@case-framework/survey-core 0.1.0 → 0.2.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.
- package/README.md +181 -0
- package/build/editor.d.mts +169 -5
- package/build/editor.d.mts.map +1 -1
- package/build/editor.mjs +429 -8
- package/build/editor.mjs.map +1 -1
- package/build/index.d.mts +189 -6
- package/build/index.d.mts.map +1 -1
- package/build/index.mjs +361 -2
- package/build/index.mjs.map +1 -1
- package/build/{package.json/package.json → package.json} +1 -1
- package/build/{survey-TUPUXiXl.d.mts → survey-D3sMutUV.d.mts} +63 -3
- package/build/{survey-TUPUXiXl.d.mts.map → survey-D3sMutUV.d.mts.map} +1 -1
- package/build/{survey-C3ZHI-5z.mjs → survey-DQmpzihl.mjs} +249 -183
- package/build/survey-DQmpzihl.mjs.map +1 -0
- package/package.json +1 -1
- package/build/survey-C3ZHI-5z.mjs.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# @case-framework/survey-core
|
|
2
|
+
|
|
3
|
+
Headless TypeScript core for defining, editing, running, and exporting surveys in the CASE ecosystem.
|
|
4
|
+
|
|
5
|
+
## Intention
|
|
6
|
+
|
|
7
|
+
`@case-framework/survey-core` is the domain/runtime layer behind CASE surveys. It is designed to:
|
|
8
|
+
|
|
9
|
+
- Provide a framework-agnostic survey model.
|
|
10
|
+
- Support custom item types through a plugin registry.
|
|
11
|
+
- Evaluate display logic, validations, and template expressions at runtime.
|
|
12
|
+
- Produce normalized responses and export-ready data (including CSV).
|
|
13
|
+
|
|
14
|
+
## Scope
|
|
15
|
+
|
|
16
|
+
This package includes:
|
|
17
|
+
|
|
18
|
+
- Survey model and serialization (`Survey`).
|
|
19
|
+
- Item contracts and registry utilities (`SurveyItemCore`, `createItemCore`, `createFullRegistry`).
|
|
20
|
+
- Runtime engine (`SurveyEngineCore`) for render order, conditions, template values, events, and responses.
|
|
21
|
+
- Expression model + evaluator (`Expression`, `FunctionExpression`, `ExpressionEvaluator`, etc.).
|
|
22
|
+
- Response models (`SurveyResponse`, `SurveyItemResponse`, `ResponseItem`).
|
|
23
|
+
- Response export tooling (`SurveyResponseExporter`, CSV helpers, codebook generation).
|
|
24
|
+
- Editor state/manipulation APIs via the `@case-framework/survey-core/editor` entrypoint.
|
|
25
|
+
|
|
26
|
+
This package does not include:
|
|
27
|
+
|
|
28
|
+
- UI rendering components.
|
|
29
|
+
- Network or persistence layers.
|
|
30
|
+
- App-level state management.
|
|
31
|
+
|
|
32
|
+
For UI integration, use `@case-framework/survey-ui` on top of this core package.
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add @case-framework/survey-core
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Entrypoints
|
|
41
|
+
|
|
42
|
+
- `@case-framework/survey-core`: runtime/model/expressions/exporter APIs.
|
|
43
|
+
- `@case-framework/survey-core/editor`: editing APIs (`SurveyEditor`, undo/redo, copy/paste helpers).
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### 1. Define a custom item type and registry
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import {
|
|
51
|
+
SurveyItemCore,
|
|
52
|
+
ValueRefTypeLookup,
|
|
53
|
+
ValueType,
|
|
54
|
+
ItemTypeRegistry,
|
|
55
|
+
} from '@case-framework/survey-core';
|
|
56
|
+
|
|
57
|
+
type SingleChoiceConfig = {
|
|
58
|
+
id: string;
|
|
59
|
+
options: Array<{ id: string; key: string; type: string }>;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
class SingleChoiceQuestionItemCore extends SurveyItemCore<'singleChoiceQuestion', SingleChoiceConfig> {
|
|
63
|
+
readonly type = 'singleChoiceQuestion';
|
|
64
|
+
|
|
65
|
+
parseConfig(rawConfig: unknown): SingleChoiceConfig {
|
|
66
|
+
const cfg = (rawConfig ?? {}) as Partial<SingleChoiceConfig>;
|
|
67
|
+
return {
|
|
68
|
+
id: cfg.id ?? this.id,
|
|
69
|
+
options: cfg.options ?? [],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
isInteractive(): boolean {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
getAvailableResponseValueSlots(): ValueRefTypeLookup {
|
|
78
|
+
return {
|
|
79
|
+
[`${this.id}...get...${this.config.id}`]: ValueType.reference,
|
|
80
|
+
[`${this.id}...isDefined...${this.config.id}`]: ValueType.boolean,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const pluginRegistry: ItemTypeRegistry = {
|
|
86
|
+
singleChoiceQuestion: SingleChoiceQuestionItemCore,
|
|
87
|
+
};
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 2. Load a survey and run it with the engine
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
import {
|
|
94
|
+
Survey,
|
|
95
|
+
SurveyEngineCore,
|
|
96
|
+
ResponseItem,
|
|
97
|
+
ValueType,
|
|
98
|
+
ReservedSurveyItemTypes,
|
|
99
|
+
} from '@case-framework/survey-core';
|
|
100
|
+
|
|
101
|
+
const survey = Survey.fromJson(
|
|
102
|
+
{
|
|
103
|
+
$schema:
|
|
104
|
+
'https://github.com/case-framework/case-survey-toolkit/packages/survey-core/schemas/survey-schema.json',
|
|
105
|
+
surveyItems: [
|
|
106
|
+
{
|
|
107
|
+
id: 'root',
|
|
108
|
+
key: 'root',
|
|
109
|
+
itemType: ReservedSurveyItemTypes.Group,
|
|
110
|
+
config: { isRoot: true, items: ['q1'] },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'q1',
|
|
114
|
+
key: 'q1',
|
|
115
|
+
itemType: 'singleChoiceQuestion',
|
|
116
|
+
config: {
|
|
117
|
+
id: 'q1',
|
|
118
|
+
options: [
|
|
119
|
+
{ id: 'yes', key: 'yes', type: 'option' },
|
|
120
|
+
{ id: 'no', key: 'no', type: 'option' },
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
pluginRegistry
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const engine = new SurveyEngineCore(survey, { locale: 'en' });
|
|
130
|
+
|
|
131
|
+
// Set one item response (slot id == config.id in this example).
|
|
132
|
+
engine.setResponse(
|
|
133
|
+
'q1',
|
|
134
|
+
new ResponseItem([['q1', { type: ValueType.reference, value: 'yes' }]])
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
const pages = engine.getSurveyPages('large');
|
|
138
|
+
const responses = engine.getResponses();
|
|
139
|
+
const events = engine.getEvents();
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 3. Export responses to CSV
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import {
|
|
146
|
+
SurveyResponse,
|
|
147
|
+
SurveyResponseExporter,
|
|
148
|
+
} from '@case-framework/survey-core';
|
|
149
|
+
|
|
150
|
+
const response = new SurveyResponse('response-1', 'v1');
|
|
151
|
+
response.responses = new Map(responses.map((r) => [r.itemId, r]));
|
|
152
|
+
response.submittedAt = Math.floor(Date.now() / 1000);
|
|
153
|
+
|
|
154
|
+
const exporter = new SurveyResponseExporter([
|
|
155
|
+
{
|
|
156
|
+
versionId: 'v1',
|
|
157
|
+
surveyKey: survey.surveyKey ?? 'survey',
|
|
158
|
+
survey,
|
|
159
|
+
},
|
|
160
|
+
]);
|
|
161
|
+
|
|
162
|
+
const csv = exporter.exportResponsesToCsv([response]);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 4. Edit surveys with the editor entrypoint
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
import { SurveyEditor, CommitSource } from '@case-framework/survey-core/editor';
|
|
169
|
+
|
|
170
|
+
const editor = new SurveyEditor(survey, { pluginRegistry });
|
|
171
|
+
|
|
172
|
+
const newItem = survey.createItemFromRaw({
|
|
173
|
+
id: 'q2',
|
|
174
|
+
key: 'q2',
|
|
175
|
+
itemType: 'singleChoiceQuestion',
|
|
176
|
+
config: { id: 'q2', options: [] },
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
editor.addItem({ parentId: survey.rootItem!.id }, newItem);
|
|
180
|
+
editor.commit({ label: 'Add q2', source: CommitSource.USER });
|
|
181
|
+
```
|
package/build/editor.d.mts
CHANGED
|
@@ -1,5 +1,83 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as SurveyCardContent, L as RawSurveyItem, S as NavigationContent, T as SurveyItemTranslations, W as TemplateValueDefinition, b as JsonComponentContent, j as Content, p as ItemTypeRegistry, t as Survey, y as RawSurvey, z as SurveyItemCore } from "./survey-D3sMutUV.mjs";
|
|
2
2
|
|
|
3
|
+
//#region src/editor/ai-context.d.ts
|
|
4
|
+
type SurveyAIContextScope = "tiny" | "focused" | "full";
|
|
5
|
+
type SurveyAIContextPurpose = "generic" | "key-suggestion" | "label-suggestion" | "item-generation" | "translation" | "condition-management";
|
|
6
|
+
interface SurveyAIOutlineNode {
|
|
7
|
+
itemId: string;
|
|
8
|
+
parentId?: string;
|
|
9
|
+
depth: number;
|
|
10
|
+
itemType: string;
|
|
11
|
+
key: string;
|
|
12
|
+
fullKey: string;
|
|
13
|
+
itemLabel?: string;
|
|
14
|
+
childCount: number;
|
|
15
|
+
}
|
|
16
|
+
interface SurveyAIFocus {
|
|
17
|
+
focusItemId: string;
|
|
18
|
+
parentItemId?: string;
|
|
19
|
+
pathItemIds: string[];
|
|
20
|
+
siblingItemIds: string[];
|
|
21
|
+
childItemIds: string[];
|
|
22
|
+
}
|
|
23
|
+
interface SurveyAITranslationSnippet {
|
|
24
|
+
locale: string;
|
|
25
|
+
contentKey: string;
|
|
26
|
+
text: string;
|
|
27
|
+
}
|
|
28
|
+
interface SurveyAIItemContextNode {
|
|
29
|
+
itemId: string;
|
|
30
|
+
itemType: string;
|
|
31
|
+
itemKey: string;
|
|
32
|
+
fullKey: string;
|
|
33
|
+
itemLabel?: string;
|
|
34
|
+
siblingKeys: string[];
|
|
35
|
+
translations: SurveyAITranslationSnippet[];
|
|
36
|
+
descendants: SurveyAIItemContextNode[];
|
|
37
|
+
}
|
|
38
|
+
interface SurveyAIKeyIndexEntry {
|
|
39
|
+
itemId: string;
|
|
40
|
+
itemType: string;
|
|
41
|
+
key: string;
|
|
42
|
+
fullKey: string;
|
|
43
|
+
itemLabel?: string;
|
|
44
|
+
path: string[];
|
|
45
|
+
}
|
|
46
|
+
interface SurveyAIContextIndexes {
|
|
47
|
+
keyIndex: SurveyAIKeyIndexEntry[];
|
|
48
|
+
responseSlots?: string[];
|
|
49
|
+
}
|
|
50
|
+
interface SurveyAIContextPack {
|
|
51
|
+
purpose: SurveyAIContextPurpose;
|
|
52
|
+
scope: SurveyAIContextScope;
|
|
53
|
+
surveyKey?: string;
|
|
54
|
+
locales: string[];
|
|
55
|
+
itemCount: number;
|
|
56
|
+
outline: SurveyAIOutlineNode[];
|
|
57
|
+
focus?: SurveyAIFocus;
|
|
58
|
+
focusItem?: SurveyAIItemContextNode;
|
|
59
|
+
indexes?: SurveyAIContextIndexes;
|
|
60
|
+
flags: {
|
|
61
|
+
outlineTruncated: boolean;
|
|
62
|
+
rawSurveyIncluded: boolean;
|
|
63
|
+
focusItemTreeTruncated: boolean;
|
|
64
|
+
};
|
|
65
|
+
rawSurvey?: RawSurvey;
|
|
66
|
+
}
|
|
67
|
+
interface BuildSurveyAIContextPackOptions {
|
|
68
|
+
purpose?: SurveyAIContextPurpose;
|
|
69
|
+
scope?: SurveyAIContextScope;
|
|
70
|
+
focusItemId?: string;
|
|
71
|
+
includeRawSurvey?: boolean;
|
|
72
|
+
outlineLimit?: number;
|
|
73
|
+
includeIndexes?: boolean;
|
|
74
|
+
includeFocusItemTree?: boolean;
|
|
75
|
+
focusItemTreeLimit?: number;
|
|
76
|
+
translationSnippetsPerItemLimit?: number;
|
|
77
|
+
translationSnippetTextLimit?: number;
|
|
78
|
+
}
|
|
79
|
+
declare function buildSurveyAIContextPack(survey: Survey, options?: BuildSurveyAIContextPackOptions): SurveyAIContextPack;
|
|
80
|
+
//#endregion
|
|
3
81
|
//#region src/editor/types.d.ts
|
|
4
82
|
interface Target {
|
|
5
83
|
parentId: string;
|
|
@@ -189,6 +267,7 @@ declare class SurveyEditor {
|
|
|
189
267
|
private _hasUncommittedChanges;
|
|
190
268
|
private _pluginRegistry?;
|
|
191
269
|
constructor(survey: Survey, config?: SurveyEditorConfig, meta?: CommitMeta);
|
|
270
|
+
/** Returns an immutable copy of the current survey state. */
|
|
192
271
|
get survey(): Survey;
|
|
193
272
|
get hasUncommittedChanges(): boolean;
|
|
194
273
|
get undoRedo(): SurveyEditorUndoRedo;
|
|
@@ -225,21 +304,106 @@ declare class SurveyEditor {
|
|
|
225
304
|
addItem(target: Target, item: SurveyItemCore, content?: SurveyItemTranslations): void;
|
|
226
305
|
removeItem(itemId: string, nested?: boolean): boolean;
|
|
227
306
|
moveItem(itemId: string, newTarget: Target): boolean;
|
|
307
|
+
/**
|
|
308
|
+
* Get a deep copy of an item's raw data.
|
|
309
|
+
* The returned object is independent of the survey—mutating it will not affect the survey.
|
|
310
|
+
* Use this when you need to edit an item in a form or pass it to updateItem after modifications.
|
|
311
|
+
*
|
|
312
|
+
* @param itemId - The ID of the item to copy
|
|
313
|
+
* @returns A deep copy of the item's RawSurveyItem data
|
|
314
|
+
* @throws Error if the item is not found
|
|
315
|
+
*/
|
|
316
|
+
getItemDataCopy(itemId: string): RawSurveyItem;
|
|
317
|
+
/**
|
|
318
|
+
* Update an item's data in the survey.
|
|
319
|
+
* Can update common attributes (displayConditions, disabledConditions, validations, etc.)
|
|
320
|
+
* as well as type-specific config.
|
|
321
|
+
*
|
|
322
|
+
* Use getItemDataCopy to obtain an editable copy, modify it, then pass it here.
|
|
323
|
+
* Alternatively, pass a Partial to merge specific fields (top-level keys only;
|
|
324
|
+
* e.g. config replaces the entire config object).
|
|
325
|
+
*
|
|
326
|
+
* @param itemId - The ID of the item to update (must match data.id if provided)
|
|
327
|
+
* @param rawItemData - Full RawSurveyItem or Partial to merge. The id cannot be changed.
|
|
328
|
+
*/
|
|
329
|
+
updateItem(itemId: string, rawItemData: RawSurveyItem | Partial<RawSurveyItem>): void;
|
|
228
330
|
updateItemTranslations(itemId: string, updatedContent?: SurveyItemTranslations): boolean;
|
|
331
|
+
/**
|
|
332
|
+
* Update survey-level translations that are not tied to specific items.
|
|
333
|
+
* Use these for survey card, navigation, validation messages, etc.
|
|
334
|
+
*/
|
|
335
|
+
updateSurveyTranslations(updates: {
|
|
336
|
+
surveyCard?: {
|
|
337
|
+
locale: string;
|
|
338
|
+
content?: SurveyCardContent;
|
|
339
|
+
};
|
|
340
|
+
navigation?: {
|
|
341
|
+
locale: string;
|
|
342
|
+
content?: NavigationContent;
|
|
343
|
+
};
|
|
344
|
+
validationMessages?: {
|
|
345
|
+
locale: string;
|
|
346
|
+
content?: {
|
|
347
|
+
invalidResponse?: Content;
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
}): void;
|
|
351
|
+
/**
|
|
352
|
+
* Get maxItemsPerPage immutably (returns a copy).
|
|
353
|
+
*/
|
|
354
|
+
getMaxItemsPerPage(): {
|
|
355
|
+
large: number;
|
|
356
|
+
small: number;
|
|
357
|
+
} | undefined;
|
|
358
|
+
/**
|
|
359
|
+
* Update maxItemsPerPage.
|
|
360
|
+
*/
|
|
361
|
+
updateMaxItemsPerPage(value: {
|
|
362
|
+
large: number;
|
|
363
|
+
small: number;
|
|
364
|
+
} | undefined): void;
|
|
365
|
+
/**
|
|
366
|
+
* Get metadata immutably (returns a copy).
|
|
367
|
+
*/
|
|
368
|
+
getMetadata(): {
|
|
369
|
+
[key: string]: string;
|
|
370
|
+
} | undefined;
|
|
371
|
+
/**
|
|
372
|
+
* Update metadata.
|
|
373
|
+
*/
|
|
374
|
+
updateMetadata(metadata: {
|
|
375
|
+
[key: string]: string;
|
|
376
|
+
} | undefined): void;
|
|
377
|
+
/**
|
|
378
|
+
* Get a template value immutably (returns a deep copy).
|
|
379
|
+
*/
|
|
380
|
+
getTemplateValue(key: string): TemplateValueDefinition | undefined;
|
|
381
|
+
/**
|
|
382
|
+
* Get all template values immutably (returns a new Map with deep-copied values).
|
|
383
|
+
*/
|
|
384
|
+
getTemplateValues(): Map<string, TemplateValueDefinition>;
|
|
385
|
+
/**
|
|
386
|
+
* Add or replace a template value.
|
|
387
|
+
*/
|
|
388
|
+
setTemplateValue(key: string, templateValue: TemplateValueDefinition): void;
|
|
389
|
+
/**
|
|
390
|
+
* Remove a template value.
|
|
391
|
+
*/
|
|
392
|
+
removeTemplateValue(key: string): void;
|
|
229
393
|
/**
|
|
230
394
|
* Copy a survey item and all its data to clipboard format
|
|
231
|
-
* @param
|
|
395
|
+
* @param itemId - The ID of the item to copy
|
|
232
396
|
* @returns Clipboard data that can be serialized to JSON for clipboard
|
|
233
397
|
*/
|
|
234
|
-
copyItem(
|
|
398
|
+
copyItem(itemId: string): SurveyItemClipboardData;
|
|
235
399
|
/**
|
|
236
400
|
* Paste a survey item from clipboard data to a target location
|
|
237
401
|
* @param clipboardData - The clipboard data containing the item to paste
|
|
238
402
|
* @param target - Target location where to paste the item
|
|
239
|
-
* @returns The
|
|
403
|
+
* @returns The ID of the pasted item
|
|
240
404
|
*/
|
|
241
405
|
pasteItem(clipboardData: SurveyItemClipboardData, target: Target): string;
|
|
242
406
|
}
|
|
243
407
|
//#endregion
|
|
244
|
-
export { CommitMeta, CommitSource, ItemCopyPaste, SerializedSurveyEditor, SerializedTranslations, SurveyEditor, SurveyEditorConfig, SurveyEditorUndoRedo, SurveyItemClipboardData, Target, UndoRedoConfig };
|
|
408
|
+
export { BuildSurveyAIContextPackOptions, CommitMeta, CommitSource, ItemCopyPaste, SerializedSurveyEditor, SerializedTranslations, SurveyAIContextIndexes, SurveyAIContextPack, SurveyAIContextPurpose, SurveyAIContextScope, SurveyAIFocus, SurveyAIItemContextNode, SurveyAIKeyIndexEntry, SurveyAIOutlineNode, SurveyAITranslationSnippet, SurveyEditor, SurveyEditorConfig, SurveyEditorUndoRedo, SurveyItemClipboardData, Target, UndoRedoConfig, buildSurveyAIContextPack };
|
|
245
409
|
//# sourceMappingURL=editor.d.mts.map
|
package/build/editor.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.mts","names":[],"sources":["../src/editor/types.ts","../src/editor/item-copy-paste.ts","../src/editor/undo-redo.ts","../src/editor/survey-editor.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"editor.d.mts","names":[],"sources":["../src/editor/ai-context.ts","../src/editor/types.ts","../src/editor/item-copy-paste.ts","../src/editor/undo-redo.ts","../src/editor/survey-editor.ts"],"mappings":"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"}
|