@vue-skuilder/common 0.1.11-26 → 0.1.11-28
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/schemas/dataShapeToZod.d.ts +11 -0
- package/dist/schemas/dataShapeToZod.d.ts.map +1 -0
- package/dist/schemas/dataShapeToZod.js +97 -0
- package/dist/schemas/dataShapeToZod.js.map +1 -0
- package/dist/schemas/dataShapeToZod.mjs +93 -0
- package/dist/wire-format.d.ts +1 -0
- package/dist/wire-format.d.ts.map +1 -1
- package/dist/wire-format.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +3 -0
- package/src/schemas/dataShapeToZod.ts +119 -0
- package/src/wire-format.ts +1 -0
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,8 @@ __exportStar(require("./bulkImport/types.js"), exports);
|
|
|
29
29
|
__exportStar(require("./interfaces/index.js"), exports);
|
|
30
30
|
// enums
|
|
31
31
|
__exportStar(require("./enums/index.js"), exports);
|
|
32
|
+
// schemas
|
|
33
|
+
__exportStar(require("./schemas/dataShapeToZod.js"), exports);
|
|
32
34
|
// docker utilities (Node.js only - not exported in main index for browser compatibility)
|
|
33
35
|
// Use explicit import: import { CouchDBManager } from '@vue-skuilder/common/docker'
|
|
34
36
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AAEtC,aAAa;AACb,cAAc,uBAAuB,CAAC;AAEtC,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,yFAAyF;AACzF,oFAAoF"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AAEtC,aAAa;AACb,cAAc,uBAAuB,CAAC;AAEtC,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,UAAU;AACV,cAAc,6BAA6B,CAAC;AAE5C,yFAAyF;AACzF,oFAAoF"}
|
package/dist/index.mjs
CHANGED
|
@@ -13,6 +13,8 @@ export * from './bulkImport/types.mjs';
|
|
|
13
13
|
export * from './interfaces/index.mjs';
|
|
14
14
|
// enums
|
|
15
15
|
export * from './enums/index.mjs';
|
|
16
|
+
// schemas
|
|
17
|
+
export * from './schemas/dataShapeToZod.mjs';
|
|
16
18
|
// docker utilities (Node.js only - not exported in main index for browser compatibility)
|
|
17
19
|
// Use explicit import: import { CouchDBManager } from '@vue-skuilder/common/docker'
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z, ZodRawShape } from 'zod';
|
|
2
|
+
import { DataShape } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a DataShape to a Zod schema
|
|
5
|
+
*/
|
|
6
|
+
export declare function toZod(dataShape: DataShape): z.ZodObject<ZodRawShape>;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a DataShape to JSON Schema string using Zod v4 native conversion
|
|
9
|
+
*/
|
|
10
|
+
export declare function toZodJSON(dataShape: DataShape): string;
|
|
11
|
+
//# sourceMappingURL=dataShapeToZod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataShapeToZod.d.ts","sourceRoot":"","sources":["../../src/schemas/dataShapeToZod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,SAAS,EAAsC,MAAM,aAAa,CAAC;AAiG5E;;GAEG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAItD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toZod = toZod;
|
|
4
|
+
exports.toZodJSON = toZodJSON;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const index_js_1 = require("../index.js");
|
|
7
|
+
/**
|
|
8
|
+
* Converts a FieldType enum to appropriate Zod schema
|
|
9
|
+
*/
|
|
10
|
+
function fieldTypeToZodSchema(field) {
|
|
11
|
+
let baseSchema;
|
|
12
|
+
switch (field.type) {
|
|
13
|
+
case index_js_1.FieldType.STRING:
|
|
14
|
+
baseSchema = zod_1.z.string().min(1, `${field.name} cannot be empty`);
|
|
15
|
+
break;
|
|
16
|
+
case index_js_1.FieldType.MARKDOWN:
|
|
17
|
+
baseSchema = zod_1.z.string().min(1, `${field.name} cannot be empty`);
|
|
18
|
+
// Special handling for known patterns like Blanks
|
|
19
|
+
if (field.name === 'Input') {
|
|
20
|
+
baseSchema = baseSchema
|
|
21
|
+
.refine((value) => typeof value === 'string' && value.includes('{{') && value.includes('}}'), 'Must contain at least one blank in format {{answer}} or {{answer1|answer2||distractor}}')
|
|
22
|
+
.describe("Markdown text with blanks. Format: {{answer}} for fill-in or {{answer1|answer2||distractor1|distractor2}} for multiple choice. Use the 'fill-in-card-authoring' MCP prompt for detailed syntax guidance.");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
baseSchema = baseSchema.describe('Markdown content');
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case index_js_1.FieldType.NUMBER:
|
|
29
|
+
baseSchema = zod_1.z.number().describe(`Numeric value for ${field.name}`);
|
|
30
|
+
break;
|
|
31
|
+
case index_js_1.FieldType.INT:
|
|
32
|
+
baseSchema = zod_1.z.number().int().describe(`Integer value for ${field.name}`);
|
|
33
|
+
break;
|
|
34
|
+
case index_js_1.FieldType.IMAGE:
|
|
35
|
+
baseSchema = zod_1.z.any().optional().describe('Image file');
|
|
36
|
+
break;
|
|
37
|
+
case index_js_1.FieldType.AUDIO:
|
|
38
|
+
baseSchema = zod_1.z.any().optional().describe('Audio file');
|
|
39
|
+
break;
|
|
40
|
+
case index_js_1.FieldType.MIDI:
|
|
41
|
+
baseSchema = zod_1.z.any().optional().describe('MIDI file');
|
|
42
|
+
break;
|
|
43
|
+
case index_js_1.FieldType.MEDIA_UPLOADS:
|
|
44
|
+
baseSchema = zod_1.z
|
|
45
|
+
.array(zod_1.z.any())
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Optional media files (images, audio, etc.)');
|
|
48
|
+
break;
|
|
49
|
+
case index_js_1.FieldType.CHESS_PUZZLE:
|
|
50
|
+
baseSchema = zod_1.z
|
|
51
|
+
.string()
|
|
52
|
+
.min(1, 'Chess puzzle cannot be empty')
|
|
53
|
+
.describe('Chess puzzle in FEN or PGN format');
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
baseSchema = zod_1.z.any().describe(`Field of type ${field.type}`);
|
|
57
|
+
}
|
|
58
|
+
// Add custom validation if present
|
|
59
|
+
if (field.validator) {
|
|
60
|
+
const originalValidator = field.validator;
|
|
61
|
+
baseSchema = baseSchema.refine((value) => {
|
|
62
|
+
try {
|
|
63
|
+
const result = originalValidator.test(String(value));
|
|
64
|
+
return result.status === index_js_1.Status.ok;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}, {
|
|
70
|
+
message: originalValidator.instructions || `Validation failed for ${field.name}`,
|
|
71
|
+
});
|
|
72
|
+
// Add validator instructions as description if available
|
|
73
|
+
if (originalValidator.instructions) {
|
|
74
|
+
baseSchema = baseSchema.describe(`${baseSchema.description || ''}\nInstructions: ${originalValidator.instructions}`.trim());
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return baseSchema;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Converts a DataShape to a Zod schema
|
|
81
|
+
*/
|
|
82
|
+
function toZod(dataShape) {
|
|
83
|
+
const schemaFields = {};
|
|
84
|
+
dataShape.fields.forEach((field) => {
|
|
85
|
+
schemaFields[field.name] = fieldTypeToZodSchema(field);
|
|
86
|
+
});
|
|
87
|
+
return zod_1.z.object(schemaFields).describe(`DataShape: ${dataShape.name} - Schema for card creation`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Converts a DataShape to JSON Schema string using Zod v4 native conversion
|
|
91
|
+
*/
|
|
92
|
+
function toZodJSON(dataShape) {
|
|
93
|
+
const zodSchema = toZod(dataShape);
|
|
94
|
+
const jsonSchema = zod_1.z.toJSONSchema(zodSchema);
|
|
95
|
+
return JSON.stringify(jsonSchema, null, 2);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=dataShapeToZod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataShapeToZod.js","sourceRoot":"","sources":["../../src/schemas/dataShapeToZod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAe,MAAM,KAAK,CAAC;AACrC,OAAO,EAA8B,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5E;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAsB;IAClD,IAAI,UAAwB,CAAC;IAE7B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,MAAM;YACnB,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAC;YAChE,MAAM;QAER,KAAK,SAAS,CAAC,QAAQ;YACrB,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAC;YAEhE,kDAAkD;YAClD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,UAAU,GAAG,UAAU;qBACpB,MAAM,CACL,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EACrG,yFAAyF,CAC1F;qBACA,QAAQ,CACP,0MAA0M,CAC3M,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACvD,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,MAAM;YACnB,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM;QAER,KAAK,SAAS,CAAC,GAAG;YAChB,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1E,MAAM;QAER,KAAK,SAAS,CAAC,KAAK;YAClB,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM;QAER,KAAK,SAAS,CAAC,KAAK;YAClB,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM;QAER,KAAK,SAAS,CAAC,IAAI;YACjB,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM;QAER,KAAK,SAAS,CAAC,aAAa;YAC1B,UAAU,GAAG,CAAC;iBACX,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;iBACd,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC,CAAC;YAC1D,MAAM;QAER,KAAK,SAAS,CAAC,YAAY;YACzB,UAAU,GAAG,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,EAAE,8BAA8B,CAAC;iBACtC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;YACjD,MAAM;QAER;YACE,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,mCAAmC;IACnC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1C,UAAU,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,EACD;YACE,OAAO,EAAE,iBAAiB,CAAC,YAAY,IAAI,yBAAyB,KAAK,CAAC,IAAI,EAAE;SACjF,CACF,CAAC;QAEF,yDAAyD;QACzD,IAAI,iBAAiB,CAAC,YAAY,EAAE,CAAC;YACnC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAC9B,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,mBAAmB,iBAAiB,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,SAAoB;IACxC,MAAM,YAAY,GAAiC,EAAE,CAAC;IAEtD,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,cAAc,SAAS,CAAC,IAAI,6BAA6B,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,SAAoB;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { FieldType, Status } from '../index.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a FieldType enum to appropriate Zod schema
|
|
5
|
+
*/
|
|
6
|
+
function fieldTypeToZodSchema(field) {
|
|
7
|
+
let baseSchema;
|
|
8
|
+
switch (field.type) {
|
|
9
|
+
case FieldType.STRING:
|
|
10
|
+
baseSchema = z.string().min(1, `${field.name} cannot be empty`);
|
|
11
|
+
break;
|
|
12
|
+
case FieldType.MARKDOWN:
|
|
13
|
+
baseSchema = z.string().min(1, `${field.name} cannot be empty`);
|
|
14
|
+
// Special handling for known patterns like Blanks
|
|
15
|
+
if (field.name === 'Input') {
|
|
16
|
+
baseSchema = baseSchema
|
|
17
|
+
.refine((value) => typeof value === 'string' && value.includes('{{') && value.includes('}}'), 'Must contain at least one blank in format {{answer}} or {{answer1|answer2||distractor}}')
|
|
18
|
+
.describe("Markdown text with blanks. Format: {{answer}} for fill-in or {{answer1|answer2||distractor1|distractor2}} for multiple choice. Use the 'fill-in-card-authoring' MCP prompt for detailed syntax guidance.");
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
baseSchema = baseSchema.describe('Markdown content');
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
24
|
+
case FieldType.NUMBER:
|
|
25
|
+
baseSchema = z.number().describe(`Numeric value for ${field.name}`);
|
|
26
|
+
break;
|
|
27
|
+
case FieldType.INT:
|
|
28
|
+
baseSchema = z.number().int().describe(`Integer value for ${field.name}`);
|
|
29
|
+
break;
|
|
30
|
+
case FieldType.IMAGE:
|
|
31
|
+
baseSchema = z.any().optional().describe('Image file');
|
|
32
|
+
break;
|
|
33
|
+
case FieldType.AUDIO:
|
|
34
|
+
baseSchema = z.any().optional().describe('Audio file');
|
|
35
|
+
break;
|
|
36
|
+
case FieldType.MIDI:
|
|
37
|
+
baseSchema = z.any().optional().describe('MIDI file');
|
|
38
|
+
break;
|
|
39
|
+
case FieldType.MEDIA_UPLOADS:
|
|
40
|
+
baseSchema = z
|
|
41
|
+
.array(z.any())
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Optional media files (images, audio, etc.)');
|
|
44
|
+
break;
|
|
45
|
+
case FieldType.CHESS_PUZZLE:
|
|
46
|
+
baseSchema = z
|
|
47
|
+
.string()
|
|
48
|
+
.min(1, 'Chess puzzle cannot be empty')
|
|
49
|
+
.describe('Chess puzzle in FEN or PGN format');
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
baseSchema = z.any().describe(`Field of type ${field.type}`);
|
|
53
|
+
}
|
|
54
|
+
// Add custom validation if present
|
|
55
|
+
if (field.validator) {
|
|
56
|
+
const originalValidator = field.validator;
|
|
57
|
+
baseSchema = baseSchema.refine((value) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = originalValidator.test(String(value));
|
|
60
|
+
return result.status === Status.ok;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}, {
|
|
66
|
+
message: originalValidator.instructions || `Validation failed for ${field.name}`,
|
|
67
|
+
});
|
|
68
|
+
// Add validator instructions as description if available
|
|
69
|
+
if (originalValidator.instructions) {
|
|
70
|
+
baseSchema = baseSchema.describe(`${baseSchema.description || ''}\nInstructions: ${originalValidator.instructions}`.trim());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return baseSchema;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Converts a DataShape to a Zod schema
|
|
77
|
+
*/
|
|
78
|
+
export function toZod(dataShape) {
|
|
79
|
+
const schemaFields = {};
|
|
80
|
+
dataShape.fields.forEach((field) => {
|
|
81
|
+
schemaFields[field.name] = fieldTypeToZodSchema(field);
|
|
82
|
+
});
|
|
83
|
+
return z.object(schemaFields).describe(`DataShape: ${dataShape.name} - Schema for card creation`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Converts a DataShape to JSON Schema string using Zod v4 native conversion
|
|
87
|
+
*/
|
|
88
|
+
export function toZodJSON(dataShape) {
|
|
89
|
+
const zodSchema = toZod(dataShape);
|
|
90
|
+
const jsonSchema = z.toJSONSchema(zodSchema);
|
|
91
|
+
return JSON.stringify(jsonSchema, null, 2);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=dataShapeToZod.js.map
|
package/dist/wire-format.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-format.d.ts","sourceRoot":"","sources":["../src/wire-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,oBAAY,MAAM;IAChB,gBAAgB,aAAa;IAC7B,EAAE,OAAO;IACT,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAE,iBAAiB,CAAC,gBAAgB,CAAC;IACzC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,OAAO,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;CACV;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAE,iBAAiB,CAAC,gBAAgB,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,IAAI,EAAE,iBAAiB,CAAC,cAAc,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;QACrD,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,OAAO,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC;CACV;AACD,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,IAAI,EAAE,iBAAiB,CAAC,eAAe,CAAC;IACxC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,KAAK,mBAAmB,GAAG,MAAM,CAAC;AAElC,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"wire-format.d.ts","sourceRoot":"","sources":["../src/wire-format.ts"],"names":[],"mappings":"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"}
|
package/dist/wire-format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-format.js","sourceRoot":"","sources":["../src/wire-format.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,MAKX;AALD,WAAY,MAAM;IAChB,uCAA6B,CAAA;IAC7B,mBAAS,CAAA;IACT,6BAAmB,CAAA;IACnB,yBAAe,CAAA;AACjB,CAAC,EALW,MAAM,KAAN,MAAM,QAKjB;
|
|
1
|
+
{"version":3,"file":"wire-format.js","sourceRoot":"","sources":["../src/wire-format.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,MAKX;AALD,WAAY,MAAM;IAChB,uCAA6B,CAAA;IAC7B,mBAAS,CAAA;IACT,6BAAmB,CAAA;IACnB,yBAAe,CAAA;AACjB,CAAC,EALW,MAAM,KAAN,MAAM,QAKjB;AAiKD,MAAM,CAAN,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,0DAAqC,CAAA;IACrC,0DAAqC,CAAA;IACrC,sDAAiC,CAAA;IACjC,wDAAmC,CAAA;IACnC,oDAA+B,CAAA;IAC/B,oDAA+B,CAAA;IAC/B,wDAAmC,CAAA;IACnC,gDAA2B,CAAA;AAC7B,CAAC,EATW,iBAAiB,KAAjB,iBAAiB,QAS5B"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.1.11-
|
|
6
|
+
"version": "0.1.11-28",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"module": "dist/index.mjs",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"typescript": "~5.7.2"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"moment": "^2.30.1"
|
|
35
|
+
"moment": "^2.30.1",
|
|
36
|
+
"zod": "^4.0.0"
|
|
36
37
|
},
|
|
37
38
|
"stableVersion": "0.1.10"
|
|
38
39
|
}
|
package/src/index.ts
CHANGED
|
@@ -17,5 +17,8 @@ export * from './interfaces/index.js';
|
|
|
17
17
|
// enums
|
|
18
18
|
export * from './enums/index.js';
|
|
19
19
|
|
|
20
|
+
// schemas
|
|
21
|
+
export * from './schemas/dataShapeToZod.js';
|
|
22
|
+
|
|
20
23
|
// docker utilities (Node.js only - not exported in main index for browser compatibility)
|
|
21
24
|
// Use explicit import: import { CouchDBManager } from '@vue-skuilder/common/docker'
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { z, ZodRawShape } from 'zod';
|
|
2
|
+
import { DataShape, FieldDefinition, FieldType, Status } from '../index.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Converts a FieldType enum to appropriate Zod schema
|
|
6
|
+
*/
|
|
7
|
+
function fieldTypeToZodSchema(field: FieldDefinition): z.ZodTypeAny {
|
|
8
|
+
let baseSchema: z.ZodTypeAny;
|
|
9
|
+
|
|
10
|
+
switch (field.type) {
|
|
11
|
+
case FieldType.STRING:
|
|
12
|
+
baseSchema = z.string().min(1, `${field.name} cannot be empty`);
|
|
13
|
+
break;
|
|
14
|
+
|
|
15
|
+
case FieldType.MARKDOWN:
|
|
16
|
+
baseSchema = z.string().min(1, `${field.name} cannot be empty`);
|
|
17
|
+
|
|
18
|
+
// Special handling for known patterns like Blanks
|
|
19
|
+
if (field.name === 'Input') {
|
|
20
|
+
baseSchema = baseSchema
|
|
21
|
+
.refine(
|
|
22
|
+
(value): value is string => typeof value === 'string' && value.includes('{{') && value.includes('}}'),
|
|
23
|
+
'Must contain at least one blank in format {{answer}} or {{answer1|answer2||distractor}}'
|
|
24
|
+
)
|
|
25
|
+
.describe(
|
|
26
|
+
"Markdown text with blanks. Format: {{answer}} for fill-in or {{answer1|answer2||distractor1|distractor2}} for multiple choice. Use the 'fill-in-card-authoring' MCP prompt for detailed syntax guidance."
|
|
27
|
+
);
|
|
28
|
+
} else {
|
|
29
|
+
baseSchema = baseSchema.describe('Markdown content');
|
|
30
|
+
}
|
|
31
|
+
break;
|
|
32
|
+
|
|
33
|
+
case FieldType.NUMBER:
|
|
34
|
+
baseSchema = z.number().describe(`Numeric value for ${field.name}`);
|
|
35
|
+
break;
|
|
36
|
+
|
|
37
|
+
case FieldType.INT:
|
|
38
|
+
baseSchema = z.number().int().describe(`Integer value for ${field.name}`);
|
|
39
|
+
break;
|
|
40
|
+
|
|
41
|
+
case FieldType.IMAGE:
|
|
42
|
+
baseSchema = z.any().optional().describe('Image file');
|
|
43
|
+
break;
|
|
44
|
+
|
|
45
|
+
case FieldType.AUDIO:
|
|
46
|
+
baseSchema = z.any().optional().describe('Audio file');
|
|
47
|
+
break;
|
|
48
|
+
|
|
49
|
+
case FieldType.MIDI:
|
|
50
|
+
baseSchema = z.any().optional().describe('MIDI file');
|
|
51
|
+
break;
|
|
52
|
+
|
|
53
|
+
case FieldType.MEDIA_UPLOADS:
|
|
54
|
+
baseSchema = z
|
|
55
|
+
.array(z.any())
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('Optional media files (images, audio, etc.)');
|
|
58
|
+
break;
|
|
59
|
+
|
|
60
|
+
case FieldType.CHESS_PUZZLE:
|
|
61
|
+
baseSchema = z
|
|
62
|
+
.string()
|
|
63
|
+
.min(1, 'Chess puzzle cannot be empty')
|
|
64
|
+
.describe('Chess puzzle in FEN or PGN format');
|
|
65
|
+
break;
|
|
66
|
+
|
|
67
|
+
default:
|
|
68
|
+
baseSchema = z.any().describe(`Field of type ${field.type}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Add custom validation if present
|
|
72
|
+
if (field.validator) {
|
|
73
|
+
const originalValidator = field.validator;
|
|
74
|
+
baseSchema = baseSchema.refine(
|
|
75
|
+
(value) => {
|
|
76
|
+
try {
|
|
77
|
+
const result = originalValidator.test(String(value));
|
|
78
|
+
return result.status === Status.ok;
|
|
79
|
+
} catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
message: originalValidator.instructions || `Validation failed for ${field.name}`,
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Add validator instructions as description if available
|
|
89
|
+
if (originalValidator.instructions) {
|
|
90
|
+
baseSchema = baseSchema.describe(
|
|
91
|
+
`${baseSchema.description || ''}\nInstructions: ${originalValidator.instructions}`.trim()
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return baseSchema;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Converts a DataShape to a Zod schema
|
|
101
|
+
*/
|
|
102
|
+
export function toZod(dataShape: DataShape): z.ZodObject<ZodRawShape> {
|
|
103
|
+
const schemaFields: Record<string, z.ZodTypeAny> = {};
|
|
104
|
+
|
|
105
|
+
dataShape.fields.forEach((field) => {
|
|
106
|
+
schemaFields[field.name] = fieldTypeToZodSchema(field);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return z.object(schemaFields).describe(`DataShape: ${dataShape.name} - Schema for card creation`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Converts a DataShape to JSON Schema string using Zod v4 native conversion
|
|
114
|
+
*/
|
|
115
|
+
export function toZodJSON(dataShape: DataShape): string {
|
|
116
|
+
const zodSchema = toZod(dataShape);
|
|
117
|
+
const jsonSchema = z.toJSONSchema(zodSchema);
|
|
118
|
+
return JSON.stringify(jsonSchema, null, 2);
|
|
119
|
+
}
|
package/src/wire-format.ts
CHANGED
|
@@ -66,6 +66,7 @@ export interface DataShape55 {
|
|
|
66
66
|
// [ ] rename this to something else - disambiguate from DataShape in base-course
|
|
67
67
|
name: NamespacedDatashape;
|
|
68
68
|
questionTypes: PouchDB.Core.DocumentId[];
|
|
69
|
+
serializedZodSchema?: string;
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
type NamespacedQuestion = string; // ${course}.question.${question}
|