Skip to content

Commit f62a1bc

Browse files
feat: sort generated type declarations (#257)
This produces more stable output when generating types
1 parent 8a55922 commit f62a1bc

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

packages/mysql-schema-print-types/src/__tests__/print-from-code.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ test('replace filter', async () => {
4545
"filename": "index.ts",
4646
},
4747
Object {
48-
"content": "interface TableName {
48+
"content": "interface TableMyNameInsert {
4949
}
50-
export default TableName;
50+
export type {TableMyNameInsert}
5151
52-
interface TableMyNameInsert {
52+
interface TableName {
5353
}
54-
export type {TableMyNameInsert}
54+
export default TableName;
5555
",
5656
"filename": "my_table_my_name.ts",
5757
},

packages/pg-schema-print-types/src/__tests__/print-from-code.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@ test('replace filter', async () => {
4747
export {serializeValue}
4848
4949
export type {
50-
TableName,
5150
TableMyNameInsert,
51+
TableName,
5252
}
5353
",
5454
"filename": "index.ts",
5555
},
5656
Object {
57-
"content": "interface TableName {
57+
"content": "interface TableMyNameInsert {
5858
}
59-
export default TableName;
59+
export type {TableMyNameInsert}
6060
61-
interface TableMyNameInsert {
61+
interface TableName {
6262
}
63-
export type {TableMyNameInsert}
63+
export default TableName;
6464
",
6565
"filename": "my_table_my_name.ts",
6666
},

packages/shared-print-types/src/PrintContext.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class FileContent<TypeID> {
5353
private readonly _options: PrintOptions<TypeID>;
5454
private readonly _imports = new Map<FileName, ImportState>();
5555
private readonly _declarationNames = new Set<string>();
56-
private readonly _declarations: (() => string[])[] = [];
56+
private readonly _declarations: {name: string; src: () => string[]}[] = [];
5757
private readonly _reExports: {
5858
type: {source: string; dest: string}[];
5959
value: {source: string; dest: string}[];
@@ -122,12 +122,15 @@ class FileContent<TypeID> {
122122
getImport: (id: FileExport) =>
123123
this._getImportState(id.file).getImport(id),
124124
});
125-
this._declarations.push(() => [
126-
...declarationLines,
127-
this.getDefaultName() === identifierName
128-
? `export default ${identifierName};`
129-
: `export ${mode === 'type' ? 'type ' : ''}{${identifierName}}`,
130-
]);
125+
this._declarations.push({
126+
name: identifierName,
127+
src: () => [
128+
...declarationLines,
129+
this.getDefaultName() === identifierName
130+
? `export default ${identifierName};`
131+
: `export ${mode === 'type' ? 'type ' : ''}{${identifierName}}`,
132+
],
133+
});
131134
}
132135
return {
133136
mode,
@@ -167,10 +170,13 @@ class FileContent<TypeID> {
167170
.join('\n'),
168171
]
169172
: []),
170-
...this._declarations.map((v) => v().join('\n')),
173+
...this._declarations
174+
.sort((a, b) => (a.name < b.name ? -1 : 1))
175+
.map((v) => v.src().join('\n')),
171176
...(this._reExports.type.length
172177
? [
173178
`export type {\n${this._reExports.type
179+
.sort((a, b) => (a.dest < b.dest ? -1 : 1))
174180
.map((t) =>
175181
t.source === t.dest
176182
? ` ${t.source},`
@@ -182,6 +188,7 @@ class FileContent<TypeID> {
182188
...(this._reExports.value.length
183189
? [
184190
`export {\n${this._reExports.value
191+
.sort((a, b) => (a.dest < b.dest ? -1 : 1))
185192
.map((t) =>
186193
t.source === t.dest
187194
? ` ${t.source},`

0 commit comments

Comments
 (0)