@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.
@@ -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:32:53.304Z
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]: Expanded<T[P]>;
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":";;;AAMA,yEAAmE;AACnE,6CAAoE;AAEpE,MAAM,WAAW,GAAG;IACnB,IAAI,EAAE;;;;;;;;;;CAUN;IACA,KAAK,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,yBAAW,CAC7B,IAAA,sCAAwB,EAAC,oBAAoB,EAAE,EAAE,CAAC,CAClD,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,CAAS,EAAU,EAAE,CACtD,CAAC;KACC,KAAK,CAAC,MAAM,CAAC;KACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjD,IAAI,CAAC,EAAE,CAAC,CAAC;AAEZ,MAAM,qBAAqB,GAAG,CAC7B,CAAmB,EACnB,EAAE,UAAU,EAAoB,EAChC,IAAqB,EACZ,EAAE;IACX,IAAI,UAAU,IAAI,IAAI,EAAE;QACvB,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CACpE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAC3C,CAAC;QACF,IAAI,eAAe,IAAI,IAAI,EAAE;YAC5B,OAAO,uBAAuB,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;SACzD;KACD;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC/B,CAAmB,EACnB,CAAmB,EACnB,IAAqB,EACZ,EAAE;IACX,IAAI,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;QACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,CAAC,UAAU,EAAwB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAC5D,CAAC;QACF,IAAI,QAAQ,EAAE;YACb,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,aAAa,CAAC,GAAG,QAAQ,CAAC;YACxC,OAAO,aAAa;iBAClB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBAChE,IAAI,CAAC,KAAK,CAAC,CAAC;SACd;KACD;IAED,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACnB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACZ,OAAO,QAAQ,CAAC;QACjB,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC;QACjB,KAAK,aAAa;YAEjB,OAAO,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,KAAK,YAAY;YAChB,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC1B,OAAO,kBAAkB,CAAC;aAC1B;YAED,MAAM,mBAAmB,GAAG,wBAAwB,CACnD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAW,CAAC,YAAY,CAAC,CAAC,IAAI,CACzC,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACvC,OAAO,WAAW,kBAAkB,SAAS,mBAAmB,GAAG,QAAQ,GAAG,CAAC;QAChF,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC;QACjB,KAAK,MAAM;YACV,OAAO,IAAI,CAAC;QACb;YACC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;KACvD;AACF,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC9B,CAAmB,EACnB,MAA0B,EAC1B,IAAqB,EACZ,EAAE,CACX,MAAM;KACJ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IACV,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,OAAO,MAAM,CAAA;GACb,IAAA,0CAAkB,EAAC,CAAC,CAAC,SAAS,CAAC,KAAK,uBAAuB,CAC1D,CAAC,EACD,CAAC,EACD,IAAI,CACJ,GAAG,QAAQ;CACd,CAAC;AACA,CAAC,CAAC;KACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAEd,MAAM,gBAAgB,GAAG,CACxB,CAAmB,EACnB,KAAuB,EACvB,IAAqB,EACpB,EAAE,CAAC,MAAM,CAAA;mBACQ,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;EACrD,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;;CAE9C,CAAC;AAOK,MAAM,4BAA4B,GAAG,CAC3C,CAAmB,EACnB,OAAgB,EAAE,EACT,EAAE;;IACX,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,IAAI,mCAAI,MAAM,CAAC;IACjC,MAAM,eAAe,GAAoB;QACxC,GAAG,IAAI;QACP,IAAI;KACJ,CAAC;IACF,OAAO,MAAM,CAAA;EACZ,WAAW,CAAC,IAAI,CAAC;EACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;SACrB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC;CACb,CAAC;AACF,CAAC,CAAC;AAlBW,QAAA,4BAA4B,gCAkBvC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AASA,yEAAmE;AACnE,6CAAoE;AAEpE,MAAM,WAAW,GAAG;IACnB,IAAI,EAAE;;;;;;;;;;CAUN;IACA,KAAK,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,yBAAW,CAC7B,IAAA,sCAAwB,EAAC,oBAAoB,EAAE,EAAE,CAAC,CAClD,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,CAAS,EAAU,EAAE,CACtD,CAAC;KACC,KAAK,CAAC,MAAM,CAAC;KACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjD,IAAI,CAAC,EAAE,CAAC,CAAC;AAEZ,MAAM,qBAAqB,GAAG,CAC7B,CAAmB,EACnB,EAAE,UAAU,EAAoB,EAChC,IAAqB,EACZ,EAAE;IACX,IAAI,UAAU,IAAI,IAAI,EAAE;QACvB,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CACpE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAC3C,CAAC;QACF,IAAI,eAAe,IAAI,IAAI,EAAE;YAC5B,OAAO,uBAAuB,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;SACzD;KACD;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC/B,CAAmB,EACnB,CAAmB,EACnB,IAAqB,EACZ,EAAE;IACX,IAAI,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;QACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,CAAC,UAAU,EAAwB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAC5D,CAAC;QACF,IAAI,QAAQ,EAAE;YACb,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,aAAa,CAAC,GAAG,QAAQ,CAAC;YACxC,OAAO,aAAa;iBAClB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBAChE,IAAI,CAAC,KAAK,CAAC,CAAC;SACd;KACD;IAED,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACnB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACZ,OAAO,QAAQ,CAAC;QACjB,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC;QACjB,KAAK,aAAa;YAEjB,OAAO,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,KAAK,YAAY;YAChB,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC1B,OAAO,kBAAkB,CAAC;aAC1B;YAED,MAAM,mBAAmB,GAAG,wBAAwB,CACnD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAW,CAAC,YAAY,CAAC,CAAC,IAAI,CACzC,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACvC,OAAO,WAAW,kBAAkB,SAAS,mBAAmB,GAAG,QAAQ,GAAG,CAAC;QAChF,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC;QACjB,KAAK,MAAM;YACV,OAAO,IAAI,CAAC;QACb;YACC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;KACvD;AACF,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC9B,CAAmB,EACnB,MAA0B,EAC1B,IAAqB,EACV,EAAE,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IAChB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,OAAO,GAAG,IAAA,0CAAkB,EAAC,CAAC,CAAC,SAAS,CAAC,KAAK,uBAAuB,CACpE,CAAC,EACD,CAAC,EACD,IAAI,CACJ,GAAG,QAAQ,GAAG,CAAC;AACjB,CAAC,CAAC,CAAC;AAEJ,MAAM,oBAAoB,GAAG,CAC5B,CAAmB,EACnB,aAA2B,EAC3B,IAAqB,EACrB,YAA8B,EAC9B,SAAiB,EACN,EAAE,CACb,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;IAC1C,IAAI,GAAG,KAAK,GAAG,EAAE;QAChB,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,GAClC,aACA,CAAC,CAAC,CAAC;QACJ,IAAI,YAAY,CAAC,OAAO,KAAK,UAAU,IAAI,eAAe,IAAI,IAAI,EAAE;YACnE,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,eAAe,IAAI,IAAI,EAAE;gBAC5B,MAAM,mBAAmB,GAAG,wBAAwB,CACnD,eAAe,CAAC,IAAI,CACpB,CAAC;gBACF,OAAO,GAAG,SAAS,MAAM,mBAAmB,KAAK,CAAC;aAClD;SACD;QACD,OAAO,EAAE,CAAC;KACV;IACD,OAAO,oBAAoB,CAC1B,CAAC,EACA,aAA0C,CAAC,GAAG,CAAC,EAChD,IAAI,EACJ,YAAY,EACZ,GAAG,SAAS,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CACzC,CAAC;AACH,CAAC,CAAC,CAAC;AAEJ,MAAM,6BAA6B,GAAG,CACrC,CAAmB,EACnB,KAAuB,EACvB,IAAqB,EACV,EAAE;IACb,MAAM,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,aAAa,IAAI,IAAI,EAAE;QAC1B,OAAO,EAAE,CAAC;KACV;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAEjD,IAAI,GAAG,KAAK,KAAK,EAAE;YAClB,OAAO,EAAE,CAAC;SACV;QACD,OAAO,oBAAoB,CAC1B,CAAC,EACD,aAAa,CAAC,GAAG,CAAC,EAClB,IAAI,EACJ,KAAK,EACL,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACxB,CAAmB,EACnB,KAAuB,EACvB,IAAqB,EACpB,EAAE;IACH,MAAM,iBAAiB,GACtB,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,OAAO,MAAM,CAAA;mBACK,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;GACpD,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAC9E,MAAM,CACN;;CAED,CAAC;AACF,CAAC,CAAC;AAOK,MAAM,4BAA4B,GAAG,CAC3C,CAAmB,EACnB,OAAgB,EAAE,EACT,EAAE;;IACX,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,IAAI,mCAAI,MAAM,CAAC;IACjC,MAAM,eAAe,GAAoB;QACxC,GAAG,IAAI;QACP,IAAI;KACJ,CAAC;IACF,OAAO,MAAM,CAAA;EACZ,WAAW,CAAC,IAAI,CAAC;EACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;SACrB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC;CACb,CAAC;AACF,CAAC,CAAC;AAlBW,QAAA,4BAA4B,gCAkBvC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@balena/abstract-sql-to-typescript",
3
- "version": "1.1.2",
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-08T15:32:53.884Z"
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]: Expanded<T[P]>;
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
- .map((f) => {
112
- const nullable = f.required ? '' : ' | null';
113
- return trimNL`
114
- ${sqlNameToODataName(f.fieldName)}: ${sqlTypeToTypescriptType(
115
- m,
116
- f,
117
- opts,
118
- )}${nullable};
119
- `;
120
- })
121
- .join('\n');
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
- ) => trimNL`
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]: Expanded<T[P]>;
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 {
package/tsconfig.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "strictNullChecks": true,
11
11
  "declaration": true,
12
12
  "skipLibCheck": true,
13
- "target": "es2018",
13
+ "target": "es2019",
14
14
  "outDir": "out",
15
15
  "resolveJsonModule": true
16
16
  },