mirror of
https://github.com/xtool-org/xtool.git
synced 2026-02-04 11:53:30 +01:00
- Make some enums non-exhaustive (closes #77) - Also a tentative fix for #62 and #64 - Improve logging on deserialization failure We now use raw JS to patch the OpenAPI spec instead of openapi-overlay. It's a lot more flexible this way.
60 lines
2.0 KiB
JavaScript
60 lines
2.0 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import fs from 'fs';
|
|
|
|
function makeOpen(enumSchema) {
|
|
const copy = structuredClone(enumSchema);
|
|
Object.keys(enumSchema).forEach(k => delete enumSchema[k]);
|
|
Object.assign(enumSchema, {
|
|
anyOf: [
|
|
copy,
|
|
{ type: 'string' },
|
|
]
|
|
})
|
|
}
|
|
|
|
function format(schema) {
|
|
const schemas = schema.components.schemas;
|
|
|
|
// this field is required when using the private Xcode API
|
|
const capabilityCreateRelationships = schemas.BundleIdCapabilityCreateRequest.properties.data.properties.relationships;
|
|
capabilityCreateRelationships.properties.capability = {
|
|
type: 'object',
|
|
properties: {
|
|
data: {
|
|
type: 'object',
|
|
properties: {
|
|
type: {
|
|
type: 'string',
|
|
enum: ['capabilities'],
|
|
},
|
|
id: { $ref: '#/components/schemas/CapabilityType' },
|
|
},
|
|
required: ['id', 'type'],
|
|
},
|
|
},
|
|
required: ['data'],
|
|
}
|
|
capabilityCreateRelationships.required.push('capability');
|
|
|
|
// we don't use this but it triggers a deprecation warning. see:
|
|
// https://github.com/apple/swift-openapi-generator/issues/715
|
|
schemas.App.properties.relationships.properties.inAppPurchases.deprecated = false;
|
|
|
|
// openapi-generator expects response enums to be exhaustive. Apple's ASC OpenAPI spec
|
|
// misses some cases that they do, actually, return.
|
|
// https://swiftpackageindex.com/apple/swift-openapi-generator/1.7.2/documentation/swift-openapi-generator/useful-openapi-patterns#Open-enums-and-oneOfs
|
|
makeOpen(schemas.BundleIdPlatform);
|
|
makeOpen(schemas.CapabilityType);
|
|
makeOpen(schemas.CertificateType);
|
|
makeOpen(schemas.Device.properties.attributes.properties.deviceClass);
|
|
|
|
return schema;
|
|
}
|
|
|
|
const text = fs.readFileSync(process.stdin.fd, 'utf8');
|
|
const json = JSON.parse(text);
|
|
const formatted = format(json);
|
|
const formattedText = JSON.stringify(formatted);
|
|
console.log(formattedText);
|