fastlane-plugin-store_screenshot_check 0.1.0 → 0.1.1
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.
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d91b0d3b71bb79040fb01c8a3fa6834fe550100c279d5a0ec3f5dba122a6daf6
|
|
4
|
+
data.tar.gz: 6bea841e05f48b8b57cecb3604c07423182c9d5adc3935bb58e747f6b79bcb19
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7f5daf5bd204cb930c836129f94cd747346fff91f33c428784cd905cb0d5f68d1a16c63a008f37c1eafbc2797b94b522a350bc2a919403a02ebc6604fdf2b01a
|
|
7
|
+
data.tar.gz: 4d1728e35e8e59ec16634b33b2e5ceb4f78c0f2a90876fb20c4a4812d9a699468f82b9181b817f3a136ea09dbf1c9e64562cbcbe78030f1741122654be117b11
|
data/README.md
CHANGED
|
@@ -5,16 +5,14 @@ Play. The `store_screenshot_check` action checks image data, dimensions,
|
|
|
5
5
|
transparency and set counts using `@grunersoftware/store-screenshot-specs` 0.1.0.
|
|
6
6
|
It returns a report and, by default, stops the lane when a file or set fails.
|
|
7
7
|
|
|
8
|
-
Version 0.1.
|
|
9
|
-
published, add the tagged repository to your project's `fastlane/Pluginfile`:
|
|
8
|
+
Version 0.1.1 is published on RubyGems. Add the plugin to a Fastlane project:
|
|
10
9
|
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
git: 'https://github.com/MartinGryner/fastlane-plugin-store_screenshot_check.git',
|
|
14
|
-
tag: 'v0.1.0'
|
|
10
|
+
```sh
|
|
11
|
+
bundle exec fastlane add_plugin store_screenshot_check
|
|
15
12
|
```
|
|
16
13
|
|
|
17
|
-
|
|
14
|
+
Or add `gem 'fastlane-plugin-store_screenshot_check', '~> 0.1.1'` to the
|
|
15
|
+
project's `fastlane/Pluginfile` and run `bundle install`. The lane host needs Node.js 22 or newer,
|
|
18
16
|
Ruby 3.1 or newer, and Fastlane 2.220 or newer (2.x). The gem includes its
|
|
19
17
|
JavaScript validator and dependencies; no npm install is needed to run it.
|
|
20
18
|
|
|
@@ -98,15 +96,15 @@ Fastlane actions and CI provider have their own data handling.
|
|
|
98
96
|
optional app for creating screenshot sets. It is not required to run this check.
|
|
99
97
|
You can also use the [browser validator](https://martingruner.com/tools/store-screenshot-validator).
|
|
100
98
|
|
|
101
|
-
## Build and test
|
|
99
|
+
## Build and test
|
|
102
100
|
|
|
103
|
-
The runtime bundle
|
|
104
|
-
|
|
105
|
-
package. There is no
|
|
101
|
+
The runtime bundle is generated from the validator source under
|
|
102
|
+
`vendor/validate-store-screenshots` and the exact published
|
|
103
|
+
`@grunersoftware/store-screenshot-specs` 0.1.0 package. There is no
|
|
104
|
+
independently maintained rule table in this plugin.
|
|
106
105
|
|
|
107
106
|
```sh
|
|
108
|
-
npm --prefix
|
|
109
|
-
npm --prefix ../validate-store-screenshots ci
|
|
107
|
+
npm --prefix vendor/validate-store-screenshots ci
|
|
110
108
|
node scripts/build.mjs
|
|
111
109
|
node --test test/validator.test.mjs
|
|
112
110
|
ruby test/action_test.rb
|
|
@@ -115,6 +113,4 @@ gem build fastlane-plugin-store_screenshot_check.gemspec
|
|
|
115
113
|
|
|
116
114
|
The Ruby integration test requires Fastlane to be installed. Rebuild the bundle
|
|
117
115
|
whenever the shared validator or specifications change. Keep `LICENSE` and
|
|
118
|
-
`THIRD_PARTY_LICENSES.txt` with the bundle.
|
|
119
|
-
includes the shared build inputs and pinned dependency manifests needed to rebuild
|
|
120
|
-
the helper. Repeat these checks before each tagged release.
|
|
116
|
+
`THIRD_PARTY_LICENSES.txt` with the bundle.
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -29,9 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
29
28
|
mod
|
|
30
29
|
));
|
|
31
30
|
|
|
32
|
-
//
|
|
31
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/chunkstream.js
|
|
33
32
|
var require_chunkstream = __commonJS({
|
|
34
|
-
"
|
|
33
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/chunkstream.js"(exports2, module2) {
|
|
35
34
|
"use strict";
|
|
36
35
|
var util = require("util");
|
|
37
36
|
var Stream = require("stream");
|
|
@@ -167,9 +166,9 @@ var require_chunkstream = __commonJS({
|
|
|
167
166
|
}
|
|
168
167
|
});
|
|
169
168
|
|
|
170
|
-
//
|
|
169
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/interlace.js
|
|
171
170
|
var require_interlace = __commonJS({
|
|
172
|
-
"
|
|
171
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/interlace.js"(exports2) {
|
|
173
172
|
"use strict";
|
|
174
173
|
var imagePasses = [
|
|
175
174
|
{
|
|
@@ -250,9 +249,9 @@ var require_interlace = __commonJS({
|
|
|
250
249
|
}
|
|
251
250
|
});
|
|
252
251
|
|
|
253
|
-
//
|
|
252
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/paeth-predictor.js
|
|
254
253
|
var require_paeth_predictor = __commonJS({
|
|
255
|
-
"
|
|
254
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/paeth-predictor.js"(exports2, module2) {
|
|
256
255
|
"use strict";
|
|
257
256
|
module2.exports = function paethPredictor(left, above, upLeft) {
|
|
258
257
|
let paeth = left + above - upLeft;
|
|
@@ -270,9 +269,9 @@ var require_paeth_predictor = __commonJS({
|
|
|
270
269
|
}
|
|
271
270
|
});
|
|
272
271
|
|
|
273
|
-
//
|
|
272
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse.js
|
|
274
273
|
var require_filter_parse = __commonJS({
|
|
275
|
-
"
|
|
274
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse.js"(exports2, module2) {
|
|
276
275
|
"use strict";
|
|
277
276
|
var interlaceUtils = require_interlace();
|
|
278
277
|
var paethPredictor = require_paeth_predictor();
|
|
@@ -411,9 +410,9 @@ var require_filter_parse = __commonJS({
|
|
|
411
410
|
}
|
|
412
411
|
});
|
|
413
412
|
|
|
414
|
-
//
|
|
413
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse-async.js
|
|
415
414
|
var require_filter_parse_async = __commonJS({
|
|
416
|
-
"
|
|
415
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse-async.js"(exports2, module2) {
|
|
417
416
|
"use strict";
|
|
418
417
|
var util = require("util");
|
|
419
418
|
var ChunkStream = require_chunkstream();
|
|
@@ -437,9 +436,9 @@ var require_filter_parse_async = __commonJS({
|
|
|
437
436
|
}
|
|
438
437
|
});
|
|
439
438
|
|
|
440
|
-
//
|
|
439
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/constants.js
|
|
441
440
|
var require_constants = __commonJS({
|
|
442
|
-
"
|
|
441
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/constants.js"(exports2, module2) {
|
|
443
442
|
"use strict";
|
|
444
443
|
module2.exports = {
|
|
445
444
|
PNG_SIGNATURE: [137, 80, 78, 71, 13, 10, 26, 10],
|
|
@@ -472,9 +471,9 @@ var require_constants = __commonJS({
|
|
|
472
471
|
}
|
|
473
472
|
});
|
|
474
473
|
|
|
475
|
-
//
|
|
474
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/crc.js
|
|
476
475
|
var require_crc = __commonJS({
|
|
477
|
-
"
|
|
476
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/crc.js"(exports2, module2) {
|
|
478
477
|
"use strict";
|
|
479
478
|
var crcTable = [];
|
|
480
479
|
(function() {
|
|
@@ -512,9 +511,9 @@ var require_crc = __commonJS({
|
|
|
512
511
|
}
|
|
513
512
|
});
|
|
514
513
|
|
|
515
|
-
//
|
|
514
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/parser.js
|
|
516
515
|
var require_parser = __commonJS({
|
|
517
|
-
"
|
|
516
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/parser.js"(exports2, module2) {
|
|
518
517
|
"use strict";
|
|
519
518
|
var constants = require_constants();
|
|
520
519
|
var CrcCalculator = require_crc();
|
|
@@ -733,9 +732,9 @@ var require_parser = __commonJS({
|
|
|
733
732
|
}
|
|
734
733
|
});
|
|
735
734
|
|
|
736
|
-
//
|
|
735
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/bitmapper.js
|
|
737
736
|
var require_bitmapper = __commonJS({
|
|
738
|
-
"
|
|
737
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/bitmapper.js"(exports2) {
|
|
739
738
|
"use strict";
|
|
740
739
|
var interlaceUtils = require_interlace();
|
|
741
740
|
var pixelBppMapper = [
|
|
@@ -981,9 +980,9 @@ var require_bitmapper = __commonJS({
|
|
|
981
980
|
}
|
|
982
981
|
});
|
|
983
982
|
|
|
984
|
-
//
|
|
983
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/format-normaliser.js
|
|
985
984
|
var require_format_normaliser = __commonJS({
|
|
986
|
-
"
|
|
985
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/format-normaliser.js"(exports2, module2) {
|
|
987
986
|
"use strict";
|
|
988
987
|
function dePalette(indata, outdata, width, height, palette) {
|
|
989
988
|
let pxPos = 0;
|
|
@@ -1062,9 +1061,9 @@ var require_format_normaliser = __commonJS({
|
|
|
1062
1061
|
}
|
|
1063
1062
|
});
|
|
1064
1063
|
|
|
1065
|
-
//
|
|
1064
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/parser-async.js
|
|
1066
1065
|
var require_parser_async = __commonJS({
|
|
1067
|
-
"
|
|
1066
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/parser-async.js"(exports2, module2) {
|
|
1068
1067
|
"use strict";
|
|
1069
1068
|
var util = require("util");
|
|
1070
1069
|
var zlib = require("zlib");
|
|
@@ -1192,9 +1191,9 @@ var require_parser_async = __commonJS({
|
|
|
1192
1191
|
}
|
|
1193
1192
|
});
|
|
1194
1193
|
|
|
1195
|
-
//
|
|
1194
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/bitpacker.js
|
|
1196
1195
|
var require_bitpacker = __commonJS({
|
|
1197
|
-
"
|
|
1196
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/bitpacker.js"(exports2, module2) {
|
|
1198
1197
|
"use strict";
|
|
1199
1198
|
var constants = require_constants();
|
|
1200
1199
|
module2.exports = function(dataIn, width, height, options) {
|
|
@@ -1342,9 +1341,9 @@ var require_bitpacker = __commonJS({
|
|
|
1342
1341
|
}
|
|
1343
1342
|
});
|
|
1344
1343
|
|
|
1345
|
-
//
|
|
1344
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-pack.js
|
|
1346
1345
|
var require_filter_pack = __commonJS({
|
|
1347
|
-
"
|
|
1346
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-pack.js"(exports2, module2) {
|
|
1348
1347
|
"use strict";
|
|
1349
1348
|
var paethPredictor = require_paeth_predictor();
|
|
1350
1349
|
function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) {
|
|
@@ -1484,9 +1483,9 @@ var require_filter_pack = __commonJS({
|
|
|
1484
1483
|
}
|
|
1485
1484
|
});
|
|
1486
1485
|
|
|
1487
|
-
//
|
|
1486
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/packer.js
|
|
1488
1487
|
var require_packer = __commonJS({
|
|
1489
|
-
"
|
|
1488
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/packer.js"(exports2, module2) {
|
|
1490
1489
|
"use strict";
|
|
1491
1490
|
var constants = require_constants();
|
|
1492
1491
|
var CrcStream = require_crc();
|
|
@@ -1584,9 +1583,9 @@ var require_packer = __commonJS({
|
|
|
1584
1583
|
}
|
|
1585
1584
|
});
|
|
1586
1585
|
|
|
1587
|
-
//
|
|
1586
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/packer-async.js
|
|
1588
1587
|
var require_packer_async = __commonJS({
|
|
1589
|
-
"
|
|
1588
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/packer-async.js"(exports2, module2) {
|
|
1590
1589
|
"use strict";
|
|
1591
1590
|
var util = require("util");
|
|
1592
1591
|
var Stream = require("stream");
|
|
@@ -1626,9 +1625,9 @@ var require_packer_async = __commonJS({
|
|
|
1626
1625
|
}
|
|
1627
1626
|
});
|
|
1628
1627
|
|
|
1629
|
-
//
|
|
1628
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/sync-inflate.js
|
|
1630
1629
|
var require_sync_inflate = __commonJS({
|
|
1631
|
-
"
|
|
1630
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/sync-inflate.js"(exports2, module2) {
|
|
1632
1631
|
"use strict";
|
|
1633
1632
|
var assert = require("assert").ok;
|
|
1634
1633
|
var zlib = require("zlib");
|
|
@@ -1763,9 +1762,9 @@ var require_sync_inflate = __commonJS({
|
|
|
1763
1762
|
}
|
|
1764
1763
|
});
|
|
1765
1764
|
|
|
1766
|
-
//
|
|
1765
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/sync-reader.js
|
|
1767
1766
|
var require_sync_reader = __commonJS({
|
|
1768
|
-
"
|
|
1767
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/sync-reader.js"(exports2, module2) {
|
|
1769
1768
|
"use strict";
|
|
1770
1769
|
var SyncReader = module2.exports = function(buffer) {
|
|
1771
1770
|
this._buffer = buffer;
|
|
@@ -1801,9 +1800,9 @@ var require_sync_reader = __commonJS({
|
|
|
1801
1800
|
}
|
|
1802
1801
|
});
|
|
1803
1802
|
|
|
1804
|
-
//
|
|
1803
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse-sync.js
|
|
1805
1804
|
var require_filter_parse_sync = __commonJS({
|
|
1806
|
-
"
|
|
1805
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/filter-parse-sync.js"(exports2) {
|
|
1807
1806
|
"use strict";
|
|
1808
1807
|
var SyncReader = require_sync_reader();
|
|
1809
1808
|
var Filter = require_filter_parse();
|
|
@@ -1825,9 +1824,9 @@ var require_filter_parse_sync = __commonJS({
|
|
|
1825
1824
|
}
|
|
1826
1825
|
});
|
|
1827
1826
|
|
|
1828
|
-
//
|
|
1827
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/parser-sync.js
|
|
1829
1828
|
var require_parser_sync = __commonJS({
|
|
1830
|
-
"
|
|
1829
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/parser-sync.js"(exports2, module2) {
|
|
1831
1830
|
"use strict";
|
|
1832
1831
|
var hasSyncZlib = true;
|
|
1833
1832
|
var zlib = require("zlib");
|
|
@@ -1920,9 +1919,9 @@ var require_parser_sync = __commonJS({
|
|
|
1920
1919
|
}
|
|
1921
1920
|
});
|
|
1922
1921
|
|
|
1923
|
-
//
|
|
1922
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/packer-sync.js
|
|
1924
1923
|
var require_packer_sync = __commonJS({
|
|
1925
|
-
"
|
|
1924
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/packer-sync.js"(exports2, module2) {
|
|
1926
1925
|
"use strict";
|
|
1927
1926
|
var hasSyncZlib = true;
|
|
1928
1927
|
var zlib = require("zlib");
|
|
@@ -1965,9 +1964,9 @@ var require_packer_sync = __commonJS({
|
|
|
1965
1964
|
}
|
|
1966
1965
|
});
|
|
1967
1966
|
|
|
1968
|
-
//
|
|
1967
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/png-sync.js
|
|
1969
1968
|
var require_png_sync = __commonJS({
|
|
1970
|
-
"
|
|
1969
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/png-sync.js"(exports2) {
|
|
1971
1970
|
"use strict";
|
|
1972
1971
|
var parse = require_parser_sync();
|
|
1973
1972
|
var pack = require_packer_sync();
|
|
@@ -1980,9 +1979,9 @@ var require_png_sync = __commonJS({
|
|
|
1980
1979
|
}
|
|
1981
1980
|
});
|
|
1982
1981
|
|
|
1983
|
-
//
|
|
1982
|
+
// vendor/validate-store-screenshots/node_modules/pngjs/lib/png.js
|
|
1984
1983
|
var require_png = __commonJS({
|
|
1985
|
-
"
|
|
1984
|
+
"vendor/validate-store-screenshots/node_modules/pngjs/lib/png.js"(exports2) {
|
|
1986
1985
|
"use strict";
|
|
1987
1986
|
var util = require("util");
|
|
1988
1987
|
var Stream = require("stream");
|
|
@@ -2117,9 +2116,9 @@ var require_png = __commonJS({
|
|
|
2117
2116
|
}
|
|
2118
2117
|
});
|
|
2119
2118
|
|
|
2120
|
-
//
|
|
2119
|
+
// vendor/validate-store-screenshots/node_modules/jpeg-js/lib/encoder.js
|
|
2121
2120
|
var require_encoder = __commonJS({
|
|
2122
|
-
"
|
|
2121
|
+
"vendor/validate-store-screenshots/node_modules/jpeg-js/lib/encoder.js"(exports2, module2) {
|
|
2123
2122
|
var btoa = btoa || function(buf) {
|
|
2124
2123
|
return Buffer.from(buf).toString("base64");
|
|
2125
2124
|
};
|
|
@@ -3194,9 +3193,9 @@ var require_encoder = __commonJS({
|
|
|
3194
3193
|
}
|
|
3195
3194
|
});
|
|
3196
3195
|
|
|
3197
|
-
//
|
|
3196
|
+
// vendor/validate-store-screenshots/node_modules/jpeg-js/lib/decoder.js
|
|
3198
3197
|
var require_decoder = __commonJS({
|
|
3199
|
-
"
|
|
3198
|
+
"vendor/validate-store-screenshots/node_modules/jpeg-js/lib/decoder.js"(exports2, module2) {
|
|
3200
3199
|
var JpegImage = (function jpegImage() {
|
|
3201
3200
|
"use strict";
|
|
3202
3201
|
var dctZigZag = new Int32Array([
|
|
@@ -4256,9 +4255,9 @@ var require_decoder = __commonJS({
|
|
|
4256
4255
|
}
|
|
4257
4256
|
});
|
|
4258
4257
|
|
|
4259
|
-
//
|
|
4258
|
+
// vendor/validate-store-screenshots/node_modules/jpeg-js/index.js
|
|
4260
4259
|
var require_jpeg_js = __commonJS({
|
|
4261
|
-
"
|
|
4260
|
+
"vendor/validate-store-screenshots/node_modules/jpeg-js/index.js"(exports2, module2) {
|
|
4262
4261
|
var encode = require_encoder();
|
|
4263
4262
|
var decode = require_decoder();
|
|
4264
4263
|
module2.exports = {
|
|
@@ -4271,13 +4270,13 @@ var require_jpeg_js = __commonJS({
|
|
|
4271
4270
|
// scripts/validate.mjs
|
|
4272
4271
|
var import_node_fs = require("node:fs");
|
|
4273
4272
|
|
|
4274
|
-
//
|
|
4273
|
+
// vendor/validate-store-screenshots/src/validate.mjs
|
|
4275
4274
|
var import_promises = require("node:fs/promises");
|
|
4276
4275
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
4277
4276
|
var import_pngjs = __toESM(require_png(), 1);
|
|
4278
4277
|
var import_jpeg_js = __toESM(require_jpeg_js(), 1);
|
|
4279
4278
|
|
|
4280
|
-
//
|
|
4279
|
+
// vendor/validate-store-screenshots/node_modules/@grunersoftware/store-screenshot-specs/dist/apple.js
|
|
4281
4280
|
var appleScreenshotSpecifications = {
|
|
4282
4281
|
schemaVersion: 1,
|
|
4283
4282
|
verifiedAt: "2026-10-07",
|
|
@@ -4551,7 +4550,7 @@ function getAppleScreenshotSlotByValidatorTarget(targetId) {
|
|
|
4551
4550
|
return appleScreenshotSpecifications.slots.find((slot) => slot.validatorTargetId === targetId);
|
|
4552
4551
|
}
|
|
4553
4552
|
|
|
4554
|
-
//
|
|
4553
|
+
// vendor/validate-store-screenshots/node_modules/@grunersoftware/store-screenshot-specs/dist/index.js
|
|
4555
4554
|
var appleSource = appleScreenshotSpecifications.sourceUrl;
|
|
4556
4555
|
var appleVerifiedAt = appleScreenshotSpecifications.verifiedAt;
|
|
4557
4556
|
function acceptedAppleSizes(targetId) {
|
|
@@ -4807,7 +4806,7 @@ function screenshotExampleFor(target) {
|
|
|
4807
4806
|
}
|
|
4808
4807
|
var screenshotExample = screenshotExampleFor("apple-iphone-69");
|
|
4809
4808
|
|
|
4810
|
-
//
|
|
4809
|
+
// vendor/validate-store-screenshots/src/validate.mjs
|
|
4811
4810
|
var MAX_BYTES = 64 * 1024 * 1024;
|
|
4812
4811
|
var MAX_PIXELS = 24e6;
|
|
4813
4812
|
function inspectBuffer(buffer, name) {
|
|
@@ -4874,459 +4873,7 @@ async function validateDirectory(directory, target, workspace) {
|
|
|
4874
4873
|
return { ...report, errors, failures: report.failures + errors.length, target, files: files.length };
|
|
4875
4874
|
}
|
|
4876
4875
|
|
|
4877
|
-
//
|
|
4878
|
-
var appleScreenshotSpecifications2 = {
|
|
4879
|
-
schemaVersion: 1,
|
|
4880
|
-
verifiedAt: "2026-10-07",
|
|
4881
|
-
sourceUrl: "https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/",
|
|
4882
|
-
uploadGuidanceUrl: "https://developer.apple.com/help/app-store-connect/manage-app-information/manage-your-app-store-assets/",
|
|
4883
|
-
fileRules: {
|
|
4884
|
-
minimumScreenshots: 1,
|
|
4885
|
-
maximumScreenshots: 10,
|
|
4886
|
-
formats: ["jpeg", "jpg", "png"],
|
|
4887
|
-
alphaChannelsAllowed: false,
|
|
4888
|
-
transparencyAllowed: false
|
|
4889
|
-
},
|
|
4890
|
-
slots: [
|
|
4891
|
-
{
|
|
4892
|
-
id: "iphone-duo",
|
|
4893
|
-
platform: "iPhone",
|
|
4894
|
-
display: "iPhone Duo",
|
|
4895
|
-
requirement: null,
|
|
4896
|
-
fallback: null,
|
|
4897
|
-
validatorTargetId: "apple-iphone-duo",
|
|
4898
|
-
sizes: [
|
|
4899
|
-
{ width: 1398, height: 2034, orientation: "portrait", note: "outer display" },
|
|
4900
|
-
{ width: 2034, height: 1398, orientation: "landscape", note: "outer display" },
|
|
4901
|
-
{ width: 2007, height: 2853, orientation: "portrait", note: "inner display" },
|
|
4902
|
-
{ width: 2853, height: 2007, orientation: "landscape", note: "inner display" }
|
|
4903
|
-
]
|
|
4904
|
-
},
|
|
4905
|
-
{
|
|
4906
|
-
id: "iphone-6-9",
|
|
4907
|
-
platform: "iPhone",
|
|
4908
|
-
display: "iPhone with Dynamic Island (large display)",
|
|
4909
|
-
formerLabel: "6.9-inch",
|
|
4910
|
-
requirement: null,
|
|
4911
|
-
fallback: "App Store Connect uses scaled Face ID (large display) screenshots when this slot is omitted.",
|
|
4912
|
-
validatorTargetId: "apple-iphone-69",
|
|
4913
|
-
sizes: [
|
|
4914
|
-
{ width: 1260, height: 2736, orientation: "portrait" },
|
|
4915
|
-
{ width: 2736, height: 1260, orientation: "landscape" },
|
|
4916
|
-
{ width: 1290, height: 2796, orientation: "portrait" },
|
|
4917
|
-
{ width: 2796, height: 1290, orientation: "landscape" },
|
|
4918
|
-
{ width: 1320, height: 2868, orientation: "portrait" },
|
|
4919
|
-
{ width: 2868, height: 1320, orientation: "landscape" }
|
|
4920
|
-
]
|
|
4921
|
-
},
|
|
4922
|
-
{
|
|
4923
|
-
id: "iphone-6-5",
|
|
4924
|
-
platform: "iPhone",
|
|
4925
|
-
display: "iPhone with Face ID (large display)",
|
|
4926
|
-
formerLabel: "6.5-inch",
|
|
4927
|
-
requirement: "Apple\u2019s table: required if the app runs on iPhone and Dynamic Island (large display) screenshots are not provided.",
|
|
4928
|
-
fallback: "App Store Connect uses scaled Dynamic Island (large display) screenshots when this slot is omitted.",
|
|
4929
|
-
validatorTargetId: "apple-iphone-65",
|
|
4930
|
-
sizes: [
|
|
4931
|
-
{ width: 1284, height: 2778, orientation: "portrait" },
|
|
4932
|
-
{ width: 2778, height: 1284, orientation: "landscape" },
|
|
4933
|
-
{ width: 1242, height: 2688, orientation: "portrait" },
|
|
4934
|
-
{ width: 2688, height: 1242, orientation: "landscape" }
|
|
4935
|
-
]
|
|
4936
|
-
},
|
|
4937
|
-
{
|
|
4938
|
-
id: "iphone-6-3",
|
|
4939
|
-
platform: "iPhone",
|
|
4940
|
-
display: "iPhone with Dynamic Island (medium display)",
|
|
4941
|
-
formerLabel: "6.3-inch",
|
|
4942
|
-
requirement: "Apple\u2019s required-sizes summary: at least one iPhone screenshot at this size.",
|
|
4943
|
-
fallback: "App Store Connect uses scaled Face ID (large display) screenshots when this slot is omitted.",
|
|
4944
|
-
validatorTargetId: "apple-iphone-63",
|
|
4945
|
-
sizes: [
|
|
4946
|
-
{ width: 1179, height: 2556, orientation: "portrait" },
|
|
4947
|
-
{ width: 2556, height: 1179, orientation: "landscape" },
|
|
4948
|
-
{ width: 1206, height: 2622, orientation: "portrait" },
|
|
4949
|
-
{ width: 2622, height: 1206, orientation: "landscape" }
|
|
4950
|
-
]
|
|
4951
|
-
},
|
|
4952
|
-
{
|
|
4953
|
-
id: "iphone-6-1",
|
|
4954
|
-
platform: "iPhone",
|
|
4955
|
-
display: "iPhone with Face ID (medium display)",
|
|
4956
|
-
formerLabel: "6.1-inch",
|
|
4957
|
-
requirement: null,
|
|
4958
|
-
fallback: "App Store Connect uses scaled Dynamic Island (medium display) screenshots when this slot is omitted.",
|
|
4959
|
-
validatorTargetId: "apple-iphone-61",
|
|
4960
|
-
sizes: [
|
|
4961
|
-
{ width: 1170, height: 2532, orientation: "portrait" },
|
|
4962
|
-
{ width: 2532, height: 1170, orientation: "landscape" },
|
|
4963
|
-
{ width: 1125, height: 2436, orientation: "portrait" },
|
|
4964
|
-
{ width: 2436, height: 1125, orientation: "landscape" },
|
|
4965
|
-
{ width: 1080, height: 2340, orientation: "portrait" },
|
|
4966
|
-
{ width: 2340, height: 1080, orientation: "landscape" }
|
|
4967
|
-
]
|
|
4968
|
-
},
|
|
4969
|
-
{
|
|
4970
|
-
id: "iphone-5-5",
|
|
4971
|
-
platform: "iPhone",
|
|
4972
|
-
display: "iPhone with Home Button (large display)",
|
|
4973
|
-
formerLabel: "5.5-inch",
|
|
4974
|
-
requirement: null,
|
|
4975
|
-
fallback: "App Store Connect uses scaled Face ID (medium display) screenshots when this slot is omitted.",
|
|
4976
|
-
validatorTargetId: "apple-iphone-55",
|
|
4977
|
-
sizes: [
|
|
4978
|
-
{ width: 1242, height: 2208, orientation: "portrait" },
|
|
4979
|
-
{ width: 2208, height: 1242, orientation: "landscape" }
|
|
4980
|
-
]
|
|
4981
|
-
},
|
|
4982
|
-
{
|
|
4983
|
-
id: "iphone-4-7",
|
|
4984
|
-
platform: "iPhone",
|
|
4985
|
-
display: "iPhone with Home Button (medium display)",
|
|
4986
|
-
formerLabel: "4.7-inch",
|
|
4987
|
-
requirement: null,
|
|
4988
|
-
fallback: "App Store Connect uses scaled Home Button (large display) screenshots when this slot is omitted.",
|
|
4989
|
-
validatorTargetId: "apple-iphone-47",
|
|
4990
|
-
sizes: [
|
|
4991
|
-
{ width: 750, height: 1334, orientation: "portrait" },
|
|
4992
|
-
{ width: 1334, height: 750, orientation: "landscape" }
|
|
4993
|
-
]
|
|
4994
|
-
},
|
|
4995
|
-
{
|
|
4996
|
-
id: "iphone-4",
|
|
4997
|
-
platform: "iPhone",
|
|
4998
|
-
display: "iPhone with Home Button (4-inch display)",
|
|
4999
|
-
requirement: null,
|
|
5000
|
-
fallback: "App Store Connect uses scaled Home Button (medium display) screenshots when this slot is omitted.",
|
|
5001
|
-
validatorTargetId: "apple-iphone-4",
|
|
5002
|
-
sizes: [
|
|
5003
|
-
{ width: 640, height: 1096, orientation: "portrait", note: "without status bar" },
|
|
5004
|
-
{ width: 640, height: 1136, orientation: "portrait", note: "with status bar" },
|
|
5005
|
-
{ width: 1136, height: 600, orientation: "landscape", note: "without status bar" },
|
|
5006
|
-
{ width: 1136, height: 640, orientation: "landscape", note: "with status bar" }
|
|
5007
|
-
]
|
|
5008
|
-
},
|
|
5009
|
-
{
|
|
5010
|
-
id: "iphone-3-5",
|
|
5011
|
-
platform: "iPhone",
|
|
5012
|
-
display: "iPhone with Home Button (3.5-inch display)",
|
|
5013
|
-
requirement: null,
|
|
5014
|
-
fallback: "App Store Connect uses scaled Home Button (4-inch display) screenshots when this slot is omitted.",
|
|
5015
|
-
validatorTargetId: "apple-iphone-35",
|
|
5016
|
-
sizes: [
|
|
5017
|
-
{ width: 640, height: 920, orientation: "portrait", note: "without status bar" },
|
|
5018
|
-
{ width: 640, height: 960, orientation: "portrait", note: "with status bar" },
|
|
5019
|
-
{ width: 960, height: 600, orientation: "landscape", note: "without status bar" },
|
|
5020
|
-
{ width: 960, height: 640, orientation: "landscape", note: "with status bar" }
|
|
5021
|
-
]
|
|
5022
|
-
},
|
|
5023
|
-
{
|
|
5024
|
-
id: "ipad-13",
|
|
5025
|
-
platform: "iPad",
|
|
5026
|
-
display: "13-inch display",
|
|
5027
|
-
requirement: "Required when the app runs on iPad.",
|
|
5028
|
-
fallback: null,
|
|
5029
|
-
validatorTargetId: "apple-ipad-13",
|
|
5030
|
-
sizes: [
|
|
5031
|
-
{ width: 2064, height: 2752, orientation: "portrait" },
|
|
5032
|
-
{ width: 2752, height: 2064, orientation: "landscape" },
|
|
5033
|
-
{ width: 2048, height: 2732, orientation: "portrait" },
|
|
5034
|
-
{ width: 2732, height: 2048, orientation: "landscape" }
|
|
5035
|
-
]
|
|
5036
|
-
},
|
|
5037
|
-
{
|
|
5038
|
-
id: "ipad-12-9",
|
|
5039
|
-
platform: "iPad",
|
|
5040
|
-
display: "12.9-inch display",
|
|
5041
|
-
requirement: null,
|
|
5042
|
-
fallback: "App Store Connect uses scaled 13-inch screenshots when this slot is omitted.",
|
|
5043
|
-
validatorTargetId: "apple-ipad-129",
|
|
5044
|
-
sizes: [
|
|
5045
|
-
{ width: 2048, height: 2732, orientation: "portrait" },
|
|
5046
|
-
{ width: 2732, height: 2048, orientation: "landscape" }
|
|
5047
|
-
]
|
|
5048
|
-
},
|
|
5049
|
-
{
|
|
5050
|
-
id: "ipad-11",
|
|
5051
|
-
platform: "iPad",
|
|
5052
|
-
display: "11-inch display",
|
|
5053
|
-
requirement: null,
|
|
5054
|
-
fallback: "App Store Connect uses scaled 13-inch screenshots when this slot is omitted.",
|
|
5055
|
-
validatorTargetId: "apple-ipad-11",
|
|
5056
|
-
sizes: [
|
|
5057
|
-
{ width: 1488, height: 2266, orientation: "portrait" },
|
|
5058
|
-
{ width: 2266, height: 1488, orientation: "landscape" },
|
|
5059
|
-
{ width: 1668, height: 2420, orientation: "portrait" },
|
|
5060
|
-
{ width: 2420, height: 1668, orientation: "landscape" },
|
|
5061
|
-
{ width: 1668, height: 2388, orientation: "portrait" },
|
|
5062
|
-
{ width: 2388, height: 1668, orientation: "landscape" },
|
|
5063
|
-
{ width: 1640, height: 2360, orientation: "portrait" },
|
|
5064
|
-
{ width: 2360, height: 1640, orientation: "landscape" }
|
|
5065
|
-
]
|
|
5066
|
-
},
|
|
5067
|
-
{
|
|
5068
|
-
id: "ipad-10-5",
|
|
5069
|
-
platform: "iPad",
|
|
5070
|
-
display: "10.5-inch display",
|
|
5071
|
-
requirement: null,
|
|
5072
|
-
fallback: "App Store Connect uses scaled 12.9-inch screenshots when this slot is omitted.",
|
|
5073
|
-
validatorTargetId: "apple-ipad-105",
|
|
5074
|
-
sizes: [
|
|
5075
|
-
{ width: 1668, height: 2224, orientation: "portrait" },
|
|
5076
|
-
{ width: 2224, height: 1668, orientation: "landscape" }
|
|
5077
|
-
]
|
|
5078
|
-
},
|
|
5079
|
-
{
|
|
5080
|
-
id: "ipad-9-7",
|
|
5081
|
-
platform: "iPad",
|
|
5082
|
-
display: "9.7-inch display",
|
|
5083
|
-
requirement: null,
|
|
5084
|
-
fallback: "App Store Connect uses scaled 10.5-inch screenshots when this slot is omitted.",
|
|
5085
|
-
validatorTargetId: "apple-ipad-97",
|
|
5086
|
-
sizes: [
|
|
5087
|
-
{ width: 1536, height: 2008, orientation: "portrait", note: "without status bar" },
|
|
5088
|
-
{ width: 1536, height: 2048, orientation: "portrait", note: "with status bar" },
|
|
5089
|
-
{ width: 2048, height: 1496, orientation: "landscape", note: "without status bar" },
|
|
5090
|
-
{ width: 2048, height: 1536, orientation: "landscape", note: "with status bar" },
|
|
5091
|
-
{ width: 768, height: 1004, orientation: "portrait", note: "without status bar" },
|
|
5092
|
-
{ width: 768, height: 1024, orientation: "portrait", note: "with status bar" },
|
|
5093
|
-
{ width: 1024, height: 748, orientation: "landscape", note: "without status bar" },
|
|
5094
|
-
{ width: 1024, height: 768, orientation: "landscape", note: "with status bar" }
|
|
5095
|
-
]
|
|
5096
|
-
},
|
|
5097
|
-
{
|
|
5098
|
-
id: "mac",
|
|
5099
|
-
platform: "Mac",
|
|
5100
|
-
display: "Mac",
|
|
5101
|
-
requirement: "Required for Mac apps. Use a 16:10 aspect ratio.",
|
|
5102
|
-
fallback: null,
|
|
5103
|
-
validatorTargetId: "apple-mac",
|
|
5104
|
-
sizes: [
|
|
5105
|
-
{ width: 1280, height: 800, orientation: "landscape" },
|
|
5106
|
-
{ width: 1440, height: 900, orientation: "landscape" },
|
|
5107
|
-
{ width: 2560, height: 1600, orientation: "landscape" },
|
|
5108
|
-
{ width: 2880, height: 1800, orientation: "landscape" }
|
|
5109
|
-
]
|
|
5110
|
-
},
|
|
5111
|
-
{
|
|
5112
|
-
id: "apple-tv",
|
|
5113
|
-
platform: "Apple TV",
|
|
5114
|
-
display: "Apple TV",
|
|
5115
|
-
requirement: "Required for Apple TV apps.",
|
|
5116
|
-
fallback: null,
|
|
5117
|
-
sizes: [
|
|
5118
|
-
{ width: 1920, height: 1080, orientation: "landscape" },
|
|
5119
|
-
{ width: 3840, height: 2160, orientation: "landscape" }
|
|
5120
|
-
]
|
|
5121
|
-
},
|
|
5122
|
-
{
|
|
5123
|
-
id: "apple-vision-pro",
|
|
5124
|
-
platform: "Apple Vision Pro",
|
|
5125
|
-
display: "Apple Vision Pro",
|
|
5126
|
-
requirement: "Required for Apple Vision Pro apps.",
|
|
5127
|
-
fallback: null,
|
|
5128
|
-
sizes: [{ width: 3840, height: 2160, orientation: "landscape" }]
|
|
5129
|
-
},
|
|
5130
|
-
{
|
|
5131
|
-
id: "apple-watch",
|
|
5132
|
-
platform: "Apple Watch",
|
|
5133
|
-
display: "Apple Watch",
|
|
5134
|
-
requirement: "Required for Apple Watch apps. Use the same size across every localization.",
|
|
5135
|
-
fallback: null,
|
|
5136
|
-
sizes: [
|
|
5137
|
-
{ width: 422, height: 514, orientation: "portrait", note: "Ultra 4 and Ultra 3" },
|
|
5138
|
-
{ width: 410, height: 502, orientation: "portrait", note: "Ultra 2 and Ultra" },
|
|
5139
|
-
{ width: 416, height: 496, orientation: "portrait", note: "Series 12, Series 11, and Series 10" },
|
|
5140
|
-
{ width: 396, height: 484, orientation: "portrait", note: "Series 9, Series 8, and Series 7" },
|
|
5141
|
-
{ width: 368, height: 448, orientation: "portrait", note: "Series 6, Series 5, Series 4, SE 3, SE 2, and SE" },
|
|
5142
|
-
{ width: 312, height: 390, orientation: "portrait", note: "Series 3, Series 2, and Series 1" }
|
|
5143
|
-
]
|
|
5144
|
-
}
|
|
5145
|
-
]
|
|
5146
|
-
};
|
|
5147
|
-
function getAppleScreenshotSlotByValidatorTarget2(targetId) {
|
|
5148
|
-
return appleScreenshotSpecifications2.slots.find((slot) => slot.validatorTargetId === targetId);
|
|
5149
|
-
}
|
|
5150
|
-
|
|
5151
|
-
// ../store-screenshot-specs/dist/index.js
|
|
5152
|
-
var appleSource2 = appleScreenshotSpecifications2.sourceUrl;
|
|
5153
|
-
var appleVerifiedAt2 = appleScreenshotSpecifications2.verifiedAt;
|
|
5154
|
-
function acceptedAppleSizes2(targetId) {
|
|
5155
|
-
const slot = getAppleScreenshotSlotByValidatorTarget2(targetId);
|
|
5156
|
-
if (!slot)
|
|
5157
|
-
throw new Error(`Missing Apple screenshot specification for validator target ${targetId}`);
|
|
5158
|
-
return slot.sizes.map((size) => `${size.width}x${size.height}`);
|
|
5159
|
-
}
|
|
5160
|
-
var storeTargets2 = {
|
|
5161
|
-
"apple-iphone-duo": {
|
|
5162
|
-
name: "App Store Connect \xB7 iPhone Duo",
|
|
5163
|
-
shortName: "iPhone Duo",
|
|
5164
|
-
source: appleSource2,
|
|
5165
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5166
|
-
verifiedAt: appleVerifiedAt2,
|
|
5167
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact iPhone Duo outer- or inner-display size.",
|
|
5168
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-duo")
|
|
5169
|
-
},
|
|
5170
|
-
"apple-iphone-69": {
|
|
5171
|
-
name: "App Store Connect \xB7 iPhone Dynamic Island, large (6.9-inch)",
|
|
5172
|
-
shortName: "iPhone Dynamic Island, large (6.9-inch)",
|
|
5173
|
-
source: appleSource2,
|
|
5174
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5175
|
-
verifiedAt: appleVerifiedAt2,
|
|
5176
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact current Dynamic Island (large display) size.",
|
|
5177
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-69")
|
|
5178
|
-
},
|
|
5179
|
-
"apple-iphone-65": {
|
|
5180
|
-
name: "App Store Connect \xB7 iPhone Face ID, large (6.5-inch)",
|
|
5181
|
-
shortName: "iPhone Face ID, large (6.5-inch)",
|
|
5182
|
-
source: appleSource2,
|
|
5183
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5184
|
-
verifiedAt: appleVerifiedAt2,
|
|
5185
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact Face ID (large display) size.",
|
|
5186
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-65")
|
|
5187
|
-
},
|
|
5188
|
-
"apple-iphone-63": {
|
|
5189
|
-
name: "App Store Connect \xB7 iPhone Dynamic Island, medium (6.3-inch)",
|
|
5190
|
-
shortName: "iPhone Dynamic Island, medium (6.3-inch)",
|
|
5191
|
-
source: appleSource2,
|
|
5192
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5193
|
-
verifiedAt: appleVerifiedAt2,
|
|
5194
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact Dynamic Island (medium display) size.",
|
|
5195
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-63")
|
|
5196
|
-
},
|
|
5197
|
-
"apple-iphone-61": {
|
|
5198
|
-
name: "App Store Connect \xB7 iPhone Face ID, medium (6.1-inch)",
|
|
5199
|
-
shortName: "iPhone Face ID, medium (6.1-inch)",
|
|
5200
|
-
source: appleSource2,
|
|
5201
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5202
|
-
verifiedAt: appleVerifiedAt2,
|
|
5203
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact Face ID (medium display) size.",
|
|
5204
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-61")
|
|
5205
|
-
},
|
|
5206
|
-
"apple-iphone-55": {
|
|
5207
|
-
name: "App Store Connect \xB7 iPhone Home Button, large (5.5-inch)",
|
|
5208
|
-
shortName: "iPhone Home Button, large (5.5-inch)",
|
|
5209
|
-
source: appleSource2,
|
|
5210
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5211
|
-
verifiedAt: appleVerifiedAt2,
|
|
5212
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using the exact Home Button (large display) size.",
|
|
5213
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-55")
|
|
5214
|
-
},
|
|
5215
|
-
"apple-iphone-47": {
|
|
5216
|
-
name: "App Store Connect \xB7 iPhone Home Button, medium (4.7-inch)",
|
|
5217
|
-
shortName: "iPhone Home Button, medium (4.7-inch)",
|
|
5218
|
-
source: appleSource2,
|
|
5219
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5220
|
-
verifiedAt: appleVerifiedAt2,
|
|
5221
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using the exact Home Button (medium display) size.",
|
|
5222
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-47")
|
|
5223
|
-
},
|
|
5224
|
-
"apple-iphone-4": {
|
|
5225
|
-
name: "App Store Connect \xB7 iPhone Home Button, 4-inch",
|
|
5226
|
-
shortName: "iPhone Home Button, 4-inch",
|
|
5227
|
-
source: appleSource2,
|
|
5228
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5229
|
-
verifiedAt: appleVerifiedAt2,
|
|
5230
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact 4-inch Home Button size with or without the status bar.",
|
|
5231
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-4")
|
|
5232
|
-
},
|
|
5233
|
-
"apple-iphone-35": {
|
|
5234
|
-
name: "App Store Connect \xB7 iPhone Home Button, 3.5-inch",
|
|
5235
|
-
shortName: "iPhone Home Button, 3.5-inch",
|
|
5236
|
-
source: appleSource2,
|
|
5237
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5238
|
-
verifiedAt: appleVerifiedAt2,
|
|
5239
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact 3.5-inch Home Button size with or without the status bar.",
|
|
5240
|
-
acceptedSizes: acceptedAppleSizes2("apple-iphone-35")
|
|
5241
|
-
},
|
|
5242
|
-
"apple-ipad-13": {
|
|
5243
|
-
name: "App Store Connect \xB7 iPad 13-inch",
|
|
5244
|
-
shortName: "iPad 13-inch",
|
|
5245
|
-
source: appleSource2,
|
|
5246
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5247
|
-
verifiedAt: appleVerifiedAt2,
|
|
5248
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact current 13-inch iPad size.",
|
|
5249
|
-
acceptedSizes: acceptedAppleSizes2("apple-ipad-13")
|
|
5250
|
-
},
|
|
5251
|
-
"apple-ipad-129": {
|
|
5252
|
-
name: "App Store Connect \xB7 iPad 12.9-inch",
|
|
5253
|
-
shortName: "iPad 12.9-inch",
|
|
5254
|
-
source: appleSource2,
|
|
5255
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5256
|
-
verifiedAt: appleVerifiedAt2,
|
|
5257
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using the exact 12.9-inch iPad size.",
|
|
5258
|
-
acceptedSizes: acceptedAppleSizes2("apple-ipad-129")
|
|
5259
|
-
},
|
|
5260
|
-
"apple-ipad-11": {
|
|
5261
|
-
name: "App Store Connect \xB7 iPad 11-inch",
|
|
5262
|
-
shortName: "iPad 11-inch",
|
|
5263
|
-
source: appleSource2,
|
|
5264
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5265
|
-
verifiedAt: appleVerifiedAt2,
|
|
5266
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact 11-inch iPad size.",
|
|
5267
|
-
acceptedSizes: acceptedAppleSizes2("apple-ipad-11")
|
|
5268
|
-
},
|
|
5269
|
-
"apple-ipad-105": {
|
|
5270
|
-
name: "App Store Connect \xB7 iPad 10.5-inch",
|
|
5271
|
-
shortName: "iPad 10.5-inch",
|
|
5272
|
-
source: appleSource2,
|
|
5273
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5274
|
-
verifiedAt: appleVerifiedAt2,
|
|
5275
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using the exact 10.5-inch iPad size.",
|
|
5276
|
-
acceptedSizes: acceptedAppleSizes2("apple-ipad-105")
|
|
5277
|
-
},
|
|
5278
|
-
"apple-ipad-97": {
|
|
5279
|
-
name: "App Store Connect \xB7 iPad 9.7-inch",
|
|
5280
|
-
shortName: "iPad 9.7-inch",
|
|
5281
|
-
source: appleSource2,
|
|
5282
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5283
|
-
verifiedAt: appleVerifiedAt2,
|
|
5284
|
-
summary: "1\u201310 JPEG or PNG screenshots without transparency, using an exact 9.7-inch iPad size with or without the status bar.",
|
|
5285
|
-
acceptedSizes: acceptedAppleSizes2("apple-ipad-97")
|
|
5286
|
-
},
|
|
5287
|
-
"apple-mac": {
|
|
5288
|
-
name: "App Store Connect \xB7 Mac",
|
|
5289
|
-
shortName: "Apple \xB7 Mac",
|
|
5290
|
-
source: appleSource2,
|
|
5291
|
-
sourceLabel: "Apple screenshot specifications",
|
|
5292
|
-
verifiedAt: appleVerifiedAt2,
|
|
5293
|
-
summary: "1\u201310 JPEG or PNG screenshots, no transparency, using one of Apple\u2019s four exact 16:10 Mac sizes.",
|
|
5294
|
-
acceptedSizes: acceptedAppleSizes2("apple-mac")
|
|
5295
|
-
},
|
|
5296
|
-
"google-phone": {
|
|
5297
|
-
name: "Google Play \xB7 Phone",
|
|
5298
|
-
shortName: "Google Play",
|
|
5299
|
-
source: "https://support.google.com/googleplay/android-developer/answer/9866151?hl=en",
|
|
5300
|
-
sourceLabel: "Google Play preview asset guidance",
|
|
5301
|
-
verifiedAt: "2026-10-07",
|
|
5302
|
-
summary: "JPEG or 24-bit PNG without alpha, 320\u20133840 px, with the long edge no more than twice the short edge."
|
|
5303
|
-
},
|
|
5304
|
-
"microsoft-desktop": {
|
|
5305
|
-
name: "Microsoft Store \xB7 Desktop",
|
|
5306
|
-
shortName: "Microsoft \xB7 Desktop",
|
|
5307
|
-
source: "https://learn.microsoft.com/en-us/windows/apps/publish/publish-your-app/pwa/screenshots-and-images",
|
|
5308
|
-
sourceLabel: "Microsoft Store screenshot guidance",
|
|
5309
|
-
verifiedAt: "2026-10-07",
|
|
5310
|
-
summary: "1\u201310 PNG screenshots, at least 1366 \xD7 768 in landscape (or the portrait equivalent), up to 50 MB each."
|
|
5311
|
-
}
|
|
5312
|
-
};
|
|
5313
|
-
var appleTargetIds2 = ["apple-iphone-duo", "apple-iphone-69", "apple-iphone-65", "apple-iphone-63", "apple-iphone-61", "apple-iphone-55", "apple-iphone-47", "apple-iphone-4", "apple-iphone-35", "apple-ipad-13", "apple-ipad-129", "apple-ipad-11", "apple-ipad-105", "apple-ipad-97", "apple-mac"];
|
|
5314
|
-
function isAppleTarget2(target) {
|
|
5315
|
-
return appleTargetIds2.includes(target);
|
|
5316
|
-
}
|
|
5317
|
-
function screenshotExampleFor2(target) {
|
|
5318
|
-
if (isAppleTarget2(target)) {
|
|
5319
|
-
const [width, height] = storeTargets2[target].acceptedSizes[0].split("x").map(Number);
|
|
5320
|
-
return [1, 2, 3].map((index) => ({ name: `${String(index).padStart(2, "0")}-app-screen.png`, width, height, size: 25e5 + index * 41e4, mime: "image/png", hasAlpha: false, pngBitDepth: 8, pngColorType: 2 }));
|
|
5321
|
-
}
|
|
5322
|
-
if (target === "google-phone") {
|
|
5323
|
-
return [1, 2, 3, 4].map((index) => ({ name: `${String(index).padStart(2, "0")}-phone.png`, width: 1080, height: 1920, size: 18e5 + index * 25e4, mime: "image/png", hasAlpha: false, pngBitDepth: 8, pngColorType: 2 }));
|
|
5324
|
-
}
|
|
5325
|
-
return [1, 2, 3].map((index) => ({ name: `${String(index).padStart(2, "0")}-desktop.png`, width: 1920, height: 1080, size: 21e5 + index * 3e5, mime: "image/png", hasAlpha: false, pngBitDepth: 8, pngColorType: 2 }));
|
|
5326
|
-
}
|
|
5327
|
-
var screenshotExample2 = screenshotExampleFor2("apple-iphone-69");
|
|
5328
|
-
|
|
5329
|
-
// ../store-screenshot-specs/dist/specs.json
|
|
4876
|
+
// vendor/validate-store-screenshots/node_modules/@grunersoftware/store-screenshot-specs/dist/specs.json
|
|
5330
4877
|
var specs_default = {
|
|
5331
4878
|
schemaVersion: 1,
|
|
5332
4879
|
packageVersion: "0.1.0",
|
|
@@ -5912,7 +5459,7 @@ async function main() {
|
|
|
5912
5459
|
for (const key of ["directory", "workspace", "target"]) {
|
|
5913
5460
|
if (typeof request[key] !== "string" || !request[key].trim()) throw new Error(`${key} must be a non-empty string.`);
|
|
5914
5461
|
}
|
|
5915
|
-
const supported = [...
|
|
5462
|
+
const supported = [...appleTargetIds, "google-phone"];
|
|
5916
5463
|
if (!supported.includes(request.target)) throw new Error(`Unsupported target. Choose ${supported.join(", ")}.`);
|
|
5917
5464
|
for (const key of ["fail_on_error", "fail_on_review"]) {
|
|
5918
5465
|
if (typeof request[key] !== "boolean") throw new Error(`${key} must be a boolean.`);
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fastlane-plugin-store_screenshot_check
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Martin Grüner
|
|
@@ -47,7 +47,7 @@ licenses:
|
|
|
47
47
|
- MIT
|
|
48
48
|
metadata:
|
|
49
49
|
homepage_uri: https://github.com/MartinGryner/fastlane-plugin-store_screenshot_check
|
|
50
|
-
source_code_uri: https://github.com/MartinGryner/fastlane-plugin-store_screenshot_check/tree/v0.1.
|
|
50
|
+
source_code_uri: https://github.com/MartinGryner/fastlane-plugin-store_screenshot_check/tree/v0.1.1
|
|
51
51
|
bug_tracker_uri: https://github.com/MartinGryner/fastlane-plugin-store_screenshot_check/issues
|
|
52
52
|
rdoc_options: []
|
|
53
53
|
require_paths:
|