@redonvn/redai-backend-api-sdk 0.1.17 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/core/auth.d.ts +19 -0
  2. package/dist/core/auth.js +47 -0
  3. package/dist/core/http-client.d.ts +9 -0
  4. package/dist/core/http-client.js +41 -0
  5. package/dist/core/types.d.ts +19 -0
  6. package/dist/core/types.js +2 -0
  7. package/{src/generated/dynamic-table/index.ts → dist/generated/dynamic-table/index.d.ts} +0 -1
  8. package/dist/generated/dynamic-table/index.js +19 -0
  9. package/dist/generated/dynamic-table/services/api-docs.service.d.ts +9 -0
  10. package/dist/generated/dynamic-table/services/api-docs.service.js +36 -0
  11. package/dist/generated/dynamic-table/services/api-tokens.service.d.ts +10 -0
  12. package/dist/generated/dynamic-table/services/api-tokens.service.js +45 -0
  13. package/dist/generated/dynamic-table/services/attachments-secure.service.d.ts +8 -0
  14. package/dist/generated/dynamic-table/services/attachments-secure.service.js +27 -0
  15. package/dist/generated/dynamic-table/services/attachments.service.d.ts +10 -0
  16. package/dist/generated/dynamic-table/services/attachments.service.js +45 -0
  17. package/dist/generated/dynamic-table/services/base-members.service.d.ts +10 -0
  18. package/dist/generated/dynamic-table/services/base-members.service.js +45 -0
  19. package/dist/generated/dynamic-table/services/bases.service.d.ts +11 -0
  20. package/dist/generated/dynamic-table/services/bases.service.js +54 -0
  21. package/dist/generated/dynamic-table/services/caches.service.d.ts +9 -0
  22. package/dist/generated/dynamic-table/services/caches.service.js +36 -0
  23. package/dist/generated/dynamic-table/services/calendar-data.service.d.ts +14 -0
  24. package/dist/generated/dynamic-table/services/calendar-data.service.js +36 -0
  25. package/dist/generated/dynamic-table/services/calendars.service.d.ts +9 -0
  26. package/dist/generated/dynamic-table/services/calendars.service.js +36 -0
  27. package/dist/generated/dynamic-table/services/columns.service.d.ts +17 -0
  28. package/dist/generated/dynamic-table/services/columns.service.js +81 -0
  29. package/dist/generated/dynamic-table/services/command-palette.service.d.ts +9 -0
  30. package/dist/generated/dynamic-table/services/command-palette.service.js +36 -0
  31. package/dist/generated/dynamic-table/services/comments.service.d.ts +13 -0
  32. package/dist/generated/dynamic-table/services/comments.service.js +72 -0
  33. package/dist/generated/dynamic-table/services/data-imports.service.d.ts +15 -0
  34. package/dist/generated/dynamic-table/services/data-imports.service.js +63 -0
  35. package/dist/generated/dynamic-table/services/data-table.service.d.ts +33 -0
  36. package/dist/generated/dynamic-table/services/data-table.service.js +162 -0
  37. package/dist/generated/dynamic-table/services/dynamic-table-auth.service.d.ts +7 -0
  38. package/dist/generated/dynamic-table/services/dynamic-table-auth.service.js +18 -0
  39. package/dist/generated/dynamic-table/services/filters.service.d.ts +12 -0
  40. package/dist/generated/dynamic-table/services/filters.service.js +63 -0
  41. package/dist/generated/dynamic-table/services/forms.service.d.ts +9 -0
  42. package/dist/generated/dynamic-table/services/forms.service.js +36 -0
  43. package/dist/generated/dynamic-table/services/galleries.service.d.ts +9 -0
  44. package/dist/generated/dynamic-table/services/galleries.service.js +36 -0
  45. package/dist/generated/dynamic-table/services/grids.service.d.ts +8 -0
  46. package/dist/generated/dynamic-table/services/grids.service.js +27 -0
  47. package/dist/generated/dynamic-table/services/hooks.service.d.ts +18 -0
  48. package/dist/generated/dynamic-table/services/hooks.service.js +117 -0
  49. package/{src/generated/dynamic-table/services/index.ts → dist/generated/dynamic-table/services/index.d.ts} +4 -1
  50. package/dist/generated/dynamic-table/services/index.js +84 -0
  51. package/dist/generated/dynamic-table/services/internal.service.d.ts +9 -0
  52. package/dist/generated/dynamic-table/services/internal.service.js +36 -0
  53. package/dist/generated/dynamic-table/services/jobs-meta.service.d.ts +16 -0
  54. package/dist/generated/dynamic-table/services/jobs-meta.service.js +45 -0
  55. package/dist/generated/dynamic-table/services/jobs.service.d.ts +7 -0
  56. package/dist/generated/dynamic-table/services/jobs.service.js +18 -0
  57. package/dist/generated/dynamic-table/services/kanban-data.service.d.ts +7 -0
  58. package/dist/generated/dynamic-table/services/kanban-data.service.js +18 -0
  59. package/dist/generated/dynamic-table/services/kanbans.service.d.ts +9 -0
  60. package/dist/generated/dynamic-table/services/kanbans.service.js +36 -0
  61. package/dist/generated/dynamic-table/services/maps.service.d.ts +9 -0
  62. package/dist/generated/dynamic-table/services/maps.service.js +36 -0
  63. package/dist/generated/dynamic-table/services/row-color.service.d.ts +12 -0
  64. package/dist/generated/dynamic-table/services/row-color.service.js +63 -0
  65. package/dist/generated/dynamic-table/services/sorts.service.d.ts +12 -0
  66. package/dist/generated/dynamic-table/services/sorts.service.js +63 -0
  67. package/dist/generated/dynamic-table/services/sources.service.d.ts +11 -0
  68. package/dist/generated/dynamic-table/services/sources.service.js +54 -0
  69. package/dist/generated/dynamic-table/services/tables.service.d.ts +12 -0
  70. package/dist/generated/dynamic-table/services/tables.service.js +63 -0
  71. package/dist/generated/dynamic-table/services/user-ui-preferences.service.d.ts +8 -0
  72. package/dist/generated/dynamic-table/services/user-ui-preferences.service.js +27 -0
  73. package/dist/generated/dynamic-table/services/utils.service.d.ts +10 -0
  74. package/dist/generated/dynamic-table/services/utils.service.js +45 -0
  75. package/dist/generated/dynamic-table/services/view-columns.service.d.ts +13 -0
  76. package/dist/generated/dynamic-table/services/view-columns.service.js +72 -0
  77. package/dist/generated/dynamic-table/services/views.service.d.ts +15 -0
  78. package/dist/generated/dynamic-table/services/views.service.js +90 -0
  79. package/dist/generated/dynamic-table/services/workspace-invite-link-settings.service.d.ts +9 -0
  80. package/dist/generated/dynamic-table/services/workspace-invite-link-settings.service.js +36 -0
  81. package/dist/generated/dynamic-table/services/workspace-invite-links.service.d.ts +10 -0
  82. package/dist/generated/dynamic-table/services/workspace-invite-links.service.js +45 -0
  83. package/dist/generated/dynamic-table/services/workspace-invites.service.d.ts +7 -0
  84. package/dist/generated/dynamic-table/services/workspace-invites.service.js +18 -0
  85. package/dist/generated/dynamic-table/services/workspace-join-requests.service.d.ts +9 -0
  86. package/dist/generated/dynamic-table/services/workspace-join-requests.service.js +36 -0
  87. package/dist/generated/dynamic-table/services/workspace-members.service.d.ts +10 -0
  88. package/dist/generated/dynamic-table/services/workspace-members.service.js +45 -0
  89. package/dist/generated/dynamic-table/services/workspaces.service.d.ts +12 -0
  90. package/dist/generated/dynamic-table/services/workspaces.service.js +63 -0
  91. package/dist/generated/dynamic-table/types.d.ts +2539 -0
  92. package/dist/generated/dynamic-table/types.js +488 -0
  93. package/{src/generated/index.ts → dist/generated/index.d.ts} +0 -1
  94. package/dist/generated/index.js +43 -0
  95. package/{src/generated/services/index.ts → dist/generated/services/index.d.ts} +0 -1
  96. package/dist/generated/services/index.js +18 -0
  97. package/{src/generated/types.ts → dist/generated/types.d.ts} +0 -1
  98. package/dist/generated/types.js +18 -0
  99. package/dist/index.d.ts +58 -0
  100. package/dist/index.js +98 -0
  101. package/package.json +19 -13
  102. package/.npm-cache/_cacache/content-v2/sha512/86/70/40787d3ad4c6bb74f182be681858c7e22dc44bd5679779bfe4f3aa562f18810e6b8e80144a539402fe397be24c37e2555f351176e49d8bd1ddff114d5e04 +0 -0
  103. package/.npm-cache/_cacache/tmp/6303939d +0 -0
  104. package/.npm-cache/_update-notifier-last-checked +0 -0
  105. package/src/core/auth.ts +0 -62
  106. package/src/core/http-client.ts +0 -41
  107. package/src/core/types.ts +0 -23
  108. package/src/generated/dynamic-table/services/api-docs.service.ts +0 -42
  109. package/src/generated/dynamic-table/services/api-tokens.service.ts +0 -53
  110. package/src/generated/dynamic-table/services/attachments-secure.service.ts +0 -31
  111. package/src/generated/dynamic-table/services/attachments.service.ts +0 -53
  112. package/src/generated/dynamic-table/services/base-members.service.ts +0 -55
  113. package/src/generated/dynamic-table/services/bases.service.ts +0 -66
  114. package/src/generated/dynamic-table/services/caches.service.ts +0 -42
  115. package/src/generated/dynamic-table/services/calendar-data.service.ts +0 -44
  116. package/src/generated/dynamic-table/services/calendars.service.ts +0 -45
  117. package/src/generated/dynamic-table/services/columns.service.ts +0 -98
  118. package/src/generated/dynamic-table/services/command-palette.service.ts +0 -42
  119. package/src/generated/dynamic-table/services/data-table.service.ts +0 -199
  120. package/src/generated/dynamic-table/services/dynamic-table-auth.service.ts +0 -21
  121. package/src/generated/dynamic-table/services/filters.service.ts +0 -76
  122. package/src/generated/dynamic-table/services/forms.service.ts +0 -45
  123. package/src/generated/dynamic-table/services/galleries.service.ts +0 -45
  124. package/src/generated/dynamic-table/services/grids.service.ts +0 -33
  125. package/src/generated/dynamic-table/services/hooks.service.ts +0 -145
  126. package/src/generated/dynamic-table/services/internal.service.ts +0 -42
  127. package/src/generated/dynamic-table/services/kanban-data.service.ts +0 -21
  128. package/src/generated/dynamic-table/services/kanbans.service.ts +0 -45
  129. package/src/generated/dynamic-table/services/maps.service.ts +0 -45
  130. package/src/generated/dynamic-table/services/row-color.service.ts +0 -77
  131. package/src/generated/dynamic-table/services/sorts.service.ts +0 -76
  132. package/src/generated/dynamic-table/services/sources.service.ts +0 -66
  133. package/src/generated/dynamic-table/services/tables.service.ts +0 -77
  134. package/src/generated/dynamic-table/services/user-ui-preferences.service.ts +0 -32
  135. package/src/generated/dynamic-table/services/utils.service.ts +0 -53
  136. package/src/generated/dynamic-table/services/view-columns.service.ts +0 -87
  137. package/src/generated/dynamic-table/services/views.service.ts +0 -109
  138. package/src/generated/dynamic-table/services/workspace-invite-link-settings.service.ts +0 -43
  139. package/src/generated/dynamic-table/services/workspace-invite-links.service.ts +0 -55
  140. package/src/generated/dynamic-table/services/workspace-invites.service.ts +0 -21
  141. package/src/generated/dynamic-table/services/workspace-join-requests.service.ts +0 -45
  142. package/src/generated/dynamic-table/services/workspace-members.service.ts +0 -56
  143. package/src/generated/dynamic-table/services/workspaces.service.ts +0 -77
  144. package/src/generated/dynamic-table/types.ts +0 -2326
  145. package/src/index.ts +0 -79
  146. package/tools/.reports/dynamic-table-sdk-report.json +0 -9
  147. package/tools/generate-dynamic-table-sdk.ts +0 -31
  148. package/tools/generate-sdk.ts +0 -13
  149. package/tools/generator/openapi-resolver.ts +0 -77
  150. package/tools/generator/shared.ts +0 -162
  151. package/tools/generator/ts-resolver.ts +0 -439
  152. package/tools/verify-generated.ts +0 -23
  153. package/tsconfig.json +0 -19
