From e969a4d543676c3dcae5d4d9e73c2dc230181ce8 Mon Sep 17 00:00:00 2001 From: finalerock44 <77282157+finalerock44@users.noreply.github.com> Date: Mon, 21 Sep 2026 11:40:12 +0100 Subject: [PATCH] feat(device): add the iPhone 17/18 Pro/Air and M5 iPads, drop two phantom slugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors the API enum after iOS 27 went GA. Also removes iphone-14-pro and iphone-15-pro, which this file has listed since it was written but which have never existed in the API — they only ever produced help text offering a value the backend rejects. Co-Authored-By: Claude Opus 5 (1M context) --- src/types/domain/device.types.ts | 19 +- src/types/generated/schema.types.ts | 294 ++++++++++++---------------- 2 files changed, 143 insertions(+), 170 deletions(-) diff --git a/src/types/domain/device.types.ts b/src/types/domain/device.types.ts index ba2f0fa..6bbe915 100644 --- a/src/types/domain/device.types.ts +++ b/src/types/domain/device.types.ts @@ -1,18 +1,31 @@ /** * Device type definitions - should be kept in sync with API - * @see /Users/riglar/repos/dcd/api/src/common/types/device.types.ts + * @see dcd/api/src/common/types/device.types.ts + * + * These drive `--ios-device` / `--android-device` help text and nothing else: + * the actual validation runs against the live compatibility payload + * (device-validation.service.ts), so a value the API has dropped produces a + * clear "not supported" error rather than a wrong local rejection. That makes + * a CLI *ahead* of the API safe and a CLI *behind* it not. + * + * `iphone-14-pro` and `iphone-15-pro` were listed here but have never existed + * in the API enum; removed 2026-09-21 rather than carried forward. */ export enum EiOSDevices { 'ipad-pro-6th-gen' = 'ipad-pro-6th-gen', + 'ipad-pro-m5-11' = 'ipad-pro-m5-11', + 'ipad-pro-m5-13' = 'ipad-pro-m5-13', 'iphone-14' = 'iphone-14', - 'iphone-14-pro' = 'iphone-14-pro', 'iphone-15' = 'iphone-15', - 'iphone-15-pro' = 'iphone-15-pro', 'iphone-16' = 'iphone-16', 'iphone-16-plus' = 'iphone-16-plus', 'iphone-16-pro' = 'iphone-16-pro', 'iphone-16-pro-max' = 'iphone-16-pro-max', + 'iphone-17' = 'iphone-17', + 'iphone-18-pro' = 'iphone-18-pro', + 'iphone-18-pro-max' = 'iphone-18-pro-max', + 'iphone-air' = 'iphone-air', } export enum EAndroidDevices { diff --git a/src/types/generated/schema.types.ts b/src/types/generated/schema.types.ts index 29897ea..c59d2a6 100644 --- a/src/types/generated/schema.types.ts +++ b/src/types/generated/schema.types.ts @@ -1652,9 +1652,11 @@ export interface components { /** @enum {string} */ iOSVersion?: "17" | "18" | "26" | "27"; /** @enum {string} */ - iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "ipad-pro-6th-gen"; + iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "iphone-17" | "iphone-air" | "iphone-18-pro" | "iphone-18-pro-max" | "ipad-pro-6th-gen" | "ipad-pro-m5-11" | "ipad-pro-m5-13"; platform?: string; googlePlay?: boolean; + /** @description Cancel the still-queued tests of the previous run from the same CI context. The context is derived from the run metadata (gh_repo/bb_repo, gh_branch/gh_pr_number or their bb_ twins, and gh_check_name); without it nothing is cancelled. Tests already running are left to finish. */ + cancelPrevious?: boolean; config: string; name?: string; /** @enum {string} */ @@ -1692,9 +1694,11 @@ export interface components { /** @enum {string} */ iOSVersion?: "17" | "18" | "26" | "27"; /** @enum {string} */ - iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "ipad-pro-6th-gen"; + iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "iphone-17" | "iphone-air" | "iphone-18-pro" | "iphone-18-pro-max" | "ipad-pro-6th-gen" | "ipad-pro-m5-11" | "ipad-pro-m5-13"; platform?: string; googlePlay?: boolean; + /** @description Cancel the still-queued tests of the previous run from the same CI context. The context is derived from the run metadata (gh_repo/bb_repo, gh_branch/gh_pr_number or their bb_ twins, and gh_check_name); without it nothing is cancelled. Tests already running are left to finish. */ + cancelPrevious?: boolean; config: string; name?: string; /** @enum {string} */ @@ -1743,9 +1747,11 @@ export interface components { /** @enum {string} */ iOSVersion?: "17" | "18" | "26" | "27"; /** @enum {string} */ - iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "ipad-pro-6th-gen"; + iOSDevice?: "iphone-14" | "iphone-15" | "iphone-16" | "iphone-16-plus" | "iphone-16-pro" | "iphone-16-pro-max" | "iphone-17" | "iphone-air" | "iphone-18-pro" | "iphone-18-pro-max" | "ipad-pro-6th-gen" | "ipad-pro-m5-11" | "ipad-pro-m5-13"; platform?: string; googlePlay?: boolean; + /** @description Cancel the still-queued tests of the previous run from the same CI context. The context is derived from the run metadata (gh_repo/bb_repo, gh_branch/gh_pr_number or their bb_ twins, and gh_check_name); without it nothing is cancelled. Tests already running are left to finish. */ + cancelPrevious?: boolean; config: string; name?: string; /** @enum {string} */ @@ -1881,6 +1887,7 @@ export interface components { retry_of?: number; fail_reason?: string; duration_seconds?: number; + cancellation_reason?: string; simulator_name?: string; config?: Record; }; @@ -2191,6 +2198,8 @@ export interface operations { message?: string; success?: boolean; cancelledCount?: number; + /** @description Credits returned for tests that had not started yet. 0 when nothing was refundable. See the billing docs for the rate. */ + refundedAmount?: number; }; }; }; @@ -2952,174 +2961,125 @@ export interface operations { * "statusCode": 200, * "data": { * "ios": { - * "iphone-14": { - * "name": "iPhone 14", - * "versions": [ - * "17", - * "18" - * ], - * "deprecated": false - * }, - * "iphone-15": { - * "name": "iPhone 15", - * "versions": [ - * "17" - * ], - * "deprecated": false - * }, - * "iphone-16": { - * "name": "iPhone 16", - * "versions": [ - * "18", - * "26" - * ], - * "deprecated": false - * }, - * "iphone-16-plus": { - * "name": "iPhone 16 Plus", - * "versions": [ - * "26" - * ], - * "deprecated": false - * }, - * "iphone-16-pro": { - * "name": "iPhone 16 Pro", - * "versions": [ - * "18", - * "26" - * ], - * "deprecated": false - * }, - * "iphone-16-pro-max": { - * "name": "iPhone 16 Pro Max", - * "versions": [ - * "18", - * "26" - * ], - * "deprecated": false - * }, - * "ipad-pro-6th-gen": { - * "name": "iPad Pro (6th gen)", - * "versions": [ - * "18", - * "26" - * ], - * "deprecated": false - * } + * "iphone-14": [ + * "17", + * "18" + * ], + * "iphone-15": [ + * "17" + * ], + * "iphone-16": [ + * "18", + * "26", + * "27" + * ], + * "iphone-16-plus": [ + * "26", + * "27" + * ], + * "iphone-16-pro": [ + * "18", + * "26", + * "27" + * ], + * "iphone-16-pro-max": [ + * "18", + * "26", + * "27" + * ], + * "iphone-17": [ + * "26", + * "27" + * ], + * "iphone-air": [ + * "26", + * "27" + * ], + * "iphone-18-pro": [ + * "27" + * ], + * "iphone-18-pro-max": [ + * "27" + * ], + * "ipad-pro-6th-gen": [ + * "18", + * "26", + * "27" + * ], + * "ipad-pro-m5-11": [ + * "26", + * "27" + * ], + * "ipad-pro-m5-13": [ + * "26", + * "27" + * ] * }, * "android": { - * "pixel-6": { - * "name": "Pixel 6", - * "apiLevels": [ - * "29", - * "30", - * "31", - * "32", - * "33", - * "34", - * "35", - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-6-pro": { - * "name": "Pixel 6 Pro", - * "apiLevels": [ - * "33", - * "35" - * ], - * "deprecated": false - * }, - * "pixel-7": { - * "name": "Pixel 7", - * "apiLevels": [ - * "33", - * "34", - * "35", - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-7-pro": { - * "name": "Pixel 7 Pro", - * "apiLevels": [ - * "33", - * "34", - * "35", - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-8": { - * "name": "Pixel 8", - * "apiLevels": [ - * "34", - * "35", - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-10": { - * "name": "Pixel 10", - * "apiLevels": [ - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-10-pro": { - * "name": "Pixel 10 Pro", - * "apiLevels": [ - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-10-pro-xl": { - * "name": "Pixel 10 Pro XL", - * "apiLevels": [ - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-10-pro-fold": { - * "name": "Pixel 10 Pro Fold", - * "apiLevels": [ - * "36", - * "37" - * ], - * "deprecated": false - * }, - * "pixel-11": { - * "name": "Pixel 11", - * "apiLevels": [ - * "37" - * ], - * "deprecated": false - * }, - * "generic-tablet": { - * "name": "Generic Tablet", - * "apiLevels": [ - * "33", - * "36", - * "37" - * ], - * "deprecated": false - * } + * "pixel-6": [ + * "29", + * "30", + * "31", + * "32", + * "33", + * "34", + * "35", + * "36", + * "37" + * ], + * "pixel-6-pro": [ + * "33", + * "35" + * ], + * "pixel-7": [ + * "33", + * "34", + * "35", + * "36", + * "37" + * ], + * "pixel-7-pro": [ + * "33", + * "34", + * "35", + * "36", + * "37" + * ], + * "pixel-8": [ + * "34", + * "35", + * "36", + * "37" + * ], + * "pixel-10": [ + * "36", + * "37" + * ], + * "pixel-10-pro": [ + * "36", + * "37" + * ], + * "pixel-10-pro-xl": [ + * "36", + * "37" + * ], + * "pixel-10-pro-fold": [ + * "36", + * "37" + * ], + * "pixel-11": [ + * "37" + * ], + * "generic-tablet": [ + * "33", + * "36", + * "37" + * ] * }, * "androidPlay": { - * "pixel-7": { - * "name": "Pixel 7 (Google Play)", - * "apiLevels": [ - * "34" - * ], - * "deprecated": false - * } + * "pixel-7": [ + * "34" + * ] * }, * "maestro": { * "supportedVersions": [