feat(codegen): x-expanded-relations (#3442)
## What Alter generated types base on `x-expanded-relations` OAS extension declared on schemaObjects. ## Why Often, API endpoints will automatically expand a model relations by default. They can also decorate a model with calculated totals. In order to more accurately represent the API, we wish to alter the generated types based on the expanded relations information. ## How - Follow the relation declaration signature as the backend controllers and the `expand` query param, i.e.: `items.variant.product`. - Introduce a custom `x-expended-relations` OAS extension. - Allow for organizing declared relations to help their maintenance. - Use traversal algorithms in codegen to support deeply nested relationships. - Use [type-fest](https://www.npmjs.com/package/type-fest)'s `Merge` and `SetRequired` to efficiently alter the types while enabling great intellisense for IDEs. Extra scope: * Added convenience yarn script to interact with the `medisa-oas` CLI within the monorepo. ## Test Include in the PR are two implementations of the x-expanded-relations on OAS schema, a simple and a complex one. ### Step 1 * Run `yarn install` * Run `yarn build` * Run `yarn medusa-oas oas --type combined --out-dir ~/tmp/oas` * Run `yarn medusa-oas client --type combined --component types --src-file ~/tmp/oas/combined.osa.json --out-dir ~/tmp/types` * Open `~/tmp/types/models/StoreRegionsRes` * Expect relations to be declared as required ### Step 2 * Open `~/tmp/types/models/StoreCartsRes` * Expect relations to be declared as required * Expect nested relations to have relations as required. ### Step 3 (optional) * Open `~/tmp/types` in an intellisense capable IDE * Within the `index.ts` file, attempt to declare a `const storeRegionRes: StoreRegionRes = {}` * Expect IDE to highlight that `countries` is a required field of `StoreRegionRes`
This commit is contained in:
@@ -76,6 +76,7 @@
|
||||
"test:integration:plugins": "turbo run test --no-daemon --filter=integration-tests-plugins",
|
||||
"test:integration:repositories": "turbo run test --no-daemon --filter=integration-tests-repositories",
|
||||
"openapi:generate": "yarn ./packages/oas/oas-github-ci run ci",
|
||||
"medusa-oas": "yarn ./packages/oas/medusa-oas-cli run medusa-oas",
|
||||
"generate:services": "typedoc --options typedoc.services.js",
|
||||
"generate:js-client": "typedoc --options typedoc.js-client.js",
|
||||
"generate:entities": "typedoc --options typedoc.entities.js",
|
||||
|
||||
Reference in New Issue
Block a user