@solana-mobile/dapp-store-cli 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -121,13 +121,13 @@ function _ts_generator(thisArg, body) {
121
121
  trys: [],
122
122
  ops: []
123
123
  };
124
- return(g = {
124
+ return g = {
125
125
  next: verb(0),
126
126
  "throw": verb(1),
127
127
  "return": verb(2)
128
128
  }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
129
129
  return this;
130
- }), g);
130
+ }), g;
131
131
  function verb(n) {
132
132
  return function(v) {
133
133
  return step([
@@ -209,7 +209,7 @@ function _ts_generator(thisArg, body) {
209
209
  import { dump, load } from "js-yaml";
210
210
  import Ajv from "ajv";
211
211
  // eslint-disable-next-line require-extensions/require-extensions
212
- import { readFile } from "fs/promises";
212
+ import { readFile } from 'fs/promises';
213
213
  var schemaJson = JSON.parse((await readFile(new URL("../generated/config_schema.json", import.meta.url))).toString());
214
214
  import fs from "fs";
215
215
  import path from "path";
@@ -219,6 +219,7 @@ import util from "util";
219
219
  import { imageSize } from "image-size";
220
220
  import { exec } from "child_process";
221
221
  import getVideoDimensions from "get-video-dimensions";
222
+ import { PublicKey } from "@solana/web3.js";
222
223
  var runImgSize = util.promisify(imageSize);
223
224
  var runExec = util.promisify(exec);
224
225
  var AaptPrefixes = {
@@ -235,7 +236,7 @@ var ajv = new Ajv({
235
236
  strictTuples: false
236
237
  });
237
238
  var validate = ajv.compile(schemaJson);
238
- export var loadPublishDetails = function() {
239
+ export var loadPublishDetails = /*#__PURE__*/ function() {
239
240
  var _ref = _async_to_generator(function(configPath) {
240
241
  var configFile, valid;
241
242
  return _ts_generator(this, function(_state) {
@@ -263,9 +264,9 @@ export var loadPublishDetails = function() {
263
264
  return _ref.apply(this, arguments);
264
265
  };
265
266
  }();
266
- export var loadPublishDetailsWithChecks = function() {
267
+ export var loadPublishDetailsWithChecks = /*#__PURE__*/ function() {
267
268
  var _ref = _async_to_generator(function() {
268
- var buildToolsDir, _config_publisher_media_find, _config_publisher_media, _config_app_media_find, _config_app_media, _config_release_media_find, _config_release_media, _config_release_media1, _config_release_media2, config, apkEntry, apkPath, _, publisherIcon, iconPath, iconBuffer, appIcon, iconPath1, iconBuffer1, releaseIcon, iconPath2, screenshots, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, item, mediaPath, err, videos, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, video, mediaPath1, err, googlePkg, pkgCompare;
269
+ var buildToolsDir, _config_publisher_media_find, _config_publisher_media, _config_app_media_find, _config_app_media, _config_release_media_find, _config_release_media, _config_release_media_find1, _config_release_media1, _config_release_media_find2, _config_release_media2, _config_release_media3, _config_release_media4, config, apkEntry, apkPath, _, publisherIcon, iconPath, iconBuffer, appIcon, iconPath1, iconBuffer1, releaseIcon, iconPath2, banner, bannerPath, featureGraphic, featureGraphicPath, screenshots, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, item, mediaPath, err, videos, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, video, mediaPath1, err, googlePkg, pkgCompare, alpha_testers, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, wallet;
269
270
  var _arguments = arguments;
270
271
  return _ts_generator(this, function(_state) {
271
272
  switch(_state.label){
@@ -277,6 +278,7 @@ export var loadPublishDetailsWithChecks = function() {
277
278
  ];
278
279
  case 1:
279
280
  config = _state.sent();
281
+ // We validate that the config is going to have at least one installable asset
280
282
  apkEntry = config.release.files.find(function(asset) {
281
283
  return asset.purpose === "install";
282
284
  });
@@ -297,7 +299,7 @@ export var loadPublishDetailsWithChecks = function() {
297
299
  _.android_details = _state.sent();
298
300
  _state.label = 3;
299
301
  case 3:
300
- publisherIcon = (_config_publisher_media_find = (_config_publisher_media = config.publisher.media) === null || _config_publisher_media === void 0 ? void 0 : _config_publisher_media.find(function(asset) {
302
+ publisherIcon = (_config_publisher_media = config.publisher.media) === null || _config_publisher_media === void 0 ? void 0 : (_config_publisher_media_find = _config_publisher_media.find(function(asset) {
301
303
  return asset.purpose === "icon";
302
304
  })) === null || _config_publisher_media_find === void 0 ? void 0 : _config_publisher_media_find.uri;
303
305
  if (!publisherIcon) return [
@@ -320,7 +322,7 @@ export var loadPublishDetailsWithChecks = function() {
320
322
  config.publisher.icon = toMetaplexFile(iconBuffer, publisherIcon);
321
323
  _state.label = 6;
322
324
  case 6:
323
- appIcon = (_config_app_media_find = (_config_app_media = config.app.media) === null || _config_app_media === void 0 ? void 0 : _config_app_media.find(function(asset) {
325
+ appIcon = (_config_app_media = config.app.media) === null || _config_app_media === void 0 ? void 0 : (_config_app_media_find = _config_app_media.find(function(asset) {
324
326
  return asset.purpose === "icon";
325
327
  })) === null || _config_app_media_find === void 0 ? void 0 : _config_app_media_find.uri;
326
328
  if (!appIcon) return [
@@ -343,7 +345,7 @@ export var loadPublishDetailsWithChecks = function() {
343
345
  config.app.icon = toMetaplexFile(iconBuffer1, appIcon);
344
346
  _state.label = 9;
345
347
  case 9:
346
- releaseIcon = (_config_release_media_find = (_config_release_media = config.release.media) === null || _config_release_media === void 0 ? void 0 : _config_release_media.find(function(asset) {
348
+ releaseIcon = (_config_release_media = config.release.media) === null || _config_release_media === void 0 ? void 0 : (_config_release_media_find = _config_release_media.find(function(asset) {
347
349
  return asset.purpose === "icon";
348
350
  })) === null || _config_release_media_find === void 0 ? void 0 : _config_release_media_find.uri;
349
351
  if (!releaseIcon) return [
@@ -362,6 +364,38 @@ export var loadPublishDetailsWithChecks = function() {
362
364
  if (!appIcon && !releaseIcon) {
363
365
  throw new Error("Please specify at least one media entry of type icon in your configuration file");
364
366
  }
367
+ banner = (_config_release_media1 = config.release.media) === null || _config_release_media1 === void 0 ? void 0 : (_config_release_media_find1 = _config_release_media1.find(function(asset) {
368
+ return asset.purpose === "banner";
369
+ })) === null || _config_release_media_find1 === void 0 ? void 0 : _config_release_media_find1.uri;
370
+ if (!banner) return [
371
+ 3,
372
+ 13
373
+ ];
374
+ bannerPath = path.join(process.cwd(), banner);
375
+ return [
376
+ 4,
377
+ checkBannerCompatibility(bannerPath)
378
+ ];
379
+ case 12:
380
+ _state.sent();
381
+ _state.label = 13;
382
+ case 13:
383
+ featureGraphic = (_config_release_media2 = config.release.media) === null || _config_release_media2 === void 0 ? void 0 : (_config_release_media_find2 = _config_release_media2.find(function(asset) {
384
+ return asset.purpose === "featureGraphic";
385
+ })) === null || _config_release_media_find2 === void 0 ? void 0 : _config_release_media_find2.uri;
386
+ if (!featureGraphic) return [
387
+ 3,
388
+ 15
389
+ ];
390
+ featureGraphicPath = path.join(process.cwd(), featureGraphic);
391
+ return [
392
+ 4,
393
+ checkFeatureGraphicCompatibility(featureGraphicPath)
394
+ ];
395
+ case 14:
396
+ _state.sent();
397
+ _state.label = 15;
398
+ case 15:
365
399
  config.release.media.forEach(function(item) {
366
400
  var mediaPath = path.join(process.cwd(), item.uri);
367
401
  if (!fs.existsSync(mediaPath)) {
@@ -374,56 +408,56 @@ export var loadPublishDetailsWithChecks = function() {
374
408
  throw new Error("Please ensure the file ".concat(item.uri, " is a mp4."));
375
409
  }
376
410
  });
377
- screenshots = (_config_release_media1 = config.release.media) === null || _config_release_media1 === void 0 ? void 0 : _config_release_media1.filter(function(asset) {
411
+ screenshots = (_config_release_media3 = config.release.media) === null || _config_release_media3 === void 0 ? void 0 : _config_release_media3.filter(function(asset) {
378
412
  return asset.purpose === "screenshot";
379
413
  });
380
414
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
381
- _state.label = 12;
382
- case 12:
415
+ _state.label = 16;
416
+ case 16:
383
417
  _state.trys.push([
384
- 12,
385
- 17,
386
- 18,
387
- 19
418
+ 16,
419
+ 21,
420
+ 22,
421
+ 23
388
422
  ]);
389
423
  _iterator = screenshots[Symbol.iterator]();
390
- _state.label = 13;
391
- case 13:
424
+ _state.label = 17;
425
+ case 17:
392
426
  if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
393
427
  3,
394
- 16
428
+ 20
395
429
  ];
396
430
  item = _step.value;
397
431
  mediaPath = path.join(process.cwd(), item.uri);
398
432
  return [
399
433
  4,
400
- checkScreenshotSize(mediaPath)
434
+ checkScreenshotDimensions(mediaPath)
401
435
  ];
402
- case 14:
436
+ case 18:
403
437
  if (_state.sent()) {
404
438
  throw new Error("Screenshot ".concat(mediaPath, " must be at least 1080px in width and height."));
405
439
  }
406
- _state.label = 15;
407
- case 15:
440
+ _state.label = 19;
441
+ case 19:
408
442
  _iteratorNormalCompletion = true;
409
443
  return [
410
444
  3,
411
- 13
445
+ 17
412
446
  ];
413
- case 16:
447
+ case 20:
414
448
  return [
415
449
  3,
416
- 19
450
+ 23
417
451
  ];
418
- case 17:
452
+ case 21:
419
453
  err = _state.sent();
420
454
  _didIteratorError = true;
421
455
  _iteratorError = err;
422
456
  return [
423
457
  3,
424
- 19
458
+ 23
425
459
  ];
426
- case 18:
460
+ case 22:
427
461
  try {
428
462
  if (!_iteratorNormalCompletion && _iterator.return != null) {
429
463
  _iterator.return();
@@ -436,57 +470,57 @@ export var loadPublishDetailsWithChecks = function() {
436
470
  return [
437
471
  7
438
472
  ];
439
- case 19:
440
- videos = (_config_release_media2 = config.release.media) === null || _config_release_media2 === void 0 ? void 0 : _config_release_media2.filter(function(asset) {
473
+ case 23:
474
+ videos = (_config_release_media4 = config.release.media) === null || _config_release_media4 === void 0 ? void 0 : _config_release_media4.filter(function(asset) {
441
475
  return asset.purpose === "video";
442
476
  });
443
477
  _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
444
- _state.label = 20;
445
- case 20:
478
+ _state.label = 24;
479
+ case 24:
446
480
  _state.trys.push([
447
- 20,
448
- 25,
449
- 26,
450
- 27
481
+ 24,
482
+ 29,
483
+ 30,
484
+ 31
451
485
  ]);
452
486
  _iterator1 = videos[Symbol.iterator]();
453
- _state.label = 21;
454
- case 21:
487
+ _state.label = 25;
488
+ case 25:
455
489
  if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
456
490
  3,
457
- 24
491
+ 28
458
492
  ];
459
493
  video = _step1.value;
460
494
  mediaPath1 = path.join(process.cwd(), video.uri);
461
495
  return [
462
496
  4,
463
- checkVideoSize(mediaPath1)
497
+ checkVideoDimensions(mediaPath1)
464
498
  ];
465
- case 22:
499
+ case 26:
466
500
  if (_state.sent()) {
467
501
  throw new Error("Video ".concat(mediaPath1, " must be at least 720px in width and height."));
468
502
  }
469
- _state.label = 23;
470
- case 23:
503
+ _state.label = 27;
504
+ case 27:
471
505
  _iteratorNormalCompletion1 = true;
472
506
  return [
473
507
  3,
474
- 21
508
+ 25
475
509
  ];
476
- case 24:
510
+ case 28:
477
511
  return [
478
512
  3,
479
- 27
513
+ 31
480
514
  ];
481
- case 25:
515
+ case 29:
482
516
  err = _state.sent();
483
517
  _didIteratorError1 = true;
484
518
  _iteratorError1 = err;
485
519
  return [
486
520
  3,
487
- 27
521
+ 31
488
522
  ];
489
- case 26:
523
+ case 30:
490
524
  try {
491
525
  if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
492
526
  _iterator1.return();
@@ -499,7 +533,7 @@ export var loadPublishDetailsWithChecks = function() {
499
533
  return [
500
534
  7
501
535
  ];
502
- case 27:
536
+ case 31:
503
537
  if (screenshots.length + videos.length < 4) {
504
538
  throw new Error("At least 4 screenshots or videos are required for publishing a new release. Found only ".concat(screenshots.length + videos.length));
505
539
  }
@@ -511,6 +545,36 @@ export var loadPublishDetailsWithChecks = function() {
511
545
  throw new Error("Please provide a valid Google store package name in the Publisher Portal section of your configuration file.");
512
546
  }
513
547
  }
548
+ alpha_testers = config.solana_mobile_dapp_publisher_portal.alpha_testers;
549
+ if (alpha_testers !== undefined) {
550
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
551
+ try {
552
+ for(_iterator2 = alpha_testers[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
553
+ wallet = _step2.value;
554
+ try {
555
+ void new PublicKey(wallet.address);
556
+ } catch (e) {
557
+ throw new Error("invalid alpha tester wallet address <".concat(wallet, ">"));
558
+ }
559
+ }
560
+ } catch (err) {
561
+ _didIteratorError2 = true;
562
+ _iteratorError2 = err;
563
+ } finally{
564
+ try {
565
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
566
+ _iterator2.return();
567
+ }
568
+ } finally{
569
+ if (_didIteratorError2) {
570
+ throw _iteratorError2;
571
+ }
572
+ }
573
+ }
574
+ if (alpha_testers.size > 10) {
575
+ throw new Error("Alpha testers are limited to 10 per app submission");
576
+ }
577
+ }
514
578
  return [
515
579
  2,
516
580
  config
@@ -522,7 +586,7 @@ export var loadPublishDetailsWithChecks = function() {
522
586
  return _ref.apply(this, arguments);
523
587
  };
524
588
  }();
525
- var checkIconCompatibility = function() {
589
+ var checkIconCompatibility = /*#__PURE__*/ function() {
526
590
  var _ref = _async_to_generator(function(path, typeString) {
527
591
  return _ts_generator(this, function(_state) {
528
592
  switch(_state.label){
@@ -548,6 +612,58 @@ var checkIconCompatibility = function() {
548
612
  return _ref.apply(this, arguments);
549
613
  };
550
614
  }();
615
+ var checkBannerCompatibility = /*#__PURE__*/ function() {
616
+ var _ref = _async_to_generator(function(path) {
617
+ return _ts_generator(this, function(_state) {
618
+ switch(_state.label){
619
+ case 0:
620
+ if (!fs.existsSync(path) || !checkImageExtension(path)) {
621
+ throw new Error("Please check the path to your banner image and ensure the file is a jpeg, png, or webp file.");
622
+ }
623
+ return [
624
+ 4,
625
+ checkBannerDimensions(path)
626
+ ];
627
+ case 1:
628
+ if (_state.sent()) {
629
+ throw new Error("Banner must be 1200px by 600px.");
630
+ }
631
+ return [
632
+ 2
633
+ ];
634
+ }
635
+ });
636
+ });
637
+ return function checkBannerCompatibility(path) {
638
+ return _ref.apply(this, arguments);
639
+ };
640
+ }();
641
+ var checkFeatureGraphicCompatibility = /*#__PURE__*/ function() {
642
+ var _ref = _async_to_generator(function(path) {
643
+ return _ts_generator(this, function(_state) {
644
+ switch(_state.label){
645
+ case 0:
646
+ if (!fs.existsSync(path) || !checkImageExtension(path)) {
647
+ throw new Error("Please check the path to your featureGraphic image and ensure the file is a jpeg, png, or webp file.");
648
+ }
649
+ return [
650
+ 4,
651
+ checkFeatureGraphicDimensions(path)
652
+ ];
653
+ case 1:
654
+ if (_state.sent()) {
655
+ throw new Error("Feature Graphic must be 1200px by 1200px.");
656
+ }
657
+ return [
658
+ 2
659
+ ];
660
+ }
661
+ });
662
+ });
663
+ return function checkFeatureGraphicCompatibility(path) {
664
+ return _ref.apply(this, arguments);
665
+ };
666
+ }();
551
667
  var checkImageExtension = function(uri) {
552
668
  var fileExt = path.extname(uri).toLowerCase();
553
669
  return fileExt == ".png" || fileExt == ".jpg" || fileExt == ".jpeg" || fileExt == ".webp";
@@ -578,7 +694,7 @@ var checkVideoExtension = function(uri) {
578
694
  throw new Error("Please ensure all translations of short_description are between 0 and 30 characters");
579
695
  }
580
696
  };
581
- var checkIconDimensions = function() {
697
+ var checkIconDimensions = /*#__PURE__*/ function() {
582
698
  var _ref = _async_to_generator(function(iconPath) {
583
699
  var size, _size_width;
584
700
  return _ts_generator(this, function(_state) {
@@ -601,7 +717,7 @@ var checkIconDimensions = function() {
601
717
  return _ref.apply(this, arguments);
602
718
  };
603
719
  }();
604
- var checkScreenshotSize = function() {
720
+ var checkScreenshotDimensions = /*#__PURE__*/ function() {
605
721
  var _ref = _async_to_generator(function(imagePath) {
606
722
  var size, _size_width, _size_height;
607
723
  return _ts_generator(this, function(_state) {
@@ -620,11 +736,57 @@ var checkScreenshotSize = function() {
620
736
  }
621
737
  });
622
738
  });
623
- return function checkScreenshotSize(imagePath) {
739
+ return function checkScreenshotDimensions(imagePath) {
740
+ return _ref.apply(this, arguments);
741
+ };
742
+ }();
743
+ var checkBannerDimensions = /*#__PURE__*/ function() {
744
+ var _ref = _async_to_generator(function(imagePath) {
745
+ var size, _size_width, _size_height;
746
+ return _ts_generator(this, function(_state) {
747
+ switch(_state.label){
748
+ case 0:
749
+ return [
750
+ 4,
751
+ runImgSize(imagePath)
752
+ ];
753
+ case 1:
754
+ size = _state.sent();
755
+ return [
756
+ 2,
757
+ ((_size_width = size === null || size === void 0 ? void 0 : size.width) !== null && _size_width !== void 0 ? _size_width : 0) != 1200 || ((_size_height = size === null || size === void 0 ? void 0 : size.height) !== null && _size_height !== void 0 ? _size_height : 0) != 600
758
+ ];
759
+ }
760
+ });
761
+ });
762
+ return function checkBannerDimensions(imagePath) {
763
+ return _ref.apply(this, arguments);
764
+ };
765
+ }();
766
+ var checkFeatureGraphicDimensions = /*#__PURE__*/ function() {
767
+ var _ref = _async_to_generator(function(imagePath) {
768
+ var size, _size_width, _size_height;
769
+ return _ts_generator(this, function(_state) {
770
+ switch(_state.label){
771
+ case 0:
772
+ return [
773
+ 4,
774
+ runImgSize(imagePath)
775
+ ];
776
+ case 1:
777
+ size = _state.sent();
778
+ return [
779
+ 2,
780
+ ((_size_width = size === null || size === void 0 ? void 0 : size.width) !== null && _size_width !== void 0 ? _size_width : 0) != 1200 || ((_size_height = size === null || size === void 0 ? void 0 : size.height) !== null && _size_height !== void 0 ? _size_height : 0) != 1200
781
+ ];
782
+ }
783
+ });
784
+ });
785
+ return function checkFeatureGraphicDimensions(imagePath) {
624
786
  return _ref.apply(this, arguments);
625
787
  };
626
788
  }();
627
- var checkVideoSize = function() {
789
+ var checkVideoDimensions = /*#__PURE__*/ function() {
628
790
  var _ref = _async_to_generator(function(imagePath) {
629
791
  var size, _size_width, _size_height;
630
792
  return _ts_generator(this, function(_state) {
@@ -643,11 +805,11 @@ var checkVideoSize = function() {
643
805
  }
644
806
  });
645
807
  });
646
- return function checkVideoSize(imagePath) {
808
+ return function checkVideoDimensions(imagePath) {
647
809
  return _ref.apply(this, arguments);
648
810
  };
649
811
  }();
650
- var getAndroidDetails = function() {
812
+ var getAndroidDetails = /*#__PURE__*/ function() {
651
813
  var _ref = _async_to_generator(function(aaptDir, apkPath) {
652
814
  var stdout, appPackage, versionCode, versionName, minSdk, permissions, locales, isDebuggable, _locales_values, localeArray, localesSrc, _appPackage_, _minSdk_, _versionCode_, _versionName_, _tmp, e;
653
815
  return _ts_generator(this, function(_state) {
@@ -734,7 +896,7 @@ var getAndroidDetails = function() {
734
896
  return _ref.apply(this, arguments);
735
897
  };
736
898
  }();
737
- var checkAbis = function() {
899
+ var checkAbis = /*#__PURE__*/ function() {
738
900
  var _ref = _async_to_generator(function(apkPath) {
739
901
  var stdout, amV7libs, x86libs, x8664libs, messages, e;
740
902
  return _ts_generator(this, function(_state) {
@@ -774,7 +936,7 @@ var checkAbis = function() {
774
936
  ] : []), [
775
937
  "\n\nAlthough your app works fine on Saga, these library files are unused and increase the size of apk file making the download and update time longer for your app.",
776
938
  "\n\nSee https://developer.android.com/games/optimize/64-bit#build-with-64-bit for how to optimize your app."
777
- ]).join("\n");
939
+ ]).join('\n');
778
940
  showMessage("Unsupported files found in apk", messages, "warning");
779
941
  }
780
942
  return [
@@ -798,7 +960,7 @@ var checkAbis = function() {
798
960
  return _ref.apply(this, arguments);
799
961
  };
800
962
  }();
801
- export var extractCertFingerprint = function() {
963
+ export var extractCertFingerprint = /*#__PURE__*/ function() {
802
964
  var _ref = _async_to_generator(function(aaptDir, apkPath) {
803
965
  var stdout, regex, match;
804
966
  return _ts_generator(this, function(_state) {
@@ -830,7 +992,7 @@ export var extractCertFingerprint = function() {
830
992
  return _ref.apply(this, arguments);
831
993
  };
832
994
  }();
833
- export var writeToPublishDetails = function() {
995
+ export var writeToPublishDetails = /*#__PURE__*/ function() {
834
996
  var _ref = _async_to_generator(function(param) {
835
997
  var publisher, app, release, lastSubmittedVersionOnChain, lastUpdatedVersionOnStore, currentConfig, _publisher_address, _app_address, _release_address, newConfig;
836
998
  return _ts_generator(this, function(_state) {
@@ -1 +1 @@
1
- {"publisher":{"name":"<<YOUR_PUBLISHER_NAME>>","address":"","website":"<<URL_OF_PUBLISHER_WEBSITE>>","email":"<<EMAIL_ADDRESS_TO_CONTACT_PUBLISHER>>","media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_PUBLISHER_ICON>>"}]},"app":{"name":"<<APP_NAME>>","address":"","android_package":"<<ANDROID_PACKAGE_NAME>>","urls":{"license_url":"<<URL_OF_APP_LICENSE_OR_TERMS_OF_SERVICE>>","copyright_url":"<<URL_OF_COPYRIGHT_DETAILS_FOR_APP>>","privacy_policy_url":"<<URL_OF_APP_PRIVACY_POLICY>>","website":"<<URL_OF_APP_WEBSITE>>"},"media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_APP_ICON>>"}]},"release":{"address":"","media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_RELEASE_ICON>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT1>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT2>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT3>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT4>>"},{"purpose":"video","uri":"<<RELATIVE_PATH_TO_VIDEO1>>"}],"files":[{"purpose":"install","uri":"<<RELATIVE_PATH_TO_APK>>"}],"catalog":{"en-US":{"name":"<<APP_NAME>>","short_description":"<<SHORT_APP_DESCRIPTION>>","long_description":"<<LONG_APP_DESCRIPTION>>","new_in_version":"<<WHATS_NEW_IN_THIS_VERSION>>","saga_features":"<<ANY_FEATURES_ONLY_AVAILBLE_WHEN_RUNNING_ON_SAGA>>"}}},"solana_mobile_dapp_publisher_portal":{"google_store_package":"<<ANDROID_PACKAGE_NAME_OF_GOOGLE_PLAY_STORE_VERSION_IF_DIFFERENT>>","testing_instructions":"<<TESTING_INSTRUCTIONS>>"}}
1
+ {"publisher":{"name":"<<YOUR_PUBLISHER_NAME>>","address":"","website":"<<URL_OF_PUBLISHER_WEBSITE>>","email":"<<EMAIL_ADDRESS_TO_CONTACT_PUBLISHER>>","media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_PUBLISHER_ICON>>"}]},"app":{"name":"<<APP_NAME>>","address":"","android_package":"<<ANDROID_PACKAGE_NAME>>","urls":{"license_url":"<<URL_OF_APP_LICENSE_OR_TERMS_OF_SERVICE>>","copyright_url":"<<URL_OF_COPYRIGHT_DETAILS_FOR_APP>>","privacy_policy_url":"<<URL_OF_APP_PRIVACY_POLICY>>","website":"<<URL_OF_APP_WEBSITE>>"},"media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_APP_ICON>>"}]},"release":{"address":"","media":[{"purpose":"icon","uri":"<<RELATIVE_PATH_TO_RELEASE_ICON>>"},{"purpose":"banner","uri":"<<RELATIVE_PATH_TO_BANNER>>"},{"purpose":"featureGraphic","uri":"<<RELATIVE_PATH_TO_FEATURE_GRAPHIC>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT1>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT2>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT3>>"},{"purpose":"screenshot","uri":"<<RELATIVE_PATH_TO_SCREENSHOT4>>"},{"purpose":"video","uri":"<<RELATIVE_PATH_TO_VIDEO1>>"}],"files":[{"purpose":"install","uri":"<<RELATIVE_PATH_TO_APK>>"}],"catalog":{"en-US":{"name":"<<APP_NAME>>","short_description":"<<SHORT_APP_DESCRIPTION>>","long_description":"<<LONG_APP_DESCRIPTION>>","new_in_version":"<<WHATS_NEW_IN_THIS_VERSION>>","saga_features":"<<ANY_FEATURES_ONLY_AVAILBLE_WHEN_RUNNING_ON_SAGA>>"}}},"solana_mobile_dapp_publisher_portal":{"google_store_package":"<<ANDROID_PACKAGE_NAME_OF_GOOGLE_PLAY_STORE_VERSION_IF_DIFFERENT>>","testing_instructions":"<<TESTING_INSTRUCTIONS>>","alpha_testers":[{"address":"<<genesis token wallet address>>","comment":"<<Optional. For internal use only>>"},{"address":"<<genesis token wallet address>>","comment":"<<Optional. For internal use only>>"}]}}
@@ -1 +1 @@
1
- {"type":"object","properties":{"publisher":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"website":{"type":"string"},"email":{"type":"string"},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}}}},"app":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"android_package":{"type":"string"},"urls":{"type":"object","properties":{"license_url":{"type":"string"},"copyright_url":{"type":"string"},"privacy_policy_url":{"type":"string"},"website":{"type":"string"}}},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}}}},"release":{"type":"object","properties":{"address":{"type":"string"},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}},"required":["purpose","uri"]}},"files":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}},"catalog":{"type":"object","properties":{"en-US":{"type":"object","properties":{"name":{"type":"string"},"short_description":{"type":"string"},"long_description":{"type":"string"},"new_in_version":{"type":"string"},"saga_features":{"type":"string"}},"required":["short_description"]}}}}},"solana_mobile_dapp_publisher_portal":{"type":"object","properties":{"google_store_package":{"type":"string"},"testing_instructions":{"type":"string"}}}}}
1
+ {"type":"object","properties":{"publisher":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"website":{"type":"string"},"email":{"type":"string"},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}}}},"app":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"android_package":{"type":"string"},"urls":{"type":"object","properties":{"license_url":{"type":"string"},"copyright_url":{"type":"string"},"privacy_policy_url":{"type":"string"},"website":{"type":"string"}}},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}}}},"release":{"type":"object","properties":{"address":{"type":"string"},"media":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}},"required":["purpose","uri"]}},"files":{"type":"array","items":{"type":"object","properties":{"purpose":{"type":"string"},"uri":{"type":"string"}}}},"catalog":{"type":"object","properties":{"en-US":{"type":"object","properties":{"name":{"type":"string"},"short_description":{"type":"string"},"long_description":{"type":"string"},"new_in_version":{"type":"string"},"saga_features":{"type":"string"}},"required":["short_description"]}}}}},"solana_mobile_dapp_publisher_portal":{"type":"object","properties":{"google_store_package":{"type":"string"},"testing_instructions":{"type":"string"},"alpha_testers":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"comment":{"type":"string"}},"required":["address","comment"]}}}}}}
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana-mobile/dapp-store-cli",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -53,7 +53,7 @@
53
53
  "dependencies": {
54
54
  "@aws-sdk/client-s3": "^3.321.1",
55
55
  "@metaplex-foundation/js-plugin-aws": "^0.20.0",
56
- "@solana-mobile/dapp-store-publishing-tools": "workspace:0.9.4",
56
+ "@solana-mobile/dapp-store-publishing-tools": "workspace:0.10.0",
57
57
  "@solana/web3.js": "1.92.1",
58
58
  "@types/semver": "^7.3.13",
59
59
  "ajv": "^8.11.0",
@@ -23,6 +23,10 @@ release:
23
23
  media:
24
24
  - purpose: icon
25
25
  uri: <<RELATIVE_PATH_TO_RELEASE_ICON>>
26
+ - purpose: banner
27
+ uri: <<RELATIVE_PATH_TO_BANNER>>
28
+ - purpose: featureGraphic
29
+ uri: <<RELATIVE_PATH_TO_FEATURE_GRAPHIC>>
26
30
  - purpose: screenshot
27
31
  uri: <<RELATIVE_PATH_TO_SCREENSHOT1>>
28
32
  - purpose: screenshot
@@ -51,4 +55,9 @@ release:
51
55
  solana_mobile_dapp_publisher_portal:
52
56
  google_store_package: <<ANDROID_PACKAGE_NAME_OF_GOOGLE_PLAY_STORE_VERSION_IF_DIFFERENT>>
53
57
  testing_instructions: >-
54
- <<TESTING_INSTRUCTIONS>>
58
+ <<TESTING_INSTRUCTIONS>>
59
+ alpha_testers:
60
+ - address: <<genesis token wallet address>>
61
+ comment: <<Optional. For internal use only>>
62
+ - address: <<genesis token wallet address>>
63
+ comment: <<Optional. For internal use only>>
@@ -2,10 +2,10 @@ import fs from "fs";
2
2
  import yaml from "js-yaml";
3
3
  import generateSchema from "generate-schema";
4
4
  try {
5
- var yamlSrc = fs.readFileSync("./src/prebuild_schema/publishing_source.yaml", "utf8");
5
+ var yamlSrc = fs.readFileSync('./src/prebuild_schema/publishing_source.yaml', 'utf8');
6
6
  var convertedYaml = yaml.load(yamlSrc);
7
- fs.writeFileSync("./src/generated/config_obj.json", Buffer.from(JSON.stringify(convertedYaml)), "utf-8");
8
- var schema = generateSchema.json("result", convertedYaml);
7
+ fs.writeFileSync('./src/generated/config_obj.json', Buffer.from(JSON.stringify(convertedYaml)), 'utf-8');
8
+ var schema = generateSchema.json('result', convertedYaml);
9
9
  // CLI 0.3.0: Adding requirement for `short_description` so validation will catch
10
10
  schema["properties"]["release"]["properties"]["catalog"]["properties"]["en-US"].required = [
11
11
  "short_description"
@@ -14,7 +14,7 @@ try {
14
14
  delete schema.$schema;
15
15
  delete schema.title;
16
16
  var toWrite = Buffer.from(JSON.stringify(schema));
17
- fs.writeFileSync("./src/generated/config_schema.json", toWrite, "utf-8");
17
+ fs.writeFileSync('./src/generated/config_schema.json', toWrite, 'utf-8');
18
18
  } catch (e) {
19
19
  console.log(":: Schema generation step failed ::");
20
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana-mobile/dapp-store-cli",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -46,7 +46,7 @@
46
46
  "dependencies": {
47
47
  "@aws-sdk/client-s3": "^3.321.1",
48
48
  "@metaplex-foundation/js-plugin-aws": "^0.20.0",
49
- "@solana-mobile/dapp-store-publishing-tools": "0.9.4",
49
+ "@solana-mobile/dapp-store-publishing-tools": "0.10.0",
50
50
  "@solana/web3.js": "1.92.1",
51
51
  "@types/semver": "^7.3.13",
52
52
  "ajv": "^8.11.0",