|
1 | 1 | import { readFile, writeFile } from 'node:fs/promises' |
2 | | -import { resolve } from 'node:path' |
| 2 | +import { dirname, posix, resolve } from 'node:path' |
| 3 | +import { fileURLToPath } from 'node:url' |
3 | 4 |
|
4 | 5 | import { openapi } from '@seamapi/types/connect' |
5 | 6 | import { camelCase, kebabCase, pascalCase, snakeCase } from 'change-case' |
| 7 | +import { deleteAsync } from 'del' |
6 | 8 | import { ESLint } from 'eslint' |
7 | 9 | import { format, resolveConfig } from 'prettier' |
8 | 10 |
|
9 | | -const rootClassPath = resolve('src', 'lib', 'seam', 'connect', 'seam-http.ts') |
10 | | -const routeOutputPath = resolve('src', 'lib', 'seam', 'connect', 'routes') |
| 11 | +const rootPathParts = ['src', 'lib', 'seam', 'connect'] |
| 12 | + |
| 13 | +const routeOutputPathParts = ['routes'] |
| 14 | + |
| 15 | +const rootPath = resolve( |
| 16 | + dirname(fileURLToPath(import.meta.url)), |
| 17 | + ...rootPathParts, |
| 18 | +) |
| 19 | +const rootClassPath = resolve(rootPath, 'seam-http.ts') |
| 20 | +const routeOutputPath = resolve(rootPath, ...routeOutputPathParts) |
| 21 | + |
| 22 | +async function main(): Promise<void> { |
| 23 | + const routes = createRoutes() |
| 24 | + const routeNames = await Promise.all(routes.map(writeRoute)) |
| 25 | + const routeIndexName = await writeRoutesIndex(routes) |
| 26 | + const outputPathParts = [...rootPathParts, ...routeOutputPathParts] |
| 27 | + await deleteAsync([ |
| 28 | + posix.join(...outputPathParts, '*'), |
| 29 | + `!${posix.join(...outputPathParts, routeIndexName)}`, |
| 30 | + ...routeNames.map((name) => `!${posix.join(...outputPathParts, name)}`), |
| 31 | + ]) |
| 32 | +} |
11 | 33 |
|
12 | 34 | const routePaths = [ |
13 | 35 | '/access_codes', |
@@ -486,21 +508,21 @@ const getClassConstructors = (data: string): string => { |
486 | 508 | return lines.slice(startIdx, endIdx).join('\n') |
487 | 509 | } |
488 | 510 |
|
489 | | -const writeRoute = async (route: Route): Promise<void> => { |
| 511 | +const writeRoute = async (route: Route): Promise<string> => { |
490 | 512 | const rootClass = await readFile(rootClassPath) |
491 | 513 | const constructors = getClassConstructors(rootClass.toString()) |
492 | | - await write( |
493 | | - renderRoute(route, { constructors }), |
494 | | - routeOutputPath, |
495 | | - `${kebabCase(route.namespace)}.ts`, |
496 | | - ) |
| 514 | + const name = `${kebabCase(route.namespace)}.ts` |
| 515 | + await write(renderRoute(route, { constructors }), routeOutputPath, name) |
| 516 | + return name |
497 | 517 | } |
498 | 518 |
|
499 | | -const writeRoutesIndex = async (routes: Route[]): Promise<void> => { |
| 519 | +const writeRoutesIndex = async (routes: Route[]): Promise<string> => { |
500 | 520 | const exports = routes.map( |
501 | 521 | (route) => `export * from './${kebabCase(route.namespace)}.js'`, |
502 | 522 | ) |
503 | | - await write(exports.join('\n'), routeOutputPath, `index.ts`) |
| 523 | + const name = 'index.ts' |
| 524 | + await write(exports.join('\n'), routeOutputPath, name) |
| 525 | + return name |
504 | 526 | } |
505 | 527 |
|
506 | 528 | const write = async (data: string, ...path: string[]): Promise<void> => { |
@@ -550,6 +572,4 @@ const eslintFixOutput = async ( |
550 | 572 | return linted.output ?? linted.source ?? data |
551 | 573 | } |
552 | 574 |
|
553 | | -const routes = createRoutes() |
554 | | -await Promise.all(routes.map(writeRoute)) |
555 | | -await writeRoutesIndex(routes) |
| 575 | +await main() |
0 commit comments