@numerum-tech/yeriasdk 1.0.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 +864 -0
- package/dist/core/action-grid-view.d.ts +57 -0
- package/dist/core/action-grid-view.d.ts.map +1 -0
- package/dist/core/action-grid-view.js +112 -0
- package/dist/core/action-grid-view.js.map +1 -0
- package/dist/core/action-list-view.d.ts +39 -0
- package/dist/core/action-list-view.d.ts.map +1 -0
- package/dist/core/action-list-view.js +77 -0
- package/dist/core/action-list-view.js.map +1 -0
- package/dist/core/base/base-action-view.d.ts +82 -0
- package/dist/core/base/base-action-view.d.ts.map +1 -0
- package/dist/core/base/base-action-view.js +143 -0
- package/dist/core/base/base-action-view.js.map +1 -0
- package/dist/core/base-view.d.ts +105 -0
- package/dist/core/base-view.d.ts.map +1 -0
- package/dist/core/base-view.js +426 -0
- package/dist/core/base-view.js.map +1 -0
- package/dist/core/card-view.d.ts +24 -0
- package/dist/core/card-view.d.ts.map +1 -0
- package/dist/core/card-view.js +127 -0
- package/dist/core/card-view.js.map +1 -0
- package/dist/core/carousel-view.d.ts +22 -0
- package/dist/core/carousel-view.d.ts.map +1 -0
- package/dist/core/carousel-view.js +99 -0
- package/dist/core/carousel-view.js.map +1 -0
- package/dist/core/form-view.d.ts +165 -0
- package/dist/core/form-view.d.ts.map +1 -0
- package/dist/core/form-view.js +365 -0
- package/dist/core/form-view.js.map +1 -0
- package/dist/core/jsonapp.d.ts +263 -0
- package/dist/core/jsonapp.d.ts.map +1 -0
- package/dist/core/jsonapp.js +528 -0
- package/dist/core/jsonapp.js.map +1 -0
- package/dist/core/key-store.d.ts +51 -0
- package/dist/core/key-store.d.ts.map +1 -0
- package/dist/core/key-store.js +138 -0
- package/dist/core/key-store.js.map +1 -0
- package/dist/core/map-view.d.ts +45 -0
- package/dist/core/map-view.d.ts.map +1 -0
- package/dist/core/map-view.js +318 -0
- package/dist/core/map-view.js.map +1 -0
- package/dist/core/media-view.d.ts +20 -0
- package/dist/core/media-view.d.ts.map +1 -0
- package/dist/core/media-view.js +75 -0
- package/dist/core/media-view.js.map +1 -0
- package/dist/core/message-view.d.ts +53 -0
- package/dist/core/message-view.d.ts.map +1 -0
- package/dist/core/message-view.js +109 -0
- package/dist/core/message-view.js.map +1 -0
- package/dist/core/notification.d.ts +17 -0
- package/dist/core/notification.d.ts.map +1 -0
- package/dist/core/notification.js +33 -0
- package/dist/core/notification.js.map +1 -0
- package/dist/core/qr-display-view.d.ts +32 -0
- package/dist/core/qr-display-view.d.ts.map +1 -0
- package/dist/core/qr-display-view.js +66 -0
- package/dist/core/qr-display-view.js.map +1 -0
- package/dist/core/qr-scan-view.d.ts +148 -0
- package/dist/core/qr-scan-view.d.ts.map +1 -0
- package/dist/core/qr-scan-view.js +259 -0
- package/dist/core/qr-scan-view.js.map +1 -0
- package/dist/core/reader-view.d.ts +73 -0
- package/dist/core/reader-view.d.ts.map +1 -0
- package/dist/core/reader-view.js +285 -0
- package/dist/core/reader-view.js.map +1 -0
- package/dist/core/timeline-view.d.ts +16 -0
- package/dist/core/timeline-view.d.ts.map +1 -0
- package/dist/core/timeline-view.js +68 -0
- package/dist/core/timeline-view.js.map +1 -0
- package/dist/errors/index.d.ts +276 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +431 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +576 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +48 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fileFormats.d.ts +52 -0
- package/dist/utils/fileFormats.d.ts.map +1 -0
- package/dist/utils/fileFormats.js +198 -0
- package/dist/utils/fileFormats.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +109 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validators.d.ts +48 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +445 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QRScanView = void 0;
|
|
4
|
+
const base_view_1 = require("./base-view");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
/**
|
|
7
|
+
* QRScanView - A view for scanning QR codes
|
|
8
|
+
*
|
|
9
|
+
* **Design Principles:**
|
|
10
|
+
* - Mobile app handles ALL scanner implementation (camera, torch, focus, formats, UI)
|
|
11
|
+
* - View only describes what to scan and where to submit
|
|
12
|
+
* - Convention: Field name is ALWAYS "qrData" (not configurable)
|
|
13
|
+
* - Auto-submit by default: scan → immediately POST { qrData: "ABC123" }
|
|
14
|
+
* - Submit button disables auto-submit for manual confirmation workflows
|
|
15
|
+
*
|
|
16
|
+
* **Submission Convention:**
|
|
17
|
+
* - Auto-submit: POST {service.baseUrl}/{viewId} with { qrData: "scanned-value" }
|
|
18
|
+
* - With button: User scans, previews, clicks button to submit
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Simple: Auto-submit after scan
|
|
22
|
+
* const view = new QRScanView('scan-ticket', 'Scan Your Ticket')
|
|
23
|
+
* .setIntro('Point camera at the QR code on your ticket');
|
|
24
|
+
* // → Scans, immediately POSTs { qrData: "ABC123" } to {baseUrl}/scan-ticket
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Manual confirmation workflow
|
|
28
|
+
* const view = new QRScanView('verify-product', 'Verify Product')
|
|
29
|
+
* .setIntro('Scan the product barcode')
|
|
30
|
+
* .enablePreview(true, 'Product Code')
|
|
31
|
+
* .submitButton('Verify Product');
|
|
32
|
+
* // → Scans, shows preview, user clicks "Verify Product" to submit
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // With validation
|
|
36
|
+
* const view = new QRScanView('scan-invoice', 'Scan Invoice')
|
|
37
|
+
* .setIntro('Scan the invoice QR code')
|
|
38
|
+
* .setValidation(/^INV-\d{6}$/, 'Invalid invoice format')
|
|
39
|
+
* .submitButton('Process Invoice');
|
|
40
|
+
* // → Scans, validates pattern, shows preview, submits on button click
|
|
41
|
+
*/
|
|
42
|
+
class QRScanView extends base_view_1.BaseView {
|
|
43
|
+
constructor(viewId, title, processId) {
|
|
44
|
+
super({
|
|
45
|
+
id: viewId,
|
|
46
|
+
type: 'QRScan',
|
|
47
|
+
processId,
|
|
48
|
+
metadata: {
|
|
49
|
+
version: '2.0.0',
|
|
50
|
+
createdAt: new Date()
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
this.content = {
|
|
54
|
+
title,
|
|
55
|
+
intro: '',
|
|
56
|
+
autoSubmit: true // Auto-submit by default
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sets instructional text shown to the user
|
|
61
|
+
*
|
|
62
|
+
* @param intro - Instructions like "Point your camera at the QR code"
|
|
63
|
+
* @returns this for chaining
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* view.setIntro('Scan the code on your membership card');
|
|
67
|
+
*/
|
|
68
|
+
setIntro(intro) {
|
|
69
|
+
return this.setIntroText('intro', intro);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Configures a submit button for manual confirmation
|
|
73
|
+
* **IMPORTANT**: Automatically disables auto-submit when button is added
|
|
74
|
+
* **Note**: QRScan submissions are always POST (convention-based security)
|
|
75
|
+
*
|
|
76
|
+
* @param text - Button text like "Confirm", "Process", "Submit"
|
|
77
|
+
* @param confirmMessage - Optional confirmation dialog
|
|
78
|
+
* @returns this for chaining
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* view.submitButton('Verify Code');
|
|
82
|
+
* // User must click button after scanning
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* view.submitButton('Process', 'Are you sure?');
|
|
86
|
+
*/
|
|
87
|
+
submitButton(text, confirmMessage) {
|
|
88
|
+
if (!text || text.trim().length === 0) {
|
|
89
|
+
throw new errors_1.InvalidParameterError('text', text, 'Button text cannot be empty');
|
|
90
|
+
}
|
|
91
|
+
this.content.submit = {
|
|
92
|
+
text: text.trim(),
|
|
93
|
+
method: 'POST',
|
|
94
|
+
confirmMessage
|
|
95
|
+
};
|
|
96
|
+
// Disable auto-submit when button is present
|
|
97
|
+
this.content.autoSubmit = false;
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Sets simple validation rules for scanned data
|
|
102
|
+
* **IMPORTANT**: Mobile app validates client-side for UX, but server MUST re-validate for security
|
|
103
|
+
*
|
|
104
|
+
* @param errorMessage - Error message shown on validation failure
|
|
105
|
+
* @param format - Data format: 'text' (any), 'number' (digits only), 'url' (http/https), 'email' (has @ and .)
|
|
106
|
+
* @param minLength - Minimum length (includes prefix if startsWith is set)
|
|
107
|
+
* @param maxLength - Maximum length (includes prefix if startsWith is set)
|
|
108
|
+
* @param startsWith - Required prefix (exempt from format validation)
|
|
109
|
+
* @returns this for chaining
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* // Numeric code with exact length
|
|
113
|
+
* view.setValidation('Code must be 6 digits', 'number', 6, 6);
|
|
114
|
+
* // Accepts: "123456", "000001"
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* // Prefix + format + length range
|
|
118
|
+
* view.setValidation('Invalid invoice', 'number', 10, 15, 'INV-');
|
|
119
|
+
* // Accepts: "INV-123456" (10-15 chars total, digits after INV-)
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* // Email format
|
|
123
|
+
* view.setValidation('Invalid email format', 'email');
|
|
124
|
+
* // Accepts: "user@example.com" (simple check: has @ and .)
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // URL format
|
|
128
|
+
* view.setValidation('Invalid URL', 'url');
|
|
129
|
+
* // Accepts: "https://example.com" (starts with http:// or https://)
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* // Just prefix, any content after
|
|
133
|
+
* view.setValidation('Must start with TICKET-', undefined, undefined, undefined, 'TICKET-');
|
|
134
|
+
* // Accepts: "TICKET-ABC123", "TICKET-XYZ"
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* // Length range without format
|
|
138
|
+
* view.setValidation('Code must be 8-20 characters', undefined, 8, 20);
|
|
139
|
+
*/
|
|
140
|
+
setValidation(errorMessage, format, minLength, maxLength, startsWith) {
|
|
141
|
+
if (!errorMessage || errorMessage.trim().length === 0) {
|
|
142
|
+
throw new errors_1.InvalidParameterError('errorMessage', errorMessage, 'Error message is required for validation');
|
|
143
|
+
}
|
|
144
|
+
const validation = {
|
|
145
|
+
errorMessage: errorMessage.trim()
|
|
146
|
+
};
|
|
147
|
+
// Validate and set format
|
|
148
|
+
if (format !== undefined) {
|
|
149
|
+
const validFormats = ['text', 'number', 'url', 'email'];
|
|
150
|
+
if (!validFormats.includes(format)) {
|
|
151
|
+
throw new errors_1.InvalidParameterError('format', format, `Format must be one of: ${validFormats.join(', ')}`);
|
|
152
|
+
}
|
|
153
|
+
validation.format = format;
|
|
154
|
+
}
|
|
155
|
+
// Validate and set startsWith prefix
|
|
156
|
+
if (startsWith !== undefined && startsWith !== null) {
|
|
157
|
+
const trimmed = startsWith.trim();
|
|
158
|
+
if (trimmed.length === 0) {
|
|
159
|
+
throw new errors_1.InvalidParameterError('startsWith', startsWith, 'startsWith cannot be empty');
|
|
160
|
+
}
|
|
161
|
+
validation.startsWith = trimmed;
|
|
162
|
+
}
|
|
163
|
+
// Validate and set minLength
|
|
164
|
+
if (minLength !== undefined) {
|
|
165
|
+
if (minLength < 0) {
|
|
166
|
+
throw new errors_1.InvalidParameterError('minLength', minLength, 'minLength must be >= 0');
|
|
167
|
+
}
|
|
168
|
+
validation.minLength = minLength;
|
|
169
|
+
}
|
|
170
|
+
// Validate and set maxLength
|
|
171
|
+
if (maxLength !== undefined) {
|
|
172
|
+
if (maxLength < 1) {
|
|
173
|
+
throw new errors_1.InvalidParameterError('maxLength', maxLength, 'maxLength must be >= 1');
|
|
174
|
+
}
|
|
175
|
+
if (minLength !== undefined && maxLength < minLength) {
|
|
176
|
+
throw new errors_1.InvalidParameterError('maxLength', maxLength, 'maxLength must be >= minLength');
|
|
177
|
+
}
|
|
178
|
+
validation.maxLength = maxLength;
|
|
179
|
+
}
|
|
180
|
+
this.content.validation = validation;
|
|
181
|
+
return this;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Enables preview mode where scanned value is shown before submission
|
|
185
|
+
* **Note**: Requires submit button to be set
|
|
186
|
+
*
|
|
187
|
+
* @param editable - Allow user to manually edit the scanned value
|
|
188
|
+
* @param label - Field label in preview (default: "Scanned Code")
|
|
189
|
+
* @returns this for chaining
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* view.enablePreview(true, 'Barcode')
|
|
193
|
+
* .submitButton('Confirm');
|
|
194
|
+
*/
|
|
195
|
+
enablePreview(editable = false, label) {
|
|
196
|
+
this.content.preview = {
|
|
197
|
+
enabled: true,
|
|
198
|
+
editable,
|
|
199
|
+
label: label?.trim() || 'Scanned Code'
|
|
200
|
+
};
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Disables preview mode
|
|
205
|
+
* @returns this for chaining
|
|
206
|
+
*/
|
|
207
|
+
disablePreview() {
|
|
208
|
+
this.content.preview = undefined;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Explicitly enables or disables auto-submit
|
|
213
|
+
* **Note**: Auto-submit is automatically disabled when submitButton() is called
|
|
214
|
+
*
|
|
215
|
+
* @param enabled - Enable auto-submit (default: true)
|
|
216
|
+
* @returns this for chaining
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* // Explicit auto-submit
|
|
220
|
+
* view.setAutoSubmit(true); // Scan → immediate POST
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* // Disable auto-submit without button (rare case)
|
|
224
|
+
* view.setAutoSubmit(false);
|
|
225
|
+
*/
|
|
226
|
+
setAutoSubmit(enabled = true) {
|
|
227
|
+
this.content.autoSubmit = enabled;
|
|
228
|
+
return this;
|
|
229
|
+
}
|
|
230
|
+
// ============================================
|
|
231
|
+
// Getters
|
|
232
|
+
// ============================================
|
|
233
|
+
/**
|
|
234
|
+
* Validates the view configuration before serving
|
|
235
|
+
* @internal
|
|
236
|
+
*/
|
|
237
|
+
validate() {
|
|
238
|
+
const baseResult = super.validate();
|
|
239
|
+
const content = this.content;
|
|
240
|
+
const errors = [...baseResult.errors];
|
|
241
|
+
// Preview requires submit button
|
|
242
|
+
if (content.preview?.enabled && !content.submit) {
|
|
243
|
+
errors.push({ message: 'Preview mode requires a submit button' });
|
|
244
|
+
}
|
|
245
|
+
// If preview is editable, submit button is required
|
|
246
|
+
if (content.preview?.editable && !content.submit) {
|
|
247
|
+
errors.push({ message: 'Editable preview requires a submit button' });
|
|
248
|
+
}
|
|
249
|
+
// Validation without submit button is allowed (auto-submit with validation)
|
|
250
|
+
// But it's recommended to have a button for better UX
|
|
251
|
+
return {
|
|
252
|
+
isValid: errors.length === 0,
|
|
253
|
+
errors,
|
|
254
|
+
warnings: baseResult.warnings
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
exports.QRScanView = QRScanView;
|
|
259
|
+
//# sourceMappingURL=qr-scan-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-scan-view.js","sourceRoot":"","sources":["../../src/core/qr-scan-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { BaseView } from './base-view';
|
|
2
|
+
import { ReaderElement } from '../types';
|
|
3
|
+
export interface ReaderContent {
|
|
4
|
+
title: string;
|
|
5
|
+
intro: string;
|
|
6
|
+
elements: ReaderElement[];
|
|
7
|
+
}
|
|
8
|
+
export declare class ReaderView extends BaseView {
|
|
9
|
+
constructor(viewId: string, title: string, processId?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Définit l'introduction
|
|
12
|
+
*/
|
|
13
|
+
setIntro(intro: string): this;
|
|
14
|
+
/**
|
|
15
|
+
* Ajoute un paragraphe
|
|
16
|
+
*/
|
|
17
|
+
addParagraph(text: string): this;
|
|
18
|
+
/**
|
|
19
|
+
* Ajoute une image
|
|
20
|
+
*/
|
|
21
|
+
addImage(url: string, alt?: string, caption?: string): this;
|
|
22
|
+
/**
|
|
23
|
+
* Ajoute un sous-titre
|
|
24
|
+
*/
|
|
25
|
+
addSubTitle(text: string): this;
|
|
26
|
+
/**
|
|
27
|
+
* Ajoute du contenu Markdown
|
|
28
|
+
*/
|
|
29
|
+
addMarkdown(markdownText: string, options?: {
|
|
30
|
+
sanitize?: boolean;
|
|
31
|
+
}): this;
|
|
32
|
+
/**
|
|
33
|
+
* Ajoute une liste
|
|
34
|
+
*/
|
|
35
|
+
addListField(items: string[], ordered?: boolean): this;
|
|
36
|
+
/**
|
|
37
|
+
* Ajoute un lien
|
|
38
|
+
*/
|
|
39
|
+
addLink(url: string, text: string, description?: string): this;
|
|
40
|
+
/**
|
|
41
|
+
* Ajoute un tableau
|
|
42
|
+
*/
|
|
43
|
+
addTable(headers: string[], rows: string[][]): this;
|
|
44
|
+
/**
|
|
45
|
+
* Ajoute un bloc de code
|
|
46
|
+
*/
|
|
47
|
+
addCodeBlock(code: string, language?: string): this;
|
|
48
|
+
/**
|
|
49
|
+
* Ajoute une citation
|
|
50
|
+
*/
|
|
51
|
+
addQuote(text: string, author?: string, source?: string): this;
|
|
52
|
+
/**
|
|
53
|
+
* Ajoute un séparateur
|
|
54
|
+
*/
|
|
55
|
+
addSeparator(): this;
|
|
56
|
+
/**
|
|
57
|
+
* Ajoute un élément personnalisé
|
|
58
|
+
*/
|
|
59
|
+
addCustomElement(type: string, data: Record<string, unknown>): this;
|
|
60
|
+
/**
|
|
61
|
+
* Obtient les éléments par type
|
|
62
|
+
*/
|
|
63
|
+
getElementsByType(type: ReaderElement['type']): ReaderElement[];
|
|
64
|
+
/**
|
|
65
|
+
* Supprime un élément par index
|
|
66
|
+
*/
|
|
67
|
+
removeElement(index: number): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Insère un élément à un index spécifique
|
|
70
|
+
*/
|
|
71
|
+
insertElement(index: number, element: ReaderElement): boolean;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=reader-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader-view.d.ts","sourceRoot":"","sources":["../../src/core/reader-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AAKvD,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAgCD,qBAAa,UAAW,SAAQ,QAAQ;gBACxB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAkB7D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAahC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAuB3D;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAa/B;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;IAsC7E;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAgB7D;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IA0B9D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAenD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcnD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkB9D;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAcnE;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE;IAI/D;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO;CAQhE"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReaderView = void 0;
|
|
7
|
+
const base_view_1 = require("./base-view");
|
|
8
|
+
const marked_1 = require("marked");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
const sanitize_html_1 = __importDefault(require("sanitize-html"));
|
|
11
|
+
/**
|
|
12
|
+
* Sanitizes HTML using sanitize-html to prevent XSS attacks
|
|
13
|
+
* More secure than regex-based sanitization with comprehensive protection
|
|
14
|
+
*/
|
|
15
|
+
const sanitizeHtml = (html) => {
|
|
16
|
+
return (0, sanitize_html_1.default)(html, {
|
|
17
|
+
allowedTags: [
|
|
18
|
+
'p', 'br', 'strong', 'em', 'u', 'i', 'b',
|
|
19
|
+
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
20
|
+
'ul', 'ol', 'li',
|
|
21
|
+
'a', 'blockquote', 'code', 'pre',
|
|
22
|
+
'table', 'thead', 'tbody', 'tr', 'th', 'td',
|
|
23
|
+
'hr', 'div', 'span'
|
|
24
|
+
],
|
|
25
|
+
allowedAttributes: {
|
|
26
|
+
'a': ['href', 'title'],
|
|
27
|
+
'*': ['class', 'id']
|
|
28
|
+
},
|
|
29
|
+
allowedSchemes: ['http', 'https', 'mailto'],
|
|
30
|
+
allowedSchemesByTag: {
|
|
31
|
+
'a': ['http', 'https', 'mailto']
|
|
32
|
+
},
|
|
33
|
+
// Disallow data attributes to prevent data: URL attacks
|
|
34
|
+
allowedClasses: {},
|
|
35
|
+
disallowedTagsMode: 'discard',
|
|
36
|
+
// Enforce strict filtering
|
|
37
|
+
enforceHtmlBoundary: true
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
class ReaderView extends base_view_1.BaseView {
|
|
41
|
+
constructor(viewId, title, processId) {
|
|
42
|
+
super({
|
|
43
|
+
id: viewId,
|
|
44
|
+
type: 'Reader',
|
|
45
|
+
processId,
|
|
46
|
+
metadata: {
|
|
47
|
+
version: '1.0.0',
|
|
48
|
+
createdAt: new Date()
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
this.content = {
|
|
52
|
+
title: title,
|
|
53
|
+
intro: '',
|
|
54
|
+
elements: []
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Définit l'introduction
|
|
59
|
+
*/
|
|
60
|
+
setIntro(intro) {
|
|
61
|
+
return this.setIntroText('intro', intro);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Ajoute un paragraphe
|
|
65
|
+
*/
|
|
66
|
+
addParagraph(text) {
|
|
67
|
+
const trimmed = text.trim();
|
|
68
|
+
if (trimmed.length === 0) {
|
|
69
|
+
throw new errors_1.InvalidParameterError('text', text, 'Paragraph text cannot be empty');
|
|
70
|
+
}
|
|
71
|
+
this.content.elements.push({
|
|
72
|
+
type: 'paragraph',
|
|
73
|
+
text: trimmed
|
|
74
|
+
});
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Ajoute une image
|
|
79
|
+
*/
|
|
80
|
+
addImage(url, alt, caption) {
|
|
81
|
+
const trimmedUrl = url.trim();
|
|
82
|
+
if (trimmedUrl.length === 0) {
|
|
83
|
+
throw new errors_1.InvalidParameterError('url', url, 'Image URL cannot be empty');
|
|
84
|
+
}
|
|
85
|
+
const imageElement = {
|
|
86
|
+
type: 'image',
|
|
87
|
+
url: trimmedUrl
|
|
88
|
+
};
|
|
89
|
+
if (alt) {
|
|
90
|
+
imageElement.alt = alt;
|
|
91
|
+
}
|
|
92
|
+
if (caption) {
|
|
93
|
+
imageElement.caption = caption;
|
|
94
|
+
}
|
|
95
|
+
this.content.elements.push(imageElement);
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Ajoute un sous-titre
|
|
100
|
+
*/
|
|
101
|
+
addSubTitle(text) {
|
|
102
|
+
const trimmed = text.trim();
|
|
103
|
+
if (trimmed.length === 0) {
|
|
104
|
+
throw new errors_1.InvalidParameterError('text', text, 'Subtitle text cannot be empty');
|
|
105
|
+
}
|
|
106
|
+
this.content.elements.push({
|
|
107
|
+
type: 'subtitle',
|
|
108
|
+
text: trimmed
|
|
109
|
+
});
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Ajoute du contenu Markdown
|
|
114
|
+
*/
|
|
115
|
+
addMarkdown(markdownText, options = {}) {
|
|
116
|
+
const { sanitize = true } = options;
|
|
117
|
+
try {
|
|
118
|
+
const parsed = marked_1.marked.parse(markdownText);
|
|
119
|
+
const htmlContent = typeof parsed === 'string' ? parsed : parsed.toString();
|
|
120
|
+
const page = {
|
|
121
|
+
content: sanitize ? sanitizeHtml(htmlContent) : htmlContent,
|
|
122
|
+
raw: markdownText,
|
|
123
|
+
sanitized: sanitize
|
|
124
|
+
};
|
|
125
|
+
const elements = this.content.elements;
|
|
126
|
+
const existingMarkdown = elements.find((element) => element.type === 'markdown');
|
|
127
|
+
if (!existingMarkdown) {
|
|
128
|
+
elements.push({
|
|
129
|
+
type: 'markdown',
|
|
130
|
+
pages: [page]
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
if (!existingMarkdown.pages) {
|
|
135
|
+
existingMarkdown.pages = [];
|
|
136
|
+
}
|
|
137
|
+
existingMarkdown.pages.push(page);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const err = error instanceof Error ? error : new Error('Unknown error');
|
|
142
|
+
throw new errors_1.MarkdownParseError(this.id, err);
|
|
143
|
+
}
|
|
144
|
+
return this;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Ajoute une liste
|
|
148
|
+
*/
|
|
149
|
+
addListField(items, ordered = false) {
|
|
150
|
+
if (!Array.isArray(items)) {
|
|
151
|
+
throw new errors_1.InvalidParameterError('items', items, 'List items must be an array');
|
|
152
|
+
}
|
|
153
|
+
const trimmedItems = items.map(item => item.trim());
|
|
154
|
+
const listElement = {
|
|
155
|
+
type: 'list',
|
|
156
|
+
items: trimmedItems,
|
|
157
|
+
ordered
|
|
158
|
+
};
|
|
159
|
+
this.content.elements.push(listElement);
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Ajoute un lien
|
|
164
|
+
*/
|
|
165
|
+
addLink(url, text, description) {
|
|
166
|
+
const trimmedUrl = url.trim();
|
|
167
|
+
const trimmedText = text.trim();
|
|
168
|
+
if (trimmedUrl.length === 0) {
|
|
169
|
+
throw new errors_1.InvalidParameterError('url', url, 'Link URL cannot be empty');
|
|
170
|
+
}
|
|
171
|
+
if (trimmedText.length === 0) {
|
|
172
|
+
throw new errors_1.InvalidParameterError('text', text, 'Link text cannot be empty');
|
|
173
|
+
}
|
|
174
|
+
const linkElement = {
|
|
175
|
+
type: 'link',
|
|
176
|
+
url: trimmedUrl,
|
|
177
|
+
text: trimmedText
|
|
178
|
+
};
|
|
179
|
+
if (description) {
|
|
180
|
+
linkElement.description = description;
|
|
181
|
+
}
|
|
182
|
+
this.content.elements.push(linkElement);
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Ajoute un tableau
|
|
187
|
+
*/
|
|
188
|
+
addTable(headers, rows) {
|
|
189
|
+
if (!Array.isArray(headers) || !Array.isArray(rows)) {
|
|
190
|
+
throw new errors_1.InvalidParameterError('table data', { headers, rows }, 'Headers and rows must be arrays');
|
|
191
|
+
}
|
|
192
|
+
const tableElement = {
|
|
193
|
+
type: 'table',
|
|
194
|
+
headers,
|
|
195
|
+
rows
|
|
196
|
+
};
|
|
197
|
+
this.content.elements.push(tableElement);
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Ajoute un bloc de code
|
|
202
|
+
*/
|
|
203
|
+
addCodeBlock(code, language) {
|
|
204
|
+
const codeElement = {
|
|
205
|
+
type: 'code',
|
|
206
|
+
code
|
|
207
|
+
};
|
|
208
|
+
if (language) {
|
|
209
|
+
codeElement.language = language;
|
|
210
|
+
}
|
|
211
|
+
this.content.elements.push(codeElement);
|
|
212
|
+
return this;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Ajoute une citation
|
|
216
|
+
*/
|
|
217
|
+
addQuote(text, author, source) {
|
|
218
|
+
const quoteElement = {
|
|
219
|
+
type: 'quote',
|
|
220
|
+
text
|
|
221
|
+
};
|
|
222
|
+
if (author) {
|
|
223
|
+
quoteElement.author = author;
|
|
224
|
+
}
|
|
225
|
+
if (source) {
|
|
226
|
+
quoteElement.source = source;
|
|
227
|
+
}
|
|
228
|
+
this.content.elements.push(quoteElement);
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Ajoute un séparateur
|
|
233
|
+
*/
|
|
234
|
+
addSeparator() {
|
|
235
|
+
this.content.elements.push({
|
|
236
|
+
type: 'separator'
|
|
237
|
+
});
|
|
238
|
+
return this;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Ajoute un élément personnalisé
|
|
242
|
+
*/
|
|
243
|
+
addCustomElement(type, data) {
|
|
244
|
+
const trimmedType = type.trim();
|
|
245
|
+
if (trimmedType.length === 0) {
|
|
246
|
+
throw new errors_1.InvalidParameterError('type', type, 'Custom element type cannot be empty');
|
|
247
|
+
}
|
|
248
|
+
this.content.elements.push({
|
|
249
|
+
type: 'custom',
|
|
250
|
+
kind: trimmedType,
|
|
251
|
+
data: { ...data }
|
|
252
|
+
});
|
|
253
|
+
return this;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Obtient les éléments par type
|
|
257
|
+
*/
|
|
258
|
+
getElementsByType(type) {
|
|
259
|
+
return this.content.elements.filter(element => element.type === type);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Supprime un élément par index
|
|
263
|
+
*/
|
|
264
|
+
removeElement(index) {
|
|
265
|
+
const elements = this.content.elements;
|
|
266
|
+
if (index >= 0 && index < elements.length) {
|
|
267
|
+
elements.splice(index, 1);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Insère un élément à un index spécifique
|
|
274
|
+
*/
|
|
275
|
+
insertElement(index, element) {
|
|
276
|
+
const elements = this.content.elements;
|
|
277
|
+
if (index >= 0 && index <= elements.length) {
|
|
278
|
+
elements.splice(index, 0, element);
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
exports.ReaderView = ReaderView;
|
|
285
|
+
//# sourceMappingURL=reader-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader-view.js","sourceRoot":"","sources":["../../src/core/reader-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseView } from './base-view';
|
|
2
|
+
import { TimelineContent, TimelineItem, TimelineStatus } from '../types';
|
|
3
|
+
export declare class TimelineView extends BaseView {
|
|
4
|
+
constructor(viewId: string, title: string, processId?: string);
|
|
5
|
+
setIntro(intro: string): this;
|
|
6
|
+
addItem(item: TimelineItem): this;
|
|
7
|
+
addEvent(id: string, title: string, timestamp: string, options?: {
|
|
8
|
+
description?: string;
|
|
9
|
+
status?: TimelineStatus;
|
|
10
|
+
icon?: string;
|
|
11
|
+
}): this;
|
|
12
|
+
setItems(items: TimelineItem[]): this;
|
|
13
|
+
clearItems(): this;
|
|
14
|
+
getContent(): TimelineContent;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=timeline-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-view.d.ts","sourceRoot":"","sources":["../../src/core/timeline-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAKzE,qBAAa,YAAa,SAAQ,QAAQ;gBAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAmB7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAgBjC,QAAQ,CACJ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/E,IAAI;IAYP,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAMrC,UAAU,IAAI,IAAI;IAMlB,UAAU,IAAI,eAAe;CAGhC"}
|