@pocketlantern/schema
Advanced tools
| import { describe, it, expect } from "vitest"; | ||
| import { CardSchema, CandidateSchema } from "../card.js"; | ||
| import { cardJsonSchema, candidateJsonSchema } from "../json-schema.js"; | ||
| describe("cardJsonSchema", () => { | ||
| it("is a valid JSON Schema object with type and properties", () => { | ||
| const schema = cardJsonSchema; | ||
| const def = schema["$defs"]?.["Card"] ?? schema; | ||
| const defObj = def; | ||
| expect(defObj).toHaveProperty("type"); | ||
| expect(defObj).toHaveProperty("properties"); | ||
| function resolveSchema(raw) { | ||
| const schema = raw; | ||
| const def = schema["$defs"]?.["Card"] ?? schema; | ||
| return def; | ||
| } | ||
| describe("cardJsonSchema ↔ CardSchema sync", () => { | ||
| const jsonSchema = resolveSchema(cardJsonSchema); | ||
| const zodShape = CardSchema.shape; | ||
| it("JSON Schema properties match Zod schema fields exactly", () => { | ||
| const jsonProps = Object.keys(jsonSchema.properties).sort(); | ||
| const zodFields = Object.keys(zodShape).sort(); | ||
| expect(jsonProps).toEqual(zodFields); | ||
| }); | ||
| it("properties include all required card fields", () => { | ||
| const schema = cardJsonSchema; | ||
| const def = schema["$defs"]?.["Card"] ?? schema; | ||
| const properties = def["properties"]; | ||
| const requiredFields = ["id", "title", "problem", "candidates", "tags", "updated"]; | ||
| for (const field of requiredFields) { | ||
| expect(properties).toHaveProperty(field); | ||
| } | ||
| it("JSON Schema required fields match Zod non-optional fields", () => { | ||
| const jsonRequired = (jsonSchema.required ?? []).sort(); | ||
| const zodRequired = Object.entries(zodShape) | ||
| .filter(([, v]) => !v.isOptional?.()) | ||
| .map(([k]) => k) | ||
| .sort(); | ||
| expect(jsonRequired).toEqual(zodRequired); | ||
| }); | ||
| it("id field preserves regex pattern from Zod", () => { | ||
| const idProp = jsonSchema.properties.id; | ||
| expect(idProp.pattern).toBeDefined(); | ||
| expect(new RegExp(idProp.pattern).test("auth/jwt-vs-session")).toBe(true); | ||
| expect(new RegExp(idProp.pattern).test("BAD")).toBe(false); | ||
| }); | ||
| }); | ||
| describe("candidateJsonSchema", () => { | ||
| it("is a valid JSON Schema object with type and properties", () => { | ||
| const schema = candidateJsonSchema; | ||
| const def = schema["$defs"]?.["Candidate"] ?? schema; | ||
| const defObj = def; | ||
| expect(defObj).toHaveProperty("type"); | ||
| expect(defObj).toHaveProperty("properties"); | ||
| describe("candidateJsonSchema ↔ CandidateSchema sync", () => { | ||
| const jsonSchema = resolveSchema(candidateJsonSchema); | ||
| const zodShape = CandidateSchema.shape; | ||
| it("JSON Schema properties match Zod schema fields exactly", () => { | ||
| const jsonProps = Object.keys(jsonSchema.properties).sort(); | ||
| const zodFields = Object.keys(zodShape).sort(); | ||
| expect(jsonProps).toEqual(zodFields); | ||
| }); | ||
| it("properties include all required candidate fields", () => { | ||
| const schema = candidateJsonSchema; | ||
| const def = schema["$defs"]?.["Candidate"] ?? schema; | ||
| const properties = def["properties"]; | ||
| const requiredFields = ["name", "summary", "when_to_use", "tradeoffs", "cautions"]; | ||
| for (const field of requiredFields) { | ||
| expect(properties).toHaveProperty(field); | ||
| } | ||
| it("JSON Schema required fields match Zod non-optional fields", () => { | ||
| const jsonRequired = (jsonSchema.required ?? []).sort(); | ||
| const zodRequired = Object.entries(zodShape) | ||
| .filter(([, v]) => !v.isOptional?.()) | ||
| .map(([k]) => k) | ||
| .sort(); | ||
| expect(jsonRequired).toEqual(zodRequired); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=json-schema.test.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"json-schema.test.js","sourceRoot":"","sources":["../../src/__tests__/json-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,cAAyC,CAAC;QACzD,MAAM,GAAG,GAAI,MAAM,CAAC,OAAO,CAA6B,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAE7E,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,cAAyC,CAAC;QACzD,MAAM,GAAG,GAAI,MAAM,CAAC,OAAO,CAA6B,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAE7E,MAAM,UAAU,GAAI,GAA+B,CAAC,YAAY,CAA4B,CAAC;QAE7F,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,mBAA8C,CAAC;QAC9D,MAAM,GAAG,GAAI,MAAM,CAAC,OAAO,CAA6B,EAAE,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC;QAElF,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,mBAA8C,CAAC;QAC9D,MAAM,GAAG,GAAI,MAAM,CAAC,OAAO,CAA6B,EAAE,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC;QAElF,MAAM,UAAU,GAAI,GAA+B,CAAC,YAAY,CAA4B,CAAC;QAE7F,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACnF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"json-schema.test.js","sourceRoot":"","sources":["../../src/__tests__/json-schema.test.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "@pocketlantern/schema", | ||
| "version": "0.1.1", | ||
| "version": "0.1.2", | ||
| "type": "module", | ||
@@ -5,0 +5,0 @@ "description": "Card schema definitions for PocketLantern (zod + TypeScript)", |
| export {}; | ||
| //# sourceMappingURL=index.test.d.ts.map |
| {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""} |
| import { describe, it, expect } from "vitest"; | ||
| import * as schema from "../index.js"; | ||
| describe("index exports", () => { | ||
| it.each([ | ||
| "CardSchema", | ||
| "CandidateSchema", | ||
| "ConstraintSchema", | ||
| "CardStatusSchema", | ||
| "CardSummarySchema", | ||
| "cardJsonSchema", | ||
| "candidateJsonSchema", | ||
| ])("exports %s", (name) => { | ||
| expect(schema).toHaveProperty(name); | ||
| expect(schema[name]).toBeDefined(); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=index.test.js.map |
| {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,IAAI,CAAC;QACN,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,gBAAgB;QAChB,qBAAqB;KACtB,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAE,MAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} |
37630
-0.16%23
-14.81%508
-1.36%