@cogenta/forms 0.2.4
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/LICENSE +373 -0
- package/dist/anti-abuse.d.ts +16 -0
- package/dist/anti-abuse.d.ts.map +1 -0
- package/dist/anti-abuse.js +58 -0
- package/dist/anti-abuse.js.map +1 -0
- package/dist/captcha.d.ts +18 -0
- package/dist/captcha.d.ts.map +1 -0
- package/dist/captcha.js +69 -0
- package/dist/captcha.js.map +1 -0
- package/dist/conditions.d.ts +6 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.js +52 -0
- package/dist/conditions.js.map +1 -0
- package/dist/csv.d.ts +10 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +56 -0
- package/dist/csv.js.map +1 -0
- package/dist/file-field.d.ts +64 -0
- package/dist/file-field.d.ts.map +1 -0
- package/dist/file-field.js +169 -0
- package/dist/file-field.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ip.d.ts +12 -0
- package/dist/ip.d.ts.map +1 -0
- package/dist/ip.js +15 -0
- package/dist/ip.js.map +1 -0
- package/dist/notify.d.ts +52 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +113 -0
- package/dist/notify.js.map +1 -0
- package/dist/rows.d.ts +13 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +72 -0
- package/dist/rows.js.map +1 -0
- package/dist/store.d.ts +71 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +509 -0
- package/dist/store.js.map +1 -0
- package/dist/tables.d.ts +21 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +131 -0
- package/dist/tables.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +56 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +20 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +353 -0
- package/dist/validate.js.map +1 -0
- package/package.json +43 -0
package/dist/validate.js
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { CogentaError } from '@cogenta/core';
|
|
2
|
+
import { isFieldVisible } from './conditions.js';
|
|
3
|
+
import { FORM_CONDITION_OPERATORS, FORM_FILE_CATEGORIES, isFormFileValue, } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Full server-side validation, independent of whatever the client did or
|
|
6
|
+
* did not check (fiche 16 task 3's own requirement, and the same standard
|
|
7
|
+
* `@cogenta/commerce`'s stores hold their own writes to). Never trusts a
|
|
8
|
+
* shape the browser sent: a `choiceMulti` answer for a field it does not
|
|
9
|
+
* know, a `consent` box the definition never declared, or a value that
|
|
10
|
+
* arrived as an object are all rejected here, the same way whether the
|
|
11
|
+
* caller was a browser form post or a JSON API client.
|
|
12
|
+
*/
|
|
13
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/u;
|
|
14
|
+
// Loose on purpose: a phone number is free text almost everywhere in the
|
|
15
|
+
// world (extensions, country codes, spaces) — this rejects control
|
|
16
|
+
// characters and enforces a sane length, not a dial plan.
|
|
17
|
+
const PHONE_RE = /^[+()0-9 .-]{3,32}$/u;
|
|
18
|
+
const MAX_TEXT_LENGTH = 2_000;
|
|
19
|
+
const MAX_LONG_TEXT_LENGTH = 20_000;
|
|
20
|
+
function invalid(field, reason) {
|
|
21
|
+
return new CogentaError({
|
|
22
|
+
code: 'FORM_SUBMISSION_INVALID',
|
|
23
|
+
message: `"${field}" ${reason}.`,
|
|
24
|
+
hint: 'Check the value sent for this field and try again.',
|
|
25
|
+
details: { field },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function readRawString(raw, field) {
|
|
29
|
+
if (typeof raw === 'string')
|
|
30
|
+
return raw.trim();
|
|
31
|
+
if (Array.isArray(raw) && raw.length === 1 && typeof raw[0] === 'string')
|
|
32
|
+
return raw[0].trim();
|
|
33
|
+
throw invalid(field.name, 'must be a single text value');
|
|
34
|
+
}
|
|
35
|
+
function readRawList(raw, field) {
|
|
36
|
+
if (typeof raw === 'string')
|
|
37
|
+
return raw.trim() === '' ? [] : [raw.trim()];
|
|
38
|
+
if (Array.isArray(raw)) {
|
|
39
|
+
return raw.map((entry) => {
|
|
40
|
+
if (typeof entry !== 'string')
|
|
41
|
+
throw invalid(field.name, 'must be a list of text values');
|
|
42
|
+
return entry.trim();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
throw invalid(field.name, 'must be a list of text values');
|
|
46
|
+
}
|
|
47
|
+
function validateField(field, raw, now) {
|
|
48
|
+
const present = raw !== undefined &&
|
|
49
|
+
raw !== null &&
|
|
50
|
+
!(typeof raw === 'string' && raw.trim() === '') &&
|
|
51
|
+
!(Array.isArray(raw) && raw.length === 0);
|
|
52
|
+
if (!present) {
|
|
53
|
+
if (field.required)
|
|
54
|
+
throw invalid(field.name, 'is required');
|
|
55
|
+
return { value: undefined };
|
|
56
|
+
}
|
|
57
|
+
switch (field.kind) {
|
|
58
|
+
case 'text': {
|
|
59
|
+
const value = readRawString(raw, field);
|
|
60
|
+
if (value.length > MAX_TEXT_LENGTH)
|
|
61
|
+
throw invalid(field.name, `must be at most ${MAX_TEXT_LENGTH} characters`);
|
|
62
|
+
return { value };
|
|
63
|
+
}
|
|
64
|
+
case 'longText': {
|
|
65
|
+
const value = readRawString(raw, field);
|
|
66
|
+
if (value.length > MAX_LONG_TEXT_LENGTH) {
|
|
67
|
+
throw invalid(field.name, `must be at most ${MAX_LONG_TEXT_LENGTH} characters`);
|
|
68
|
+
}
|
|
69
|
+
return { value };
|
|
70
|
+
}
|
|
71
|
+
case 'email': {
|
|
72
|
+
const value = readRawString(raw, field).toLowerCase();
|
|
73
|
+
if (!EMAIL_RE.test(value))
|
|
74
|
+
throw invalid(field.name, 'must be a valid e-mail address');
|
|
75
|
+
return { value };
|
|
76
|
+
}
|
|
77
|
+
case 'phone': {
|
|
78
|
+
const value = readRawString(raw, field);
|
|
79
|
+
if (!PHONE_RE.test(value))
|
|
80
|
+
throw invalid(field.name, 'must be a valid phone number');
|
|
81
|
+
return { value };
|
|
82
|
+
}
|
|
83
|
+
case 'number': {
|
|
84
|
+
const text = readRawString(raw, field);
|
|
85
|
+
const value = Number(text);
|
|
86
|
+
if (!Number.isFinite(value))
|
|
87
|
+
throw invalid(field.name, 'must be a number');
|
|
88
|
+
return { value: String(value) };
|
|
89
|
+
}
|
|
90
|
+
case 'date': {
|
|
91
|
+
const value = readRawString(raw, field);
|
|
92
|
+
if (Number.isNaN(new Date(value).getTime()))
|
|
93
|
+
throw invalid(field.name, 'must be a valid date');
|
|
94
|
+
return { value };
|
|
95
|
+
}
|
|
96
|
+
case 'choiceSingle': {
|
|
97
|
+
const value = readRawString(raw, field);
|
|
98
|
+
const choices = field.choices ?? [];
|
|
99
|
+
if (!choices.includes(value))
|
|
100
|
+
throw invalid(field.name, 'must be one of the offered choices');
|
|
101
|
+
return { value };
|
|
102
|
+
}
|
|
103
|
+
case 'choiceMulti': {
|
|
104
|
+
const values = readRawList(raw, field);
|
|
105
|
+
const choices = field.choices ?? [];
|
|
106
|
+
for (const value of values) {
|
|
107
|
+
if (!choices.includes(value))
|
|
108
|
+
throw invalid(field.name, 'must only contain offered choices');
|
|
109
|
+
}
|
|
110
|
+
return { value: values };
|
|
111
|
+
}
|
|
112
|
+
case 'file': {
|
|
113
|
+
// The router (`@cogenta/api`'s `forms-router.ts`) is the only layer
|
|
114
|
+
// that ever sees raw bytes — it resolves an uploaded multipart file
|
|
115
|
+
// (or a JSON-carried value from an earlier multi-step page) into a
|
|
116
|
+
// `FormFileValue` *before* calling this function. This package never
|
|
117
|
+
// touches a `StorageDriver`, so all it can check here is the shape.
|
|
118
|
+
if (!isFormFileValue(raw)) {
|
|
119
|
+
throw invalid(field.name, 'must be a file already uploaded to this field');
|
|
120
|
+
}
|
|
121
|
+
return { value: raw };
|
|
122
|
+
}
|
|
123
|
+
case 'consent': {
|
|
124
|
+
const value = readRawString(raw, field);
|
|
125
|
+
const agreed = value === 'true' || value === 'on' || value === '1' || value === 'yes';
|
|
126
|
+
if (!agreed) {
|
|
127
|
+
throw new CogentaError({
|
|
128
|
+
code: 'FORM_CONSENT_REQUIRED',
|
|
129
|
+
message: `Consent for "${field.name}" is required to submit this form.`,
|
|
130
|
+
hint: 'Tick the consent checkbox before submitting.',
|
|
131
|
+
details: { field: field.name },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
value: 'true',
|
|
136
|
+
consent: {
|
|
137
|
+
fieldName: field.name,
|
|
138
|
+
// The wording as it stands *right now*, recorded verbatim onto the
|
|
139
|
+
// submission — this is what has probative value, per ADR-0026 and
|
|
140
|
+
// the fiche's own reminder: "le texte au moment du recueil compte,
|
|
141
|
+
// pas celui d'aujourd'hui".
|
|
142
|
+
text: field.consentText ?? field.label,
|
|
143
|
+
agreedAt: new Date(now()).toISOString(),
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
default: {
|
|
148
|
+
const exhaustive = field.kind;
|
|
149
|
+
throw invalid(field.name, `has an unknown field kind ${String(exhaustive)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validates a raw submission body against a form's own definition. Rejects
|
|
155
|
+
* any key the definition does not declare — a client cannot smuggle an
|
|
156
|
+
* extra column into what gets stored.
|
|
157
|
+
*/
|
|
158
|
+
export function validateSubmission(definition, rawValues, now = Date.now) {
|
|
159
|
+
if (!definition.active) {
|
|
160
|
+
throw new CogentaError({
|
|
161
|
+
code: 'FORM_DISABLED',
|
|
162
|
+
message: `The form "${definition.name}" is not accepting submissions.`,
|
|
163
|
+
hint: 'This form has been switched off by its owner.',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
const known = new Set(definition.fields.map((field) => field.name));
|
|
167
|
+
for (const key of Object.keys(rawValues)) {
|
|
168
|
+
if (key.startsWith('_'))
|
|
169
|
+
continue; // anti-abuse fields (honeypot, timestamp) — never stored as an answer.
|
|
170
|
+
if (!known.has(key))
|
|
171
|
+
throw invalid(key, 'is not a field on this form');
|
|
172
|
+
}
|
|
173
|
+
const values = {};
|
|
174
|
+
const consents = [];
|
|
175
|
+
for (const field of definition.fields) {
|
|
176
|
+
// Fiche 47 task 1: a field masked by an unmet `showIf` is neither
|
|
177
|
+
// required nor validated — whatever was submitted under its name (if
|
|
178
|
+
// anything) is silently discarded, never stored. Evaluated against the
|
|
179
|
+
// *raw* submission, so it works identically with or without JavaScript
|
|
180
|
+
// having toggled anything on screen.
|
|
181
|
+
if (!isFieldVisible(field, rawValues))
|
|
182
|
+
continue;
|
|
183
|
+
const outcome = validateField(field, rawValues[field.name], now);
|
|
184
|
+
if (outcome.value !== undefined)
|
|
185
|
+
values[field.name] = outcome.value;
|
|
186
|
+
if (outcome.consent !== undefined)
|
|
187
|
+
consents.push(outcome.consent);
|
|
188
|
+
}
|
|
189
|
+
return { values, consents };
|
|
190
|
+
}
|
|
191
|
+
/** A definition's own fields must be internally consistent — checked once, at create/update time. */
|
|
192
|
+
export function validateDefinitionFields(fields) {
|
|
193
|
+
if (fields.length === 0) {
|
|
194
|
+
throw new CogentaError({
|
|
195
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
196
|
+
message: 'A form needs at least one field.',
|
|
197
|
+
hint: 'Add at least one field before saving.',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const seen = new Set();
|
|
201
|
+
for (const field of fields) {
|
|
202
|
+
if (field.name.trim() === '' || !/^[a-zA-Z][a-zA-Z0-9_]*$/u.test(field.name)) {
|
|
203
|
+
throw new CogentaError({
|
|
204
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
205
|
+
message: `"${field.name}" is not a valid field name.`,
|
|
206
|
+
hint: 'Field names start with a letter and contain only letters, digits and underscores.',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (seen.has(field.name)) {
|
|
210
|
+
throw new CogentaError({
|
|
211
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
212
|
+
message: `Field name "${field.name}" is used more than once.`,
|
|
213
|
+
hint: 'Every field needs a unique name.',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
seen.add(field.name);
|
|
217
|
+
if ((field.kind === 'choiceSingle' || field.kind === 'choiceMulti') &&
|
|
218
|
+
(field.choices ?? []).length === 0) {
|
|
219
|
+
throw new CogentaError({
|
|
220
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
221
|
+
message: `"${field.name}" needs at least one choice.`,
|
|
222
|
+
hint: 'Add at least one choice for this field.',
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
if (field.kind === 'consent' && (field.consentText ?? '').trim() === '') {
|
|
226
|
+
throw new CogentaError({
|
|
227
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
228
|
+
message: `"${field.name}" needs its consent wording.`,
|
|
229
|
+
hint: 'A consent field must carry the exact text shown to whoever ticks it — this is what has probative value later.',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (field.kind === 'file' && field.acceptCategories !== undefined) {
|
|
233
|
+
for (const category of field.acceptCategories) {
|
|
234
|
+
if (!FORM_FILE_CATEGORIES.includes(category)) {
|
|
235
|
+
throw new CogentaError({
|
|
236
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
237
|
+
message: `"${category}" is not a file category.`,
|
|
238
|
+
hint: `Use one of: ${FORM_FILE_CATEGORIES.join(', ')}.`,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (field.kind === 'file' && field.maxSizeBytes !== undefined && field.maxSizeBytes <= 0) {
|
|
244
|
+
throw new CogentaError({
|
|
245
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
246
|
+
message: `"${field.name}" needs a positive maximum file size.`,
|
|
247
|
+
hint: 'Set maxSizeBytes to a positive number of bytes, or omit it to use the default.',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// A second pass for `showIf`: every field name has to be known before a
|
|
252
|
+
// condition can be checked against one, which is why this is not folded
|
|
253
|
+
// into the loop above.
|
|
254
|
+
for (const field of fields) {
|
|
255
|
+
if (field.showIf === undefined)
|
|
256
|
+
continue;
|
|
257
|
+
if (!FORM_CONDITION_OPERATORS.includes(field.showIf.operator)) {
|
|
258
|
+
throw new CogentaError({
|
|
259
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
260
|
+
message: `"${field.showIf.operator}" is not a condition operator.`,
|
|
261
|
+
hint: `Use one of: ${FORM_CONDITION_OPERATORS.join(', ')}.`,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
if (field.showIf.field === field.name) {
|
|
265
|
+
throw new CogentaError({
|
|
266
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
267
|
+
message: `"${field.name}" cannot depend on its own value.`,
|
|
268
|
+
hint: 'A showIf condition must name a different field.',
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
if (!seen.has(field.showIf.field)) {
|
|
272
|
+
throw new CogentaError({
|
|
273
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
274
|
+
message: `"${field.name}"'s condition names an unknown field "${field.showIf.field}".`,
|
|
275
|
+
hint: 'showIf.field must be the name of another field on this form.',
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** Task 2 — every field must belong to exactly one step when a form declares any. Absent/empty `steps` means single-page, unchecked here. */
|
|
281
|
+
export function validateFormSteps(fields, steps) {
|
|
282
|
+
if (steps.length === 0)
|
|
283
|
+
return;
|
|
284
|
+
const fieldNames = new Set(fields.map((field) => field.name));
|
|
285
|
+
const assigned = new Set();
|
|
286
|
+
for (const step of steps) {
|
|
287
|
+
if (step.name.trim() === '') {
|
|
288
|
+
throw new CogentaError({
|
|
289
|
+
code: 'FORM_STEP_INVALID',
|
|
290
|
+
message: 'Every step needs a name.',
|
|
291
|
+
hint: 'Give each step a short, stable identifier.',
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
if (step.fieldNames.length === 0) {
|
|
295
|
+
throw new CogentaError({
|
|
296
|
+
code: 'FORM_STEP_INVALID',
|
|
297
|
+
message: `Step "${step.name}" has no fields.`,
|
|
298
|
+
hint: 'Every step must show at least one field.',
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
for (const name of step.fieldNames) {
|
|
302
|
+
if (!fieldNames.has(name)) {
|
|
303
|
+
throw new CogentaError({
|
|
304
|
+
code: 'FORM_STEP_INVALID',
|
|
305
|
+
message: `Step "${step.name}" names an unknown field "${name}".`,
|
|
306
|
+
hint: 'Every step field must be a real field on this form.',
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
if (assigned.has(name)) {
|
|
310
|
+
throw new CogentaError({
|
|
311
|
+
code: 'FORM_STEP_INVALID',
|
|
312
|
+
message: `"${name}" is assigned to more than one step.`,
|
|
313
|
+
hint: 'Every field belongs to exactly one step.',
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
assigned.add(name);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
for (const name of fieldNames) {
|
|
320
|
+
if (!assigned.has(name)) {
|
|
321
|
+
throw new CogentaError({
|
|
322
|
+
code: 'FORM_STEP_INVALID',
|
|
323
|
+
message: `"${name}" is not assigned to any step.`,
|
|
324
|
+
hint: 'Every field must belong to exactly one step once a form declares steps.',
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/** Task 4 — a channel/target pair must at least be non-empty text; `@cogenta/api`'s router is what actually knows whether `channel` names a configured adapter. */
|
|
330
|
+
export function validateNotifyChannels(channels) {
|
|
331
|
+
for (const entry of channels) {
|
|
332
|
+
if (entry.channel.trim() === '' || entry.target.trim() === '') {
|
|
333
|
+
throw new CogentaError({
|
|
334
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
335
|
+
message: 'Every notification channel needs both a channel name and a target.',
|
|
336
|
+
hint: 'Set both "channel" (e.g. "slack") and "target" (that channel’s own destination id).',
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/** Task 10 — enabling the CAPTCHA without both keys is a misconfiguration caught at save time, not at the first anonymous submission. */
|
|
342
|
+
export function validateCaptchaConfig(captcha) {
|
|
343
|
+
if (!captcha.enabled)
|
|
344
|
+
return;
|
|
345
|
+
if ((captcha.siteKey ?? '').trim() === '' || (captcha.secretKey ?? '').trim() === '') {
|
|
346
|
+
throw new CogentaError({
|
|
347
|
+
code: 'FORM_DEFINITION_INVALID',
|
|
348
|
+
message: 'Enabling the CAPTCHA requires both a site key and a secret key.',
|
|
349
|
+
hint: 'Get a Turnstile site key and secret key, or leave the CAPTCHA disabled.',
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cogenta/forms",
|
|
3
|
+
"version": "0.2.4",
|
|
4
|
+
"description": "Contract G: form definitions and submissions (ADR-0026).",
|
|
5
|
+
"license": "MPL-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.11.0"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public",
|
|
22
|
+
"provenance": true
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/cogenta-cms/cogenta.git",
|
|
27
|
+
"directory": "packages/forms"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@cogenta/channels": "0.3.4",
|
|
31
|
+
"@cogenta/core": "0.8.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "^7.0.2",
|
|
35
|
+
"vitest": "^4.1.10"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
40
|
+
"test": "vitest run --passWithNoTests",
|
|
41
|
+
"test:integration": "vitest run --config vitest.integration.config.ts --passWithNoTests"
|
|
42
|
+
}
|
|
43
|
+
}
|