@openframe-org/criteria-set-protocol 2.8.0-alpha.0 → 2.9.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.
@@ -164,10 +164,115 @@ export declare const themeSchema: z.ZodObject<{
164
164
  defaultValue: z.ZodOptional<z.ZodBoolean>;
165
165
  }, z.core.$strip>], "type">;
166
166
  description: z.ZodNullable<z.ZodString>;
167
+ data: z.ZodIntersection<z.ZodType<{
168
+ text: string;
169
+ } & ({
170
+ [x: string]: any;
171
+ value: number;
172
+ total: number;
173
+ maximumValue?: number | undefined;
174
+ minimumValue?: number | undefined;
175
+ exclusiveMaximum?: number | undefined;
176
+ exclusiveMinimum?: number | undefined;
177
+ weight?: number | undefined;
178
+ type?: "number" | undefined;
179
+ } | {
180
+ [x: string]: any;
181
+ type: "percentage";
182
+ value: number;
183
+ maximumValue?: number | undefined;
184
+ minimumValue?: number | undefined;
185
+ exclusiveMaximum?: number | undefined;
186
+ exclusiveMinimum?: number | undefined;
187
+ weight?: number | undefined;
188
+ } | {
189
+ [x: string]: any;
190
+ type: "boolean";
191
+ value: boolean;
192
+ }), unknown, z.core.$ZodTypeInternals<{
193
+ text: string;
194
+ } & ({
195
+ [x: string]: any;
196
+ value: number;
197
+ total: number;
198
+ maximumValue?: number | undefined;
199
+ minimumValue?: number | undefined;
200
+ exclusiveMaximum?: number | undefined;
201
+ exclusiveMinimum?: number | undefined;
202
+ weight?: number | undefined;
203
+ type?: "number" | undefined;
204
+ } | {
205
+ [x: string]: any;
206
+ type: "percentage";
207
+ value: number;
208
+ maximumValue?: number | undefined;
209
+ minimumValue?: number | undefined;
210
+ exclusiveMaximum?: number | undefined;
211
+ exclusiveMinimum?: number | undefined;
212
+ weight?: number | undefined;
213
+ } | {
214
+ [x: string]: any;
215
+ type: "boolean";
216
+ value: boolean;
217
+ }), unknown>>, z.ZodObject<{
218
+ readOnly: z.ZodBoolean;
219
+ valueReference: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined, z.ZodArray<z.ZodString>]>>;
220
+ }, z.core.$strip>>;
167
221
  options: z.ZodObject<{
168
222
  excludeFromTargets: z.ZodOptional<z.ZodBoolean>;
169
223
  }, z.core.$strip>;
170
224
  }, z.core.$strip>>>;
225
+ data: z.ZodType<{
226
+ text: string;
227
+ } & ({
228
+ [x: string]: any;
229
+ value: number;
230
+ total: number;
231
+ maximumValue?: number | undefined;
232
+ minimumValue?: number | undefined;
233
+ exclusiveMaximum?: number | undefined;
234
+ exclusiveMinimum?: number | undefined;
235
+ weight?: number | undefined;
236
+ type?: "number" | undefined;
237
+ } | {
238
+ [x: string]: any;
239
+ type: "percentage";
240
+ value: number;
241
+ maximumValue?: number | undefined;
242
+ minimumValue?: number | undefined;
243
+ exclusiveMaximum?: number | undefined;
244
+ exclusiveMinimum?: number | undefined;
245
+ weight?: number | undefined;
246
+ } | {
247
+ [x: string]: any;
248
+ type: "boolean";
249
+ value: boolean;
250
+ }), unknown, z.core.$ZodTypeInternals<{
251
+ text: string;
252
+ } & ({
253
+ [x: string]: any;
254
+ value: number;
255
+ total: number;
256
+ maximumValue?: number | undefined;
257
+ minimumValue?: number | undefined;
258
+ exclusiveMaximum?: number | undefined;
259
+ exclusiveMinimum?: number | undefined;
260
+ weight?: number | undefined;
261
+ type?: "number" | undefined;
262
+ } | {
263
+ [x: string]: any;
264
+ type: "percentage";
265
+ value: number;
266
+ maximumValue?: number | undefined;
267
+ minimumValue?: number | undefined;
268
+ exclusiveMaximum?: number | undefined;
269
+ exclusiveMinimum?: number | undefined;
270
+ weight?: number | undefined;
271
+ } | {
272
+ [x: string]: any;
273
+ type: "boolean";
274
+ value: boolean;
275
+ }), unknown>>;
171
276
  options: z.ZodObject<{
172
277
  breadcrumbTextFormat: z.ZodString;
173
278
  documentTreeFolderTextFormat: z.ZodString;
@@ -177,6 +282,57 @@ export declare const themeSchema: z.ZodObject<{
177
282
  }, z.core.$strip>;
178
283
  }, z.core.$strip>>>;
