slowlane 1.0.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.
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AppStoreConnectClient = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const jwt = __importStar(require("jsonwebtoken"));
40
+ // API Client
41
+ class AppStoreConnectClient {
42
+ issuerId;
43
+ keyId;
44
+ privateKey;
45
+ baseUrl = 'https://api.appstoreconnect.apple.com/v1';
46
+ constructor(config, configDir) {
47
+ this.issuerId = config.issuer_id;
48
+ this.keyId = config.key_id;
49
+ const keyPath = path.isAbsolute(config.private_key_path)
50
+ ? config.private_key_path
51
+ : path.join(configDir, config.private_key_path);
52
+ this.privateKey = fs.readFileSync(keyPath, 'utf-8');
53
+ }
54
+ generateToken() {
55
+ const now = Math.floor(Date.now() / 1000);
56
+ const payload = {
57
+ iss: this.issuerId,
58
+ iat: now,
59
+ exp: now + 20 * 60, // 20 minutes
60
+ aud: 'appstoreconnect-v1',
61
+ };
62
+ return jwt.sign(payload, this.privateKey, {
63
+ algorithm: 'ES256',
64
+ keyid: this.keyId,
65
+ });
66
+ }
67
+ async request(endpoint, options) {
68
+ const token = this.generateToken();
69
+ const url = `${this.baseUrl}${endpoint}`;
70
+ const response = await fetch(url, {
71
+ method: options?.method ?? 'GET',
72
+ headers: {
73
+ Authorization: `Bearer ${token}`,
74
+ 'Content-Type': 'application/json',
75
+ },
76
+ body: options?.body ? JSON.stringify(options.body) : undefined,
77
+ });
78
+ if (!response.ok) {
79
+ const errorText = await response.text();
80
+ throw new Error(`App Store Connect API error: ${response.status} ${response.statusText}\n${errorText}`);
81
+ }
82
+ return response.json();
83
+ }
84
+ async listApps() {
85
+ const apps = [];
86
+ let nextUrl = '/apps';
87
+ while (nextUrl !== undefined) {
88
+ const currentUrl = nextUrl;
89
+ const endpoint = currentUrl.startsWith('http')
90
+ ? currentUrl.replace(this.baseUrl, '')
91
+ : currentUrl;
92
+ const response = await this.request(endpoint);
93
+ apps.push(...response.data);
94
+ nextUrl = response.links.next;
95
+ }
96
+ return apps;
97
+ }
98
+ async getAppByBundleId(bundleId) {
99
+ const response = await this.request(`/apps?filter[bundleId]=${encodeURIComponent(bundleId)}`);
100
+ return response.data[0] ?? null;
101
+ }
102
+ async getAppMetadata(bundleId, fromVersion = 'editable') {
103
+ const app = await this.getAppByBundleId(bundleId);
104
+ if (!app) {
105
+ throw new Error(`App not found with bundle ID: ${bundleId}`);
106
+ }
107
+ // Get app infos (contains state and age rating info)
108
+ const appInfosResponse = await this.request(`/apps/${app.id}/appInfos`);
109
+ // Find live and editable appInfos
110
+ const liveAppInfo = appInfosResponse.data.find(info => info.attributes.appStoreState === 'READY_FOR_SALE');
111
+ const editableAppInfo = appInfosResponse.data.find(info => info.attributes.appStoreState !== 'READY_FOR_SALE');
112
+ const appInfo = fromVersion === 'live'
113
+ ? (liveAppInfo ?? editableAppInfo)
114
+ : (editableAppInfo ?? liveAppInfo);
115
+ if (!appInfo) {
116
+ throw new Error(`No app info found for app: ${bundleId}`);
117
+ }
118
+ // Get app info localizations (name, subtitle, privacy policy)
119
+ const appInfoLocalizationsResponse = await this.request(`/appInfos/${appInfo.id}/appInfoLocalizations?limit=200`);
120
+ // Get app store versions to find live and editable versions
121
+ const versionsResponse = await this.request(`/apps/${app.id}/appStoreVersions?limit=10`);
122
+ // Find live version (READY_FOR_SALE) and editable version (PREPARE_FOR_SUBMISSION, etc.)
123
+ const liveVersion = versionsResponse.data.find(v => v.attributes.appStoreState === 'READY_FOR_SALE');
124
+ const editableVersion = versionsResponse.data.find(v => [
125
+ 'PREPARE_FOR_SUBMISSION',
126
+ 'WAITING_FOR_REVIEW',
127
+ 'IN_REVIEW',
128
+ 'PENDING_DEVELOPER_RELEASE',
129
+ ].includes(v.attributes.appStoreState));
130
+ // Get version localizations from the requested version
131
+ const versionForLocalizations = fromVersion === 'live'
132
+ ? (liveVersion ?? editableVersion)
133
+ : (editableVersion ?? liveVersion);
134
+ let versionLocalizations = [];
135
+ if (versionForLocalizations) {
136
+ const versionLocalizationsResponse = await this.request(`/appStoreVersions/${versionForLocalizations.id}/appStoreVersionLocalizations`);
137
+ versionLocalizations = versionLocalizationsResponse.data;
138
+ }
139
+ // Merge localizations by locale
140
+ const localeMap = new Map();
141
+ for (const loc of appInfoLocalizationsResponse.data) {
142
+ const locale = loc.attributes.locale;
143
+ localeMap.set(locale, {
144
+ locale,
145
+ name: loc.attributes.name,
146
+ subtitle: loc.attributes.subtitle,
147
+ privacyPolicyUrl: loc.attributes.privacyPolicyUrl,
148
+ });
149
+ }
150
+ for (const loc of versionLocalizations) {
151
+ const locale = loc.attributes.locale;
152
+ const existing = localeMap.get(locale) ?? { locale };
153
+ localeMap.set(locale, {
154
+ ...existing,
155
+ description: loc.attributes.description,
156
+ keywords: loc.attributes.keywords,
157
+ whatsNew: loc.attributes.whatsNew,
158
+ promotionalText: loc.attributes.promotionalText,
159
+ marketingUrl: loc.attributes.marketingUrl,
160
+ supportUrl: loc.attributes.supportUrl,
161
+ });
162
+ }
163
+ const localizations = Array.from(localeMap.values()).sort((a, b) => a.locale.localeCompare(b.locale));
164
+ return {
165
+ app,
166
+ appInfo,
167
+ liveVersion,
168
+ editableVersion,
169
+ localizations,
170
+ };
171
+ }
172
+ async getLatestVersion(bundleId) {
173
+ const app = await this.getAppByBundleId(bundleId);
174
+ if (!app) {
175
+ throw new Error(`App not found with bundle ID: ${bundleId}`);
176
+ }
177
+ // Get most recent version (sorted by createdDate desc by default)
178
+ const response = await this.request(`/apps/${app.id}/appStoreVersions?limit=1`);
179
+ return response.data[0] ?? null;
180
+ }
181
+ async createVersion(bundleId, versionString, platform) {
182
+ const app = await this.getAppByBundleId(bundleId);
183
+ if (!app) {
184
+ throw new Error(`App not found with bundle ID: ${bundleId}`);
185
+ }
186
+ // If no platform specified, copy from latest version
187
+ let targetPlatform = platform ?? 'IOS';
188
+ if (!platform) {
189
+ const latestVersion = await this.getLatestVersion(bundleId);
190
+ if (latestVersion) {
191
+ targetPlatform = latestVersion.attributes.platform;
192
+ }
193
+ }
194
+ const body = {
195
+ data: {
196
+ type: 'appStoreVersions',
197
+ attributes: {
198
+ platform: targetPlatform,
199
+ versionString,
200
+ },
201
+ relationships: {
202
+ app: {
203
+ data: { type: 'apps', id: app.id },
204
+ },
205
+ },
206
+ },
207
+ };
208
+ const response = await this.request('/appStoreVersions', { method: 'POST', body });
209
+ return response.data;
210
+ }
211
+ async setMetadata(bundleId, localizations) {
212
+ // Validate field lengths before making any API calls
213
+ const validationErrors = [];
214
+ for (const loc of localizations) {
215
+ if (loc.name && loc.name.length > 30) {
216
+ validationErrors.push(`${loc.locale}: name exceeds 30 characters (${loc.name.length})`);
217
+ }
218
+ if (loc.subtitle && loc.subtitle.length > 30) {
219
+ validationErrors.push(`${loc.locale}: subtitle exceeds 30 characters (${loc.subtitle.length})`);
220
+ }
221
+ if (loc.keywords && loc.keywords.length > 100) {
222
+ validationErrors.push(`${loc.locale}: keywords exceeds 100 characters (${loc.keywords.length})`);
223
+ }
224
+ }
225
+ if (validationErrors.length > 0) {
226
+ throw new Error(`Validation failed:\n ${validationErrors.join('\n ')}`);
227
+ }
228
+ const app = await this.getAppByBundleId(bundleId);
229
+ if (!app) {
230
+ throw new Error(`App not found with bundle ID: ${bundleId}`);
231
+ }
232
+ // Get app info for app-level localizations - find the editable one
233
+ const appInfosResponse = await this.request(`/apps/${app.id}/appInfos`);
234
+ // Find editable appInfo (not READY_FOR_SALE)
235
+ const editableAppInfo = appInfosResponse.data.find(info => info.attributes.appStoreState !== 'READY_FOR_SALE');
236
+ if (!editableAppInfo) {
237
+ throw new Error('No editable app info found. Create a new version first with create-version.');
238
+ }
239
+ const appInfo = editableAppInfo;
240
+ // Get existing app info localizations (limit=200 to avoid pagination issues)
241
+ const appInfoLocResponse = await this.request(`/appInfos/${appInfo.id}/appInfoLocalizations?limit=200`);
242
+ const existingAppInfoLocs = new Map(appInfoLocResponse.data.map(l => [l.attributes.locale, l]));
243
+ // Get editable version for version-level localizations
244
+ const versionsResponse = await this.request(`/apps/${app.id}/appStoreVersions?limit=10`);
245
+ const editableVersion = versionsResponse.data.find(v => [
246
+ 'PREPARE_FOR_SUBMISSION',
247
+ 'WAITING_FOR_REVIEW',
248
+ 'IN_REVIEW',
249
+ 'PENDING_DEVELOPER_RELEASE',
250
+ ].includes(v.attributes.appStoreState));
251
+ if (!editableVersion) {
252
+ throw new Error('No editable version found. Create a new version first with create-version.');
253
+ }
254
+ // Get existing version localizations (limit=200 to avoid pagination issues)
255
+ const versionLocResponse = await this.request(`/appStoreVersions/${editableVersion.id}/appStoreVersionLocalizations?limit=200`);
256
+ const existingVersionLocs = new Map(versionLocResponse.data.map(l => [l.attributes.locale, l]));
257
+ const results = {
258
+ appInfoLocalizationsUpdated: [],
259
+ appInfoLocalizationsCreated: [],
260
+ versionLocalizationsUpdated: [],
261
+ versionLocalizationsCreated: [],
262
+ };
263
+ for (const loc of localizations) {
264
+ // Update or create app info localization (name, subtitle, privacyPolicyUrl)
265
+ const appInfoAttrs = {};
266
+ if ('name' in loc)
267
+ appInfoAttrs.name = loc.name ?? null;
268
+ if ('subtitle' in loc)
269
+ appInfoAttrs.subtitle = loc.subtitle ?? null;
270
+ if ('privacyPolicyUrl' in loc)
271
+ appInfoAttrs.privacyPolicyUrl = loc.privacyPolicyUrl ?? null;
272
+ const hasAppInfoFields = Object.keys(appInfoAttrs).length > 0;
273
+ if (hasAppInfoFields) {
274
+ const existingAppInfoLoc = existingAppInfoLocs.get(loc.locale);
275
+ if (existingAppInfoLoc) {
276
+ await this.request(`/appInfoLocalizations/${existingAppInfoLoc.id}`, {
277
+ method: 'PATCH',
278
+ body: {
279
+ data: {
280
+ type: 'appInfoLocalizations',
281
+ id: existingAppInfoLoc.id,
282
+ attributes: appInfoAttrs,
283
+ },
284
+ },
285
+ });
286
+ results.appInfoLocalizationsUpdated.push(loc.locale);
287
+ }
288
+ else {
289
+ // Try to create, but handle duplicate error by falling back to PATCH
290
+ try {
291
+ await this.request('/appInfoLocalizations', {
292
+ method: 'POST',
293
+ body: {
294
+ data: {
295
+ type: 'appInfoLocalizations',
296
+ attributes: { locale: loc.locale, ...appInfoAttrs },
297
+ relationships: {
298
+ appInfo: { data: { type: 'appInfos', id: appInfo.id } },
299
+ },
300
+ },
301
+ },
302
+ });
303
+ results.appInfoLocalizationsCreated.push(loc.locale);
304
+ }
305
+ catch (error) {
306
+ // If duplicate error, fetch and PATCH instead
307
+ if (error instanceof Error &&
308
+ error.message.includes('DUPLICATE')) {
309
+ const refetch = await this.request(`/appInfos/${appInfo.id}/appInfoLocalizations?filter[locale]=${loc.locale}`);
310
+ const existing = refetch.data[0];
311
+ if (existing) {
312
+ await this.request(`/appInfoLocalizations/${existing.id}`, {
313
+ method: 'PATCH',
314
+ body: {
315
+ data: {
316
+ type: 'appInfoLocalizations',
317
+ id: existing.id,
318
+ attributes: appInfoAttrs,
319
+ },
320
+ },
321
+ });
322
+ results.appInfoLocalizationsUpdated.push(loc.locale);
323
+ }
324
+ else {
325
+ throw error;
326
+ }
327
+ }
328
+ else {
329
+ throw error;
330
+ }
331
+ }
332
+ }
333
+ }
334
+ // Update or create version localization
335
+ const versionAttrs = {};
336
+ if ('description' in loc)
337
+ versionAttrs.description = loc.description ?? null;
338
+ if ('keywords' in loc)
339
+ versionAttrs.keywords = loc.keywords ?? null;
340
+ if ('whatsNew' in loc)
341
+ versionAttrs.whatsNew = loc.whatsNew ?? null;
342
+ if ('promotionalText' in loc)
343
+ versionAttrs.promotionalText = loc.promotionalText ?? null;
344
+ if ('marketingUrl' in loc)
345
+ versionAttrs.marketingUrl = loc.marketingUrl ?? null;
346
+ if ('supportUrl' in loc)
347
+ versionAttrs.supportUrl = loc.supportUrl ?? null;
348
+ const hasVersionFields = Object.keys(versionAttrs).length > 0;
349
+ if (hasVersionFields) {
350
+ const existingVersionLoc = existingVersionLocs.get(loc.locale);
351
+ if (existingVersionLoc) {
352
+ await this.request(`/appStoreVersionLocalizations/${existingVersionLoc.id}`, {
353
+ method: 'PATCH',
354
+ body: {
355
+ data: {
356
+ type: 'appStoreVersionLocalizations',
357
+ id: existingVersionLoc.id,
358
+ attributes: versionAttrs,
359
+ },
360
+ },
361
+ });
362
+ results.versionLocalizationsUpdated.push(loc.locale);
363
+ }
364
+ else {
365
+ // Try to create, but handle duplicate error by falling back to PATCH
366
+ try {
367
+ await this.request('/appStoreVersionLocalizations', {
368
+ method: 'POST',
369
+ body: {
370
+ data: {
371
+ type: 'appStoreVersionLocalizations',
372
+ attributes: { locale: loc.locale, ...versionAttrs },
373
+ relationships: {
374
+ appStoreVersion: {
375
+ data: { type: 'appStoreVersions', id: editableVersion.id },
376
+ },
377
+ },
378
+ },
379
+ },
380
+ });
381
+ results.versionLocalizationsCreated.push(loc.locale);
382
+ }
383
+ catch (error) {
384
+ // If duplicate error, fetch and PATCH instead
385
+ if (error instanceof Error &&
386
+ error.message.includes('DUPLICATE')) {
387
+ const refetch = await this.request(`/appStoreVersions/${editableVersion.id}/appStoreVersionLocalizations?filter[locale]=${loc.locale}`);
388
+ const existing = refetch.data[0];
389
+ if (existing) {
390
+ await this.request(`/appStoreVersionLocalizations/${existing.id}`, {
391
+ method: 'PATCH',
392
+ body: {
393
+ data: {
394
+ type: 'appStoreVersionLocalizations',
395
+ id: existing.id,
396
+ attributes: versionAttrs,
397
+ },
398
+ },
399
+ });
400
+ results.versionLocalizationsUpdated.push(loc.locale);
401
+ }
402
+ else {
403
+ throw error;
404
+ }
405
+ }
406
+ else {
407
+ throw error;
408
+ }
409
+ }
410
+ }
411
+ }
412
+ }
413
+ return results;
414
+ }
415
+ }
416
+ exports.AppStoreConnectClient = AppStoreConnectClient;
417
+ //# sourceMappingURL=appstoreconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appstoreconnect.js","sourceRoot":"","sources":["../../src/appstoreconnect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SlowlaneConfig } from './appstoreconnect.js';
2
+ export declare function loadConfig(configPath?: string): {
3
+ config: SlowlaneConfig;
4
+ configDir: string;
5
+ };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadConfig = loadConfig;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const toml = __importStar(require("toml"));
40
+ function loadConfig(configPath) {
41
+ const resolvedPath = configPath ?? path.join(process.cwd(), 'slowlane.toml');
42
+ if (!fs.existsSync(resolvedPath)) {
43
+ throw new Error(`Config file not found: ${resolvedPath}`);
44
+ }
45
+ const content = fs.readFileSync(resolvedPath, 'utf-8');
46
+ const parsed = toml.parse(content);
47
+ const config = {};
48
+ if (parsed.appstore_connect) {
49
+ config.appstore_connect = {
50
+ issuer_id: parsed.appstore_connect.issuer_id,
51
+ key_id: parsed.appstore_connect.key_id,
52
+ private_key_path: parsed.appstore_connect.private_key_path,
53
+ };
54
+ }
55
+ if (parsed.google_play) {
56
+ config.google_play = {
57
+ service_account_path: parsed.google_play.service_account_path,
58
+ packages: parsed.google_play.packages,
59
+ };
60
+ }
61
+ return {
62
+ config,
63
+ configDir: path.dirname(resolvedPath),
64
+ };
65
+ }
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,gCAkCC;AAvDD,uCAAyB;AACzB,2CAA6B;AAC7B,2CAA6B;AAmB7B,SAAgB,UAAU,CAAC,UAAmB;IAI5C,MAAM,YAAY,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAE7E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;IAE5D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,GAAG;YACxB,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS;YAC5C,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM;YACtC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,gBAAgB;SAC3D,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG;YACnB,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,oBAAoB;YAC7D,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ;SACtC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { GooglePlayConfig } from './appstoreconnect.js';
2
+ export interface GooglePlayApp {
3
+ packageName: string;
4
+ displayName: string;
5
+ }
6
+ export interface GooglePlayListing {
7
+ language: string;
8
+ title?: string;
9
+ shortDescription?: string;
10
+ fullDescription?: string;
11
+ video?: string;
12
+ }
13
+ export interface GooglePlayMetadata {
14
+ packageName: string;
15
+ defaultLanguage?: string;
16
+ listings: GooglePlayListing[];
17
+ }
18
+ export interface GooglePlaySetMetadataResult {
19
+ listingsUpdated: string[];
20
+ listingsCreated: string[];
21
+ }
22
+ export declare class GooglePlayClient {
23
+ private readonly auth;
24
+ private readonly publisher;
25
+ constructor(config: GooglePlayConfig, configDir: string);
26
+ listApps(): Promise<GooglePlayApp[]>;
27
+ getMetadata(packageName: string): Promise<GooglePlayMetadata>;
28
+ setMetadata(packageName: string, listings: GooglePlayListing[], options?: {
29
+ sendForReview?: boolean;
30
+ }): Promise<GooglePlaySetMetadataResult>;
31
+ }