Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update/1.10.0 #16

Merged
merged 54 commits into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
db14dc5
Update ROADMAP.md
calvincestari Nov 13, 2023
78d3ba1
Add GitHub CODEOWNERS (apollographql/apollo-ios-dev#136)
calvincestari Nov 15, 2023
d4feb13
Update ROADMAP.md - timestamp
bignimbus Nov 16, 2023
7b26cd8
chore(deps): update secops orb to v2.0.2 (apollographql/apollo-ios-de…
svc-secops Nov 20, 2023
9ec294f
Adding GraphQLResult conversion extension (apollographql/apollo-ios-d…
BobaFetters Nov 21, 2023
7564cc0
tests: Add merged selection deferred test case (apollographql/apollo-…
calvincestari Nov 28, 2023
b852c0a
Update ROADMAP.md
calvincestari Nov 29, 2023
d09a8c6
chore(deps): Renovate dependency updates (apollographql/apollo-ios-de…
calvincestari Dec 1, 2023
3901362
Make ApolloInterceptor id requirement read-only (apollographql/apollo…
SebastianOsinski Dec 4, 2023
0c0a990
chore(deps): Update CircleCI secops orb version (apollographql/apollo…
calvincestari Dec 12, 2023
5cebbac
tests: TestCodegenConfigurations projects should fail on warnings (ap…
calvincestari Dec 13, 2023
f584fe6
2023-12-14 Roadmap update
bignimbus Dec 14, 2023
a683632
chore(deps): update actions/add-to-project action to v0.5.0 (apollogr…
svc-secops Dec 18, 2023
db2c028
2024-01-04 Roadmap update
bignimbus Jan 4, 2024
4a55efb
Add priority features to ROADMAP
AnthonyMDev Jan 6, 2024
28d38d3
chore(deps): update secops orb to v2.0.5 (apollographql/apollo-ios-de…
svc-secops Jan 8, 2024
74e71b8
feat: SECOPS-2525 - add semgrep job (apollographql/apollo-ios-dev#230)
calvincestari Jan 10, 2024
f806167
InstallCLI Plugin Updates (apollographql/apollo-ios-dev#132)
BobaFetters Jan 12, 2024
ff54632
release: 1.8.0 (apollographql/apollo-ios-dev#237)
calvincestari Jan 12, 2024
c8b0693
feat: SECOPS-2525 - add semgrep job (apollographql/apollo-ios-dev#233)
calvincestari Jan 16, 2024
1e69e83
chore: Removes boundary from header for Subscription operations (apo…
calvincestari Jan 16, 2024
79dbcd0
Fixing fragment definition generation when not generating operation d…
BobaFetters Jan 16, 2024
83c6ba0
[chore] Add user survey to READMEs (apollographql/apollo-ios-dev#227)
calvincestari Jan 17, 2024
a7e9615
2024-01-18 Roadmap update
bignimbus Jan 18, 2024
1d9b926
chore(deps): update secops orb to v2.0.7 (apollographql/apollo-ios-de…
svc-secops Jan 22, 2024
6bdaf4e
chore: User survey update (apollographql/apollo-ios-dev#246)
calvincestari Jan 25, 2024
6a918a5
Add privacy manifest for Apollo targets (apollographql/apollo-ios-dev…
BobaFetters Jan 31, 2024
6957435
Remove debug print statements for websocket status (apollographql/apo…
calvincestari Feb 2, 2024
74a16c7
release: 1.9.0 (apollographql/apollo-ios-dev#255)
calvincestari Feb 2, 2024
9855a2c
chore: Update user survey conditions (apollographql/apollo-ios-dev#258)
calvincestari Feb 6, 2024
6bfbed9
2024-02-06 Roadmap update
bignimbus Feb 6, 2024
da1ffac
chore: Fix user survey actions script (apollographql/apollo-ios-dev#263)
calvincestari Feb 9, 2024
33306e4
Make a caseless enum (apollographql/apollo-ios-dev#266)
vsanthanam Feb 13, 2024
b434fb9
2024-02-20 Roadmap update
bignimbus Feb 20, 2024
1f8afae
Feature/ContextIdentifier for the mutate queries (apollographql/apoll…
VladimirK-ah Mar 4, 2024
abeb8b4
release: 1.9.1 (apollographql/apollo-ios-dev#280)
calvincestari Mar 4, 2024
82b3217
chore(deps): update actions/add-to-project action to v0.6.0 (apollogr…
svc-secops Mar 6, 2024
10e4c15
Pagination - Change cancel() to reset() (apollographql/apollo-ios-dev…
AnthonyMDev Mar 6, 2024
5068c44
Update ROADMAP.md (apollographql/apollo-ios-dev#289)
calvincestari Mar 8, 2024
569f814
Session and task descriptions (apollographql/apollo-ios-dev#286)
hishma Mar 8, 2024
9e65157
Compatibility fixes for 1.9.1 (apollographql/apollo-ios-dev#290)
AnthonyMDev Mar 8, 2024
72aaf03
Release 1.9.2 (apollographql/apollo-ios-dev#291)
AnthonyMDev Mar 8, 2024
1dd23c2
Fix injecting of context for UploadRequest (apollographql/apollo-ios-…
RobertDresler Mar 18, 2024
5755cb4
2024-03-19 Roadmap updates
bignimbus Mar 19, 2024
3a70e65
Provide a direct means to observe changes in ApolloStore (apollograph…
jamesonwilliams Mar 22, 2024
4e716cd
fix: Remove empty arrays from privacy manifests (apollographql/apollo…
calvincestari Mar 22, 2024
eedde21
release: 1.9.3 (apollographql/apollo-ios-dev#310)
calvincestari Mar 22, 2024
3f1f53d
secops: 2024-03-25 (apollographql/apollo-ios-dev#315)
calvincestari Mar 25, 2024
d126608
chore(deps): update actions/add-to-project action to v1 (#325)
svc-secops Apr 1, 2024
4851f15
Add Sendable conformance to some basic SchemaTypes (apollographql/apo…
bdbergeron Apr 2, 2024
a267368
2024-04-02 Roadmap update
bignimbus Apr 2, 2024
7585fff
feature: Enable visionOS Support (apollographql/apollo-ios-dev#333)
calvincestari Apr 15, 2024
e41cc41
release: (apollographql/apollo-ios-dev#335)
calvincestari Apr 15, 2024
dbac621
Merge branch 'main' into peek-fork
ricardohg Apr 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
version: 2.1

orbs:
secops: apollo/[email protected].0
secops: apollo/[email protected].7

workflows:
security-scans:
Expand All @@ -13,3 +13,9 @@ workflows:
- secops-oidc
git-base-revision: <<#pipeline.git.base_revision>><<pipeline.git.base_revision>><</pipeline.git.base_revision >>
git-revision: << pipeline.git.revision >>
- secops/semgrep:
context:
- secops-oidc
- github-orb
git-base-revision: <<#pipeline.git.base_revision>><<pipeline.git.base_revision>><</pipeline.git.base_revision >>
fail-on-findings: true
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# This file was automatically generated by the Apollo SecOps team
# Please customize this file as needed prior to merging.

* @apollographql/client-swift
2 changes: 0 additions & 2 deletions .github/CODEOWNERS.md

This file was deleted.

27 changes: 27 additions & 0 deletions .github/workflows/issue-close-user-survey.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Issue Close User Survey

on:
issues:
types: [closed]

jobs:
user-survey-comment:
permissions:
issues: write
runs-on: ubuntu-latest
if: github.repository == 'apollographql/apollo-ios'
steps:
- run: |
if [ "$AUTHOR" == "MEMBER" ] && (( $COMMENTS == 0 )); then
echo "Issue opened by member with no comments, skipping user survey."
else
gh issue comment "$NUMBER" --body "$BODY"
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}
COMMENTS: ${{ github.event.issue.comments }}
AUTHOR: ${{ github.event.issue.author_association }}
BODY: >
Do you have any feedback for the maintainers? Please tell us by taking a [one-minute survey](https://docs.google.com/forms/d/e/1FAIpQLSczNDXfJne3ZUOXjk9Ursm9JYvhTh1_nFTDfdq3XBAFWCzplQ/viewform?usp=pp_url&entry.1170701325=Apollo+iOS&entry.204965213=GitHub+Issue). Your responses will help us understand Apollo iOS usage and allow us to serve you better.
2 changes: 1 addition & 1 deletion .github/workflows/prometheus-project-add.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Add to project
uses: actions/add-to-project@v0.4.0
uses: actions/add-to-project@v1.0.0
with:
project-url: https://github.com/orgs/apollographql/projects/21
github-token: ${{ secrets.PROMETHEUS_PROJECT_ACCESS_SECRET }}
Expand Down
10 changes: 9 additions & 1 deletion Apollo.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Pod::Spec.new do |s|
s.osx.deployment_target = '10.14'
s.tvos.deployment_target = '12.0'
s.watchos.deployment_target = '5.0'
s.visionos.deployment_target = '1.0'

cli_binary_name = 'apollo-ios-cli'
s.preserve_paths = [cli_binary_name]
Expand All @@ -22,20 +23,27 @@ Pod::Spec.new do |s|

s.subspec 'Core' do |ss|
ss.source_files = 'Sources/Apollo/**/*.swift','Sources/ApolloAPI/**/*.swift'
ss.resource_bundles = {'Apollo' => ['Sources/Apollo/Resources/PrivacyInfo.xcprivacy']}
end

# Apollo provides exactly one persistent cache out-of-the-box, as a reasonable default choice for
# those who require cache persistence. Third-party caches may use different storage mechanisms.
s.subspec 'SQLite' do |ss|
ss.source_files = 'Sources/ApolloSQLite/*.swift'
ss.dependency 'Apollo/Core'
ss.dependency 'SQLite.swift', '~>0.13.1'
ss.dependency 'SQLite.swift', '~>0.15.1'
ss.resource_bundles = {
'ApolloSQLite' => ['Sources/ApolloSQLite/Resources/PrivacyInfo.xcprivacy']
}
end

# Websocket and subscription support based on Starscream
s.subspec 'WebSocket' do |ss|
ss.source_files = 'Sources/ApolloWebSocket/**/*.swift'
ss.dependency 'Apollo/Core'
ss.resource_bundles = {
'ApolloWebSocket' => ['Sources/ApolloWebSocket/Resources/PrivacyInfo.xcprivacy']
}
end

end
70 changes: 70 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,75 @@
# Change Log

## v1.10.0

### New

- **Added support for visionOS ([#3320](https://github.com/apollographql/apollo-ios/issues/3320)):** All the dependecies that Apollo iOS requires have been updated to add support for visionOS, so we can now add official support for visionOS too. See PR [#333](https://github.com/apollographql/apollo-ios-dev/pull/333).

### Improvement

- **Add Sendable conformance to some basic SchemaTypes:** This adds `Sendable` conformance to the some of the generated schema types. This does not mean that all of the generated code is safe to use yet with complete concurrency checking of Swift 5.10 but it gets us closer to that goal. See PR [#322](https://github.com/apollographql/apollo-ios-dev/pull/322). _Thanks to [@bdbergeron](https://github.com/bdbergeron) for the contributon._

## v1.9.3

### Fixed

- **Fix injecting of context for UploadRequest:** Any request context passed into an upload request was not being added to the HTTP request and would not be available to the interceptor chain. See PR ([#302](https://github.com/apollographql/apollo-ios-dev/pull/302)). _Thanks to [@RobertDresler](https://github.com/RobertDresler) for the contribution._
- **Added support for SPM Package.resolved format version 3 ([#3355](https://github.com/apollographql/apollo-ios/issues/3355)):** When using Xcode 15.3 the codegen CLI would fail the `generate` command with an error stating the Package.resolve file version is unsupported. Version 3 is now accepted as a valid file format for the codegen version checker. See PR ([#304](https://github.com/apollographql/apollo-ios-dev/pull/304)).
- **PrivacyInfo.xcprivacy file is invalid for Apollo and ApolloApi ([#3359](https://github.com/apollographql/apollo-ios/issues/3359)):** We received reports that when submitting to the App Store the submission would fail with an error stating that the privacy manifests were invalid. We identified the error and updated the privacy files. See PR ([#309](https://github.com/apollographql/apollo-ios-dev/pull/309)). _Thanks to [@azilbershtein](https://github.com/azilbershtein) for raising the issue._

### Improvement

- **Provide a direct means to observe changes in ApolloStore:** `ApolloStore` now exposes it's subscriber mechanism publicly. This means you can now observe and receive notifications about changes to the store. See PR ([#300](https://github.com/apollographql/apollo-ios-dev/pull/300)). _Thanks to [@jamesonwilliams](https://github.com/jamesonwilliams) for the contribution._
- **Remove redundant iteration in EntitySelectionTree merging algorithm:** The conditions for merging selections were revisited and we identified, and removed, a redundant iteration. This is a significant performance improvement as it removes an entire additional iteration through all the conditional scopes in the tree. See PR ([#308](https://github.com/apollographql/apollo-ios-dev/pull/308)).

## v1.9.2

### Fixed

- **Backwards Compatibility issues in 1.9.1:** 1.9.1 introduced a minor breaking change for some users who were creating a custom implementaiton of `ApolloClientProtocol`. Sorry about that! This patch release fixed the compatiblity. See PR [#290](https://github.com/apollographql/apollo-ios-dev/pull/290). _Thanks to [@michaelloo](https://github.com/michaelloo) for raising the issue._

### Improvement

- **Session and task descriptions parameters added to `URLSessionClient` ([#286](https://github.com/apollographql/apollo-ios-dev/pull/286)):** The `URLSessionClient` now allows you to set a `sessionDescription` on the session and `taskDescription` on each task. These are helpful when debugging, especially when analyzing HTTP traffic with Instruments. _Thanks to [@hishma](https://github.com/hishma) for the contribution._

## v1.9.1

### Fixed

- **`SelectionSet` generated initializers don't compile with `self` parameter ([#3330](https://github.com/apollographql/apollo-ios/issues/3330)):** Selection set initializers now use a local property name when the external property name is a Swift reserved word; see PR [#257](https://github.com/apollographql/apollo-ios-dev/pull/257). _Thanks to [@grantjbutler](https://github.com/grantjbutler) for raising the issue._
- **asXXXXXXX property on a union never returning `nil` if selection set empty ([#3326](https://github.com/apollographql/apollo-ios/issues/3326)):** - The codegen logic to determine whether a selection set is composite or not has been improved to handle the case when `__typename` was the only field in the selection set; see PR [#261](https://github.com/apollographql/apollo-ios-dev/pull/261). _Thanks to [@vincentisambart](https://github.com/vincentisambart) for raising the issue._

### Improvement

- **Feature/ContextIdentifier for the mutate queries ([#281](https://github.com/apollographql/apollo-ios-dev/pull/281)):** Mutation operations can now be given a context identifier to be used later in the request. _Thanks to [@VladimirK-ah](https://github.com/VladimirK-ah) for the contribution._

## v1.9.0

### Improvement

- **New import directive for operations:** GraphQL operations now support a directive to control custom module import statements in the generated file. Any operation that includes the directive `@import(module:)`, on the defintion line, with a supplied `String` as the module name will have that module used in a Swift `import` statement at the top of the operation file and any referenced fragments. _Thank you to [@hemel](https://github.com/hemel) for the contribution ([#236](https://github.com/apollographql/apollo-ios-dev/pull/236) / [#245](https://github.com/apollographql/apollo-ios-dev/pull/245))._

### Fixed

- **The `fragmentDefinition` remains in all generated fragments when `operationDocumentFormat` does not include `.definition` ([#3282](https://github.com/apollographql/apollo-ios/issues/3282)):** Code generation will now only generate definitions in fragment files if the `operationDocumentFormat` config contains the `.definition` value ([#218](https://github.com/apollographql/apollo-ios-dev/pull/218)). _Thank you to [@jimisaacs](https://github.com/jimisaacs) for raising the issue._
- **Custom scalar file header comment ([#3323](https://github.com/apollographql/apollo-ios/issues/3323)):** The header comment for generated custom scalar files was incorrectly changed to state that the output "should not be edited" but the file content could still be edited and would not be overwritten. The header comment has been changed back to state that the contents will be preserved during subsequent codegen executions. _Thank you to [@matsudamper](https://github.com/matsudamper) for raising the issue and the contribution to fix it ([#243](https://github.com/apollographql/apollo-ios-dev/pull/243))._

### Changed

- **WebSocket disconnection errors are no longer printed to stdout ([#3325](https://github.com/apollographql/apollo-ios/issues/3325)):** See PR ([#253](https://github.com/apollographql/apollo-ios-dev/pull/253)) _Thank you to [@sgade](https://github.com/sgade) for raising the issue._

## v1.8.0

### Fixed
- **Duplicate `@defer` directive error ([#235](https://github.com/apollographql/apollo-ios-dev/pull/235)):** When executing codegen against Apollo Router and a schema that supports the `@defer` directive it would fail with an error stating the directive is duplicated.

### Improvement

- **Added `InputObject`` casing strategy ([#137](https://github.com/apollographql/apollo-ios-dev/pull/137)):** We've added a new casing strategy option for InputObjects which mimics the behaviour of the enum case conversion strategy. _Thank you to [@alexifrim](https://github.com/alexifrim) for raising this in issue [#3257](https://github.com/apollographql/apollo-ios/issues/3257)._
- **Added `GraphQLResult` conversion extension ([#139](https://github.com/apollographql/apollo-ios-dev/pull/139)):** `GraphQLResult` response data can now be easily converted into a JSON dictionary. This is useful for taking server response data and serializing it into a JSON dictionary which can then be used in a test suite.
- **Codegen performance improvements ([#152](https://github.com/apollographql/apollo-ios-dev/pull/152)):** There has been a bunch of refactoring work to prepare for future codegen features but we've also managed to squeeze out some performance improvements.

## v1.7.1

### Fixed
Expand Down
Binary file modified CLI/apollo-ios-cli.tar.gz
Binary file not shown.
24 changes: 19 additions & 5 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.7
// swift-tools-version:5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription
Expand All @@ -9,7 +9,8 @@ let package = Package(
.iOS(.v12),
.macOS(.v10_14),
.tvOS(.v12),
.watchOS(.v5)
.watchOS(.v5),
.visionOS(.v1),
],
products: [
.library(name: "Apollo", targets: ["Apollo"]),
Expand All @@ -23,30 +24,42 @@ let package = Package(
dependencies: [
.package(
url: "https://github.com/stephencelis/SQLite.swift.git",
.upToNextMajor(from: "0.13.1")),
.upToNextMajor(from: "0.15.1")),
],
targets: [
.target(
name: "Apollo",
dependencies: [
"ApolloAPI"
],
resources: [
.copy("Resources/PrivacyInfo.xcprivacy")
]
),
.target(
name: "ApolloAPI",
dependencies: []
dependencies: [],
resources: [
.copy("Resources/PrivacyInfo.xcprivacy")
]
),
.target(
name: "ApolloSQLite",
dependencies: [
"Apollo",
.product(name: "SQLite", package: "SQLite.swift"),
],
resources: [
.copy("Resources/PrivacyInfo.xcprivacy")
]
),
.target(
name: "ApolloWebSocket",
dependencies: [
"Apollo"
],
resources: [
.copy("Resources/PrivacyInfo.xcprivacy")
]
),
.target(
Expand Down Expand Up @@ -74,7 +87,8 @@ let package = Package(
verb: "apollo-cli-install",
description: "Installs the Apollo iOS Command line interface."),
permissions: [
.writeToPackageDirectory(reason: "Creates a symbolic link to the CLI executable in your project directory."),
.writeToPackageDirectory(reason: "Downloads and unzips the CLI executable into your project directory."),
.allowNetworkConnections(scope: .all(ports: []), reason: "Downloads the Apollo iOS CLI executable from the GitHub Release.")
]),
dependencies: [],
path: "Plugins/InstallCLI"
Expand Down
37 changes: 10 additions & 27 deletions Plugins/InstallCLI/InstallCLIPluginCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,17 @@ import PackagePlugin
struct InstallCLIPluginCommand: CommandPlugin {

func performCommand(context: PackagePlugin.PluginContext, arguments: [String]) async throws {
var apolloDirectoryPath: Path? = nil
let dependencies = context.package.dependencies
dependencies.forEach { dep in
try dependencies.forEach { dep in
if dep.package.displayName == "Apollo" {
apolloDirectoryPath = dep.package.directory
let process = Process()
let path = try context.tool(named: "sh").path
process.executableURL = URL(fileURLWithPath: path.string)
process.arguments = ["\(dep.package.directory)/scripts/download-cli.sh", context.package.directory.string]
try process.run()
process.waitUntilExit()
}
}

guard let apolloPath = apolloDirectoryPath else {
fatalError("No Apollo dependency directory path")
}

let process = Process()
let tarPath = try context.tool(named: "tar").path
process.executableURL = URL(fileURLWithPath: tarPath.string)
process.arguments = ["-xvf", "\(apolloPath)/CLI/apollo-ios-cli.tar.gz"]
try process.run()
process.waitUntilExit()
}

func createSymbolicLink(from: PackagePlugin.Path, to: PackagePlugin.Path) throws {
let task = Process()
task.standardInput = nil
task.environment = ProcessInfo.processInfo.environment
task.arguments = ["-c", "ln -f -s '\(from.string)' '\(to.string)'"]
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
try task.run()
task.waitUntilExit()
}

}
Expand All @@ -47,9 +30,9 @@ extension InstallCLIPluginCommand: XcodeCommandPlugin {
print("Installing Apollo CLI Plugin to Xcode project \(context.xcodeProject.displayName)")
let apolloPath = "\(context.pluginWorkDirectory)/../../checkouts/apollo-ios"
let process = Process()
let tarPath = try context.tool(named: "tar").path
process.executableURL = URL(fileURLWithPath: tarPath.string)
process.arguments = ["-xvf", "\(apolloPath)/CLI/apollo-ios-cli.tar.gz"]
let path = try context.tool(named: "sh").path
process.executableURL = URL(fileURLWithPath: path.string)
process.arguments = ["\(apolloPath)/scripts/download-cli.sh", context.xcodeProject.directory.string]
try process.run()
process.waitUntilExit()
}
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
</a>
</p>

| ☑️ Apollo Clients User Survey |
| :----- |
| What do you like best about Apollo iOS? What needs to be improved? Please tell us by taking a [one-minute survey](https://docs.google.com/forms/d/e/1FAIpQLSczNDXfJne3ZUOXjk9Ursm9JYvhTh1_nFTDfdq3XBAFWCzplQ/viewform?usp=pp_url&entry.1170701325=Apollo+iOS&entry.204965213=Readme). Your responses will help us understand Apollo iOS usage and allow us to serve you better. |

### Apollo iOS is a strongly-typed, caching GraphQL client, written in Swift

It allows you to execute queries and mutations against a GraphQL server, and returns results as query-specific Swift types. This means you don’t have to deal with parsing JSON, or passing around dictionaries and making clients cast values to the right type manually. You also don't have to write model types yourself, because these are generated from the GraphQL definitions your UI uses.
Expand Down
Loading
Loading