179
284
  }, z.core.$strip>>>;
285
+ data: z.ZodType<{
286
+ text: string;
287
+ } & ({
288
+ [x: string]: any;
289
+ value: number;
290
+ total: number;
291
+ maximumValue?: number | undefined;
292
+ minimumValue?: number | undefined;
293
+ exclusiveMaximum?: number | undefined;
294
+ exclusiveMinimum?: number | undefined;
295
+ weight?: number | undefined;
296
+ type?: "number" | undefined;
297
+ } | {
298
+ [x: string]: any;
299
+ type: "percentage";
300
+ value: number;
301
+ maximumValue?: number | undefined;
302
+ minimumValue?: number | undefined;
303
+ exclusiveMaximum?: number | undefined;
304
+ exclusiveMinimum?: number | undefined;
305
+ weight?: number | undefined;
306
+ } | {
307
+ [x: string]: any;
308
+ type: "boolean";
309
+ value: boolean;
310
+ }), unknown, z.core.$ZodTypeInternals<{
311
+ text: string;
312
+ } & ({
313
+ [x: string]: any;
314
+ value: number;
315
+ total: number;
316
+ maximumValue?: number | undefined;
317
+ minimumValue?: number | undefined;
318
+ exclusiveMaximum?: number | undefined;
319
+ exclusiveMinimum?: number | undefined;
320
+ weight?: number | undefined;
321
+ type?: "number" | undefined;
322
+ } | {
323
+ [x: string]: any;
324
+ type: "percentage";
325
+ value: number;
326
+ maximumValue?: number | undefined;
327
+ minimumValue?: number | undefined;
328
+ exclusiveMaximum?: number | undefined;
329
+ exclusiveMinimum?: number | undefined;
330
+ weight?: number | undefined;
331
+ } | {
332
+ [x: string]: any;
333
+ type: "boolean";
334
+ value: boolean;
335
+ }), unknown>>;
180
336
  options: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
181
337
  hideCodeInReport: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
182
338
  criteriaTreeElementTextFormat: z.ZodString;
@@ -193,6 +349,57 @@ export declare const themeSchema: z.ZodObject<{
193
349
  documentTreeFolderTextFormat: z.ZodString;
194
350
  }, z.core.$strip>], "hideFromDocumentTree">>;
195
351
  }, z.core.$strip>>;
