@gpc-cli/core 0.9.72 → 0.9.73

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.
package/dist/index.js CHANGED
@@ -4659,19 +4659,12 @@ async function diffAchievementConfig(client, achievementId, localData) {
4659
4659
  validateResourceId(achievementId, "achievement");
4660
4660
  const remote = await client.achievements.get(achievementId);
4661
4661
  const diffs = [];
4662
- const fields = [
4663
- "achievementType",
4664
- "initialState",
4665
- "stepsToUnlock",
4666
- "draft"
4667
- ];
4662
+ const fields = ["achievementType", "initialState", "stepsToUnlock", "draft"];
4668
4663
  for (const field of fields) {
4669
4664
  const localVal = JSON.stringify(
4670
4665
  localData[field] ?? null
4671
4666
  );
4672
- const remoteVal = JSON.stringify(
4673
- remote[field] ?? null
4674
- );
4667
+ const remoteVal = JSON.stringify(remote[field] ?? null);
4675
4668
  if (localVal !== remoteVal) {
4676
4669
  diffs.push({ field, local: localVal, remote: remoteVal });
4677
4670
  }
@@ -4707,9 +4700,7 @@ async function diffLeaderboardConfig(client, leaderboardId, localData) {
4707
4700
  const localVal = JSON.stringify(
4708
4701
  localData[field] ?? null
4709
4702
  );
4710
- const remoteVal = JSON.stringify(
4711
- remote[field] ?? null
4712
- );
4703
+ const remoteVal = JSON.stringify(remote[field] ?? null);
4713
4704
  if (localVal !== remoteVal) {
4714
4705
  diffs.push({ field, local: localVal, remote: remoteVal });
4715
4706
  }
@@ -4964,7 +4955,7 @@ async function initProject(options) {
4964
4955
  const preflightrc = JSON.stringify(
4965
4956
  {
4966
4957
  failOn: "error",
4967
- targetSdkMinimum: 35,
4958
+ targetSdkMinimum: 36,
4968
4959
  maxDownloadSizeMb: 150,
4969
4960
  allowedPermissions: [],
4970
4961
  disabledRules: [],
@@ -5582,8 +5573,8 @@ var manifestScanner = {
5582
5573
  ruleId: "geofencing-foreground-service",
5583
5574
  severity: "warning",
5584
5575
  title: `Possible geofencing via foreground service "${service.name}"`,
5585
- message: `Service "${service.name}" uses foregroundServiceType "location" and the app declares ACCESS_BACKGROUND_LOCATION. Google Play no longer approves geofencing as a foreground service use case (April 2026 policy). Compliance deadline: May 15, 2026.`,
5586
- suggestion: 'If this service performs geofencing, migrate to WorkManager or AlarmManager. If this is legitimate background location tracking (navigation, fitness), suppress this rule via .preflightrc.json: "disabledRules": ["geofencing-foreground-service"].',
5576
+ message: `Service "${service.name}" uses foregroundServiceType "location" and the app declares ACCESS_BACKGROUND_LOCATION. Google Play no longer approves geofencing as a foreground service use case (sensitive-permissions policy announced April 15, 2026); enforcement for apps targeting Android 17 (API 37+) begins October 28, 2026.`,
5577
+ suggestion: 'If this service performs geofencing, migrate to the Geofencing API (LocationServices.getGeofencingClient) or WorkManager/AlarmManager. If this is legitimate background location tracking (navigation, fitness), suppress this rule via .preflightrc.json: "disabledRules": ["geofencing-foreground-service"].',
5587
5578
  policyUrl: "https://support.google.com/googleplay/android-developer/answer/16926792"
5588
5579
  });
5589
5580
  }
@@ -5812,14 +5803,28 @@ var permissionsScanner = {
5812
5803
  ].filter((p) => manifest.permissions.includes(p) && !allowed.has(p));
5813
5804
  if (contactsPerms.length > 0) {
5814
5805
  const names = contactsPerms.map((p) => p.split(".").pop()).join(", ");
5806
+ const enforced = manifest.targetSdk >= 37 ? ` Your app targets API ${manifest.targetSdk}, so this is enforced.` : "";
5815
5807
  findings.push({
5816
5808
  scanner: "permissions",
5817
5809
  ruleId: "contacts-permission-broad",
5818
5810
  severity: "warning",
5819
5811
  title: "Broad contacts access requires migration to Contact Picker",
5820
- message: `Your app declares ${names}. Google Play now requires the Android Contact Picker instead of broad contacts access. Compliance deadline: May 15, 2026.`,
5821
- suggestion: "Migrate to the Android Contact Picker API for user-initiated contact selection. Remove READ_CONTACTS/WRITE_CONTACTS unless your app is a dialer, messaging, or contacts management app.",
5822
- policyUrl: "https://support.google.com/googleplay/android-developer/answer/16926792"
5812
+ message: `Your app declares ${names}. Google Play's Contacts Permissions policy requires the Android Contact Picker (Intent.ACTION_PICK_CONTACTS) unless broad access is core to your app. Mandatory for apps targeting Android 17 (API 37+) on October 28, 2026.${enforced}`,
5813
+ suggestion: "Migrate to the Android Contact Picker (Intent.ACTION_PICK_CONTACTS) for user-initiated contact selection, or file a Permissions Declaration Form before October 28, 2026 if the picker cannot serve your core functionality. Remove READ_CONTACTS/WRITE_CONTACTS unless your app is a dialer, messaging, or contacts management app.",
5814
+ policyUrl: "https://support.google.com/googleplay/android-developer/answer/16935362"
5815
+ });
5816
+ }
5817
+ const fineLocation = "android.permission.ACCESS_FINE_LOCATION";
5818
+ if (manifest.permissions.includes(fineLocation) && !allowed.has(fineLocation)) {
5819
+ const targetsApi37 = manifest.targetSdk >= 37;
5820
+ findings.push({
5821
+ scanner: "permissions",
5822
+ ruleId: "location-minimal-scope",
5823
+ severity: targetsApi37 ? "warning" : "info",
5824
+ title: "Precise location \u2014 consider the location button (minimum scope)",
5825
+ message: `Your app declares ACCESS_FINE_LOCATION. Google Play's Location Permissions policy makes the Android location button the recommended minimum scope for transactional (one-time) precise location. Mandatory for apps targeting Android 17 (API 37+) on October 28, 2026.${targetsApi37 ? ` Your app targets API ${manifest.targetSdk}.` : ""}`,
5826
+ suggestion: 'For one-time/transactional precise location, use the system location button instead of requesting ACCESS_FINE_LOCATION up front. Only keep continuous fine location if navigation, fitness, or a similar feature is core functionality. Suppress via .preflightrc.json "disabledRules": ["location-minimal-scope"] if fine location is essential.',
5827
+ policyUrl: "https://support.google.com/googleplay/android-developer/answer/17033915"
5823
5828
  });
5824
5829
  }
5825
5830
  const broadHealthPerm = "android.permission.health.READ_ALL_HEALTH_DATA";