@player-tools/complexity-check-plugin 0.8.1--canary.169.3663

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.
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ ComplexityCheck: () => ComplexityCheck
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/complexity-check.ts
28
+ var import_vscode_languageserver_types = require("vscode-languageserver-types");
29
+ var import_player = require("@player-ui/player");
30
+ var import_json_language_service = require("@player-tools/json-language-service");
31
+ var makeRange = (start, end, document) => {
32
+ return {
33
+ start: document.positionAt(start),
34
+ end: document.positionAt(end)
35
+ };
36
+ };
37
+ var ComplexityCheck = class {
38
+ name = "complexity-check";
39
+ config;
40
+ contentScore;
41
+ range;
42
+ constructor(config) {
43
+ this.config = config;
44
+ this.contentScore = 0;
45
+ this.range = { start: 0, end: 0 };
46
+ }
47
+ apply(service) {
48
+ service.hooks.validate.tap(this.name, async (_ctx, validation) => {
49
+ validation.useASTVisitor(this.createContentChecker());
50
+ });
51
+ service.hooks.onDocumentUpdate.tap(this.name, () => {
52
+ this.contentScore = 0;
53
+ });
54
+ service.hooks.onValidateEnd.tap(this.name, (diagnostics, context) => {
55
+ let diagnostic;
56
+ if (this.contentScore < this.config.maxAcceptableComplexity) {
57
+ if (this.config.maxWarningLevel && this.contentScore > this.config.maxWarningLevel) {
58
+ diagnostic = {
59
+ message: `Warning: Content complexity is ${this.contentScore}`,
60
+ severity: import_vscode_languageserver_types.DiagnosticSeverity.Warning,
61
+ range: makeRange(
62
+ this.range.start,
63
+ this.range.end,
64
+ context.documentContext.document
65
+ )
66
+ };
67
+ } else {
68
+ diagnostic = {
69
+ message: `Info: Content complexity is ${this.contentScore}`,
70
+ severity: import_vscode_languageserver_types.DiagnosticSeverity.Error,
71
+ range: makeRange(
72
+ this.range.start,
73
+ this.range.end,
74
+ context.documentContext.document
75
+ )
76
+ };
77
+ }
78
+ } else {
79
+ diagnostic = {
80
+ message: `Error: Content complexity is ${this.contentScore}`,
81
+ severity: import_vscode_languageserver_types.DiagnosticSeverity.Information,
82
+ range: makeRange(
83
+ this.range.start,
84
+ this.range.end,
85
+ context.documentContext.document
86
+ )
87
+ };
88
+ }
89
+ return [...diagnostics, diagnostic];
90
+ });
91
+ }
92
+ /** Create a validation visitor for dealing with transition states */
93
+ createContentChecker = () => {
94
+ return {
95
+ FlowNode: (flowNode) => {
96
+ this.range = {
97
+ start: flowNode.jsonNode.offset,
98
+ end: flowNode.jsonNode.offset + flowNode.jsonNode.length
99
+ };
100
+ },
101
+ FlowStateNode: (flowState) => {
102
+ if (flowState.stateType) {
103
+ if (flowState.stateType.valueNode?.value === "ACTION") {
104
+ const numExp = (0, import_json_language_service.getProperty)(flowState, "exp");
105
+ if (numExp?.valueNode?.type === "array") {
106
+ this.contentScore += numExp.valueNode.children.length;
107
+ if (this.config.options?.verbose) {
108
+ console.log(
109
+ `state exp (x${numExp.valueNode.children.length}): ${this.contentScore}`
110
+ );
111
+ }
112
+ } else {
113
+ this.contentScore += 1;
114
+ if (this.config.options?.verbose) {
115
+ console.log(`state exp: ${this.contentScore}`);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ },
121
+ AssetNode: (assetNode) => {
122
+ let scoreModifier = 1;
123
+ const checkParentTemplate = (node) => {
124
+ if (node.parent) {
125
+ if ((0, import_json_language_service.isPropertyNode)(node.parent) && node.parent.keyNode.value === "template") {
126
+ scoreModifier += 1;
127
+ if (this.config.options?.verbose) {
128
+ console.log(`found a template parent (+1)`);
129
+ }
130
+ return checkParentTemplate(node.parent);
131
+ }
132
+ return checkParentTemplate(node.parent);
133
+ }
134
+ return node;
135
+ };
136
+ checkParentTemplate(assetNode);
137
+ this.contentScore += scoreModifier;
138
+ const assetType = assetNode.assetType?.valueNode?.value;
139
+ const assetComplexity = assetType ? this.config.assetComplexity?.[assetType] : void 0;
140
+ if (this.config.assetComplexity) {
141
+ if (assetComplexity) {
142
+ this.contentScore += assetComplexity;
143
+ if (this.config.options?.verbose) {
144
+ console.log(
145
+ `assetNode (+${assetComplexity} for ${assetType}): ${this.contentScore}`
146
+ );
147
+ }
148
+ } else {
149
+ if (this.config.options?.verbose) {
150
+ console.log(
151
+ `assetNode (${assetType} complexity type not found): ${this.contentScore}`
152
+ );
153
+ }
154
+ }
155
+ } else if (this.config.options?.verbose) {
156
+ console.log("assetNode:", this.contentScore);
157
+ }
158
+ },
159
+ ViewNode: (viewNode) => {
160
+ this.contentScore += 1;
161
+ const viewType = viewNode.viewType?.valueNode?.value;
162
+ const viewComplexity = viewType ? this.config.assetComplexity?.[viewType] : void 0;
163
+ if (this.config.assetComplexity) {
164
+ if (viewComplexity) {
165
+ this.contentScore += viewComplexity;
166
+ if (this.config.options?.verbose) {
167
+ console.log(
168
+ `viewNode (+${viewComplexity} for ${viewType}): ${this.contentScore}`
169
+ );
170
+ }
171
+ } else {
172
+ if (this.config.options?.verbose) {
173
+ console.log(
174
+ `viewNode (${viewType} complexity type not found): ${this.contentScore}`
175
+ );
176
+ }
177
+ }
178
+ } else if (this.config.options?.verbose) {
179
+ console.log("viewNode:", this.contentScore);
180
+ }
181
+ },
182
+ StringNode: (stringNode) => {
183
+ const stringContent = stringNode.value;
184
+ (0, import_player.resolveDataRefs)(stringContent, {
185
+ model: {
186
+ get: (binding) => {
187
+ this.contentScore += 2;
188
+ if (this.config.options?.verbose) {
189
+ console.log(`model (get: ${binding}): ${this.contentScore}`);
190
+ }
191
+ return binding;
192
+ },
193
+ set: (binding) => {
194
+ this.contentScore += 2;
195
+ if (this.config.options?.verbose) {
196
+ console.log(`model (set: ${binding}): ${this.contentScore}`);
197
+ }
198
+ return [];
199
+ },
200
+ delete: () => {
201
+ }
202
+ },
203
+ evaluate: (str) => {
204
+ this.contentScore += 2;
205
+ if (this.config.options?.verbose) {
206
+ console.log(`model (evaluate: ${str}): ${this.contentScore}`);
207
+ }
208
+ return str;
209
+ }
210
+ });
211
+ }
212
+ };
213
+ };
214
+ };
215
+ // Annotate the CommonJS export names for ESM import in node:
216
+ 0 && (module.exports = {
217
+ ComplexityCheck
218
+ });
219
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/complexity-check.ts"],"sourcesContent":["export * from \"./complexity-check\";\n","import {\n Diagnostic,\n DiagnosticSeverity,\n Range,\n TextDocument,\n} from \"vscode-languageserver-types\";\nimport { resolveDataRefs } from \"@player-ui/player\";\nimport {\n getProperty,\n isPropertyNode,\n AssetASTNode,\n type ASTNode,\n type ViewASTNode,\n type PlayerLanguageService,\n type PlayerLanguageServicePlugin,\n type ASTVisitor,\n} from \"@player-tools/json-language-service\";\n\nconst makeRange = (\n start: number,\n end: number,\n document: TextDocument\n): Range => {\n return {\n start: document.positionAt(start),\n end: document.positionAt(end),\n };\n};\n\nexport interface ComplexityCheckConfig {\n /** Cutoff for content to be acceptable */\n maxAcceptableComplexity: number;\n /**\n * If set, any score above this number but below `maxAcceptableComplexity` will be logged as a warning\n */\n maxWarningLevel?: number;\n /** If set, maps complexity based on asset or view type */\n assetComplexity?: Record<string, number>;\n /** A way to pass in configurable options */\n options?: {\n /** Read out all logging messages */\n verbose?: boolean;\n };\n}\n\n/**\n * Estimates complexity of content\n */\nexport class ComplexityCheck implements PlayerLanguageServicePlugin {\n name = \"complexity-check\";\n\n private config: ComplexityCheckConfig;\n private contentScore: number;\n private range: {\n start: number;\n end: number;\n };\n\n constructor(config: ComplexityCheckConfig) {\n this.config = config;\n this.contentScore = 0;\n this.range = { start: 0, end: 0 };\n }\n\n apply(service: PlayerLanguageService): void {\n service.hooks.validate.tap(this.name, async (_ctx, validation) => {\n validation.useASTVisitor(this.createContentChecker());\n });\n\n service.hooks.onDocumentUpdate.tap(this.name, () => {\n this.contentScore = 0;\n });\n\n service.hooks.onValidateEnd.tap(this.name, (diagnostics, context) => {\n let diagnostic: Diagnostic;\n\n if (this.contentScore < this.config.maxAcceptableComplexity) {\n if (\n this.config.maxWarningLevel &&\n this.contentScore > this.config.maxWarningLevel\n ) {\n diagnostic = {\n message: `Warning: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Warning,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n } else {\n diagnostic = {\n message: `Info: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Error,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n }\n } else {\n diagnostic = {\n message: `Error: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Information,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n }\n return [...diagnostics, diagnostic];\n });\n }\n\n /** Create a validation visitor for dealing with transition states */\n createContentChecker = (): ASTVisitor => {\n return {\n FlowNode: (flowNode) => {\n this.range = {\n start: flowNode.jsonNode.offset,\n end: flowNode.jsonNode.offset + flowNode.jsonNode.length,\n };\n },\n\n FlowStateNode: (flowState) => {\n // add complexity per expression in a state\n if (flowState.stateType) {\n if (flowState.stateType.valueNode?.value === \"ACTION\") {\n const numExp = getProperty(flowState, \"exp\");\n if (numExp?.valueNode?.type === \"array\") {\n this.contentScore += numExp.valueNode.children.length;\n if (this.config.options?.verbose) {\n console.log(\n `state exp (x${numExp.valueNode.children.length}): ${this.contentScore}`\n );\n }\n } else {\n this.contentScore += 1;\n if (this.config.options?.verbose) {\n console.log(`state exp: ${this.contentScore}`);\n }\n }\n }\n }\n },\n AssetNode: (assetNode: AssetASTNode) => {\n let scoreModifier = 1;\n // recursively check parent nodes for templates\n const checkParentTemplate = (node: ASTNode) => {\n if (node.parent) {\n if (\n isPropertyNode(node.parent) &&\n node.parent.keyNode.value === \"template\"\n ) {\n // incerases the score modifier for each template parent\n scoreModifier += 1;\n\n if (this.config.options?.verbose) {\n console.log(`found a template parent (+1)`);\n }\n return checkParentTemplate(node.parent);\n }\n return checkParentTemplate(node.parent);\n }\n return node;\n };\n\n checkParentTemplate(assetNode);\n this.contentScore += scoreModifier;\n\n const assetType = assetNode.assetType?.valueNode?.value;\n\n // Map the assetComplexity score based on the asset type\n const assetComplexity = assetType\n ? this.config.assetComplexity?.[assetType]\n : undefined;\n\n // Only run if assetComplexity is set in the config\n if (this.config.assetComplexity) {\n if (assetComplexity) {\n this.contentScore += assetComplexity;\n if (this.config.options?.verbose) {\n console.log(\n `assetNode (+${assetComplexity} for ${assetType}): ${this.contentScore}`\n );\n }\n } else {\n if (this.config.options?.verbose) {\n console.log(\n `assetNode (${assetType} complexity type not found): ${this.contentScore}`\n );\n }\n }\n } else if (this.config.options?.verbose) {\n console.log(\"assetNode:\", this.contentScore);\n }\n },\n ViewNode: (viewNode: ViewASTNode) => {\n this.contentScore += 1;\n\n const viewType = viewNode.viewType?.valueNode?.value;\n\n // Map the assetComplexity score based on the view type\n const viewComplexity = viewType\n ? this.config.assetComplexity?.[viewType]\n : undefined;\n\n // Only run if assetComplexity is set in the config\n if (this.config.assetComplexity) {\n if (viewComplexity) {\n this.contentScore += viewComplexity;\n if (this.config.options?.verbose) {\n console.log(\n `viewNode (+${viewComplexity} for ${viewType}): ${this.contentScore}`\n );\n }\n } else {\n if (this.config.options?.verbose) {\n console.log(\n `viewNode (${viewType} complexity type not found): ${this.contentScore}`\n );\n }\n }\n } else if (this.config.options?.verbose) {\n console.log(\"viewNode:\", this.contentScore);\n }\n },\n StringNode: (stringNode) => {\n const stringContent = stringNode.value;\n resolveDataRefs(stringContent, {\n model: {\n get: (binding) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (get: ${binding}): ${this.contentScore}`);\n }\n return binding;\n },\n set: (binding) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (set: ${binding}): ${this.contentScore}`);\n }\n return [];\n },\n delete: () => {},\n },\n evaluate: (str) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (evaluate: ${str}): ${this.contentScore}`);\n }\n return str;\n },\n });\n },\n };\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,197 @@
1
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/complexity-check.ts
2
+ import {
3
+ DiagnosticSeverity
4
+ } from "vscode-languageserver-types";
5
+ import { resolveDataRefs } from "@player-ui/player";
6
+ import {
7
+ getProperty,
8
+ isPropertyNode
9
+ } from "@player-tools/json-language-service";
10
+ var makeRange = (start, end, document) => {
11
+ return {
12
+ start: document.positionAt(start),
13
+ end: document.positionAt(end)
14
+ };
15
+ };
16
+ var ComplexityCheck = class {
17
+ name = "complexity-check";
18
+ config;
19
+ contentScore;
20
+ range;
21
+ constructor(config) {
22
+ this.config = config;
23
+ this.contentScore = 0;
24
+ this.range = { start: 0, end: 0 };
25
+ }
26
+ apply(service) {
27
+ service.hooks.validate.tap(this.name, async (_ctx, validation) => {
28
+ validation.useASTVisitor(this.createContentChecker());
29
+ });
30
+ service.hooks.onDocumentUpdate.tap(this.name, () => {
31
+ this.contentScore = 0;
32
+ });
33
+ service.hooks.onValidateEnd.tap(this.name, (diagnostics, context) => {
34
+ let diagnostic;
35
+ if (this.contentScore < this.config.maxAcceptableComplexity) {
36
+ if (this.config.maxWarningLevel && this.contentScore > this.config.maxWarningLevel) {
37
+ diagnostic = {
38
+ message: `Warning: Content complexity is ${this.contentScore}`,
39
+ severity: DiagnosticSeverity.Warning,
40
+ range: makeRange(
41
+ this.range.start,
42
+ this.range.end,
43
+ context.documentContext.document
44
+ )
45
+ };
46
+ } else {
47
+ diagnostic = {
48
+ message: `Info: Content complexity is ${this.contentScore}`,
49
+ severity: DiagnosticSeverity.Error,
50
+ range: makeRange(
51
+ this.range.start,
52
+ this.range.end,
53
+ context.documentContext.document
54
+ )
55
+ };
56
+ }
57
+ } else {
58
+ diagnostic = {
59
+ message: `Error: Content complexity is ${this.contentScore}`,
60
+ severity: DiagnosticSeverity.Information,
61
+ range: makeRange(
62
+ this.range.start,
63
+ this.range.end,
64
+ context.documentContext.document
65
+ )
66
+ };
67
+ }
68
+ return [...diagnostics, diagnostic];
69
+ });
70
+ }
71
+ /** Create a validation visitor for dealing with transition states */
72
+ createContentChecker = () => {
73
+ return {
74
+ FlowNode: (flowNode) => {
75
+ this.range = {
76
+ start: flowNode.jsonNode.offset,
77
+ end: flowNode.jsonNode.offset + flowNode.jsonNode.length
78
+ };
79
+ },
80
+ FlowStateNode: (flowState) => {
81
+ if (flowState.stateType) {
82
+ if (flowState.stateType.valueNode?.value === "ACTION") {
83
+ const numExp = getProperty(flowState, "exp");
84
+ if (numExp?.valueNode?.type === "array") {
85
+ this.contentScore += numExp.valueNode.children.length;
86
+ if (this.config.options?.verbose) {
87
+ console.log(
88
+ `state exp (x${numExp.valueNode.children.length}): ${this.contentScore}`
89
+ );
90
+ }
91
+ } else {
92
+ this.contentScore += 1;
93
+ if (this.config.options?.verbose) {
94
+ console.log(`state exp: ${this.contentScore}`);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ },
100
+ AssetNode: (assetNode) => {
101
+ let scoreModifier = 1;
102
+ const checkParentTemplate = (node) => {
103
+ if (node.parent) {
104
+ if (isPropertyNode(node.parent) && node.parent.keyNode.value === "template") {
105
+ scoreModifier += 1;
106
+ if (this.config.options?.verbose) {
107
+ console.log(`found a template parent (+1)`);
108
+ }
109
+ return checkParentTemplate(node.parent);
110
+ }
111
+ return checkParentTemplate(node.parent);
112
+ }
113
+ return node;
114
+ };
115
+ checkParentTemplate(assetNode);
116
+ this.contentScore += scoreModifier;
117
+ const assetType = assetNode.assetType?.valueNode?.value;
118
+ const assetComplexity = assetType ? this.config.assetComplexity?.[assetType] : void 0;
119
+ if (this.config.assetComplexity) {
120
+ if (assetComplexity) {
121
+ this.contentScore += assetComplexity;
122
+ if (this.config.options?.verbose) {
123
+ console.log(
124
+ `assetNode (+${assetComplexity} for ${assetType}): ${this.contentScore}`
125
+ );
126
+ }
127
+ } else {
128
+ if (this.config.options?.verbose) {
129
+ console.log(
130
+ `assetNode (${assetType} complexity type not found): ${this.contentScore}`
131
+ );
132
+ }
133
+ }
134
+ } else if (this.config.options?.verbose) {
135
+ console.log("assetNode:", this.contentScore);
136
+ }
137
+ },
138
+ ViewNode: (viewNode) => {
139
+ this.contentScore += 1;
140
+ const viewType = viewNode.viewType?.valueNode?.value;
141
+ const viewComplexity = viewType ? this.config.assetComplexity?.[viewType] : void 0;
142
+ if (this.config.assetComplexity) {
143
+ if (viewComplexity) {
144
+ this.contentScore += viewComplexity;
145
+ if (this.config.options?.verbose) {
146
+ console.log(
147
+ `viewNode (+${viewComplexity} for ${viewType}): ${this.contentScore}`
148
+ );
149
+ }
150
+ } else {
151
+ if (this.config.options?.verbose) {
152
+ console.log(
153
+ `viewNode (${viewType} complexity type not found): ${this.contentScore}`
154
+ );
155
+ }
156
+ }
157
+ } else if (this.config.options?.verbose) {
158
+ console.log("viewNode:", this.contentScore);
159
+ }
160
+ },
161
+ StringNode: (stringNode) => {
162
+ const stringContent = stringNode.value;
163
+ resolveDataRefs(stringContent, {
164
+ model: {
165
+ get: (binding) => {
166
+ this.contentScore += 2;
167
+ if (this.config.options?.verbose) {
168
+ console.log(`model (get: ${binding}): ${this.contentScore}`);
169
+ }
170
+ return binding;
171
+ },
172
+ set: (binding) => {
173
+ this.contentScore += 2;
174
+ if (this.config.options?.verbose) {
175
+ console.log(`model (set: ${binding}): ${this.contentScore}`);
176
+ }
177
+ return [];
178
+ },
179
+ delete: () => {
180
+ }
181
+ },
182
+ evaluate: (str) => {
183
+ this.contentScore += 2;
184
+ if (this.config.options?.verbose) {
185
+ console.log(`model (evaluate: ${str}): ${this.contentScore}`);
186
+ }
187
+ return str;
188
+ }
189
+ });
190
+ }
191
+ };
192
+ };
193
+ };
194
+ export {
195
+ ComplexityCheck
196
+ };
197
+ //# sourceMappingURL=index.mjs.map
package/dist/index.mjs ADDED
@@ -0,0 +1,197 @@
1
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/complexity-check.ts
2
+ import {
3
+ DiagnosticSeverity
4
+ } from "vscode-languageserver-types";
5
+ import { resolveDataRefs } from "@player-ui/player";
6
+ import {
7
+ getProperty,
8
+ isPropertyNode
9
+ } from "@player-tools/json-language-service";
10
+ var makeRange = (start, end, document) => {
11
+ return {
12
+ start: document.positionAt(start),
13
+ end: document.positionAt(end)
14
+ };
15
+ };
16
+ var ComplexityCheck = class {
17
+ name = "complexity-check";
18
+ config;
19
+ contentScore;
20
+ range;
21
+ constructor(config) {
22
+ this.config = config;
23
+ this.contentScore = 0;
24
+ this.range = { start: 0, end: 0 };
25
+ }
26
+ apply(service) {
27
+ service.hooks.validate.tap(this.name, async (_ctx, validation) => {
28
+ validation.useASTVisitor(this.createContentChecker());
29
+ });
30
+ service.hooks.onDocumentUpdate.tap(this.name, () => {
31
+ this.contentScore = 0;
32
+ });
33
+ service.hooks.onValidateEnd.tap(this.name, (diagnostics, context) => {
34
+ let diagnostic;
35
+ if (this.contentScore < this.config.maxAcceptableComplexity) {
36
+ if (this.config.maxWarningLevel && this.contentScore > this.config.maxWarningLevel) {
37
+ diagnostic = {
38
+ message: `Warning: Content complexity is ${this.contentScore}`,
39
+ severity: DiagnosticSeverity.Warning,
40
+ range: makeRange(
41
+ this.range.start,
42
+ this.range.end,
43
+ context.documentContext.document
44
+ )
45
+ };
46
+ } else {
47
+ diagnostic = {
48
+ message: `Info: Content complexity is ${this.contentScore}`,
49
+ severity: DiagnosticSeverity.Error,
50
+ range: makeRange(
51
+ this.range.start,
52
+ this.range.end,
53
+ context.documentContext.document
54
+ )
55
+ };
56
+ }
57
+ } else {
58
+ diagnostic = {
59
+ message: `Error: Content complexity is ${this.contentScore}`,
60
+ severity: DiagnosticSeverity.Information,
61
+ range: makeRange(
62
+ this.range.start,
63
+ this.range.end,
64
+ context.documentContext.document
65
+ )
66
+ };
67
+ }
68
+ return [...diagnostics, diagnostic];
69
+ });
70
+ }
71
+ /** Create a validation visitor for dealing with transition states */
72
+ createContentChecker = () => {
73
+ return {
74
+ FlowNode: (flowNode) => {
75
+ this.range = {
76
+ start: flowNode.jsonNode.offset,
77
+ end: flowNode.jsonNode.offset + flowNode.jsonNode.length
78
+ };
79
+ },
80
+ FlowStateNode: (flowState) => {
81
+ if (flowState.stateType) {
82
+ if (flowState.stateType.valueNode?.value === "ACTION") {
83
+ const numExp = getProperty(flowState, "exp");
84
+ if (numExp?.valueNode?.type === "array") {
85
+ this.contentScore += numExp.valueNode.children.length;
86
+ if (this.config.options?.verbose) {
87
+ console.log(
88
+ `state exp (x${numExp.valueNode.children.length}): ${this.contentScore}`
89
+ );
90
+ }
91
+ } else {
92
+ this.contentScore += 1;
93
+ if (this.config.options?.verbose) {
94
+ console.log(`state exp: ${this.contentScore}`);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ },
100
+ AssetNode: (assetNode) => {
101
+ let scoreModifier = 1;
102
+ const checkParentTemplate = (node) => {
103
+ if (node.parent) {
104
+ if (isPropertyNode(node.parent) && node.parent.keyNode.value === "template") {
105
+ scoreModifier += 1;
106
+ if (this.config.options?.verbose) {
107
+ console.log(`found a template parent (+1)`);
108
+ }
109
+ return checkParentTemplate(node.parent);
110
+ }
111
+ return checkParentTemplate(node.parent);
112
+ }
113
+ return node;
114
+ };
115
+ checkParentTemplate(assetNode);
116
+ this.contentScore += scoreModifier;
117
+ const assetType = assetNode.assetType?.valueNode?.value;
118
+ const assetComplexity = assetType ? this.config.assetComplexity?.[assetType] : void 0;
119
+ if (this.config.assetComplexity) {
120
+ if (assetComplexity) {
121
+ this.contentScore += assetComplexity;
122
+ if (this.config.options?.verbose) {
123
+ console.log(
124
+ `assetNode (+${assetComplexity} for ${assetType}): ${this.contentScore}`
125
+ );
126
+ }
127
+ } else {
128
+ if (this.config.options?.verbose) {
129
+ console.log(
130
+ `assetNode (${assetType} complexity type not found): ${this.contentScore}`
131
+ );
132
+ }
133
+ }
134
+ } else if (this.config.options?.verbose) {
135
+ console.log("assetNode:", this.contentScore);
136
+ }
137
+ },
138
+ ViewNode: (viewNode) => {
139
+ this.contentScore += 1;
140
+ const viewType = viewNode.viewType?.valueNode?.value;
141
+ const viewComplexity = viewType ? this.config.assetComplexity?.[viewType] : void 0;
142
+ if (this.config.assetComplexity) {
143
+ if (viewComplexity) {
144
+ this.contentScore += viewComplexity;
145
+ if (this.config.options?.verbose) {
146
+ console.log(
147
+ `viewNode (+${viewComplexity} for ${viewType}): ${this.contentScore}`
148
+ );
149
+ }
150
+ } else {
151
+ if (this.config.options?.verbose) {
152
+ console.log(
153
+ `viewNode (${viewType} complexity type not found): ${this.contentScore}`
154
+ );
155
+ }
156
+ }
157
+ } else if (this.config.options?.verbose) {
158
+ console.log("viewNode:", this.contentScore);
159
+ }
160
+ },
161
+ StringNode: (stringNode) => {
162
+ const stringContent = stringNode.value;
163
+ resolveDataRefs(stringContent, {
164
+ model: {
165
+ get: (binding) => {
166
+ this.contentScore += 2;
167
+ if (this.config.options?.verbose) {
168
+ console.log(`model (get: ${binding}): ${this.contentScore}`);
169
+ }
170
+ return binding;
171
+ },
172
+ set: (binding) => {
173
+ this.contentScore += 2;
174
+ if (this.config.options?.verbose) {
175
+ console.log(`model (set: ${binding}): ${this.contentScore}`);
176
+ }
177
+ return [];
178
+ },
179
+ delete: () => {
180
+ }
181
+ },
182
+ evaluate: (str) => {
183
+ this.contentScore += 2;
184
+ if (this.config.options?.verbose) {
185
+ console.log(`model (evaluate: ${str}): ${this.contentScore}`);
186
+ }
187
+ return str;
188
+ }
189
+ });
190
+ }
191
+ };
192
+ };
193
+ };
194
+ export {
195
+ ComplexityCheck
196
+ };
197
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/complexity-check-plugin/src/complexity-check.ts"],"sourcesContent":["import {\n Diagnostic,\n DiagnosticSeverity,\n Range,\n TextDocument,\n} from \"vscode-languageserver-types\";\nimport { resolveDataRefs } from \"@player-ui/player\";\nimport {\n getProperty,\n isPropertyNode,\n AssetASTNode,\n type ASTNode,\n type ViewASTNode,\n type PlayerLanguageService,\n type PlayerLanguageServicePlugin,\n type ASTVisitor,\n} from \"@player-tools/json-language-service\";\n\nconst makeRange = (\n start: number,\n end: number,\n document: TextDocument\n): Range => {\n return {\n start: document.positionAt(start),\n end: document.positionAt(end),\n };\n};\n\nexport interface ComplexityCheckConfig {\n /** Cutoff for content to be acceptable */\n maxAcceptableComplexity: number;\n /**\n * If set, any score above this number but below `maxAcceptableComplexity` will be logged as a warning\n */\n maxWarningLevel?: number;\n /** If set, maps complexity based on asset or view type */\n assetComplexity?: Record<string, number>;\n /** A way to pass in configurable options */\n options?: {\n /** Read out all logging messages */\n verbose?: boolean;\n };\n}\n\n/**\n * Estimates complexity of content\n */\nexport class ComplexityCheck implements PlayerLanguageServicePlugin {\n name = \"complexity-check\";\n\n private config: ComplexityCheckConfig;\n private contentScore: number;\n private range: {\n start: number;\n end: number;\n };\n\n constructor(config: ComplexityCheckConfig) {\n this.config = config;\n this.contentScore = 0;\n this.range = { start: 0, end: 0 };\n }\n\n apply(service: PlayerLanguageService): void {\n service.hooks.validate.tap(this.name, async (_ctx, validation) => {\n validation.useASTVisitor(this.createContentChecker());\n });\n\n service.hooks.onDocumentUpdate.tap(this.name, () => {\n this.contentScore = 0;\n });\n\n service.hooks.onValidateEnd.tap(this.name, (diagnostics, context) => {\n let diagnostic: Diagnostic;\n\n if (this.contentScore < this.config.maxAcceptableComplexity) {\n if (\n this.config.maxWarningLevel &&\n this.contentScore > this.config.maxWarningLevel\n ) {\n diagnostic = {\n message: `Warning: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Warning,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n } else {\n diagnostic = {\n message: `Info: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Error,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n }\n } else {\n diagnostic = {\n message: `Error: Content complexity is ${this.contentScore}`,\n severity: DiagnosticSeverity.Information,\n range: makeRange(\n this.range.start,\n this.range.end,\n context.documentContext.document\n ),\n };\n }\n return [...diagnostics, diagnostic];\n });\n }\n\n /** Create a validation visitor for dealing with transition states */\n createContentChecker = (): ASTVisitor => {\n return {\n FlowNode: (flowNode) => {\n this.range = {\n start: flowNode.jsonNode.offset,\n end: flowNode.jsonNode.offset + flowNode.jsonNode.length,\n };\n },\n\n FlowStateNode: (flowState) => {\n // add complexity per expression in a state\n if (flowState.stateType) {\n if (flowState.stateType.valueNode?.value === \"ACTION\") {\n const numExp = getProperty(flowState, \"exp\");\n if (numExp?.valueNode?.type === \"array\") {\n this.contentScore += numExp.valueNode.children.length;\n if (this.config.options?.verbose) {\n console.log(\n `state exp (x${numExp.valueNode.children.length}): ${this.contentScore}`\n );\n }\n } else {\n this.contentScore += 1;\n if (this.config.options?.verbose) {\n console.log(`state exp: ${this.contentScore}`);\n }\n }\n }\n }\n },\n AssetNode: (assetNode: AssetASTNode) => {\n let scoreModifier = 1;\n // recursively check parent nodes for templates\n const checkParentTemplate = (node: ASTNode) => {\n if (node.parent) {\n if (\n isPropertyNode(node.parent) &&\n node.parent.keyNode.value === \"template\"\n ) {\n // incerases the score modifier for each template parent\n scoreModifier += 1;\n\n if (this.config.options?.verbose) {\n console.log(`found a template parent (+1)`);\n }\n return checkParentTemplate(node.parent);\n }\n return checkParentTemplate(node.parent);\n }\n return node;\n };\n\n checkParentTemplate(assetNode);\n this.contentScore += scoreModifier;\n\n const assetType = assetNode.assetType?.valueNode?.value;\n\n // Map the assetComplexity score based on the asset type\n const assetComplexity = assetType\n ? this.config.assetComplexity?.[assetType]\n : undefined;\n\n // Only run if assetComplexity is set in the config\n if (this.config.assetComplexity) {\n if (assetComplexity) {\n this.contentScore += assetComplexity;\n if (this.config.options?.verbose) {\n console.log(\n `assetNode (+${assetComplexity} for ${assetType}): ${this.contentScore}`\n );\n }\n } else {\n if (this.config.options?.verbose) {\n console.log(\n `assetNode (${assetType} complexity type not found): ${this.contentScore}`\n );\n }\n }\n } else if (this.config.options?.verbose) {\n console.log(\"assetNode:\", this.contentScore);\n }\n },\n ViewNode: (viewNode: ViewASTNode) => {\n this.contentScore += 1;\n\n const viewType = viewNode.viewType?.valueNode?.value;\n\n // Map the assetComplexity score based on the view type\n const viewComplexity = viewType\n ? this.config.assetComplexity?.[viewType]\n : undefined;\n\n // Only run if assetComplexity is set in the config\n if (this.config.assetComplexity) {\n if (viewComplexity) {\n this.contentScore += viewComplexity;\n if (this.config.options?.verbose) {\n console.log(\n `viewNode (+${viewComplexity} for ${viewType}): ${this.contentScore}`\n );\n }\n } else {\n if (this.config.options?.verbose) {\n console.log(\n `viewNode (${viewType} complexity type not found): ${this.contentScore}`\n );\n }\n }\n } else if (this.config.options?.verbose) {\n console.log(\"viewNode:\", this.contentScore);\n }\n },\n StringNode: (stringNode) => {\n const stringContent = stringNode.value;\n resolveDataRefs(stringContent, {\n model: {\n get: (binding) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (get: ${binding}): ${this.contentScore}`);\n }\n return binding;\n },\n set: (binding) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (set: ${binding}): ${this.contentScore}`);\n }\n return [];\n },\n delete: () => {},\n },\n evaluate: (str) => {\n this.contentScore += 2;\n if (this.config.options?.verbose) {\n console.log(`model (evaluate: ${str}): ${this.contentScore}`);\n }\n return str;\n },\n });\n },\n };\n };\n}\n"],"mappings":"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","names":[]}