352
+ data: z.ZodType<{
353
+ text: string;
354
+ } & ({
355
+ [x: string]: any;
356
+ value: number;
357
+ total: number;
358
+ maximumValue?: number | undefined;
359
+ minimumValue?: number | undefined;
360
+ exclusiveMaximum?: number | undefined;
361
+ exclusiveMinimum?: number | undefined;
362
+ weight?: number | undefined;
363
+ type?: "number" | undefined;
364
+ } | {
365
+ [x: string]: any;
366
+ type: "percentage";
367
+ value: number;
368
+ maximumValue?: number | undefined;
369
+ minimumValue?: number | undefined;
370
+ exclusiveMaximum?: number | undefined;
371
+ exclusiveMinimum?: number | undefined;
372
+ weight?: number | undefined;
373
+ } | {
374
+ [x: string]: any;
375
+ type: "boolean";
376
+ value: boolean;
377
+ }), unknown, z.core.$ZodTypeInternals<{
378
+ text: string;
379
+ } & ({
380
+ [x: string]: any;
381
+ value: number;
382
+ total: number;
383
+ maximumValue?: number | undefined;
384
+ minimumValue?: number | undefined;
385
+ exclusiveMaximum?: number | undefined;
386
+ exclusiveMinimum?: number | undefined;
387
+ weight?: number | undefined;
388
+ type?: "number" | undefined;
389
+ } | {
390
+ [x: string]: any;
391
+ type: "percentage";
392
+ value: number;
393
+ maximumValue?: number | undefined;
394
+ minimumValue?: number | undefined;
395
+ exclusiveMaximum?: number | undefined;
396
+ exclusiveMinimum?: number | undefined;
397
+ weight?: number | undefined;
398
+ } | {
399
+ [x: string]: any;
400
+ type: "boolean";
401
+ value: boolean;
402
+ }), unknown>>;
196
403
  options: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
197
404
  hideCodeInReport: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
198
405
  reportTitleTextFormat: z.ZodOptional<z.ZodString>;
@@ -30,6 +30,7 @@ exports.themeSchema = common_1.abstractElementSchema
30
30
  .nullable()
31
31
  .describe("Visual styling configuration for the theme"),
32
32
  items: zod_1.z.array(criterion_1.criterionSchema).describe("The criteria in this theme"),
33
+ data: common_1.elementDataSchema.describe("Data associated with the theme"),
33
34
  options: exports.themeOptionsSchema.describe("Configuration options for the theme display and behavior"),
34
35
  })
35
36
  .describe("Theme - Represents a theme, which is the top layer of the criteria tree");
@@ -1,7 +1,7 @@
1
1
  import { CriteriaTree, Metadata, DataMap, StreamMatrixResponse, TaskItemValueReferenceMap } from "../types";
2
2
  export type TreeAndMapParameters<ParametersType extends Record<string, any> | undefined = undefined> = {
3
3
  parameters: ParametersType extends undefined ? undefined : ParametersType;
4
- values?: TaskItemValueReferenceMap | null;
4
+ valueReferences?: TaskItemValueReferenceMap | null;
5
5
  };
