Skip to content

Commit 20fe7af

Browse files
authored
Add required behaviors to behavior headers (#951)
1 parent e2faafa commit 20fe7af

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

scripts/generate-extensions-registry.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ const args = require('minimist')(process.argv.slice(2));
1515
/** @typedef {import('./types').ExtensionHeader} ExtensionHeader */
1616
/** @typedef {import('./types').ExtensionWithFileInfo} ExtensionWithFileInfo */
1717
/** @typedef {import('./types').ExtensionTier} ExtensionTier */
18+
/** @typedef {import('./types').Extension} Extension */
19+
/** @typedef {import('./types').EventsBasedBehavior} EventsBasedBehavior */
1820

1921
const extensionsBasePath = path.join(__dirname, '..', 'extensions');
2022
const reviewedExtensionsTier = 'reviewed';
@@ -78,6 +80,50 @@ const readExtensionsFromFolder = async (folderPath, tier) => {
7880
);
7981
};
8082

83+
/**
84+
* Find all required behaviors including transitive ones.
85+
* @param {Extension} extension
86+
* @param {EventsBasedBehavior} behavior
87+
* @param {Array<string>} requiredBehaviorTypes
88+
*/
89+
const findAllRequiredBehaviorTypes = (
90+
extension,
91+
behavior,
92+
requiredBehaviorTypes = []
93+
) => {
94+
for (const propertyDescriptor of behavior.propertyDescriptors) {
95+
if (propertyDescriptor.type == 'Behavior') {
96+
const requiredBehaviorType = propertyDescriptor.extraInformation[0];
97+
const extensionPrefix = extension.name + '::';
98+
if (!requiredBehaviorTypes.includes(requiredBehaviorType)) {
99+
requiredBehaviorTypes.push(requiredBehaviorType);
100+
101+
if (requiredBehaviorType.startsWith(extensionPrefix)) {
102+
const behaviorName = requiredBehaviorType.substring(
103+
extensionPrefix.length
104+
);
105+
const requiredBehavior = extension.eventsBasedBehaviors.find(
106+
(behavior) => behavior.name === behaviorName
107+
);
108+
if (!requiredBehavior) {
109+
throw new Error(
110+
'Required behavior: ' +
111+
requiredBehaviorTypes +
112+
' is missing in the extension.'
113+
);
114+
}
115+
findAllRequiredBehaviorTypes(
116+
extension,
117+
requiredBehavior,
118+
requiredBehaviorTypes
119+
);
120+
}
121+
}
122+
}
123+
}
124+
return requiredBehaviorTypes;
125+
};
126+
81127
(async () => {
82128
try {
83129
shell.mkdir('-p', distBasePath);
@@ -217,6 +263,10 @@ const readExtensionsFromFolder = async (folderPath, tier) => {
217263
fullName: behavior.fullName,
218264
description: behavior.description,
219265
objectType: behavior.objectType,
266+
allRequiredBehaviorTypes: findAllRequiredBehaviorTypes(
267+
extension,
268+
behavior
269+
),
220270
}
221271
)
222272
.filter(Boolean)

scripts/lib/rules/DotsInSentences.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/** @typedef {import("../../types").Extension} Extension */
22
/** @typedef {import("../../types").EventsFunction} EventsFunction */
3-
/** @typedef {import("../../types").EventsBasedBehaviors} EventsBasedBehaviors */
3+
/** @typedef {import("../../types").EventsBasedBehavior} EventsBasedBehaviors */
44
/** @typedef {import("../../types").Parameter} Parameter */
55
/** @typedef {import("./rule").ErrorLogger} ErrorLogger */
66

scripts/lib/rules/FilledOutDescriptions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/** @typedef {import("../../types").Extension} Extension */
22
/** @typedef {import("../../types").EventsFunction} EventsFunction */
3-
/** @typedef {import("../../types").EventsBasedBehaviors} EventsBasedBehaviors */
3+
/** @typedef {import("../../types").EventsBasedBehavior} EventsBasedBehaviors */
44
/** @typedef {import("../../types").EventsBasedObjects} EventsBasedObjects */
55
/** @typedef {import("../../types").Parameter} Parameter */
66

scripts/types.d.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export interface BehaviorShortHeader
5252
extends RegistryItem,
5353
BehaviorAndShortHeaderFields {
5454
extensionName: string;
55+
/**
56+
* All required behaviors including transitive ones.
57+
*/
58+
allRequiredBehaviorTypes: Array<string>;
5559
}
5660

5761
interface ObjectAndShortHeaderFields {
@@ -148,13 +152,19 @@ export interface EventsFunction {
148152
objectGroups: string[];
149153
}
150154

151-
export interface EventsBasedBehaviors {
155+
export interface PropertyDescriptor {
156+
type: 'Number' | 'String' | 'Boolean' | 'Choice' | 'Color' | 'Behavior';
157+
extraInformation: string[];
158+
}
159+
160+
export interface EventsBasedBehavior {
152161
description: string;
153162
fullName: string;
154163
name: string;
155164
objectType: string;
156165
private?: boolean;
157166
eventsFunctions: EventsFunction[];
167+
propertyDescriptors: PropertyDescriptor[];
158168
}
159169

160170
export interface EventsBasedObjects {
@@ -170,7 +180,7 @@ export interface Extension
170180
ExtensionAndHeaderFields {
171181
tags: string | string[];
172182
eventsFunctions: EventsFunction[];
173-
eventsBasedBehaviors: EventsBasedBehaviors[];
183+
eventsBasedBehaviors: EventsBasedBehavior[];
174184
eventsBasedObjects?: EventsBasedObjects[];
175185
}
176186

0 commit comments

Comments
 (0)