@ebusd/ebus-typespec 0.1.0

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 (55) hide show
  1. package/README.md +62 -0
  2. package/dist/src/csv_emitter.d.ts +14 -0
  3. package/dist/src/csv_emitter.js +493 -0
  4. package/dist/src/csv_emitter.js.map +1 -0
  5. package/dist/src/decorators.d.ts +284 -0
  6. package/dist/src/decorators.js +437 -0
  7. package/dist/src/decorators.js.map +1 -0
  8. package/dist/src/index.d.ts +6 -0
  9. package/dist/src/index.js +16 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/lib.d.ts +214 -0
  12. package/dist/src/lib.js +124 -0
  13. package/dist/src/lib.js.map +1 -0
  14. package/dist/src/linter.d.ts +1 -0
  15. package/dist/src/linter.js +47 -0
  16. package/dist/src/linter.js.map +1 -0
  17. package/dist/src/rules/no-function.rule.d.ts +3 -0
  18. package/dist/src/rules/no-function.rule.js +17 -0
  19. package/dist/src/rules/no-function.rule.js.map +1 -0
  20. package/dist/src/rules/no-interface.rule.d.ts +3 -0
  21. package/dist/src/rules/no-interface.rule.js +17 -0
  22. package/dist/src/rules/no-interface.rule.js.map +1 -0
  23. package/dist/src/rules/no-intrinsic.rule.d.ts +3 -0
  24. package/dist/src/rules/no-intrinsic.rule.js +19 -0
  25. package/dist/src/rules/no-intrinsic.rule.js.map +1 -0
  26. package/dist/src/rules/no-literal.rule.d.ts +3 -0
  27. package/dist/src/rules/no-literal.rule.js +20 -0
  28. package/dist/src/rules/no-literal.rule.js.map +1 -0
  29. package/dist/src/rules/no-object.rule.d.ts +3 -0
  30. package/dist/src/rules/no-object.rule.js +17 -0
  31. package/dist/src/rules/no-object.rule.js.map +1 -0
  32. package/dist/src/rules/no-operation.rule.d.ts +3 -0
  33. package/dist/src/rules/no-operation.rule.js +19 -0
  34. package/dist/src/rules/no-operation.rule.js.map +1 -0
  35. package/dist/src/rules/no-projection.rule.d.ts +3 -0
  36. package/dist/src/rules/no-projection.rule.js +17 -0
  37. package/dist/src/rules/no-projection.rule.js.map +1 -0
  38. package/dist/src/rules/no-template.rule.d.ts +3 -0
  39. package/dist/src/rules/no-template.rule.js +20 -0
  40. package/dist/src/rules/no-template.rule.js.map +1 -0
  41. package/dist/src/rules/no-tuple.rule.d.ts +3 -0
  42. package/dist/src/rules/no-tuple.rule.js +17 -0
  43. package/dist/src/rules/no-tuple.rule.js.map +1 -0
  44. package/dist/src/rules/no-union.rule.d.ts +3 -0
  45. package/dist/src/rules/no-union.rule.js +20 -0
  46. package/dist/src/rules/no-union.rule.js.map +1 -0
  47. package/dist/src/testing/index.d.ts +2 -0
  48. package/dist/src/testing/index.js +6 -0
  49. package/dist/src/testing/index.js.map +1 -0
  50. package/docs.md +453 -0
  51. package/lib/decorators.tsp +127 -0
  52. package/lib/main.tsp +3 -0
  53. package/lib/models.tsp +61 -0
  54. package/lib/types.tsp +169 -0
  55. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # eBUS TypeSpec library
