generate-api-types.mjs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
  2. import { fileURLToPath } from 'node:url';
  3. const source = new URL('../../server/docs/openapi/water-mini-v1.json', import.meta.url);
  4. const schemas = JSON.parse(readFileSync(source, 'utf8')).components.schemas;
  5. function type(schema = {}) {
  6. let result;
  7. if (schema.$ref) result = schema.$ref.split('/').pop();
  8. else if (schema.allOf) result = schema.allOf.map((item) => `(${type(item)})`).join(' & ');
  9. else if (schema.oneOf || schema.anyOf)
  10. result = (schema.oneOf || schema.anyOf).map(type).join(' | ');
  11. else if (schema.enum) result = schema.enum.map((value) => JSON.stringify(value)).join(' | ');
  12. else if (schema.type === 'array') result = `Array<${type(schema.items)}>`;
  13. else if (schema.type === 'object' || schema.properties) {
  14. result = schema.properties
  15. ? '{\n' +
  16. Object.entries(schema.properties)
  17. .map(
  18. ([key, value]) =>
  19. ` ${JSON.stringify(key)}${schema.required?.includes(key) ? '' : '?'}: ${type(value)};`,
  20. )
  21. .join('\n') +
  22. '\n}'
  23. : 'Record<string, unknown>';
  24. } else
  25. result =
  26. {
  27. integer: 'number',
  28. number: 'number',
  29. string: 'string',
  30. boolean: 'boolean',
  31. }[schema.type] || 'unknown';
  32. return schema.nullable ? `(${result}) | null` : result;
  33. }
  34. const output =
  35. '// Generated from server/docs/openapi/water-mini-v1.json. Run npm run api:types.\n\n' +
  36. Object.entries(schemas)
  37. .map(
  38. ([name, schema]) =>
  39. `export type ${name === 'Error' ? 'ApiErrorBody' : name} = ${type(schema)};`,
  40. )
  41. .join('\n\n') +
  42. '\n';
  43. const target = new URL('../src/api/schema.ts', import.meta.url);
  44. mkdirSync(fileURLToPath(new URL('../src/api/', import.meta.url)), {
  45. recursive: true,
  46. });
  47. writeFileSync(target, output);
  48. console.log(`Generated ${Object.keys(schemas).length} API schema types.`);