6
6
  export type MatrixParameters<ParametersType extends Record<string, any> | undefined = undefined> = TreeAndMapParameters<ParametersType> & {
7
7
  additional?: any;
@@ -1,4 +1,4 @@
1
- import { Color, CriteriaTree, CriteriaTreeElement, Theme, Criterion, Task, TaskGroup, TaskItem, CertificationDefinition, TaskItemValueReference, TaskItemData, ElementData, TreeResult, CriteriaTreeElementType } from "./types";
1
+ import { Color, CriteriaTree, CriteriaTreeElement, Theme, Criterion, Task, TaskGroup, TaskItem, CertificationDefinition, TaskItemValueReference, TaskItemData, ElementData, TreeResult, CriteriaTreeElementType, TaskItemDefinition } from "./types";
2
2
  interface ApplyBreadcrumbTextFormattingPlaceholdersFunction {
3
3
  (options: {
4
4
  breadcrumbTextFormat: string | undefined;
@@ -73,7 +73,7 @@ export declare const isNil: (value: unknown) => value is null | undefined;
73
73
  /**
74
74
  * Given a list of certification definitions, return the ones for which the given value is valid
75
75
  */
76
- export declare const getCertificationsByValue: (certificationDefinitions: CertificationDefinition[], value?: TaskItemValueReference) => CertificationDefinition[] | undefined;
76
+ export declare const getCertificationsByValue: (certificationDefinitions: CertificationDefinition[], value?: number | boolean | null) => CertificationDefinition[];
77
77
  /**
78
78
  * Given a tree element or a data object, validate that it contains valid data. If it is a tree element,
79
79
  * extract the data object from it and validate it:
@@ -86,4 +86,5 @@ export declare const getCertificationsByValue: (certificationDefinitions: Certif
86
86
  export declare function validateData(data: TaskItemData | ElementData | TreeResult, dataType: Exclude<CriteriaTreeElementType, "task-group" | "task-item">): data is ElementData;
87
87
  export declare function validateData(data: TaskItemData | ElementData | TreeResult, dataType: Extract<CriteriaTreeElementType, "task-item">): data is TaskItemData;
88
88
  export declare function validateData(data: TaskItemData | ElementData | TreeResult, dataType: "tree-result"): data is TreeResult;
89
+ export declare const resolveTaskItemValue: (taskItemDefinition: TaskItemDefinition, valueReference: TaskItemValueReference) => number | boolean | null;
89
90
  export {};
package/dist/v1/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCertificationsByValue = exports.isNil = exports.applyReportTitleTextFormatFormattingPlaceholders = exports.applyCriteriaTreeElementTextFormatFormattingPlaceholders = exports.applyDocumentTreeFolderTextFormattingPlaceholders = exports.applyBreadcrumbTextFormattingPlaceholders = exports.findInTree = exports.toColorHexString = exports.isTaskItem = exports.isTask = exports.isTaskGroup = exports.isCriterion = exports.isTheme = void 0;
3
+ exports.resolveTaskItemValue = exports.getCertificationsByValue = exports.isNil = exports.applyReportTitleTextFormatFormattingPlaceholders = exports.applyCriteriaTreeElementTextFormatFormattingPlaceholders = exports.applyDocumentTreeFolderTextFormattingPlaceholders = exports.applyBreadcrumbTextFormattingPlaceholders = exports.findInTree = exports.toColorHexString = exports.isTaskItem = exports.isTask = exports.isTaskGroup = exports.isCriterion = exports.isTheme = void 0;
4
4
  exports.validateData = validateData;
5
5
  const isTheme = (element) => element.type === "theme";
6
6
  exports.isTheme = isTheme;
@@ -46,14 +46,14 @@ exports.findInTree = findInTree;
46
46
  /**
47
47
  * Apply the text formatting used in document tree folder naming
48
48
  */
49
- const applyBreadcrumbTextFormattingPlaceholders = ({ breadcrumbTextFormat = ':code:' }, { title, code }) => breadcrumbTextFormat
49
+ const applyBreadcrumbTextFormattingPlaceholders = ({ breadcrumbTextFormat = ":code:" }, { title, code }) => breadcrumbTextFormat
50
50
  .replace(/:code:/g, code)
51
51
  .replace(/:title:/g, title);
52
52
  exports.applyBreadcrumbTextFormattingPlaceholders = applyBreadcrumbTextFormattingPlaceholders;
53
53
  /**
54
54
  * Apply the text formatting used in the document tree
55
55
  */
56
- const applyDocumentTreeFolderTextFormattingPlaceholders = ({ documentTreeFolderTextFormat = ':code:' }, { title, code }) => documentTreeFolderTextFormat
56
+ const applyDocumentTreeFolderTextFormattingPlaceholders = ({ documentTreeFolderTextFormat = ":code:" }, { title, code }) => documentTreeFolderTextFormat
57
57
  .replace(/:code:/g, code)
58
58
  .replace(/:title:/g, title);
59
59
  exports.applyDocumentTreeFolderTextFormattingPlaceholders = applyDocumentTreeFolderTextFormattingPlaceholders;
@@ -67,7 +67,7 @@ exports.applyCriteriaTreeElementTextFormatFormattingPlaceholders = applyCriteria
67
67
  /**
68
68
  * Apply the text formatting used in the report title
69
69
  */
70
- const applyReportTitleTextFormatFormattingPlaceholders = ({ reportTitleTextFormat = ':title:' }, { title, code }) => reportTitleTextFormat
70
+ const applyReportTitleTextFormatFormattingPlaceholders = ({ reportTitleTextFormat = ":title:" }, { title, code }) => reportTitleTextFormat
71
71
  .replace(/:code:/g, code)
72
72
  .replace(/:title:/g, title);
73
73
  exports.applyReportTitleTextFormatFormattingPlaceholders = applyReportTitleTextFormatFormattingPlaceholders;
@@ -78,17 +78,17 @@ exports.isNil = isNil;
78
78
  */
79
79
  const getCertificationsByValue = (certificationDefinitions, value) => {
80
80
  if (typeof value !== "number") {
81
- return undefined;
81
+ return [];
82
82
  }
83
83
  return certificationDefinitions.filter((definition) => {
84
84
  return (((0, exports.isNil)(definition.rules.minimum) ||
85
- value > definition.rules.minimum) &&
85
+ value >= definition.rules.minimum) &&
86
86
  ((0, exports.isNil)(definition.rules.exclusiveMinimum) ||
87
- value >= definition.rules.exclusiveMinimum) &&
87
+ value > definition.rules.exclusiveMinimum) &&
88
88
  ((0, exports.isNil)(definition.rules.maximum) ||
89
- value < definition.rules.maximum) &&
89
+ value <= definition.rules.maximum) &&
90
90
  ((0, exports.isNil)(definition.rules.exclusiveMaximum) ||
91
- value <= definition.rules.exclusiveMaximum));
91
+ value < definition.rules.exclusiveMaximum));
92
92
  });
