diff options
| author | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
|---|---|---|
| committer | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
| commit | bce557cc2dc767628bed6aac87301a1be7c5431b (patch) | |
| tree | b51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet-app/app-store/tmp/src/common/developer | |
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/developer')
| -rw-r--r-- | node_modules/@jet-app/app-store/tmp/src/common/developer/developer-common.js | 611 | ||||
| -rw-r--r-- | node_modules/@jet-app/app-store/tmp/src/common/developer/developer-request.js | 115 |
2 files changed, 726 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-common.js b/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-common.js new file mode 100644 index 0000000..881c01d --- /dev/null +++ b/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-common.js @@ -0,0 +1,611 @@ +import * as validation from "@jet/environment/json/validation"; +import * as models from "../../api/models"; +import * as serverData from "../../foundation/json-parsing/server-data"; +import * as mediaAttributes from "../../foundation/media/attributes"; +import * as mediaDataStructure from "../../foundation/media/data-structure"; +import * as mediaRelationship from "../../foundation/media/relationships"; +import { Path, Protocol } from "../../foundation/network/url-constants"; +import * as client from "../../foundation/wrappers/client"; +import { watchosDeveloperRelationshipKey } from "./developer-request"; +import * as content from "../content/content"; +import * as lockups from "../lockups/lockups"; +import * as metricsHelpersClicks from "../metrics/helpers/clicks"; +import * as metricsHelpersImpressions from "../metrics/helpers/impressions"; +import * as metricsHelpersLocation from "../metrics/helpers/location"; +import * as metricsHelpersPage from "../metrics/helpers/page"; +import * as room from "../room/room-common"; +export class DeveloperRoomToken extends room.RoomPageToken { +} +/// Ordering of shelves for macOS developer page per Relationship key. +/// @seealso mediaUrlMapping.macOSDeveloperRelationshipKeys +const macosDeveloperRelationshipOrder = [ + "latest-release-app", + "arcade-apps", + "app-bundles", + "mac-apps", + "mac-os-compatible-ios-apps", +]; +/// Ordering of shelves for iOS developer page per Relationship key. +/// @seealso mediaUrlMapping.iosDeveloperRelationshipKeys +const iosDeveloperRelationshipOrder = [ + "latest-release-app", + "arcade-apps", + "system-apps", + "app-bundles", + "ios-apps", + "imessage-apps", + "watch-apps", + "atv-apps", +]; +/// The threshold for when to show the see all button. +const seeAllThreshold = 8; +/// Ordering of shelves for macOS developer page per Relationship key. +/// @seealso mediaUrlMapping.macOSDeveloperRelationshipKeys +const visionOSDeveloperRelationshipOrder = [ + "latest-release-app", + "xros-apps", + "arcade-apps", + "ios-apps", +]; +/// Ordering of shelves for the web developer page per Relationship key. +/// @seealso mediaUrlMapping.macOSDeveloperRelationshipKeys +const webDeveloperRelationshipOrder = [ + "latest-release-app", + "system-apps", + "app-bundles", + "ios-apps", + "mac-apps", + "arcade-apps", + "xros-apps", + "atv-apps", + "watch-apps", + "imessage-apps", +]; +export class DeveloperPageShelfToken { +} +export function developerPageFromResponse(objectGraph, response) { + return validation.context("developerPageFromResponse", () => { + const developerData = response.data.length ? response.data[0] : null; + if (!developerData) { + return null; + } + const metricsPageInformation = metricsHelpersPage.metricsPageInformationFromMediaApiResponse(objectGraph, "Artist", developerData.id, response); + const locationTracker = metricsHelpersLocation.newLocationTracker(); + const shelves = shelvesForDeveloperData(objectGraph, developerData, metricsPageInformation, locationTracker); + // A single shelf should be vertical + if (shelves.length === 1) { + shelves[0].isHorizontal = false; + } + // Add developer description + const itunesNotes = content.notesFromData(objectGraph, developerData, "standard"); + if (itunesNotes) { + const paragraph = new models.Paragraph(itunesNotes, "text/x-apple-as3-nqml"); + const shelf = new models.Shelf("paragraph"); + shelf.items = [paragraph]; + shelves.unshift(shelf); + } + // Create the page + const page = new models.GenericPage(shelves); + page.title = mediaAttributes.attributeAsString(developerData, "name"); + if (objectGraph.client.deviceType !== "watch") { + page.presentationOptions = ["prefersLargeTitle"]; + } + page.canonicalURL = mediaAttributes.attributeAsString(developerData, "url"); + // Setup metrics + metricsHelpersPage.addMetricsEventsToPageWithInformation(objectGraph, page, metricsPageInformation); + // Add the uber + const uber = mediaAttributes.attributeAsDictionary(developerData, "editorialArtwork.bannerUber"); + if (uber && !objectGraph.client.isVision) { + const uberArtwork = content.artworkFromApiArtwork(objectGraph, uber, { + cropCode: "sr", + useCase: 21 /* content.ArtworkUseCase.Uber */, + }); + page.uber = uberArtwork; + if (objectGraph.client.isiOS || objectGraph.client.isWeb) { + const uberShelf = new models.Shelf("uber"); + const uberModel = new models.Uber("above"); + uberModel.artwork = uberArtwork; + uberShelf.items = [uberModel]; + uberModel.title = page.title; + shelves.unshift(uberShelf); + page.presentationOptions.push("prefersNonStandardBackButton"); + if (!objectGraph.client.isWeb) { + page.presentationOptions.push("prefersOverlayedPageHeader"); + } + } + } + return page; + }); +} +function shelvesForDeveloperData(objectGraph, data, metricsPageInformation, locationTracker) { + switch (objectGraph.client.deviceType) { + case "mac": + return macosShelvesForDeveloperData(objectGraph, data, metricsPageInformation, locationTracker); + case "watch": + return flatShelvesForDeveloperData(objectGraph, "smallLockup", data, watchosDeveloperRelationshipKey, objectGraph.loc.string("DEVELOPER_WATCH"), metricsPageInformation, locationTracker); + case "vision": + return orderedShelvesForDeveloperData(objectGraph, data, visionOSDeveloperRelationshipOrder, metricsPageInformation, locationTracker); + case "web": + return orderedShelvesForDeveloperData(objectGraph, data, webDeveloperRelationshipOrder, metricsPageInformation, locationTracker); + default: + return orderedShelvesForDeveloperData(objectGraph, data, iosDeveloperRelationshipOrder, metricsPageInformation, locationTracker); + } +} +/** + * Returns the iOS shelf title for a given relationship. + * @param relationshipKey The relationship key. + * @param developerData Media API data for the developer page. + * @returns The localized shelf title. + */ +function iosShelfTitle(objectGraph, relationshipKey, developerData) { + switch (relationshipKey) { + case "latest-release-app": + return objectGraph.loc.string("DEVELOPER_LATEST_RELEASE"); + case "system-apps": + return objectGraph.loc.string("DEVELOPER_SYSTEM_APPS"); + case "imessage-apps": + return objectGraph.loc.string("DEVELOPER_IMESSAGE"); + case "watch-apps": + return objectGraph.loc.string("DEVELOPER_WATCH"); + case "atv-apps": + return objectGraph.loc.string("DEVELOPER_TV"); + case "app-bundles": + return objectGraph.loc.string("DEVELOPER_BUNDLES"); + case "xros-apps": + return objectGraph.loc.string("DEVELOPER_VISION"); + case "ios-apps": + const hasApps = mediaAttributes.attributeAsBooleanOrFalse(developerData, "hasApps"); + const hasGames = mediaAttributes.attributeAsBooleanOrFalse(developerData, "hasGames"); + if (hasApps && hasGames) { + return objectGraph.loc.string("DEVELOPER_APPS_AND_GAMES"); + } + else if (hasGames) { + return objectGraph.loc.string("DEVELOPER_GAMES"); + } + else { + return objectGraph.loc.string("DEVELOPER_APPS"); + } + case "arcade-apps": + return objectGraph.loc.string("DEVELOPER_APPLE_ARCADE"); + default: + return null; + } +} +/** + * Returns the web shelf title for a given relationship. + * @param relationshipKey The relationship key. + * @param developerData Media API data for the developer page. + * @returns The localized shelf title. + */ +function webShelfTitle(objectGraph, relationshipKey, developerData) { + switch (relationshipKey) { + case "latest-release-app": + return objectGraph.loc.string("DEVELOPER_LATEST_RELEASE"); + case "system-apps": + return objectGraph.loc.string("DEVELOPER_SYSTEM_APPS"); + case "imessage-apps": + return objectGraph.loc.string("DEVELOPER_IMESSAGE"); + case "watch-apps": + return objectGraph.loc.string("DEVELOPER_WATCH"); + case "atv-apps": + return objectGraph.loc.string("DEVELOPER_TV"); + case "app-bundles": + return objectGraph.loc.string("DEVELOPER_BUNDLES"); + case "xros-apps": + return objectGraph.loc.string("DEVELOPER_VISION"); + case "ios-apps": + return objectGraph.loc.string("DEVELOPER_PHONE_PAD_APPS"); + case "arcade-apps": + return objectGraph.loc.string("DEVELOPER_APPLE_ARCADE"); + case "mac-apps": + return objectGraph.loc.string("DEVELOPER_MAC_APPS"); + case "mac-os-compatible-ios-apps": + return objectGraph.loc.string("DEVELOPER_PHONE_PAD_APPS"); + default: + return null; + } +} +function orderedShelvesForDeveloperData(objectGraph, developerData, developerRelationshipOrdering, metricsPageInformation, locationTracker) { + var _a, _b; + if (objectGraph.host.isiOS) { + // Filter duplicate Arcade apps on iOS + filterDuplicateApps(developerData, "arcade-apps", ["ios-apps", "atv-apps"]); + } + let shelfContentType; + let artworkUseCase; + switch (objectGraph.client.deviceType) { + case "tv": + shelfContentType = "mediumLockup"; + artworkUseCase = 2 /* content.ArtworkUseCase.LockupIconMedium */; + break; + case "web": + shelfContentType = "mediumLockup"; + artworkUseCase = 2 /* content.ArtworkUseCase.LockupIconMedium */; + break; + default: + shelfContentType = "smallLockup"; + artworkUseCase = 1 /* content.ArtworkUseCase.LockupIconSmall */; + break; + } + let shelfCount = 0; + const shelves = []; + for (const relationship of developerRelationshipOrdering) { + const dataContainer = mediaRelationship.relationship(developerData, relationship); + const sectionData = serverData.asArrayOrEmpty(dataContainer, "data"); + const contentCount = sectionData.length; + if (contentCount === 0) { + continue; + } + // Skip the latest release shelf if there are no items + // Note: This typically happens on the Apple developer page + // if the latest release is a system app that you're not eligible for + if (relationship === "latest-release-app" && contentCount === 0) { + continue; + } + // Setup some content specific options + let clientIdentifier; + if (relationship === "imessage-apps") { + clientIdentifier = client.messagesIdentifier; + } + else if (relationship === "watch-apps") { + clientIdentifier = client.watchIdentifier; + } + else if (relationship === "atv-apps") { + clientIdentifier = client.tvIdentifier; + } + else { + clientIdentifier = client.appStoreIdentifier; + } + // Determine the title + let shelfTitle; + if (objectGraph.client.isWeb) { + shelfTitle = webShelfTitle(objectGraph, relationship, developerData); + } + else { + shelfTitle = iosShelfTitle(objectGraph, relationship, developerData); + } + // Create a metrics context + metricsHelpersLocation.pushContentLocation(objectGraph, { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: "sequential", + id: `${shelfCount}`, + targetType: "swoosh", + }, shelfTitle); + // Create the shelf + const listOptions = { + lockupOptions: { + metricsOptions: { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + }, + clientIdentifierOverride: clientIdentifier, + artworkUseCase: artworkUseCase, + }, + filter: 76532 /* filtering.Filter.DeveloperPage */, + }; + // Determine the ids we need to load + const remainingData = sectionData.filter((data) => { + return serverData.isNullOrEmpty(data.attributes); + }); + // Vision doesn't support See All on developer page shelves currently. + const shouldShowSeeAll = (((_a = dataContainer.next) === null || _a === void 0 ? void 0 : _a.length) > 0 || contentCount >= seeAllThreshold) && + !(objectGraph.client.isVision || objectGraph.client.isWeb); + const shelf = shelfForData(objectGraph, shelfTitle, developerData.id, sectionData, relationship, shelfContentType, listOptions, metricsPageInformation, locationTracker, dataContainer.href, shouldShowSeeAll); + // Ensure we're not too high + const itemCount = shelf.items.length + remainingData.length; + if (objectGraph.client.isVision) { + if (itemCount < 5) { + shelf.rowsPerColumn = 1; + } + else if (itemCount < 10) { + shelf.rowsPerColumn = 2; + } + else { + shelf.rowsPerColumn = 3; + } + } + else if (objectGraph.client.isWeb) { + shelf.rowsPerColumn = itemCount > 3 ? 2 : 1; + } + else if (itemCount < 3) { + shelf.rowsPerColumn = itemCount; + } + // Add metrics before serializing token for url + const shelfMetricsOptions = { + id: null, + kind: null, + softwareType: null, + targetType: "swoosh", + title: shelf.title, + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: null, + }; + metricsHelpersLocation.popLocation(locationTracker); + metricsHelpersImpressions.addImpressionFields(objectGraph, shelf, shelfMetricsOptions); + metricsHelpersLocation.nextPosition(locationTracker); + if (remainingData.length) { + const token = new DeveloperPageShelfToken(); + token.title = shelfTitle; + token.developerId = developerData.id; + token.contentType = shelfContentType; + token.remainingData = remainingData; + token.lockupListOptions = listOptions; + token.relationship = relationship; + token.roomUrl = dataContainer.href; + token.shouldShowSeeAll = shouldShowSeeAll; + token.hasExistingContent = serverData.isDefinedNonNullNonEmpty(shelf.items); + shelf.url = + `${Protocol.internal}:/${Path.developer}/${Path.shelf}/` + encodeURIComponent(JSON.stringify(token)); + } + // Don't add the shelf if there are no items in it, and there is no more content to fetch. + if (shelf.items.length > 0 || ((_b = shelf.url) === null || _b === void 0 ? void 0 : _b.length) > 0) { + shelves.push(shelf); + shelfCount++; + } + } + return shelves; +} +/** + * Returns the macOS shelf title for a given relationship. + * @param relationshipKey The relationship key. + * @param developerData Media API data for the developer page. + * @returns The localized shelf title. + */ +function macosShelfTitle(objectGraph, relationshipKey, developerData) { + switch (relationshipKey) { + case "latest-release-app": + return objectGraph.loc.string("DEVELOPER_LATEST_RELEASE"); + case "app-bundles": + return objectGraph.loc.string("DEVELOPER_BUNDLES"); + case "mac-apps": + if (objectGraph.appleSilicon.isSupportEnabled) { + return objectGraph.loc.string("DEVELOPER_MAC_APPS"); + } + else { + const hasApps = mediaAttributes.attributeAsBooleanOrFalse(developerData, "hasApps"); + const hasGames = mediaAttributes.attributeAsBooleanOrFalse(developerData, "hasGames"); + if (hasApps && hasGames) { + return objectGraph.loc.string("DEVELOPER_APPS_AND_GAMES"); + } + else if (hasGames) { + return objectGraph.loc.string("DEVELOPER_GAMES"); + } + else { + return objectGraph.loc.string("DEVELOPER_APPS"); + } + } + case "mac-os-compatible-ios-apps": + return objectGraph.loc.string("DEVELOPER_PHONE_PAD_APPS"); + case "arcade-apps": + return objectGraph.loc.string("DEVELOPER_APPLE_ARCADE"); + default: + return null; + } +} +function macosShelvesForDeveloperData(objectGraph, developerData, metricsPageInformation, locationTracker) { + var _a; + // Filter duplicate apps + if (objectGraph.appleSilicon.isSupportEnabled) { + filterDuplicateApps(developerData, "arcade-apps", ["mac-apps", "mac-os-compatible-ios-apps"]); + filterDuplicateApps(developerData, "mac-apps", ["mac-os-compatible-ios-apps"]); + } + else { + filterDuplicateApps(developerData, "arcade-apps", ["mac-apps"]); + } + const shelfContentType = "smallLockup"; + const artworkUseCase = 1 /* content.ArtworkUseCase.LockupIconSmall */; + let shelfCount = 0; + const shelves = []; + for (const relationship of macosDeveloperRelationshipOrder) { + const dataContainer = mediaRelationship.relationship(developerData, relationship); + const sectionData = serverData.asArrayOrEmpty(dataContainer, "data"); + const contentCount = sectionData.length; + if (contentCount === 0) { + continue; + } + // Skip the latest release shelf if there are no items + // Note: This typically happens on the Apple developer page + // if the latest release is a system app that you're not eligible for + if (relationship === "latest-release-app" && contentCount === 0) { + continue; + } + // Determine the title + const shelfTitle = macosShelfTitle(objectGraph, relationship, developerData); + // Create a metrics context + metricsHelpersLocation.pushContentLocation(objectGraph, { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: "sequential", + id: `${shelfCount}`, + targetType: "swoosh", + }, shelfTitle); + // Create the shelf + const listOptions = { + lockupOptions: { + metricsOptions: { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + }, + artworkUseCase: artworkUseCase, + }, + filter: 76532 /* filtering.Filter.DeveloperPage */, + }; + // Determine the ids we need to load + const remainingData = sectionData.filter((data) => { + return serverData.isNullOrEmpty(data.attributes); + }); + const shouldShowSeeAll = ((_a = dataContainer.next) === null || _a === void 0 ? void 0 : _a.length) > 0 || contentCount >= seeAllThreshold; + const shelf = shelfForData(objectGraph, shelfTitle, developerData.id, sectionData, relationship, shelfContentType, listOptions, metricsPageInformation, locationTracker, dataContainer.href, shouldShowSeeAll); + // Ensure we're not too high + const itemCount = shelf.items.length + remainingData.length; + if (itemCount < 3) { + shelf.rowsPerColumn = itemCount; + } + // Add metrics before serializing token for url + const shelfMetricsOptions = { + id: null, + kind: null, + softwareType: null, + targetType: "swoosh", + title: shelf.title, + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: null, + }; + metricsHelpersLocation.popLocation(locationTracker); + metricsHelpersImpressions.addImpressionFields(objectGraph, shelf, shelfMetricsOptions); + metricsHelpersLocation.nextPosition(locationTracker); + if (remainingData.length) { + const token = new DeveloperPageShelfToken(); + token.title = shelfTitle; + token.developerId = developerData.id; + token.contentType = "smallLockup"; + token.remainingData = remainingData; + token.lockupListOptions = listOptions; + token.relationship = relationship; + token.roomUrl = dataContainer.href; + token.shouldShowSeeAll = shouldShowSeeAll; + token.hasExistingContent = serverData.isDefinedNonNullNonEmpty(shelf.items); + shelf.url = + `${Protocol.internal}:/${Path.developer}/${Path.shelf}/` + encodeURIComponent(JSON.stringify(token)); + } + // Don't add the shelf if there are no items in it + if (shelf.items.length > 0) { + shelves.push(shelf); + shelfCount++; + } + } + return shelves; +} +/** + * Creates a list of apps for the given relationship type. + */ +function flatShelvesForDeveloperData(objectGraph, contentType, developerData, relationshipType, shelfTitle, metricsPageInformation, locationTracker) { + const dataCollection = mediaRelationship.relationshipCollection(developerData, relationshipType); + const listOptions = { + lockupOptions: { + metricsOptions: { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + }, + artworkUseCase: 1 /* content.ArtworkUseCase.LockupIconSmall */, + }, + filter: 76532 /* filtering.Filter.DeveloperPage */, + }; + // Create a metrics context + metricsHelpersLocation.pushContentLocation(objectGraph, { + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: "sequential", + id: `0`, + targetType: "swoosh", + }, shelfTitle); + const shelf = shelfForData(objectGraph, shelfTitle, developerData.id, dataCollection, relationshipType, contentType, listOptions, metricsPageInformation, locationTracker, null, false); + // Determine the ids we need to load + const remainingData = dataCollection.filter((data) => { + return serverData.isNullOrEmpty(data.attributes); + }); + // Add metrics before serializing token for url + const shelfMetricsOptions = { + id: null, + kind: null, + softwareType: null, + targetType: "swoosh", + title: shelfTitle, + pageInformation: metricsPageInformation, + locationTracker: locationTracker, + idType: null, + }; + metricsHelpersLocation.popLocation(locationTracker); + metricsHelpersImpressions.addImpressionFields(objectGraph, shelf, shelfMetricsOptions); + metricsHelpersLocation.nextPosition(locationTracker); + if (remainingData.length) { + const token = new DeveloperPageShelfToken(); + token.title = shelfTitle; + token.developerId = developerData.id; + token.contentType = contentType; + token.remainingData = remainingData; + token.lockupListOptions = listOptions; + token.hasExistingContent = serverData.isDefinedNonNullNonEmpty(shelf.items); + shelf.url = + `${Protocol.internal}:/${Path.developer}/${Path.shelf}/` + encodeURIComponent(JSON.stringify(token)); + } + return [shelf]; +} +export function shelfForData(objectGraph, title, developerId, dataArray, developerRelationship, contentType, listOptions, pageInformation, locationTracker, roomUrl, includeSeeAll) { + const shelf = new models.Shelf(contentType); + shelf.title = title; + switch (contentType) { + case "screenshotsLockup": + shelf.items = lockups.screenshotsLockupsFromData(objectGraph, dataArray, listOptions); + shelf.isHorizontal = false; + shelf.presentationHints = { showSupplementaryText: false }; + break; + case "smallLockup": + default: + shelf.items = lockups.lockupsFromData(objectGraph, dataArray, listOptions); + shelf.isHorizontal = objectGraph.client.deviceType !== "watch"; + break; + } + if (includeSeeAll) { + // Create token for the see all room + const roomToken = new DeveloperRoomToken(); + roomToken.title = title; + roomToken.url = roomUrl; + roomToken.developerId = developerId; + roomToken.relationshipId = developerRelationship; + roomToken.clientIdentifierOverride = listOptions.lockupOptions.clientIdentifierOverride; + const seeAllAction = new models.FlowAction("page"); + seeAllAction.pageUrl = developerRoomUrlWithToken(objectGraph, roomToken); + seeAllAction.title = objectGraph.loc.string("ACTION_SEE_ALL"); + seeAllAction.pageData = room.seeAllPage(objectGraph, title); + metricsHelpersClicks.addClickEventToSeeAllAction(objectGraph, seeAllAction, seeAllAction.pageUrl, { + pageInformation, + locationTracker, + }); + shelf.seeAllAction = seeAllAction; + } + return shelf; +} +/** + * Determines the URL to use for the developer room page. + * @param {string} token The token to use. + * @returns {string} The string to use for the developer room page. + */ +function developerRoomUrlWithToken(objectGraph, token) { + if (!serverData.isDefinedNonNull(token)) { + return null; + } + return `${Protocol.internal}:/${Path.developer}/${Path.room}/` + encodeURIComponent(JSON.stringify(token)); +} +/** + * Prune duplicate entries for apps that can appear in other shelves by modifying `developerData` in place. + * For example if `arcade-apps` relation contains id `12345`, we want to prune `12345` from shelves like "Games" and "Apple TV" + */ +function filterDuplicateApps(developerData, authoritativeRelationshipKey, filteredRelationshipKeys) { + const arcadeRelationship = mediaRelationship.relationship(developerData, authoritativeRelationshipKey); + if (serverData.isNull(arcadeRelationship)) { + return; // No arcade relationship + } + const arcadeApps = mediaDataStructure.dataCollectionFromDataContainer(arcadeRelationship); + if (serverData.isNull(arcadeApps)) { + return; // No arcade relationship data + } + // IDs to filter from other shelves since they are in arcade shelf + const arcadeAppIds = arcadeApps.map((app) => app.id); + for (const relationshipKeyToFilter of filteredRelationshipKeys) { + const relationshipToFilter = mediaRelationship.relationship(developerData, relationshipKeyToFilter); + if (serverData.isNull(relationshipToFilter)) { + continue; // Skip if relationship didn't exist + } + const relationshipDataToFilter = mediaDataStructure.dataCollectionFromDataContainer(relationshipToFilter); + if (serverData.isNull(relationshipToFilter)) { + continue; // Skip if relationship had no `data` + } + // Overwrite with filtered data + developerData.relationships[relationshipKeyToFilter].data = relationshipDataToFilter.filter((data) => !arcadeAppIds.includes(data.id)); + } +} +//# sourceMappingURL=developer-common.js.map
\ No newline at end of file diff --git a/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-request.js b/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-request.js new file mode 100644 index 0000000..88c7e74 --- /dev/null +++ b/node_modules/@jet-app/app-store/tmp/src/common/developer/developer-request.js @@ -0,0 +1,115 @@ +import { Request, defaultAdditionalPlatformsForClient } from "../../foundation/media/data-fetching"; +import { shouldFetchCustomAttributes } from "../product-page/product-page-variants"; +import { shouldUsePrerenderedIconArtwork } from "../content/content"; +/** + * Returns the attributes to use for a developer media API request. + */ +export function developerAttributes(objectGraph) { + const attributes = ["editorialArtwork", "editorialVideo", "requiredCapabilities", "minimumOSVersion"]; + if (objectGraph.client.isMac) { + attributes.push("screenshotsByType"); + } + else { + attributes.push("isAppleWatchSupported"); + } + if (objectGraph.appleSilicon.isSupportEnabled) { + attributes.push("macRequiredCapabilities"); + } + if (objectGraph.client.isMac) { + attributes.push("hasMacIPAPackage"); + } + if (objectGraph.client.isVision) { + attributes.push("compatibilityControllerRequirement"); + } + if (objectGraph.bag.enableUpdatedAgeRatings) { + attributes.push("ageRating"); + } + if (shouldUsePrerenderedIconArtwork(objectGraph)) { + attributes.push("iconArtwork"); + } + return attributes; +} +export const iosDeveloperRelationshipKeys = [ + "latest-release-app", + "system-apps", + "arcade-apps", + "app-bundles", + "ios-apps", + "imessage-apps", + "watch-apps", + "atv-apps", +]; +export const visionOSDeveloperRelationshipKeys = [ + "latest-release-app", + "xros-apps", + "arcade-apps", + "ios-apps", +]; +export const macosDeveloperRelationshipKeys = [ + "latest-release-app", + "arcade-apps", + "app-bundles", + "mac-apps", +]; +export const webDeveloperRelationshipKeys = [ + "latest-release-app", + "system-apps", + "arcade-apps", + "app-bundles", + "ios-apps", + "imessage-apps", + "watch-apps", + "atv-apps", + "xros-apps", + "mac-apps", +]; +export const watchosDeveloperRelationshipKey = "watch-apps"; +function developerRelationships(objectGraph) { + let relationships = []; + switch (objectGraph.client.deviceType) { + case "mac": + relationships = relationships.concat(macosDeveloperRelationshipKeys); + if (objectGraph.appleSilicon.isSupportEnabled) { + relationships.push("mac-os-compatible-ios-apps"); + } + break; + case "watch": + relationships.push(watchosDeveloperRelationshipKey); + break; + case "vision": + relationships = relationships.concat(visionOSDeveloperRelationshipKeys); + break; + case "web": + relationships = relationships.concat(webDeveloperRelationshipKeys); + break; + default: + relationships = relationships.concat(iosDeveloperRelationshipKeys); + break; + } + return relationships; +} +/** + * Creates a {@linkcode Request} for a "developer" page with the given {@linkcode id} + */ +export function makeDeveloperRequest(objectGraph, id) { + const request = new Request(objectGraph).withIdOfType(id, "developers"); + return addDeveloperRequestProperties(objectGraph, request); +} +/** + * Add the expected request attributes (relationships, platforms, etc) to a request + * for a "developer" resource + */ +export function addDeveloperRequestProperties(objectGraph, request) { + request + .includingAdditionalPlatforms(defaultAdditionalPlatformsForClient(objectGraph)) + .includingRelationships(developerRelationships(objectGraph)) + .includingAttributes(developerAttributes(objectGraph)) + .includingMacOSCompatibleIOSAppsWhenSupported() + .usingCustomAttributes(shouldFetchCustomAttributes(objectGraph)); + if (objectGraph.client.isWeb) { + // The "web" client needs to load *all* of the data for SEO purposes + request.addingQuery("sparseLimit[developers:ios-apps]", "40"); + } + return request; +} +//# sourceMappingURL=developer-request.js.map
\ No newline at end of file |
