@cedarjs/structure 2.8.0 → 2.8.1-next.109
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/README.md +1 -1
- package/dist/errors.js +9 -15
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -67
- package/dist/index.js.map +1 -0
- package/dist/model/RWCell.d.ts +4 -4
- package/dist/model/RWCell.d.ts.map +1 -1
- package/dist/model/RWCell.js +111 -103
- package/dist/model/RWCell.js.map +1 -0
- package/dist/model/RWComponent.d.ts +2 -2
- package/dist/model/RWComponent.d.ts.map +1 -1
- package/dist/model/RWComponent.js +46 -41
- package/dist/model/RWComponent.js.map +1 -0
- package/dist/model/RWEnvHelper.d.ts +4 -4
- package/dist/model/RWEnvHelper.d.ts.map +1 -1
- package/dist/model/RWEnvHelper.js +212 -205
- package/dist/model/RWEnvHelper.js.map +1 -0
- package/dist/model/RWFunction.d.ts +2 -2
- package/dist/model/RWFunction.d.ts.map +1 -1
- package/dist/model/RWFunction.js +10 -15
- package/dist/model/RWFunction.js.map +1 -0
- package/dist/model/RWLayout.d.ts +2 -2
- package/dist/model/RWLayout.d.ts.map +1 -1
- package/dist/model/RWLayout.js +10 -15
- package/dist/model/RWLayout.js.map +1 -0
- package/dist/model/RWPage.d.ts +3 -3
- package/dist/model/RWPage.d.ts.map +1 -1
- package/dist/model/RWPage.js +61 -57
- package/dist/model/RWPage.js.map +1 -0
- package/dist/model/RWProject.d.ts +11 -17
- package/dist/model/RWProject.d.ts.map +1 -1
- package/dist/model/RWProject.js +218 -164
- package/dist/model/RWProject.js.map +1 -0
- package/dist/model/RWRoute.d.ts +5 -5
- package/dist/model/RWRoute.d.ts.map +1 -1
- package/dist/model/RWRoute.js +312 -262
- package/dist/model/RWRoute.js.map +1 -0
- package/dist/model/RWRouter.d.ts +4 -4
- package/dist/model/RWRouter.d.ts.map +1 -1
- package/dist/model/RWRouter.js +130 -126
- package/dist/model/RWRouter.js.map +1 -0
- package/dist/model/RWSDL.d.ts +5 -5
- package/dist/model/RWSDL.d.ts.map +1 -1
- package/dist/model/RWSDL.js +96 -84
- package/dist/model/RWSDL.js.map +1 -0
- package/dist/model/RWSDLField.d.ts +6 -6
- package/dist/model/RWSDLField.d.ts.map +1 -1
- package/dist/model/RWSDLField.js +79 -81
- package/dist/model/RWSDLField.js.map +1 -0
- package/dist/model/RWService.d.ts +4 -4
- package/dist/model/RWService.d.ts.map +1 -1
- package/dist/model/RWService.js +76 -76
- package/dist/model/RWService.js.map +1 -0
- package/dist/model/RWServiceFunction.d.ts +4 -4
- package/dist/model/RWServiceFunction.d.ts.map +1 -1
- package/dist/model/RWServiceFunction.js +95 -97
- package/dist/model/RWServiceFunction.js.map +1 -0
- package/dist/model/RWTOML.d.ts +3 -3
- package/dist/model/RWTOML.d.ts.map +1 -1
- package/dist/model/RWTOML.js +53 -55
- package/dist/model/RWTOML.js.map +1 -0
- package/dist/model/index.d.ts +2 -2
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +3 -20
- package/dist/model/index.js.map +1 -0
- package/dist/model/util/process_env.js +44 -62
- package/dist/model/util/process_env.js.map +1 -0
- package/dist/nodes.d.ts +2 -2
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +171 -164
- package/dist/nodes.js.map +1 -0
- package/dist/util.js +23 -33
- package/dist/util.js.map +1 -0
- package/dist/x/Array.js +15 -25
- package/dist/x/Array.js.map +1 -0
- package/dist/x/Location.d.ts +1 -1
- package/dist/x/Location.d.ts.map +1 -1
- package/dist/x/Location.js +11 -17
- package/dist/x/Location.js.map +1 -0
- package/dist/x/Position.js +18 -29
- package/dist/x/Position.js.map +1 -0
- package/dist/x/Range.d.ts +1 -1
- package/dist/x/Range.d.ts.map +1 -1
- package/dist/x/Range.js +17 -22
- package/dist/x/Range.js.map +1 -0
- package/dist/x/URL.js +59 -75
- package/dist/x/URL.js.map +1 -0
- package/dist/x/child_process.d.ts +1 -1
- package/dist/x/child_process.d.ts.map +1 -1
- package/dist/x/child_process.js +35 -49
- package/dist/x/child_process.js.map +1 -0
- package/dist/x/decorators.d.ts +2 -2
- package/dist/x/decorators.d.ts.map +1 -1
- package/dist/x/decorators.js +46 -26
- package/dist/x/decorators.js.map +1 -0
- package/dist/x/diagnostics.d.ts +3 -3
- package/dist/x/diagnostics.d.ts.map +1 -1
- package/dist/x/diagnostics.js +163 -259
- package/dist/x/diagnostics.js.map +1 -0
- package/dist/x/path.js +36 -55
- package/dist/x/path.js.map +1 -0
- package/dist/x/prisma.d.ts +2 -2
- package/dist/x/prisma.d.ts.map +1 -1
- package/dist/x/prisma.js +32 -55
- package/dist/x/prisma.js.map +1 -0
- package/dist/x/ts-morph.js +34 -45
- package/dist/x/ts-morph.js.map +1 -0
- package/package.json +38 -17
package/dist/model/RWSDLField.js
CHANGED
|
@@ -1,83 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
var _context2;
|
|
64
|
-
return (0, _find.default)(_context2 = this.parent.service?.funcs ?? []).call(_context2, f => f.name === this.name);
|
|
65
|
-
}
|
|
66
|
-
*diagnostics() {
|
|
67
|
-
if (!this.impl) {
|
|
68
|
-
const {
|
|
69
|
-
uri,
|
|
70
|
-
range
|
|
71
|
-
} = this.location;
|
|
72
|
-
yield {
|
|
73
|
-
uri,
|
|
74
|
-
diagnostic: {
|
|
75
|
-
range,
|
|
76
|
-
message: 'Service Not Implemented',
|
|
77
|
-
severity: _diagnostics.DiagnosticSeverity.Error,
|
|
78
|
-
code: _errors.RWError.SERVICE_NOT_IMPLEMENTED
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { RWError } from '../errors.js';
|
|
8
|
+
import { BaseNode } from '../nodes.js';
|
|
9
|
+
import { lazy } from '../x/decorators.js';
|
|
10
|
+
import { Position_fromTSMorphOffset } from '../x/diagnostics.js';
|
|
11
|
+
import { DiagnosticSeverity } from '../x/diagnostics.js';
|
|
12
|
+
export class RWSDLField extends BaseNode {
|
|
13
|
+
objectTypeDef;
|
|
14
|
+
field;
|
|
15
|
+
parent;
|
|
16
|
+
constructor(objectTypeDef, field, parent) {
|
|
17
|
+
super();
|
|
18
|
+
this.objectTypeDef = objectTypeDef;
|
|
19
|
+
this.field = field;
|
|
20
|
+
this.parent = parent;
|
|
21
|
+
}
|
|
22
|
+
get id() {
|
|
23
|
+
return (this.parent.id + ' ' + this.objectTypeDef.name.value + '.' + this.name);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The location of this field.
|
|
27
|
+
* Calculating this is slightly complicated since it is embedded within a TaggedTemplateLiteral
|
|
28
|
+
*/
|
|
29
|
+
get location() {
|
|
30
|
+
let { start, end } = this.field.loc;
|
|
31
|
+
const node = this.parent.schemaStringNode;
|
|
32
|
+
start += node.getPos() + 1; // we add one to account for the quote (`)
|
|
33
|
+
end += node.getPos() + 1;
|
|
34
|
+
const startPos = Position_fromTSMorphOffset(start, node.getSourceFile());
|
|
35
|
+
const endPos = Position_fromTSMorphOffset(end, node.getSourceFile());
|
|
36
|
+
return { uri: this.parent.uri, range: { start: startPos, end: endPos } };
|
|
37
|
+
}
|
|
38
|
+
get name() {
|
|
39
|
+
return this.field.name.value;
|
|
40
|
+
}
|
|
41
|
+
get argumentNames() {
|
|
42
|
+
return (this.field.arguments ?? []).map((a) => a.name.value);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* TODO: describe in prose what is going on here.
|
|
46
|
+
* this is an important rule
|
|
47
|
+
*/
|
|
48
|
+
get impl() {
|
|
49
|
+
return (this.parent.service?.funcs ?? []).find((f) => f.name === this.name);
|
|
50
|
+
}
|
|
51
|
+
*diagnostics() {
|
|
52
|
+
if (!this.impl) {
|
|
53
|
+
const { uri, range } = this.location;
|
|
54
|
+
yield {
|
|
55
|
+
uri,
|
|
56
|
+
diagnostic: {
|
|
57
|
+
range,
|
|
58
|
+
message: 'Service Not Implemented',
|
|
59
|
+
severity: DiagnosticSeverity.Error,
|
|
60
|
+
code: RWError.SERVICE_NOT_IMPLEMENTED,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
79
63
|
}
|
|
80
|
-
};
|
|
81
64
|
}
|
|
82
|
-
|
|
83
|
-
|
|
65
|
+
}
|
|
66
|
+
__decorate([
|
|
67
|
+
lazy()
|
|
68
|
+
], RWSDLField.prototype, "id", null);
|
|
69
|
+
__decorate([
|
|
70
|
+
lazy()
|
|
71
|
+
], RWSDLField.prototype, "location", null);
|
|
72
|
+
__decorate([
|
|
73
|
+
lazy()
|
|
74
|
+
], RWSDLField.prototype, "name", null);
|
|
75
|
+
__decorate([
|
|
76
|
+
lazy()
|
|
77
|
+
], RWSDLField.prototype, "argumentNames", null);
|
|
78
|
+
__decorate([
|
|
79
|
+
lazy()
|
|
80
|
+
], RWSDLField.prototype, "impl", null);
|
|
81
|
+
//# sourceMappingURL=RWSDLField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RWSDLField.js","sourceRoot":"","sources":["../../src/model/RWSDLField.ts"],"names":[],"mappings":";;;;;;AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAMxD,MAAM,OAAO,UAAW,SAAQ,QAAQ;IAE7B;IACA;IACA;IAHT,YACS,aAAuC,EACvC,KAA0B,EAC1B,MAAa;QAEpB,KAAK,EAAE,CAAA;QAJA,kBAAa,GAAb,aAAa,CAA0B;QACvC,UAAK,GAAL,KAAK,CAAqB;QAC1B,WAAM,GAAN,MAAM,CAAO;IAGtB,CAAC;IACO,IAAI,EAAE;QACZ,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CACvE,CAAA;IACH,CAAC;IACD;;;OAGG;IACK,IAAI,QAAQ;QAClB,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAI,CAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAiB,CAAA;QAC1C,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA,CAAC,0CAA0C;QACrE,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACxB,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;QACxE,MAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;QACpE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAA;IAC1E,CAAC;IACO,IAAI,IAAI;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;IAC9B,CAAC;IACO,IAAI,aAAa;QACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9D,CAAC;IAED;;;OAGG;IACK,IAAI,IAAI;QACd,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7E,CAAC;IAED,CAAC,WAAW;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAA;YACpC,MAAM;gBACJ,GAAG;gBACH,UAAU,EAAE;oBACV,KAAK;oBACL,OAAO,EAAE,yBAAyB;oBAClC,QAAQ,EAAE,kBAAkB,CAAC,KAAK;oBAClC,IAAI,EAAE,OAAO,CAAC,uBAAuB;iBACtC;aACoB,CAAA;QACzB,CAAC;IACH,CAAC;CACF;AA/CS;IAAP,IAAI,EAAE;oCAIN;AAKO;IAAP,IAAI,EAAE;0CAQN;AACO;IAAP,IAAI,EAAE;sCAEN;AACO;IAAP,IAAI,EAAE;+CAEN;AAMO;IAAP,IAAI,EAAE;sCAEN"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FileNode } from '../nodes';
|
|
2
|
-
import type { RWProject } from './RWProject';
|
|
3
|
-
import type { RWSDL } from './RWSDL';
|
|
4
|
-
import { RWServiceFunction } from './RWServiceFunction';
|
|
1
|
+
import { FileNode } from '../nodes.js';
|
|
2
|
+
import type { RWProject } from './RWProject.js';
|
|
3
|
+
import type { RWSDL } from './RWSDL.js';
|
|
4
|
+
import { RWServiceFunction } from './RWServiceFunction.js';
|
|
5
5
|
export declare class RWService extends FileNode {
|
|
6
6
|
filePath: string;
|
|
7
7
|
parent: RWProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RWService.d.ts","sourceRoot":"","sources":["../../src/model/RWService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RWService.d.ts","sourceRoot":"","sources":["../../src/model/RWService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,qBAAa,SAAU,SAAQ,QAAQ;IAE5B,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,SAAS;gBADjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS;IAI1B;;;OAGG;IACH,IAAY,IAAI,WAEf;IAED;;;OAGG;IAEH,IAAY,GAAG,IAAI,KAAK,GAAG,SAAS,CAEnC;IAED,QAAQ;IAIR;;;OAGG;IAEH,IAAY,KAAK,wBAuBhB;CACF"}
|
package/dist/model/RWService.js
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import * as tsm from 'ts-morph';
|
|
8
|
+
import { FileNode } from '../nodes.js';
|
|
9
|
+
import { iter } from '../x/Array.js';
|
|
10
|
+
import { lazy } from '../x/decorators.js';
|
|
11
|
+
import { basenameNoExt } from '../x/path.js';
|
|
12
|
+
import { RWServiceFunction } from './RWServiceFunction.js';
|
|
13
|
+
export class RWService extends FileNode {
|
|
14
|
+
filePath;
|
|
15
|
+
parent;
|
|
16
|
+
constructor(filePath, parent) {
|
|
17
|
+
super();
|
|
18
|
+
this.filePath = filePath;
|
|
19
|
+
this.parent = parent;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The name of this service:
|
|
23
|
+
* services/todos/todos.js --> todos
|
|
24
|
+
*/
|
|
25
|
+
get name() {
|
|
26
|
+
return basenameNoExt(this.filePath);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the SDL associated with this service (if any).
|
|
30
|
+
* Match is performed by name.
|
|
31
|
+
*/
|
|
32
|
+
get sdl() {
|
|
33
|
+
return this.parent.sdls.find((sdl) => sdl.name === this.name);
|
|
34
|
+
}
|
|
35
|
+
children() {
|
|
36
|
+
return [...this.funcs];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* All the exported functions declared in this service file.
|
|
40
|
+
* They can be both ArrowFunctions (with name) or FunctionDeclarations (with name)
|
|
41
|
+
*/
|
|
42
|
+
get funcs() {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
44
|
+
const self = this;
|
|
45
|
+
return iter(function* () {
|
|
46
|
+
// export const foo = () => {}
|
|
47
|
+
for (const vd of self.sf.getVariableDeclarations()) {
|
|
48
|
+
if (vd.isExported()) {
|
|
49
|
+
const init = vd.getInitializerIfKind(tsm.SyntaxKind.ArrowFunction);
|
|
50
|
+
if (init) {
|
|
51
|
+
yield new RWServiceFunction(vd.getName(), init, self);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// export function foo(){}
|
|
56
|
+
for (const fd of self.sf.getFunctions()) {
|
|
57
|
+
if (fd.isExported() && !fd.isDefaultExport()) {
|
|
58
|
+
const nn = fd.getNameNode();
|
|
59
|
+
if (nn) {
|
|
60
|
+
yield new RWServiceFunction(nn.getText(), fd, self);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
__decorate([
|
|
68
|
+
lazy()
|
|
69
|
+
], RWService.prototype, "name", null);
|
|
70
|
+
__decorate([
|
|
71
|
+
lazy()
|
|
72
|
+
], RWService.prototype, "sdl", null);
|
|
73
|
+
__decorate([
|
|
74
|
+
lazy()
|
|
75
|
+
], RWService.prototype, "funcs", null);
|
|
76
|
+
//# sourceMappingURL=RWService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RWService.js","sourceRoot":"","sources":["../../src/model/RWService.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,OAAO,SAAU,SAAQ,QAAQ;IAE5B;IACA;IAFT,YACS,QAAgB,EAChB,MAAiB;QAExB,KAAK,EAAE,CAAA;QAHA,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAW;IAG1B,CAAC;IACD;;;OAGG;IACK,IAAI,IAAI;QACd,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED;;;OAGG;IAEK,IAAI,GAAG;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED;;;OAGG;IAEK,IAAI,KAAK;QACf,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACnB,8BAA8B;YAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE,CAAC;gBACnD,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;oBAClE,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM,IAAI,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,0BAA0B;YAC1B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC;gBACxC,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;oBAC7C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAA;oBAC3B,IAAI,EAAE,EAAE,CAAC;wBACP,MAAM,IAAI,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;oBACrD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AA9CS;IAAP,IAAI,EAAE;qCAEN;AAOO;IAAP,IAAI,EAAE;oCAEN;AAWO;IAAP,IAAI,EAAE;sCAuBN"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as tsm from 'ts-morph';
|
|
2
|
-
import { BaseNode } from '../nodes';
|
|
3
|
-
import type { ExtendedDiagnostic } from '../x/diagnostics';
|
|
4
|
-
import type { RWSDLField } from './RWSDLField';
|
|
5
|
-
import type { RWService } from './RWService';
|
|
2
|
+
import { BaseNode } from '../nodes.js';
|
|
3
|
+
import type { ExtendedDiagnostic } from '../x/diagnostics.js';
|
|
4
|
+
import type { RWSDLField } from './RWSDLField.js';
|
|
5
|
+
import type { RWService } from './RWService.js';
|
|
6
6
|
export declare class RWServiceFunction extends BaseNode {
|
|
7
7
|
name: string;
|
|
8
8
|
node: tsm.FunctionDeclaration | tsm.ArrowFunction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RWServiceFunction.d.ts","sourceRoot":"","sources":["../../src/model/RWServiceFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RWServiceFunction.d.ts","sourceRoot":"","sources":["../../src/model/RWServiceFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAI7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,qBAAa,iBAAkB,SAAQ,QAAQ;IAEpC,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC,aAAa;IACjD,MAAM,EAAE,SAAS;gBAFjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC,aAAa,EACjD,MAAM,EAAE,SAAS;IAK1B,IAAY,EAAE,WAGb;IAED;;;OAGG;IAEH,IAAY,QAAQ,IAAI,UAAU,GAAG,SAAS,CAI7C;IAED,IAAY,cAAc,aAczB;IAEA,WAAW;CAwCb"}
|
|
@@ -1,99 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
// comment out for now (see https://github.com/redwoodjs/redwood/issues/943)
|
|
87
|
-
// eslint-disable-next-line no-constant-condition
|
|
88
|
-
if (false) {
|
|
89
|
-
yield diagnostic;
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import * as tsm from 'ts-morph';
|
|
8
|
+
import { BaseNode } from '../nodes.js';
|
|
9
|
+
import { iter } from '../x/Array.js';
|
|
10
|
+
import { lazy } from '../x/decorators.js';
|
|
11
|
+
import { Location_fromNode } from '../x/diagnostics.js';
|
|
12
|
+
import { DiagnosticSeverity } from '../x/diagnostics.js';
|
|
13
|
+
export class RWServiceFunction extends BaseNode {
|
|
14
|
+
name;
|
|
15
|
+
node;
|
|
16
|
+
parent;
|
|
17
|
+
constructor(name, node, parent) {
|
|
18
|
+
super();
|
|
19
|
+
this.name = name;
|
|
20
|
+
this.node = node;
|
|
21
|
+
this.parent = parent;
|
|
22
|
+
}
|
|
23
|
+
get id() {
|
|
24
|
+
// This is a compound ID (because it points to an internal node - one within a file)
|
|
25
|
+
return this.parent.id + ' ' + this.name;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The SDL field that this function implements, if any
|
|
29
|
+
* TODO: describe this in prose.
|
|
30
|
+
*/
|
|
31
|
+
get sdlField() {
|
|
32
|
+
return this.parent.sdl?.implementableFields?.find((f) => f.name === this.name);
|
|
33
|
+
}
|
|
34
|
+
get parameterNames() {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
36
|
+
const self = this;
|
|
37
|
+
return iter(function* () {
|
|
38
|
+
for (const p of self.node.getParameters()) {
|
|
39
|
+
const nn = p.getNameNode();
|
|
40
|
+
if (nn instanceof tsm.ObjectBindingPattern) {
|
|
41
|
+
for (const element of nn.getElements()) {
|
|
42
|
+
yield element.getNameNode().getText();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// TODO: handle other cases
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
*diagnostics() {
|
|
50
|
+
if (this.sdlField) {
|
|
51
|
+
// this service function is implementing a field
|
|
52
|
+
// parameter names should match
|
|
53
|
+
const p1 = this.sdlField.argumentNames.sort().join(' '); //?
|
|
54
|
+
const p2 = this.parameterNames.sort().join(' '); //?
|
|
55
|
+
if (p1 !== p2) {
|
|
56
|
+
const locationNode = this.node.getParameters()[0] ?? this.node;
|
|
57
|
+
const { uri, range } = Location_fromNode(locationNode);
|
|
58
|
+
const message = `Parameter mismatch between SDL and implementation ("${p1}" !== "${p2}")`;
|
|
59
|
+
const diagnostic = {
|
|
60
|
+
uri,
|
|
61
|
+
diagnostic: {
|
|
62
|
+
range,
|
|
63
|
+
message,
|
|
64
|
+
severity: DiagnosticSeverity.Error,
|
|
65
|
+
// add related information so developers can jump to the SDL definition
|
|
66
|
+
relatedInformation: [
|
|
67
|
+
{
|
|
68
|
+
location: this.sdlField.location,
|
|
69
|
+
message: 'SDL field is defined here',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
// comment out for now (see https://github.com/redwoodjs/redwood/issues/943)
|
|
75
|
+
// comment out for now (see https://github.com/redwoodjs/redwood/issues/943)
|
|
76
|
+
// eslint-disable-next-line no-constant-condition
|
|
77
|
+
if (false) {
|
|
78
|
+
yield diagnostic;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// TODO: check that types match
|
|
82
|
+
// to do this it is probably easier to leverage a graphql code generator and the typescript compiler
|
|
83
|
+
// the trick is to create a source file with an interface assignment that will fail if there is a mismatch
|
|
84
|
+
// we then simply "bubble up" the type errors from the typescript compiler
|
|
90
85
|
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// TODO: check that types match
|
|
94
|
-
// to do this it is probably easier to leverage a graphql code generator and the typescript compiler
|
|
95
|
-
// the trick is to create a source file with an interface assignment that will fail if there is a mismatch
|
|
96
|
-
// we then simply "bubble up" the type errors from the typescript compiler
|
|
97
86
|
}
|
|
98
|
-
|
|
99
|
-
|
|
87
|
+
}
|
|
88
|
+
__decorate([
|
|
89
|
+
lazy()
|
|
90
|
+
], RWServiceFunction.prototype, "id", null);
|
|
91
|
+
__decorate([
|
|
92
|
+
lazy()
|
|
93
|
+
], RWServiceFunction.prototype, "sdlField", null);
|
|
94
|
+
__decorate([
|
|
95
|
+
lazy()
|
|
96
|
+
], RWServiceFunction.prototype, "parameterNames", null);
|
|
97
|
+
//# sourceMappingURL=RWServiceFunction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RWServiceFunction.js","sourceRoot":"","sources":["../../src/model/RWServiceFunction.ts"],"names":[],"mappings":"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"}
|
package/dist/model/RWTOML.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as toml from 'smol-toml';
|
|
2
|
-
import { FileNode } from '../nodes';
|
|
3
|
-
import type { RWProject } from './RWProject';
|
|
2
|
+
import { FileNode } from '../nodes.js';
|
|
3
|
+
import type { RWProject } from './RWProject.js';
|
|
4
4
|
export declare class RWTOML extends FileNode {
|
|
5
5
|
filePath: string;
|
|
6
6
|
parent: RWProject;
|
|
7
7
|
constructor(filePath: string, parent: RWProject);
|
|
8
8
|
get parsedTOML(): toml.TomlTable;
|
|
9
9
|
get web_includeEnvironmentVariables(): string[] | undefined;
|
|
10
|
-
diagnostics(): Generator<import("../x/diagnostics").ExtendedDiagnostic, void, unknown>;
|
|
10
|
+
diagnostics(): Generator<import("../x/diagnostics.js").ExtendedDiagnostic, void, unknown>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=RWTOML.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RWTOML.d.ts","sourceRoot":"","sources":["../../src/model/RWTOML.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RWTOML.d.ts","sourceRoot":"","sources":["../../src/model/RWTOML.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,qBAAa,MAAO,SAAQ,QAAQ;IAEzB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,SAAS;gBADjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS;IAQ1B,IAAY,UAAU,mBAErB;IACD,IAAY,+BAA+B,IAAI,MAAM,EAAE,GAAG,SAAS,CAElE;IACA,WAAW;CAgBb"}
|