|
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