2
+
3
+ This is a [TypeSpec](https://typespec.io/) library for defining eBUS messages on a high level.
4
+
5
+ It comes with [decorators](#decorators) for the eBUS specific aspects of circuits, messages, fields and data transfer, as well as eBUS specific [data types](#data-types).
6
+
7
+ Once a message is declared in a typespec file, it can be converted to [ebusd CSV format](https://github.com/john30/ebusd/wiki/4.-Configuration) using an [emitter](#emitter).
8
+
9
+ ## Decorators
10
+ This is a short overview of the [decorators](lib/decorators.tsp) offered by the library:
11
+ * source address `QQ`: `@qq(QQ)`
12
+ * target address `ZZ`: `@zz(ZZ)`
13
+ * message ID `PB`, `SB`, `ID*`: `@id(PB, SB, ID*)`
14
+ when using inheritance:
15
+ * base ID: `@base(PB, SB, ID*)`
16
+ * ID extension: `@ext(ID*)`
17
+ * inheritance: ``@inherit(...)`
18
+ * message direction: `@write`, `@passive`
19
+ * message condition(s): `@condition(model, values)`
20
+ * message authorization: `@auth(level)`
21
+ * field location: `@in`, `@out`
22
+ * field divisor/factor: `@divisor(number)`, `@factor(number)`
23
+ * field value list: `@values(...)`
24
+ * field unit: `@unit(...)`
25
+
26
+ ## Data types
27
+ All the standard eBUS base data types like UCH etc. are available in the [`Ebus` types namespace](lib/types.tsp) under:
28
+ * `Ebus.num`: numeric+bit types
29
+ * `Ebus.str`: string types including hex sequence
30
+ * `Ebus.dtm`: date/time type
31
+
32
+ ## Models
33
+ The identification message is available in the [`Ebus` model namespace](lib/models.tsp) under:
34
+ * `Ebus.id`: read/write/broadcast version of identification
35
+
36
+ ## Emitter
37
+ The CSV emitter is available as with the following parameters:
38
+
39
+ It can be used via `tsp compile --emit ebus --option @typespec/json-schema.emitAllRefs=true <tsp files>`.
40
+
41
+ ## Example
42
+ Here is a small example of a message carrying just a single byte:
43
+
44
+ ```typespec
45
+ import "Ebus";
46
+ using Ebus.num;
47
+
48
+ @zz(0x08)
49
+ @id(0x01, 0x02)
50
+ model message {
51
+ field1: UCH,
52
+ }
53
+ ```
54
+
55
+ This fits to an eBUS byte sequence like this
56
+ ```hex
57
+ ff08010200 / 0105
58
+ ```
59
+ that transfers the `message` from source `0xff` where the target `0x08` replied with a value of 5 for `field1`.
60
+
61
+ ## Documentation
62
+ See [here for the documentation](docs.md) generated from the source.
@@ -0,0 +1,14 @@
1
+ import { type Model, type Namespace, type Program, type Union } from "@typespec/compiler";
2
+ import { CodeTypeEmitter, type Context, type EmittedSourceFile, type EmitterOutput, type SourceFile } from "@typespec/compiler/emitter-framework";
3
+ import { type EbusdEmitterOptions } from "./lib.js";
4
+ export declare class EbusdEmitter extends CodeTypeEmitter<EbusdEmitterOptions> {
5
+ #private;
6
+ programContext(program: Program): Context;
7
+ modelDeclaration(model: Model, name: string): EmitterOutput<string>;
8
+ modelPropertiesRw(model: Model, activeWrite?: boolean, broadcastTarget?: boolean): EmitterOutput<string>;
9
+ unionDeclaration(union: Union, name: string): EmitterOutput<string>;
10
+ writeOutput(sourceFiles: SourceFile<string>[]): Promise<void>;
11
+ sourceFile(sourceFile: SourceFile<string>): EmittedSourceFile;
12
+ namespaceContext(namespace: Namespace): Context;
13
+ modelDeclarationContext(model: Model, modelName: string): Context;
14
+ }
@@ -0,0 +1,493 @@
1
+ import { emitFile, getDoc, getMaxLength, getMinLength, getNamespaceFullName, isDeclaredInNamespace, isNumericType } from "@typespec/compiler";
2
+ import { CodeTypeEmitter, StringBuilder, code } from "@typespec/compiler/emitter-framework";
3
+ import { DuplicateTracker } from "@typespec/compiler/utils";
4
+ import { basename, extname } from "path";
5
+ import { getAuth, getConditions, getDivisor, getId, getInherit, getMaxBits, getOut, getPassive, getQq, getUnit, getValues, getWrite, getZz, isSourceAddr } from "./decorators.js";
6
+ import { StateKeys, reportDiagnostic } from "./lib.js";
7
+ const hex = (v) => v === undefined ? '' : (0x100 | v).toString(16).substring(1);
8
+ const hexs = (vs) => vs ? vs.map(hex).join('') : '';
9
+ const fileParent = (n) => n.file || n.parent && fileParent(n.parent);
10
+ const isSourceFileWithPath = (scope) => scope.kind === "sourceFile" && !!scope.sourceFile.path;
11
+ const escape = (s) => s && (s.includes('"') || s?.includes(',')) ? `"${s}"` : s;
12
+ const camelCase = (s) => s ? s.substring(0, 1).toLowerCase() + s.substring(1) : s;
13
+ const normName = {
14
+ circuit: (s) => s ? s.toLowerCase() : s,
15
+ message: (s) => s, // or camelCase
16
+ field: (s) => s ? s.toLowerCase() : s,
17
+ };
18
+ const mapConds = (idModel, sf, conds) => conds?.map(c => {
19
+ const values = c.length > 1 ? (c[1].match(/^[<>=]/) ? '' : '=') + c.slice(1).join(';') : '';
20
+ const ref = c[0];
21
+ let propName = ref.kind === 'ModelProperty' ? ref.name : '';
22
+ const model = propName ? ref.model : ref;
23
+ let modelName = model?.name;
24
+ let condName = (modelName + (propName === 'value' ? '' : '_' + propName)).toLowerCase();
25
+ let circuitName = '';
26
+ if (idModel && model === idModel) {
27
+ modelName = '';
28
+ circuitName = 'scan';
29
+ propName = propName.toUpperCase(); // todo support lowercase in ebusd as well
30
+ }
31
+ else {
32
+ modelName = (modelName || '').toLowerCase();
33
+ }
34
+ sf.imports.set(condName, [`[${condName}]`, circuitName, '', modelName, '', propName]);
35
+ return `[${condName + values}]`;
36
+ }).join('');
37
+ export class EbusdEmitter extends CodeTypeEmitter {
38
+ #idDuplicateTracker = new DuplicateTracker();
39
+ #sourceFileByPath = new Map();
40
+ programContext(program) {
41
+ const sourceFile = this.emitter.createSourceFile('');
42
+ return {
43
+ scope: sourceFile.globalScope,
44
+ };
45
+ }
46
+ modelDeclaration(model, name) {
47
+ const program = this.emitter.getProgram();
48
+ const decls = [];
49
+ const context = this.emitter.getContext();
50
+ if (!program.stateSet(StateKeys.id).has(model) || context.exclude) {
51
+ return this.emitter.result.none();
52
+ }
53
+ const sf = this.#getCurrentSourceFile();
54
+ let nearestCircuit;
55
+ let nearestZz;
56
+ for (const frame of [model, context.referencedBy]) {
57
+ if (!frame)
58
+ continue;
59
+ // get "file" namespace
60
+ const fp = fileParent(frame.node);
61
+ for (let n = fp && frame.namespace; n; n = n.namespace) {
62
+ if (n?.name === 'Ebus') {
63
+ break;
64
+ }
65
+ if (frame !== context.referencedBy && fileParent(n.node) !== fp) {
66
+ break;
67
+ }
68
+ const zz = getZz(program, n);
69
+ if (zz) {
70
+ // topmost namespace with @zz decides the circuit name.
71
+ // if absent, then the file name is taken
72
+ if (!nearestCircuit) {
73
+ nearestCircuit = n.name;
74
+ }
75
+ if (!nearestZz) {
76
+ // nearest namespace with @zz decides the fallback ZZ
77
+ nearestZz = zz;
78
+ }
79
+ }
80
+ }
81
+ if (!nearestCircuit) {
82
+ let fileCircuit = basename(fp.path, extname(fp.path));
83
+ if (context.referencedBy && fileCircuit.endsWith('_inc')
84
+ || extname(sf?.path) === '.inc' && fileCircuit === basename(sf.path, '.inc') + '_inc') {
85
+ fileCircuit = ''; // leave circuit blank in include files unless the circuit name was set explicitly
86
+ }
87
+ nearestCircuit = fileCircuit;
88
+ }
89
+ }
90
+ if (nearestCircuit) {
91
+ nearestCircuit = nearestCircuit.split('.')[0]; // strip off further other suffixes
92
+ const parts = basename(sf.path, extname(sf.path)).split('.');
93
+ if (parts.length > 1 && (extname(sf.path) === '.inc' ? parts[0] === nearestCircuit : parts[0].length === 2 && parts[1] === nearestCircuit)) {
94
+ nearestCircuit = '';
95
+ }
96
+ }
97
+ const [idModel] = program.resolveTypeReference('Ebus.id.id');
98
+ const conds = (context.conds || '') + mapConds(idModel, sf, getConditions(program, model) || (model.namespace && getConditions(program, model.namespace)) || []);
99
+ for (const inheritFrom of getInherit(program, model) ?? [undefined]) {
100
+ let write = getWrite(program, model) ?? getWrite(program, inheritFrom);
101
+ const passive = getPassive(program, model) ?? getPassive(program, inheritFrom);
102
+ let zz = getZz(program, model) ?? getZz(program, inheritFrom) ?? nearestZz;
103
+ let broadcastTarget = false;
104
+ if (zz === 0xfe || isSourceAddr(zz)) {
105
+ // special: broadcast or source as target
106
+ if (passive === undefined) {
107
+ // auto for write depending on zz unless @passive was set
108
+ write ??= true;
109
+ }
110
+ if (zz === 0xfe) {
111
+ broadcastTarget = true;
112
+ }
113
+ }
114
+ else if (zz === 0xaa) { // explicit unset in child (see decorator handling)
115
+ zz = undefined;
116
+ }
117
+ const direction = write ? (passive ? 'uw' : 'w') : (passive ? 'u' : 'r');
118
+ // add a generic default line for each direction at least
119
+ if (!sf.imports.has(direction)) {
120
+ sf.imports.set(direction, [direction]);
121
+ }
122
+ const baseFields = inheritFrom && this.modelPropertiesRw(inheritFrom, write && !passive, broadcastTarget);
123
+ const fields = this.modelPropertiesRw(model, write && !passive, broadcastTarget);
124
+ const comment = getDoc(program, model) ?? getDoc(program, inheritFrom);
125
+ const qq = getQq(program, model) ?? getQq(program, inheritFrom); // todo could do same handling as for zz
126
+ // when inheriting id, only one of them may have pbsb, rest of id is concatenated
127
+ const baseId = getId(program, inheritFrom);
128
+ const modelId = getId(program, model);
129
+ const id = [...(baseId || []), ...(modelId || [])];
130
+ if (id.length < 2) {
131
+ reportDiagnostic(program, {
132
+ code: "short-id",
133
+ format: { id: id.join() },
134
+ target: model,
135
+ }); // impossible by decorators anyway
136
+ }
137
+ else {
138
+ this.#idDuplicateTracker.track([sf?.path || '', conds, direction, qq, zz, ...id].join(), model);
139
+ }
140
+ const idh = hexs(id);
141
+ const level = getAuth(program, model) ?? getAuth(program, inheritFrom);
142
+ // message: type,circuit,level,name,comment,qq,zz,pbsb,id,...fields
143
+ // field: name,part,type,divisor/values,unit,comment
144
+ const message = [conds + direction, normName.circuit(nearestCircuit), level, normName.message(name), escape(comment), hex(qq), hex(zz), idh.substring(0, 4), idh.substring(4)];
145
+ decls.push([...message, ...(baseFields ? [baseFields] : []), fields].join());
146
+ }
147
+ return this.emitter.result.declaration(name, decls.join('\n'));
148
+ }
149
+ modelPropertiesRw(model, activeWrite, broadcastTarget) {
150
+ const b = new StringBuilder();
151
+ let first = true;
152
+ const program = this.emitter.getProgram();
153
+ const properties = Array.from(model.properties.values());
154
+ let recursion = 0;
155
+ let commentProp;
156
+ for (let idx = 0; idx < properties.length; idx++) {
157
+ const p = properties[idx];
158
+ if (p.type.kind !== 'Scalar' && p.type.kind !== 'ModelProperty') {
159
+ if (p.type.kind === 'Model' && p.type.properties && recursion < 5) {
160
+ // insert the referenced models properties inplace and go on with those (this is recursive)
161
+ const append = Array.from(p.type.properties.values());
162
+ properties.splice(idx + 1, 0, ...append);
163
+ recursion++;
164
+ // extract the comment only from reference:
165
+ commentProp = p;
166
+ }
167
+ else {
168
+ reportDiagnostic(program, {
169
+ code: "banned-inheritance",
170
+ format: {},
171
+ target: p,
172
+ });
173
+ commentProp = undefined;
174
+ }
175
+ continue;
176
+ }
177
+ if (p.optional && activeWrite) {
178
+ // optional fields are omitted for active write
179
+ commentProp = undefined;
180
+ continue;
181
+ }
182
+ let res = {};
183
+ let s = p;
184
+ let isOwn = false;
185
+ do {
186
+ res = { ...res, name: s.name };
187
+ if (s.kind === 'ModelProperty') {
188
+ if (!res.pname) {
189
+ res.pname = s.name;
190
+ }
191
+ }
192
+ else if (this.#isStdType(s, true)) {
193
+ isOwn = true;
194
+ // set length depending on difference to max in base type
195
+ if (res.length !== undefined) {
196
+ const length = isNumericType(program, s) ? getMaxBits(program, s) : getMaxLength(program, s);
197
+ if (!length || res.length > length) {
198
+ res.length = undefined;
199
+ reportDiagnostic(program, {
200
+ code: "banned-length",
201
+ format: { which: isNumericType(program, s) ? 'maxBits' : 'maxLength', value: `${length}` },
202
+ target: model,
203
+ });
204
+ }
205
+ else if (length === res.length) {
206
+ res.length = res.remainLength ? 1 : undefined;
207
+ }
208
+ }
209
+ break; // ebus base type reached
210
+ }
211
+ res.length ??= isNumericType(program, s) ? getMaxBits(program, s) : getMaxLength(program, s);
212
+ res.remainLength ??= !isNumericType(program, s) && getMinLength(program, s) === 0;
213
+ if (!res.dir && s.kind === 'ModelProperty') {
214
+ const out = getOut(program, s);
215
+ if (out !== undefined) {
216
+ if (broadcastTarget && out === false) {
217
+ reportDiagnostic(program, {
218
+ code: "banned-in",
219
+ format: {},
220
+ target: s,
221
+ });
222
+ }
223
+ res.dir = out ? 'm' : 's';
224
+ }
225
+ }
226
+ const d = getDivisor(program, s);
227
+ if (d !== undefined && d !== 0) {
228
+ res.divisor = (res.divisor || 1) * d;
229
+ }
230
+ if (!res.divisor && !res.values) {
231
+ const members = getValues(program, s)?.members;
232
+ if (members) {
233
+ const values = [];
234
+ members.forEach(m => m.value !== undefined && values.push(m.value + '=' + m.name));
235
+ res.values = values;
236
+ }
237
+ }
238
+ res.unit ??= getUnit(program, s);
239
+ if (commentProp) {
240
+ res.comment ??= getDoc(program, commentProp);
241
+ commentProp = undefined;
242
+ }
243
+ res.comment ??= getDoc(program, s);
244
+ if (s.kind === 'ModelProperty') {
245
+ s = s.type;
246
+ }
247
+ else {
248
+ if (!s.baseScalar) {
249
+ break;
250
+ }
251
+ s = s.baseScalar;
252
+ }
253
+ } while (true);
254
+ commentProp = undefined;
255
+ if (!isOwn) {
256
+ reportDiagnostic(program, {
257
+ code: "banned-type",
258
+ format: { type: res.name, name: res.pname },
259
+ target: model,
260
+ });
261
+ continue;
262
+ }
263
+ // field,part (m/s),type / templates,divider / values,unit,comment
264
+ const divisor = res.divisor ? Math.round(res.divisor < 1 ? -1.0 / res.divisor : res.divisor)
265
+ : res.values?.join(';');
266
+ let typ = res.name;
267
+ if (typ.length > 4 && typ[3] === '_') {
268
+ // expect to end with digits e.g. BI3_1
269
+ typ = typ.substring(0, 3) + ':' + typ.substring(4);
270
+ }
271
+ else if (typ.length > 3 && typ.toUpperCase() === typ) {
272
+ // expect to end with digits e.g. BCD4
273
+ typ = typ.substring(0, 3) + ':' + typ.substring(3);
274
+ }
275
+ else if (res.length) {
276
+ typ += ':' + (res.remainLength ? '*' : res.length);
277
+ }
278
+ const field = [normName.field(res.pname), res.dir, typ, divisor, res.unit, escape(res.comment)];
279
+ if (first) {
280
+ first = false;
281
+ }
282
+ else {
283
+ b.push(',');
284
+ }
285
+ b.push(field.join());
286
+ }
287
+ return code `${b}`;
288
+ }
289
+ unionDeclaration(union, name) {
290
+ if (name !== '_includes') {
291
+ return this.emitter.result.none();
292
+ }
293
+ const decls = [];
294
+ const addInclude = (ns, comment, conds, isLoad = false) => {
295
+ const fp = fileParent(ns.node);
296
+ let name = basename(fp.path, extname(fp.path));
297
+ if (name.endsWith('_inc')) {
298
+ name = name.substring(0, name.length - 4) + '.inc';
299
+ }
300
+ else {
301
+ name += '.csv';
302
+ }
303
+ const incl = [conds + '!' + (isLoad ? 'load' : 'include'), name, '', '', escape(comment)];
304
+ decls.push(incl.join());
305
+ };
306
+ const program = this.emitter.getProgram();
307
+ const sf = this.#getCurrentSourceFile();
308
+ const [idModel] = program.resolveTypeReference('Ebus.id.id');
309
+ if (this.emitter.getOptions()["includes"]) {
310
+ const comment = getDoc(program, union);
311
+ if (comment) {
312
+ decls.push(`# ${comment}`);
313
+ }
314
+ union.variants.forEach(uv => {
315
+ if (uv.type.kind !== 'Namespace') {
316
+ return;
317
+ }
318
+ const isLoad = typeof uv.name === 'string' && !!uv.name;
319
+ const conds = mapConds(idModel, sf, getConditions(program, uv) || []);
320
+ addInclude(uv.type, getDoc(program, uv), conds, isLoad);
321
+ });
322
+ return this.emitter.result.declaration(name, decls.join('\n'));
323
+ }
324
+ const current = this.emitter.getContext();
325
+ if (current.referencedBy) {
326
+ reportDiagnostic(program, {
327
+ code: "banned-inheritance",
328
+ format: {},
329
+ target: union,
330
+ });
331
+ return this.emitter.result.none(); // only single reference level supported
332
+ }
333
+ union.variants.forEach(uv => {
334
+ if (uv.type.kind !== 'Namespace') {
335
+ return;
336
+ }
337
+ const namespace = uv.type;
338
+ const conds = mapConds(idModel, sf, getConditions(program, uv) || []);
339
+ const isLoad = typeof uv.name === 'string' && uv.name;
340
+ if (isLoad) {
341
+ const referenceContext = this.#mkContext(namespace.node, namespace, undefined, true);
342
+ if (Object.keys(referenceContext).length && !referenceContext.exclude
343
+ && this.#sourceFileByPath.get(referenceContext.fullname)?.meta.refCount === 1) {
344
+ this.emitter.emitTypeReference(namespace, { referenceContext }); // force emit the included file itself, once only
345
+ }
346
+ addInclude(namespace, getDoc(program, uv), conds, true);
347
+ }
348
+ else {
349
+ current.referencedBy = union;
350
+ current.conds = conds;
351
+ this.emitter.emitTypeReference(namespace, { referenceContext: current });
352
+ delete current.conds;
353
+ delete current.referencedBy;
354
+ }
355
+ });
356
+ return this.emitter.result.declaration(name, decls.join('\n')); // at least empty string needed to combine emitted declarations from above
357
+ }
358
+ #isStdType(type, ownOnly = false) {
359
+ if (ownOnly) {
360
+ const g = this.emitter.getProgram().getGlobalNamespaceType();
361
+ const own = g.namespaces.get('Ebus');
362
+ return own && isDeclaredInNamespace(type, own);
363
+ }
364
+ return this.emitter.getProgram().checker.isStdType(type);
365
+ }
366
+ #reportDuplicateIds() {
367
+ for (const [id, targets] of this.#idDuplicateTracker.entries()) {
368
+ for (const target of targets) {
369
+ reportDiagnostic(this.emitter.getProgram(), {
370
+ code: "duplicate-id",
371
+ format: { id },
372
+ target: target,
373
+ });
374
+ }
375
+ }
376
+ }
377
+ async writeOutput(sourceFiles) {
378
+ if (this.emitter.getOptions().noEmit) {
379
+ return;
380
+ }
381
+ this.#reportDuplicateIds();
382
+ const toEmit = [];
383
+ for (const sf of sourceFiles) {
384
+ const emittedSf = await this.emitter.emitSourceFile(sf);
385
+ // emitSourceFile will assert if somehow we have more than one declaration here
386
+ if (sf.meta.shouldEmit && emittedSf.contents.length > 1) {
387
+ toEmit.push(emittedSf);
388
+ }
389
+ }
390
+ for (const emittedSf of toEmit) {
391
+ await emitFile(this.emitter.getProgram(), {
392
+ path: emittedSf.path,
393
+ content: emittedSf.contents,
394
+ });
395
+ }
396
+ }
397
+ sourceFile(sourceFile) {
398
+ const content = sourceFile.globalScope.declarations.map(d => d.value);
399
+ if (!content.length) {
400
+ sourceFile.meta.shouldEmit = false;
401
+ return { contents: '', path: sourceFile.path };
402
+ }
403
+ const b = new StringBuilder();
404
+ Array.from(sourceFile.imports.values())
405
+ .sort((a, b) => a.length - b.length) // have the single column defaults at the top
406
+ .forEach(i => b.push(`*${i.join()}\n`));
407
+ return {
408
+ contents: `type,circuit,level,name,comment,qq,zz,pbsb,id,`
409
+ + `*name,part,type,divisor/values,unit,comment\n`
410
+ + b.reduce()
411
+ + content.filter(l => l).join('\n') + '\n',
412
+ path: sourceFile.path,
413
+ };
414
+ }
415
+ #getCurrentSourceFile() {
416
+ let scope = this.emitter.getContext().scope;
417
+ while (scope && !isSourceFileWithPath(scope)) {
418
+ scope = scope.parentScope;
419
+ }
420
+ return scope?.sourceFile;
421
+ }
422
+ // #serializeSourceFileContent(content: string[]): string {
423
+ // if (this.emitter.getOptions()["file-type"] === "csv") {
424
+ // return content.join('\n');
425
+ // } else if (this.emitter.getOptions()["file-type"] === "json") {
426
+ // return JSON.stringify(content, null, 2);
427
+ // } else {
428
+ // return stringify(content, {
429
+ // aliasDuplicateObjects: false,
430
+ // lineWidth: 0,
431
+ // });
432
+ // }
433
+ // }
434
+ namespaceContext(namespace) {
435
+ return this.#mkContext(namespace.node, namespace);
436
+ }
437
+ modelDeclarationContext(model, modelName) {
438
+ return this.#mkContext(model.node, model.namespace, model);
439
+ }
440
+ #mkContext(node, namespace, typ, forLoad = false) {
441
+ // if (this.#isStdType(model) && model.name === "object") {
442
+ // return {};
443
+ // }
444
+ const currentCtx = this.emitter.getContext();
445
+ if (currentCtx.referencedBy && !currentCtx.isLoad) {
446
+ return currentCtx;
447
+ }
448
+ for (let n = namespace; n; n = n.namespace) {
449
+ if (n?.name === 'Ebus') { // omit lib models
450
+ return {};
451
+ }
452
+ }
453
+ const nsf = namespace && getNamespaceFullName(namespace);
454
+ let root = nsf && nsf.split('.')[0];
455
+ let ext = this.#fileExtension();
456
+ const fp = fileParent(node);
457
+ let fpName = fp?.path && basename(fp.path, extname(fp.path));
458
+ if (fpName?.endsWith('_inc')) {
459
+ if (!this.emitter.getOptions()["includes"] && !(forLoad || currentCtx.isLoad)) {
460
+ return { exclude: true };
461
+ }
462
+ if (root === fpName) {
463
+ root = '';
464
+ }
465
+ ext = 'inc';
466
+ fpName = fpName.substring(0, fpName.length - 4);
467
+ }
468
+ const name = fpName || (typ && this.declarationName(typ)) || '';
469
+ const fullname = `${root && root !== name ? root + '/' : ''}${name}`;
470
+ let sourceFile = this.#sourceFileByPath.get(fullname);
471
+ if (!sourceFile) {
472
+ sourceFile = this.emitter.createSourceFile(`${fullname}.${ext}`);
473
+ sourceFile.meta.shouldEmit = true;
474
+ sourceFile.meta.bundledRefs = [];
475
+ sourceFile.meta.refCount = 1;
476
+ this.#sourceFileByPath.set(fullname, sourceFile);
477
+ }
478
+ else {
479
+ sourceFile.meta.refCount++;
480
+ }
481
+ return {
482
+ scope: sourceFile.globalScope,
483
+ isLoad: forLoad,
484
+ fullname,
485
+ };
486
+ }
487
+ #fileExtension() {
488
+ // return this.emitter.getOptions()["file-type"] === "json" ? "json"
489
+ // : this.emitter.getOptions()["file-type"] === "yaml" ? "yaml" :
490
+ return "csv";
491
+ }
492
+ }
493
+ //# sourceMappingURL=csv_emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv_emitter.js","sourceRoot":"","sources":["../../src/csv_emitter.ts"],"names":[],"mappings":"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"}