@balena/abstract-sql-to-typescript 1.1.2 → 1.2.0-reverse-references-0899e7780f41e34f7ee396f24fc4aff1edf7e4f8
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.
- package/.versionbot/CHANGELOG.yml +13 -1
- package/CHANGELOG.md +4 -0
- package/out/index.js +34 -9
- package/out/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +78 -16
- package/test/index.ts +33 -1
- package/tsconfig.json +1 -1
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
- commits:
|
|
2
|
+
- subject: Add support for reverse references using relationships info
|
|
3
|
+
hash: 0899e7780f41e34f7ee396f24fc4aff1edf7e4f8
|
|
4
|
+
body: ""
|
|
5
|
+
footer:
|
|
6
|
+
Change-type: minor
|
|
7
|
+
change-type: minor
|
|
8
|
+
author: Pagan Gazzard
|
|
9
|
+
nested: []
|
|
10
|
+
version: 1.2.0
|
|
11
|
+
title: "'Add support for reverse references using relationships info'"
|
|
12
|
+
date: 2022-04-15T14:47:19.984Z
|
|
1
13
|
- commits:
|
|
2
14
|
- subject: Update dependencies
|
|
3
15
|
hash: dd79d29d1e4ac31a4fdf7daf2e663ef876aec09c
|
|
@@ -605,7 +617,7 @@
|
|
|
605
617
|
date: 2021-06-30T21:27:55.877Z
|
|
606
618
|
version: 1.1.2
|
|
607
619
|
title: "'Update dependencies'"
|
|
608
|
-
date: 2022-04-08T15:
|
|
620
|
+
date: 2022-04-08T15:16:42.065Z
|
|
609
621
|
- commits:
|
|
610
622
|
- subject: Fix PickExpanded/PickDeferred type helpers
|
|
611
623
|
hash: ab7a898e7d55c50f0702560d4df1f2b29a775b90
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
+
## 1.2.0 - 2022-04-15
|
|
8
|
+
|
|
9
|
+
* Add support for reverse references using relationships info [Pagan Gazzard]
|
|
10
|
+
|
|
7
11
|
## 1.1.2 - 2022-04-08
|
|
8
12
|
|
|
9
13
|
|
package/out/index.js
CHANGED
|
@@ -8,7 +8,7 @@ const typeHelpers = {
|
|
|
8
8
|
export type DateString = string;
|
|
9
9
|
export type Expanded<T> = Extract<T, any[]>;
|
|
10
10
|
export type PickExpanded<T, K extends keyof T> = {
|
|
11
|
-
[P in K]
|
|
11
|
+
[P in K]-?: Expanded<T[P]>;
|
|
12
12
|
};
|
|
13
13
|
export type Deferred<T> = Exclude<T, any[]>;
|
|
14
14
|
export type PickDeferred<T, K extends keyof T> = {
|
|
@@ -73,19 +73,44 @@ const sqlTypeToTypescriptType = (m, f, opts) => {
|
|
|
73
73
|
throw new Error(`Unknown data type: '${f.dataType}'`);
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
|
-
const fieldsToInterfaceProps = (m, fields, opts) => fields
|
|
77
|
-
.map((f) => {
|
|
76
|
+
const fieldsToInterfaceProps = (m, fields, opts) => fields.map((f) => {
|
|
78
77
|
const nullable = f.required ? '' : ' | null';
|
|
78
|
+
return `${(0, odata_to_abstract_sql_1.sqlNameToODataName)(f.fieldName)}: ${sqlTypeToTypescriptType(m, f, opts)}${nullable};`;
|
|
79
|
+
});
|
|
80
|
+
const recurseRelationships = (m, relationships, opts, currentTable, parentKey) => Object.keys(relationships).flatMap((key) => {
|
|
81
|
+
if (key === '$') {
|
|
82
|
+
const [localField, referencedField] = relationships.$;
|
|
83
|
+
if (currentTable.idField === localField && referencedField != null) {
|
|
84
|
+
const referencedTable = m.tables[referencedField[0]];
|
|
85
|
+
if (referencedTable != null) {
|
|
86
|
+
const referencedInterface = modelNameToCamelCaseName(referencedTable.name);
|
|
87
|
+
return `${parentKey}?: ${referencedInterface}[];`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
return recurseRelationships(m, relationships[key], opts, currentTable, `${parentKey}__${key.replace(/ /g, '_')}`);
|
|
93
|
+
});
|
|
94
|
+
const relationshipsToInterfaceProps = (m, table, opts) => {
|
|
95
|
+
const relationships = m.relationships[table.resourceName];
|
|
96
|
+
if (relationships == null) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
return Object.keys(relationships).flatMap((key) => {
|
|
100
|
+
if (key === 'has') {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return recurseRelationships(m, relationships[key], opts, table, key.replace(/ /g, '_'));
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
const tableToInterface = (m, table, opts) => {
|
|
107
|
+
const relationshipProps = opts.mode === 'read' ? relationshipsToInterfaceProps(m, table, opts) : [];
|
|
79
108
|
return trimNL `
|
|
80
|
-
${(0, odata_to_abstract_sql_1.sqlNameToODataName)(f.fieldName)}: ${sqlTypeToTypescriptType(m, f, opts)}${nullable};
|
|
81
|
-
`;
|
|
82
|
-
})
|
|
83
|
-
.join('\n');
|
|
84
|
-
const tableToInterface = (m, table, opts) => trimNL `
|
|
85
109
|
export interface ${modelNameToCamelCaseName(table.name)} {
|
|
86
|
-
${fieldsToInterfaceProps(m, table.fields, opts)}
|
|
110
|
+
${[...fieldsToInterfaceProps(m, table.fields, opts), ...relationshipProps].join('\n\t')}
|
|
87
111
|
}
|
|
88
112
|
`;
|
|
113
|
+
};
|
|
89
114
|
const abstractSqlToTypescriptTypes = (m, opts = {}) => {
|
|
90
115
|
var _a;
|
|
91
116
|
const mode = (_a = opts.mode) !== null && _a !== void 0 ? _a : 'read';
|
package/out/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/abstract-sql-to-typescript",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-reverse-references-0899e7780f41e34f7ee396f24fc4aff1edf7e4f8",
|
|
4
4
|
"description": "A translator for abstract sql into typescript types.",
|
|
5
5
|
"main": "out/index.js",
|
|
6
6
|
"types": "out/index.d.ts",
|
|
@@ -45,6 +45,6 @@
|
|
|
45
45
|
"_": "test/**/*.ts"
|
|
46
46
|
},
|
|
47
47
|
"versionist": {
|
|
48
|
-
"publishedAt": "2022-04-
|
|
48
|
+
"publishedAt": "2022-04-15T14:47:20.085Z"
|
|
49
49
|
}
|
|
50
50
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,9 @@ import type {
|
|
|
3
3
|
AbstractSqlModel,
|
|
4
4
|
AbstractSqlTable,
|
|
5
5
|
InNode,
|
|
6
|
+
Relationship,
|
|
7
|
+
RelationshipInternalNode,
|
|
8
|
+
RelationshipLeafNode,
|
|
6
9
|
} from '@balena/abstract-sql-compiler';
|
|
7
10
|
import { sqlNameToODataName } from '@balena/odata-to-abstract-sql';
|
|
8
11
|
import { replaceResultTransformer, TemplateTag } from 'common-tags';
|
|
@@ -12,7 +15,7 @@ const typeHelpers = {
|
|
|
12
15
|
export type DateString = string;
|
|
13
16
|
export type Expanded<T> = Extract<T, any[]>;
|
|
14
17
|
export type PickExpanded<T, K extends keyof T> = {
|
|
15
|
-
[P in K]
|
|
18
|
+
[P in K]-?: Expanded<T[P]>;
|
|
16
19
|
};
|
|
17
20
|
export type Deferred<T> = Exclude<T, any[]>;
|
|
18
21
|
export type PickDeferred<T, K extends keyof T> = {
|
|
@@ -106,29 +109,88 @@ const fieldsToInterfaceProps = (
|
|
|
106
109
|
m: AbstractSqlModel,
|
|
107
110
|
fields: AbstractSqlField[],
|
|
108
111
|
opts: RequiredOptions,
|
|
109
|
-
): string =>
|
|
110
|
-
fields
|
|
111
|
-
.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
112
|
+
): string[] =>
|
|
113
|
+
fields.map((f) => {
|
|
114
|
+
const nullable = f.required ? '' : ' | null';
|
|
115
|
+
return `${sqlNameToODataName(f.fieldName)}: ${sqlTypeToTypescriptType(
|
|
116
|
+
m,
|
|
117
|
+
f,
|
|
118
|
+
opts,
|
|
119
|
+
)}${nullable};`;
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const recurseRelationships = (
|
|
123
|
+
m: AbstractSqlModel,
|
|
124
|
+
relationships: Relationship,
|
|
125
|
+
opts: RequiredOptions,
|
|
126
|
+
currentTable: AbstractSqlTable,
|
|
127
|
+
parentKey: string,
|
|
128
|
+
): string[] =>
|
|
129
|
+
Object.keys(relationships).flatMap((key) => {
|
|
130
|
+
if (key === '$') {
|
|
131
|
+
const [localField, referencedField] = (
|
|
132
|
+
relationships as RelationshipLeafNode
|
|
133
|
+
).$;
|
|
134
|
+
if (currentTable.idField === localField && referencedField != null) {
|
|
135
|
+
const referencedTable = m.tables[referencedField[0]];
|
|
136
|
+
if (referencedTable != null) {
|
|
137
|
+
const referencedInterface = modelNameToCamelCaseName(
|
|
138
|
+
referencedTable.name,
|
|
139
|
+
);
|
|
140
|
+
return `${parentKey}?: ${referencedInterface}[];`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
return recurseRelationships(
|
|
146
|
+
m,
|
|
147
|
+
(relationships as RelationshipInternalNode)[key],
|
|
148
|
+
opts,
|
|
149
|
+
currentTable,
|
|
150
|
+
`${parentKey}__${key.replace(/ /g, '_')}`,
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const relationshipsToInterfaceProps = (
|
|
155
|
+
m: AbstractSqlModel,
|
|
156
|
+
table: AbstractSqlTable,
|
|
157
|
+
opts: RequiredOptions,
|
|
158
|
+
): string[] => {
|
|
159
|
+
const relationships = m.relationships[table.resourceName];
|
|
160
|
+
if (relationships == null) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
return Object.keys(relationships).flatMap((key) => {
|
|
164
|
+
// We skip `has` a the top level as we omit it by convention
|
|
165
|
+
if (key === 'has') {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
return recurseRelationships(
|
|
169
|
+
m,
|
|
170
|
+
relationships[key],
|
|
171
|
+
opts,
|
|
172
|
+
table,
|
|
173
|
+
key.replace(/ /g, '_'),
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
};
|
|
122
177
|
|
|
123
178
|
const tableToInterface = (
|
|
124
179
|
m: AbstractSqlModel,
|
|
125
180
|
table: AbstractSqlTable,
|
|
126
181
|
opts: RequiredOptions,
|
|
127
|
-
) =>
|
|
182
|
+
) => {
|
|
183
|
+
const relationshipProps =
|
|
184
|
+
opts.mode === 'read' ? relationshipsToInterfaceProps(m, table, opts) : [];
|
|
185
|
+
|
|
186
|
+
return trimNL`
|
|
128
187
|
export interface ${modelNameToCamelCaseName(table.name)} {
|
|
129
|
-
${fieldsToInterfaceProps(m, table.fields, opts)
|
|
188
|
+
${[...fieldsToInterfaceProps(m, table.fields, opts), ...relationshipProps].join(
|
|
189
|
+
'\n\t',
|
|
190
|
+
)}
|
|
130
191
|
}
|
|
131
192
|
`;
|
|
193
|
+
};
|
|
132
194
|
|
|
133
195
|
export interface Options {
|
|
134
196
|
mode?: 'read' | 'write';
|
package/test/index.ts
CHANGED
|
@@ -25,7 +25,7 @@ const test = (
|
|
|
25
25
|
export type DateString = string;
|
|
26
26
|
export type Expanded<T> = Extract<T, any[]>;
|
|
27
27
|
export type PickExpanded<T, K extends keyof T> = {
|
|
28
|
-
[P in K]
|
|
28
|
+
[P in K]-?: Expanded<T[P]>;
|
|
29
29
|
};
|
|
30
30
|
export type Deferred<T> = Exclude<T, any[]>;
|
|
31
31
|
export type PickDeferred<T, K extends keyof T> = {
|
|
@@ -168,6 +168,37 @@ const testTable: Partial<AbstractSqlModel> = {
|
|
|
168
168
|
],
|
|
169
169
|
},
|
|
170
170
|
},
|
|
171
|
+
relationships: {
|
|
172
|
+
test: {
|
|
173
|
+
parent: {
|
|
174
|
+
$: ['parent', ['parent', 'id']],
|
|
175
|
+
},
|
|
176
|
+
has: {
|
|
177
|
+
parent: {
|
|
178
|
+
$: ['parent', ['parent', 'id']],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
references: {
|
|
182
|
+
other: {
|
|
183
|
+
$: ['references-other', ['other', 'id']],
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
test: {
|
|
187
|
+
references: {
|
|
188
|
+
other: {
|
|
189
|
+
$: ['id', ['test-references-other', 'test']],
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
other: {
|
|
195
|
+
'is referenced by': {
|
|
196
|
+
test: {
|
|
197
|
+
$: ['id', ['test', 'references-other']],
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
171
202
|
};
|
|
172
203
|
|
|
173
204
|
test(
|
|
@@ -184,6 +215,7 @@ test(
|
|
|
184
215
|
created_at: DateString;
|
|
185
216
|
modified_at: DateString;
|
|
186
217
|
id: number;
|
|
218
|
+
is_referenced_by__test?: Test[];
|
|
187
219
|
}
|
|
188
220
|
|
|
189
221
|
export interface Test {
|