package/src/index.ts DELETED
@@ -1,79 +0,0 @@
1
- import { DynamicTableAuth } from './core/auth';
2
- import { HttpClient } from './core/http-client';
3
- import { DynamicTableSdkConfig, DynamicTableTokenProvider } from './core/types';
4
- import { ApiDocsService, ApiTokensService, AttachmentsSecureService, AttachmentsService, BaseMembersService, BasesService, CachesService, CalendarDataService, CalendarsService, ColumnsService, CommandPaletteService, DataTableService, DynamicTableAuthService, FiltersService, FormsService, GalleriesService, GridsService, HooksService, InternalService, KanbanDataService, KanbansService, MapsService, RowColorService, SortsService, SourcesService, TablesService, UserUiPreferencesService, UtilsService, ViewColumnsService, ViewsService, WorkspaceInviteLinkSettingsService, WorkspaceInviteLinksService, WorkspaceInvitesService, WorkspaceJoinRequestsService, WorkspaceMembersService, WorkspacesService } from './generated/services';
5
-
6
- export type { ApiResponseDto, DynamicTableSdkConfig, DynamicTableTokenProvider } from './core/types';
7
- export * from './generated';
8
-
9
- export const createFrontendAxiosTokenProvider = (options?: {
10
- authStorageKey?: string;
11
- dtApiToken?: string | null;
12
- getDtApiToken?: () => string | null | undefined;
13
- }) => {
14
- const authStorageKey = options?.authStorageKey ?? 'auth_data';
15
- return {
16
- getBearerToken: () => {
17
- const storage = (globalThis as { localStorage?: { getItem: (key: string) => string | null } }).localStorage;
18
- if (!storage) return null;
19
- try {
20
- const raw = storage.getItem(authStorageKey);
21
- if (!raw) return null;
22
- const parsed = JSON.parse(raw) as { accessToken?: string; expiresAt?: number };
23
- if (!parsed?.accessToken) return null;
24
- if (typeof parsed.expiresAt === 'number' && parsed.expiresAt <= Date.now()) return null;
25
- return parsed.accessToken;
26
- } catch {
27
- return null;
28
- }
29
- },
30
- getDtApiToken: () => options?.getDtApiToken?.() ?? options?.dtApiToken ?? null,
31
- } as const;
32
- };
33
-
34
- export const createDynamicTableSdk = (config: DynamicTableSdkConfig) => {
35
- const auth = new DynamicTableAuth({ bearerToken: config.bearerToken ?? null, dtApiToken: config.dtApiToken ?? null }, config.tokenProvider);
36
- const client = new HttpClient(config, auth);
37
- const viewColumns = new ViewColumnsService(client);
38
- return {
39
- auth,
40
- apiDocs: new ApiDocsService(client),
41
- apiTokens: new ApiTokensService(client),
42
- attachmentsSecure: new AttachmentsSecureService(client),
43
- attachments: new AttachmentsService(client),
44
- baseMembers: new BaseMembersService(client),
45
- bases: new BasesService(client),
46
- caches: new CachesService(client),
47
- calendarData: new CalendarDataService(client),
48
- calendars: new CalendarsService(client),
49
- columns: new ColumnsService(client),
50
- commandPalette: new CommandPaletteService(client),
51
- dataTable: new DataTableService(client),
52
- authService: new DynamicTableAuthService(client),
53
- filters: new FiltersService(client),
54
- forms: new FormsService(client),
55
- galleries: new GalleriesService(client),
56
- grids: new GridsService(client),
57
- hooks: new HooksService(client),
58
- internal: new InternalService(client),
59
- kanbanData: new KanbanDataService(client),
60
- kanbans: new KanbansService(client),
61
- maps: new MapsService(client),
62
- rowColor: new RowColorService(client),
63
- sorts: new SortsService(client),
64
- sources: new SourcesService(client),
65
- tables: new TablesService(client),
66
- userUiPreferences: new UserUiPreferencesService(client),
67
- utils: new UtilsService(client),
68
- views: new ViewsService(client),
69
- workspaceInviteLinkSettings: new WorkspaceInviteLinkSettingsService(client),
70
- workspaceInviteLinks: new WorkspaceInviteLinksService(client),
71
- workspaceInvites: new WorkspaceInvitesService(client),
72
- workspaceJoinRequests: new WorkspaceJoinRequestsService(client),
73
- workspaceMembers: new WorkspaceMembersService(client),
74
- workspaces: new WorkspacesService(client),
75
- formColumns: viewColumns,
76
- gridColumns: viewColumns,
77
- viewColumns,
78
- };
79
- };
@@ -1,9 +0,0 @@
1
- {
2
- "moduleName": "dynamic-table",
3
- "mode": "ts",
4
- "totalOperations": 162,
5
- "resolvedByOpenapi": 0,
6
- "resolvedByTs": 162,
7
- "unresolved": [],
8
- "conflicts": []
9
- }
@@ -1,31 +0,0 @@
1
- import { spawnSync } from 'child_process';
2
- import * as path from 'path';
3
-
4
- const toolRoot = 'F:/Redon/sdk/generic-sdk-api';
5
- const cliPath = path.join(toolRoot, 'src', 'cli.ts');
6
-
7
- const args = process.argv.slice(2);
8
- const defaults = [
9
- '--module=dynamic-table',
10
- `--backendRoot=${process.env.BACKEND_ROOT ?? 'F:/Redon/DuAn/project01/true'}`,
11
- `--controllersDir=${process.env.CONTROLLERS_GLOB ?? 'src/modules/dynamic-table/controllers'}`,
12
- `--pathPrefix=${process.env.PATH_PREFIX ?? '/v1/dynamic-table'}`,
13
- `--outDir=${process.cwd()}`,
14
- `--mode=${process.env.GEN_MODE ?? 'ts'}`,
15
- `--outputReport=${process.env.OUTPUT_REPORT ?? 'true'}`,
16
- '--syncRootIndex=true',
17
- ];
18
-
19
- const openApiPath = process.env.OPENAPI_PATH ?? 'F:/Redon/DuAn/project01/true/src/modules/dynamic-table/tests/curl/docs-json.json';
20
- if ((process.env.GEN_MODE ?? 'ts') !== 'ts') {
21
- defaults.push(`--openapi=${openApiPath}`);
22
- }
23
-
24
- const result = spawnSync('npx', ['tsx', cliPath, 'generate', ...defaults, ...args], {
25
- stdio: 'inherit',
26
- shell: process.platform === 'win32',
27
- });
28
-
29
- if (result.status !== 0) {
30
- process.exit(result.status ?? 1);
31
- }
@@ -1,13 +0,0 @@
1
- import { spawnSync } from 'child_process';
2
- import * as path from 'path';
3
-
4
- const toolRoot = 'F:/Redon/sdk/generic-sdk-api';
5
- const cliPath = path.join(toolRoot, 'src', 'cli.ts');
6
-
7
- const args = process.argv.slice(2);
8
- const result = spawnSync('npx', ['tsx', cliPath, 'generate', ...args], {
9
- stdio: 'inherit',
10
- shell: process.platform === 'win32',
11
- });
12
-
13
- if (result.status !== 0) process.exit(result.status ?? 1);
@@ -1,77 +0,0 @@
1
- import * as crypto from 'crypto';
2
- import { getRefTypeName, normalizeNullable, primitiveForType, sanitizePropertyName, sanitizeTypeName, SchemaObject, OperationObject } from './shared';
3
-
4
- export const INLINE_TYPES: string[] = [];
5
- export const INLINE_TYPE_CACHE = new Map<string, string>();
6
-
7
- const toLiteral = (v: string | number | boolean | null): string => {
8
- if (v === null) return 'null';
9
- if (typeof v === 'string') return `'${v.replace(/'/g, "\\'")}'`;
10
- return String(v);
11
- };
12
-
13
- export const schemaToTs = (schema: SchemaObject | undefined, ctxName: string): string => {
14
- if (!schema) return 'unknown';
15
- if (schema.$ref) return getRefTypeName(schema.$ref);
16
- if (schema.oneOf?.length) return normalizeNullable(schema.oneOf.map((s, i) => schemaToTs(s, `${ctxName}OneOf${i}`)).join(' | '), schema.nullable);
17
- if (schema.anyOf?.length) return normalizeNullable(schema.anyOf.map((s, i) => schemaToTs(s, `${ctxName}AnyOf${i}`)).join(' | '), schema.nullable);
18
- if (schema.allOf?.length) return normalizeNullable(schema.allOf.map((s, i) => schemaToTs(s, `${ctxName}AllOf${i}`)).join(' & '), schema.nullable);
19
- if (schema.enum?.length) return normalizeNullable(schema.enum.map(toLiteral).join(' | '), schema.nullable);
20
- if (schema.type === 'array') return normalizeNullable(`(${schemaToTs(schema.items, `${ctxName}Item`)})[]`, schema.nullable);
21
-
22
- if (schema.type === 'object' || schema.properties || schema.additionalProperties) {
23
- const req = new Set(schema.required ?? []);
24
- const props = Object.entries(schema.properties ?? {}).map(([k, v]) => ` ${sanitizePropertyName(k)}${req.has(k) ? '' : '?'}: ${schemaToTs(v, `${ctxName}${sanitizeTypeName(k)}`)};`);
25
- const add = schema.additionalProperties === true
26
- ? '\n [key: string]: unknown;'
27
- : schema.additionalProperties && typeof schema.additionalProperties === 'object'
28
- ? `\n [key: string]: ${schemaToTs(schema.additionalProperties, `${ctxName}Additional`)};`
29
- : '';
30
- return normalizeNullable(`\n{\n${props.join('\n')}${add}\n}`, schema.nullable);
31
- }
32
-
33
- return normalizeNullable(primitiveForType(schema.type, schema.format), schema.nullable);
34
- };
35
-
36
- export const schemaToNamedType = (schema: SchemaObject | undefined, preferredName: string): string => {
37
- if (!schema) return 'unknown';
38
- if (schema.$ref) return getRefTypeName(schema.$ref);
39
- const hash = crypto.createHash('sha1').update(JSON.stringify(schema)).digest('hex').slice(0, 10);
40
- const cached = INLINE_TYPE_CACHE.get(hash);
41
- if (cached) return cached;
42
-
43
- const typeName = sanitizeTypeName(preferredName);
44
- const finalName = INLINE_TYPES.some((l) => l.includes(`export type ${typeName} =`)) ? `${typeName}${hash}` : typeName;
45
- INLINE_TYPES.push(`export type ${finalName} = ${schemaToTs(schema, finalName)};`);
46
- INLINE_TYPE_CACHE.set(hash, finalName);
47
- return finalName;
48
- };
49
-
50
- export const pickMediaSchema = (content: Record<string, { schema?: SchemaObject }> | undefined): SchemaObject | undefined => {
51
- if (!content) return undefined;
52
- return content['application/json']?.schema || content['application/*+json']?.schema || Object.values(content)[0]?.schema;
53
- };
54
-
55
- export const getOpenApiResponseType = (operation: OperationObject, operationName: string): string => {
56
- const responses = operation.responses ?? {};
57
- const ok = ['200', '201', '202', '203', '204'].find((s) => responses[s]);
58
- if (!ok) return 'unknown';
59
- if (ok === '204') return 'void';
60
- const schema = pickMediaSchema(responses[ok]?.content);
61
- if (!schema) return 'unknown';
62
- return schemaToNamedType(schema, `${operationName}Response`);
63
- };
64
-
65
- export const collectRefsFromSchema = (schema: SchemaObject | undefined, refs: Set<string>): void => {
66
- if (!schema) return;
67
- if (schema.$ref) {
68
- refs.add(getRefTypeName(schema.$ref));
69
- return;
70
- }
71
- for (const s of schema.oneOf ?? []) collectRefsFromSchema(s, refs);
72
- for (const s of schema.anyOf ?? []) collectRefsFromSchema(s, refs);
73
- for (const s of schema.allOf ?? []) collectRefsFromSchema(s, refs);
74
- if (schema.items) collectRefsFromSchema(schema.items, refs);
75
- for (const p of Object.values(schema.properties ?? {})) collectRefsFromSchema(p, refs);
76
- if (schema.additionalProperties && typeof schema.additionalProperties === 'object') collectRefsFromSchema(schema.additionalProperties, refs);
77
- };
@@ -1,162 +0,0 @@
1
- export type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head';
2
- export type GenMode = 'openapi' | 'ts' | 'hybrid';
3
- export type ResolveSource = 'openapi' | 'ts' | 'unknown';
4
-
5
- export type SchemaObject = {
6
- $ref?: string;
7
- type?: string;
8
- format?: string;
9
- enum?: Array<string | number | boolean | null>;
10
- nullable?: boolean;
11
- items?: SchemaObject;
12
- properties?: Record<string, SchemaObject>;
13
- required?: string[];
14
- oneOf?: SchemaObject[];
15
- anyOf?: SchemaObject[];
16
- allOf?: SchemaObject[];
17
- additionalProperties?: boolean | SchemaObject;
18
- };
19
-
20
- export type ParameterObject = {
21
- name: string;
22
- in: 'path' | 'query' | 'header' | 'cookie';
23
- required?: boolean;
24
- schema?: SchemaObject;
25
- };
26
-
27
- export type RequestBodyObject = {
28
- required?: boolean;
29
- content?: Record<string, { schema?: SchemaObject }>;
30
- };
31
-
32
- export type OperationObject = {
33
- operationId?: string;
34
- parameters?: ParameterObject[];
35
- requestBody?: RequestBodyObject;
36
- responses?: Record<string, { content?: Record<string, { schema?: SchemaObject }> }>;
37
- };
38
-
39
- export type OpenApiDoc = {
40
- openapi: string;
41
- paths: Record<string, Record<string, OperationObject> & { parameters?: ParameterObject[] }>;
42
- components?: { schemas?: Record<string, SchemaObject> };
43
- };
44
-
45
- export type OperationMeta = {
46
- path: string;
47
- method: HttpMethod;
48
- operationId: string;
49
- domain: string;
50
- methodName: string;
51
- responseType: string;
52
- responseSource: ResolveSource;
53
- paramsTypeName: string;
54
- pathParams: OperationParamMeta[];
55
- queryParams: OperationParamMeta[];
56
- headerParams: OperationParamMeta[];
57
- queryTypeName?: string;
58
- bodySchema?: SchemaObject;
59
- bodyTypeName?: string;
60
- bodyRequired: boolean;
61
- };
62
-
63
- export type TsRouteInfo = { method: HttpMethod; path: string; responseType: string };
64
- export type OperationParamMeta = ParameterObject & { typeName?: string };
65
- export type TsResolvedOperation = {
66
- method: HttpMethod;
67
- path: string;
68
- actionName: string;
69
- responseType: string;
70
- pathParams: Array<{ name: string; typeName: string }>;
71
- queryTypeName?: string;
72
- bodyTypeName?: string;
73
- bodyRequired: boolean;
74
- headerParams: Array<{ name: string; typeName: string; required: boolean }>;
75
- };
76
-
77
- export type GeneratorReport = {
78
- moduleName: string;
79
- mode: GenMode;
80
- totalOperations: number;
81
- resolvedByOpenapi: number;
82
- resolvedByTs: number;
83
- unresolved: Array<{ method: string; path: string; operationId: string }>;
84
- conflicts: Array<{ method: string; path: string; operationId: string; openapiType: string; tsType: string }>;
85
- };
86
-
87
- export const METHODS: HttpMethod[] = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];
88
-
89
- export const sanitizeTypeName = (s: string): string =>
90
- (s.replace(/[^a-zA-Z0-9_]/g, '_').split(/[_\-\s]+/).filter(Boolean).map((p) => p[0].toUpperCase() + p.slice(1)).join('')) || 'UnnamedType';
91
-
92
- export const sanitizePropertyName = (n: string): string => (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(n) ? n : `'${n.replace(/'/g, "\\'")}'`);
93
-
94
- export const normalizeApiPath = (p: string, prependV1ForModule?: string): string => {
95
- const v = (p.startsWith('/') ? p : `/${p}`).replace(/\/+/g, '/').replace(/:([a-zA-Z0-9_]+)/g, '{$1}');
96
- const withPrefix = prependV1ForModule && v.startsWith(`/${prependV1ForModule}`) ? `/v1${v}` : v;
97
- return withPrefix.length > 1 && withPrefix.endsWith('/') ? withPrefix.slice(0, -1) : withPrefix;
98
- };
99
-
100
- export const joinPaths = (a: string, b: string, modulePrefix?: string): string => normalizeApiPath(`${a.trim()}/${b.trim()}`, modulePrefix);
101
-
102
- export const parseBool = (v: string | undefined, d: boolean): boolean => (!v ? d : ['1', 'true', 'yes', 'on'].includes(v.toLowerCase()));
103
-
104
- export const getRefTypeName = (ref: string): string => sanitizeTypeName(ref.split('/').pop() || 'UnknownRef');
105
-
106
- export const normalizeNullable = (base: string, nullable?: boolean): string => (nullable ? `${base} | null` : base);
107
-
108
- export const primitiveForType = (type?: string, format?: string): string => {
109
- if (!type) return 'unknown';
110
- if (type === 'integer' || type === 'number') return 'number';
111
- if (type === 'boolean') return 'boolean';
112
- if (type === 'string') return format === 'binary' ? 'Blob' : 'string';
113
- if (type === 'null') return 'null';
114
- if (type === 'object') return 'Record<string, unknown>';
115
- if (type === 'array') return 'unknown[]';
116
- return 'unknown';
117
- };
118
-
119
- export const dedupeParameters = (a: ParameterObject[] | undefined, b: ParameterObject[] | undefined): ParameterObject[] => {
120
- const map = new Map<string, ParameterObject>();
121
- for (const p of [...(a ?? []), ...(b ?? [])]) map.set(`${p.in}:${p.name}`, p);
122
- return [...map.values()];
123
- };
124
-
125
- export const fallbackMethodName = (method: HttpMethod, apiPath: string): string => {
126
- const parts = apiPath.split('/').filter(Boolean).map((s) => (s.startsWith('{') ? `By${sanitizeTypeName(s.replace(/[{}]/g, ''))}` : sanitizeTypeName(s)));
127
- return `${method}${parts.join('')}`.replace(/^[A-Z]/, (c) => c.toLowerCase());
128
- };
129
-
130
- export const normalizeMethodName = (operationId: string, method: HttpMethod, apiPath: string): string => {
131
- if (!operationId.trim()) return fallbackMethodName(method, apiPath);
132
- const stripped = operationId.replace(/^[^_]+_/, '');
133
- const camel = stripped.replace(/[^a-zA-Z0-9]+(.)/g, (_, c: string) => c.toUpperCase()).replace(/^[A-Z]/, (c) => c.toLowerCase());
134
- return camel || fallbackMethodName(method, apiPath);
135
- };
136
-
137
- export const resolveDomain = (apiPath: string, pathPrefix: string): string => {
138
- const cleanPrefix = pathPrefix.replace(/\/$/, '');
139
- const metaPrefix = `${cleanPrefix}/db/meta/`;
140
- const dataPrefix = `${cleanPrefix}/db/data/`;
141
- if (apiPath.startsWith(metaPrefix)) return (apiPath.slice(metaPrefix.length).split('/').filter(Boolean)[0] || 'meta').toLowerCase();
142
- if (apiPath.startsWith(dataPrefix)) return 'data-table';
143
- if (apiPath.startsWith(`${cleanPrefix}/`)) return (apiPath.slice(`${cleanPrefix}/`.length).split('/').filter(Boolean)[0] || 'common').toLowerCase();
144
- return 'common';
145
- };
146
-
147
- export const BUILTIN_TYPE_NAMES = new Set(['string', 'number', 'boolean', 'unknown', 'void', 'null', 'undefined', 'never', 'any', 'Record', 'Array', 'Blob', 'Date', 'Object', 'Promise', 'ReadonlyArray', 'Partial', 'Pick', 'Omit', 'Required']);
148
-
149
- export const extractTypeIdentifiers = (typeExpr: string): string[] => {
150
- const m = typeExpr.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [];
151
- return [...new Set(m.filter((n) => !BUILTIN_TYPE_NAMES.has(n) && /^[A-Z]/.test(n)))];
152
- };
153
-
154
- export const extractGenericTypeNames = (typeExpr: string): string[] => {
155
- const out = new Set<string>();
156
- const regex = /([A-Za-z_][A-Za-z0-9_]*)\s*</g;
157
- let match: RegExpExecArray | null;
158
- while ((match = regex.exec(typeExpr)) !== null) {
159
- if (!BUILTIN_TYPE_NAMES.has(match[1]) && /^[A-Z]/.test(match[1])) out.add(match[1]);
160
- }
161
- return [...out];
162
- };