@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 +23 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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:
|
|
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
|
|
5586
|
-
suggestion: 'If this service performs geofencing, migrate to
|
|
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
|
|
5821
|
-
suggestion: "Migrate to the Android Contact Picker
|
|
5822
|
-
policyUrl: "https://support.google.com/googleplay/android-developer/answer/
|
|
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";
|