93
93
  };
94
94
  exports.getCertificationsByValue = getCertificationsByValue;
@@ -127,10 +127,54 @@ function validateData(data, dataType) {
127
127
  default:
128
128
  throw new Error(`Data has an invalid 'type' property: ${data.type}`);
129
129
  }
130
- if (dataType === 'task-item') {
130
+ if (dataType === "task-item") {
131
131
  if (!("readOnly" in data)) {
132
132
  throw new Error("Data is missing 'readOnly' property");
133
133
  }
134
134
  }
135
135
  return true;
136
136
  }
137
+ const resolveTaskItemValue = (taskItemDefinition, valueReference) => {
138
+ const toFiniteNumberOrNull = (rawValue) => {
139
+ if ((0, exports.isNil)(rawValue)) {
140
+ return null;
141
+ }
142
+ const numericValue = Number(rawValue);
143
+ return Number.isFinite(numericValue) ? numericValue : null;
144
+ };
145
+ const resolveSingleOptionValue = (optionOrValueReference) => {
146
+ var _a, _b;
147
+ if (taskItemDefinition.type !== "select-single" && taskItemDefinition.type !== "select-multiple") {
148
+ return null;
149
+ }
150
+ if (typeof optionOrValueReference === "number") {
151
+ return optionOrValueReference;
152
+ }
153
+ const foundValue = (_b = (_a = taskItemDefinition.options.find((option) => option.id === optionOrValueReference)) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;
154
+ return toFiniteNumberOrNull(foundValue);
155
+ };
156
+ switch (taskItemDefinition.type) {
157
+ case "number":
158
+ return toFiniteNumberOrNull(valueReference);
159
+ case "boolean":
160
+ return valueReference === "true" || valueReference === "1" || valueReference === true || valueReference === 1;
161
+ case "select-single": {
162
+ return resolveSingleOptionValue(valueReference);
163
+ }
164
+ case "select-multiple": {
165
+ const optionIds = Array.isArray(valueReference) ? valueReference : [valueReference];
166
+ let resolvedValue = null;
167
+ for (const optionId of optionIds) {
168
+ const resolvedOptionValue = resolveSingleOptionValue(optionId);
169
+ if (!(0, exports.isNil)(resolvedOptionValue)) {
170
+ resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : (resolvedValue = 0);
171
+ resolvedValue += resolvedOptionValue;
172
+ }
173
+ }
174
+ return resolvedValue;
175
+ }
176
+ default:
177
+ throw new Error(`Unsupported task item type: ${taskItemDefinition.type}`);
178
+ }
179
+ };
180
+ exports.resolveTaskItemValue = resolveTaskItemValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openframe-org/criteria-set-protocol",
3
- "version": "2.8.0-alpha.0",
3
+ "version": "2.9.0",
4
4
  "description": "A protocol and tools for defining and working with criteria sets",
5
5
  "private": false,
6
6
  "author": "Andrés Angulo <aa@openframe.org>",