@superbuilders/primer-tives 2.0.0 → 2.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 +742 -540
- package/dist/client/create.d.ts +22 -6
- package/dist/client/create.d.ts.map +1 -1
- package/dist/client/index.js +89 -51
- package/dist/client/index.js.map +14 -11
- package/dist/client/session.d.ts +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/transport.d.ts +4 -5
- package/dist/client/transport.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +3 -2
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +42 -36
- package/dist/contracts/index.js.map +6 -5
- package/dist/contracts/pci-schemas.d.ts +24 -20
- package/dist/contracts/pci-schemas.d.ts.map +1 -1
- package/dist/contracts/pci.d.ts +26 -27
- package/dist/contracts/pci.d.ts.map +1 -1
- package/dist/contracts/validation.d.ts +34 -23
- package/dist/contracts/validation.d.ts.map +1 -1
- package/dist/errors.d.ts +2 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -11
- package/dist/errors.js.map +3 -3
- package/dist/server/create-server.d.ts +3 -33
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/exchange.d.ts +7 -14
- package/dist/server/exchange.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +31 -407
- package/dist/server/index.js.map +6 -9
- package/dist/subject-pcis.d.ts +13 -0
- package/dist/subject-pcis.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +5 -1
- package/dist/server/hints.d.ts +0 -25
- package/dist/server/hints.d.ts.map +0 -1
- package/dist/server/students.d.ts +0 -12
- package/dist/server/students.d.ts.map +0 -1
package/dist/contracts/index.js
CHANGED
|
@@ -22,31 +22,44 @@ function blocksToPlainText(blocks) {
|
|
|
22
22
|
}).join(`
|
|
23
23
|
`);
|
|
24
24
|
}
|
|
25
|
+
// src/contracts/pci.ts
|
|
26
|
+
var PCI_IDS = ["urn:primer:pci:fraction-input"];
|
|
27
|
+
function isPciId(value) {
|
|
28
|
+
for (const id of PCI_IDS) {
|
|
29
|
+
if (id === value) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
25
35
|
// src/contracts/validation.ts
|
|
26
36
|
import { z as z2 } from "zod";
|
|
27
37
|
|
|
28
38
|
// src/contracts/pci-schemas.ts
|
|
29
39
|
import { z } from "zod";
|
|
30
|
-
var
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
34
|
-
var DivisionRemainderSubmissionSchema = z.object({
|
|
35
|
-
quotient: z.string(),
|
|
36
|
-
remainder: z.string()
|
|
37
|
-
});
|
|
38
|
-
var FractionOperandSchema = z.object({
|
|
39
|
-
numerator: z.number(),
|
|
40
|
-
denominator: z.number()
|
|
41
|
-
});
|
|
42
|
-
var FractionAdditionPropsSchema = z.object({
|
|
43
|
-
left: FractionOperandSchema,
|
|
44
|
-
right: FractionOperandSchema
|
|
45
|
-
});
|
|
46
|
-
var FractionAdditionSubmissionSchema = z.object({
|
|
47
|
-
numerator: z.string(),
|
|
48
|
-
denominator: z.string()
|
|
40
|
+
var FractionInputPropsSchema = z.object({
|
|
41
|
+
form: z.enum(["whole", "proper", "improper", "mixed"]),
|
|
42
|
+
requireSimplified: z.boolean()
|
|
49
43
|
});
|
|
44
|
+
var FractionInputSubmissionSchema = z.discriminatedUnion("form", [
|
|
45
|
+
z.object({ form: z.literal("whole"), whole: z.string() }),
|
|
46
|
+
z.object({
|
|
47
|
+
form: z.literal("proper"),
|
|
48
|
+
numerator: z.string(),
|
|
49
|
+
denominator: z.string()
|
|
50
|
+
}),
|
|
51
|
+
z.object({
|
|
52
|
+
form: z.literal("improper"),
|
|
53
|
+
numerator: z.string(),
|
|
54
|
+
denominator: z.string()
|
|
55
|
+
}),
|
|
56
|
+
z.object({
|
|
57
|
+
form: z.literal("mixed"),
|
|
58
|
+
whole: z.string(),
|
|
59
|
+
numerator: z.string(),
|
|
60
|
+
denominator: z.string()
|
|
61
|
+
})
|
|
62
|
+
]);
|
|
50
63
|
|
|
51
64
|
// src/contracts/validation.ts
|
|
52
65
|
var MatchPairSchema = z2.object({
|
|
@@ -73,15 +86,10 @@ var MatchSubmissionSchema = z2.object({
|
|
|
73
86
|
type: z2.literal("match"),
|
|
74
87
|
pairs: z2.array(MatchPairSchema)
|
|
75
88
|
});
|
|
76
|
-
var
|
|
77
|
-
type: z2.literal("portable-custom"),
|
|
78
|
-
pciId: z2.literal("urn:primer:pci:division-remainder"),
|
|
79
|
-
value: DivisionRemainderSubmissionSchema
|
|
80
|
-
});
|
|
81
|
-
var FractionAdditionPciSubmissionSchema = z2.object({
|
|
89
|
+
var FractionInputPciSubmissionSchema = z2.object({
|
|
82
90
|
type: z2.literal("portable-custom"),
|
|
83
|
-
pciId: z2.literal("urn:primer:pci:fraction-
|
|
84
|
-
value:
|
|
91
|
+
pciId: z2.literal("urn:primer:pci:fraction-input"),
|
|
92
|
+
value: FractionInputSubmissionSchema
|
|
85
93
|
});
|
|
86
94
|
var RendererSubmissionSchema = z2.union([
|
|
87
95
|
ChoiceSubmissionSchema,
|
|
@@ -89,8 +97,7 @@ var RendererSubmissionSchema = z2.union([
|
|
|
89
97
|
ExtendedTextSubmissionSchema,
|
|
90
98
|
OrderSubmissionSchema,
|
|
91
99
|
MatchSubmissionSchema,
|
|
92
|
-
|
|
93
|
-
FractionAdditionPciSubmissionSchema
|
|
100
|
+
FractionInputPciSubmissionSchema
|
|
94
101
|
]);
|
|
95
102
|
function duplicates(values, keyOf) {
|
|
96
103
|
const seen = new Set;
|
|
@@ -142,10 +149,8 @@ function validateUsageBounds(choices, counts, side) {
|
|
|
142
149
|
}
|
|
143
150
|
function pciSubmissionSchema(pciId) {
|
|
144
151
|
switch (pciId) {
|
|
145
|
-
case "urn:primer:pci:
|
|
146
|
-
return
|
|
147
|
-
case "urn:primer:pci:fraction-addition":
|
|
148
|
-
return FractionAdditionSubmissionSchema;
|
|
152
|
+
case "urn:primer:pci:fraction-input":
|
|
153
|
+
return FractionInputSubmissionSchema;
|
|
149
154
|
}
|
|
150
155
|
const exhaustiveCheck = pciId;
|
|
151
156
|
return exhaustiveCheck;
|
|
@@ -310,17 +315,18 @@ function submissionValidationMessage(result) {
|
|
|
310
315
|
export {
|
|
311
316
|
validateSubmissionForInteraction,
|
|
312
317
|
submissionValidationMessage,
|
|
318
|
+
isPciId,
|
|
313
319
|
inlinesToPlainText,
|
|
314
320
|
blocksToPlainText,
|
|
315
321
|
TextEntrySubmissionSchema,
|
|
316
322
|
RendererSubmissionSchema,
|
|
323
|
+
PCI_IDS,
|
|
317
324
|
OrderSubmissionSchema,
|
|
318
325
|
MatchSubmissionSchema,
|
|
319
326
|
MatchPairSchema,
|
|
320
|
-
|
|
327
|
+
FractionInputPciSubmissionSchema,
|
|
321
328
|
ExtendedTextSubmissionSchema,
|
|
322
|
-
DivisionRemainderPciSubmissionSchema,
|
|
323
329
|
ChoiceSubmissionSchema
|
|
324
330
|
};
|
|
325
331
|
|
|
326
|
-
//# debugId=
|
|
332
|
+
//# debugId=CAA0A7838A9BE23D64756E2164756E21
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/contracts/content.ts", "../src/contracts/validation.ts", "../src/contracts/pci-schemas.ts"],
|
|
3
|
+
"sources": ["../src/contracts/content.ts", "../src/contracts/pci.ts", "../src/contracts/validation.ts", "../src/contracts/pci-schemas.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"type ContentSpan = { type: \"text\"; value: string } | { type: \"italic\"; value: string }\n\ntype ContentInline = ContentSpan | { type: \"latex\"; value: string }\n\ntype ContentBlock = { type: \"paragraph\"; children: ContentInline[] }\n\nfunction inlinesToPlainText(nodes: ContentInline[]): string {\n\tconst parts: string[] = []\n\tfor (const node of nodes) {\n\t\tswitch (node.type) {\n\t\t\tcase \"text\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t\tcase \"italic\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t\tcase \"latex\":\n\t\t\t\tparts.push(node.value)\n\t\t\t\tbreak\n\t\t}\n\t}\n\treturn parts.join(\"\")\n}\n\nfunction blocksToPlainText(blocks: ContentBlock[]): string {\n\treturn blocks\n\t\t.map(function blockText(block) {\n\t\t\treturn inlinesToPlainText(block.children)\n\t\t})\n\t\t.join(\"\\n\")\n}\n\nexport type { ContentBlock, ContentInline, ContentSpan }\nexport { blocksToPlainText, inlinesToPlainText }\n",
|
|
6
|
-
"import { z } from \"zod\"\n\nimport type { PciId } from \"@superbuilders/primer-tives/contracts/pci\"\n\nimport {\n\tDivisionRemainderSubmissionSchema,\n\tFractionAdditionSubmissionSchema\n} from \"@superbuilders/primer-tives/contracts/pci-schemas\"\nimport type {\n\tMatchPair,\n\tRendererChoice,\n\tRendererInteraction,\n\tRendererMatchChoice,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/contracts/types\"\n\nconst MatchPairSchema = z.object({\n\tsource: z.string(),\n\ttarget: z.string()\n})\n\nconst ChoiceSubmissionSchema = z.object({\n\ttype: z.literal(\"choice\"),\n\tselectedKeys: z.array(z.string())\n})\n\nconst TextEntrySubmissionSchema = z.object({\n\ttype: z.literal(\"text-entry\"),\n\tvalue: z.string()\n})\n\nconst ExtendedTextSubmissionSchema = z.object({\n\ttype: z.literal(\"extended-text\"),\n\tvalues: z.array(z.string()).min(1)\n})\n\nconst OrderSubmissionSchema = z.object({\n\ttype: z.literal(\"order\"),\n\torderedKeys: z.array(z.string())\n})\n\nconst MatchSubmissionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tpairs: z.array(MatchPairSchema)\n})\n\nconst DivisionRemainderPciSubmissionSchema = z.object({\n\ttype: z.literal(\"portable-custom\"),\n\tpciId: z.literal(\"urn:primer:pci:division-remainder\"),\n\tvalue: DivisionRemainderSubmissionSchema\n})\n\nconst FractionAdditionPciSubmissionSchema = z.object({\n\ttype: z.literal(\"portable-custom\"),\n\tpciId: z.literal(\"urn:primer:pci:fraction-addition\"),\n\tvalue: FractionAdditionSubmissionSchema\n})\n\nconst RendererSubmissionSchema = z.union([\n\tChoiceSubmissionSchema,\n\tTextEntrySubmissionSchema,\n\tExtendedTextSubmissionSchema,\n\tOrderSubmissionSchema,\n\tMatchSubmissionSchema,\n\tDivisionRemainderPciSubmissionSchema,\n\tFractionAdditionPciSubmissionSchema\n])\n\nfunction duplicates<T>(values: readonly T[], keyOf: (value: T) => string): string[] {\n\tconst seen = new Set<string>()\n\tconst duplicated = new Set<string>()\n\tfor (const value of values) {\n\t\tconst key = keyOf(value)\n\t\tif (seen.has(key)) {\n\t\t\tduplicated.add(key)\n\t\t\tcontinue\n\t\t}\n\t\tseen.add(key)\n\t}\n\treturn [...duplicated]\n}\n\nfunction findUnknownIds(values: readonly string[], choices: RendererChoice[]): string[] {\n\tconst ids = new Set(\n\t\tchoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\treturn values.filter(function isUnknown(value) {\n\t\treturn !ids.has(value)\n\t})\n}\n\nfunction countByIdentifier(pairs: MatchPair[], side: \"source\" | \"target\"): Map<string, number> {\n\tconst counts = new Map<string, number>()\n\tfor (const pair of pairs) {\n\t\tconst key = pair[side]\n\t\tconst currentCount = counts.get(key)\n\t\tif (currentCount === undefined) {\n\t\t\tcounts.set(key, 1)\n\t\t\tcontinue\n\t\t}\n\t\tcounts.set(key, currentCount + 1)\n\t}\n\treturn counts\n}\n\nfunction validateUsageBounds(\n\tchoices: RendererMatchChoice[],\n\tcounts: Map<string, number>,\n\tside: \"source\" | \"target\"\n): string[] {\n\tconst issues: string[] = []\n\tfor (const choice of choices) {\n\t\tconst maybeCount = counts.get(choice.identifier)\n\t\tconst count = maybeCount === undefined ? 0 : maybeCount\n\t\tif (choice.matchMax !== 0 && count > choice.matchMax) {\n\t\t\tissues.push(`${side} '${choice.identifier}' used ${count} times, max ${choice.matchMax}`)\n\t\t}\n\t\tif (count < choice.matchMin) {\n\t\t\tissues.push(`${side} '${choice.identifier}' used ${count} times, min ${choice.matchMin}`)\n\t\t}\n\t}\n\treturn issues\n}\n\nfunction pciSubmissionSchema(pciId: PciId) {\n\tswitch (pciId) {\n\t\tcase \"urn:primer:pci:division-remainder\":\n\t\t\treturn DivisionRemainderSubmissionSchema\n\t\tcase \"urn:primer:pci:fraction-addition\":\n\t\t\treturn FractionAdditionSubmissionSchema\n\t}\n\tconst exhaustiveCheck: never = pciId\n\treturn exhaustiveCheck\n}\n\ntype SubmissionValidationSuccess = {\n\tok: true\n\tvalue: RendererSubmission\n}\n\ntype SubmissionValidationFailure = {\n\tok: false\n\tissues: readonly string[]\n}\n\ntype SubmissionValidationResult = SubmissionValidationSuccess | SubmissionValidationFailure\n\nfunction typeMismatch(interactionType: string, submissionType: string): string {\n\treturn `submission type '${submissionType}' does not match interaction type '${interactionType}'`\n}\n\nfunction buildResult(\n\tsubmission: RendererSubmission,\n\tissues: readonly string[]\n): SubmissionValidationResult {\n\tif (issues.length > 0) {\n\t\treturn { ok: false, issues }\n\t}\n\treturn { ok: true, value: submission }\n}\n\nfunction validateChoice(\n\tinteraction: Extract<RendererInteraction, { type: \"choice\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"choice\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.selectedKeys.length < interaction.minChoices) {\n\t\tissues.push(`need at least ${interaction.minChoices} selections`)\n\t}\n\tif (submission.selectedKeys.length > interaction.maxChoices) {\n\t\tissues.push(`at most ${interaction.maxChoices} selections`)\n\t}\n\tconst duplicateKeys = duplicates(submission.selectedKeys, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateKeys.length > 0) {\n\t\tissues.push(\"duplicate selections\")\n\t}\n\tconst unknownKeys = findUnknownIds(submission.selectedKeys, interaction.options)\n\tif (unknownKeys.length > 0) {\n\t\tissues.push(`unknown options: ${unknownKeys.join(\", \")}`)\n\t}\n\treturn issues\n}\n\nfunction validateExtendedText(\n\tinteraction: Extract<RendererInteraction, { type: \"extended-text\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"extended-text\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (interaction.cardinality === \"single\") {\n\t\tif (submission.values.length !== 1) {\n\t\t\tissues.push(\"single-cardinality extended-text requires exactly one value\")\n\t\t}\n\t\treturn issues\n\t}\n\tif (submission.values.length < interaction.minStrings) {\n\t\tissues.push(`need at least ${interaction.minStrings} values`)\n\t}\n\tif (submission.values.length > interaction.maxStrings) {\n\t\tissues.push(`at most ${interaction.maxStrings} values`)\n\t}\n\tconst duplicateValues = duplicates(submission.values, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateValues.length > 0) {\n\t\tissues.push(\"duplicate values are not allowed for multiple-cardinality extended-text\")\n\t}\n\treturn issues\n}\n\nfunction validateOrder(\n\tinteraction: Extract<RendererInteraction, { type: \"order\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"order\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.orderedKeys.length < interaction.minChoices) {\n\t\tissues.push(`need at least ${interaction.minChoices} selections`)\n\t}\n\tif (submission.orderedKeys.length > interaction.maxChoices) {\n\t\tissues.push(`at most ${interaction.maxChoices} selections`)\n\t}\n\tconst duplicateKeys = duplicates(submission.orderedKeys, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateKeys.length > 0) {\n\t\tissues.push(\"duplicate selections\")\n\t}\n\tconst unknownKeys = findUnknownIds(submission.orderedKeys, interaction.choices)\n\tif (unknownKeys.length > 0) {\n\t\tissues.push(`unknown choices: ${unknownKeys.join(\", \")}`)\n\t}\n\treturn issues\n}\n\nfunction validateMatch(\n\tinteraction: Extract<RendererInteraction, { type: \"match\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"match\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.pairs.length < interaction.minAssociations) {\n\t\tissues.push(`need at least ${interaction.minAssociations} associations`)\n\t}\n\tif (submission.pairs.length > interaction.maxAssociations) {\n\t\tissues.push(`at most ${interaction.maxAssociations} associations`)\n\t}\n\tconst duplicatePairs = duplicates(submission.pairs, function keyOf(pair) {\n\t\treturn `${pair.source}->${pair.target}`\n\t})\n\tif (duplicatePairs.length > 0) {\n\t\tissues.push(\"duplicate associations are not allowed\")\n\t}\n\tconst sourceIds = new Set(\n\t\tinteraction.sourceChoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\tconst targetIds = new Set(\n\t\tinteraction.targetChoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\tfor (const pair of submission.pairs) {\n\t\tif (!sourceIds.has(pair.source)) {\n\t\t\tissues.push(`unknown source '${pair.source}'`)\n\t\t}\n\t\tif (!targetIds.has(pair.target)) {\n\t\t\tissues.push(`unknown target '${pair.target}'`)\n\t\t}\n\t}\n\tconst sourceCounts = countByIdentifier(submission.pairs, \"source\")\n\tconst targetCounts = countByIdentifier(submission.pairs, \"target\")\n\tissues.push(...validateUsageBounds(interaction.sourceChoices, sourceCounts, \"source\"))\n\tissues.push(...validateUsageBounds(interaction.targetChoices, targetCounts, \"target\"))\n\treturn issues\n}\n\nfunction validatePortableCustom(\n\tinteraction: Extract<RendererInteraction, { type: \"portable-custom\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"portable-custom\" }>\n): readonly string[] {\n\tif (submission.pciId !== interaction.pciId) {\n\t\treturn [\n\t\t\t`submission PCI '${submission.pciId}' does not match interaction PCI '${interaction.pciId}'`\n\t\t]\n\t}\n\tconst schema = pciSubmissionSchema(interaction.pciId)\n\tconst result = schema.safeParse(submission.value)\n\tif (!result.success) {\n\t\treturn result.error.issues.map(function toIssue(issue) {\n\t\t\treturn issue.message\n\t\t})\n\t}\n\treturn []\n}\n\nfunction validateSubmissionForInteraction(\n\tinteraction: RendererInteraction,\n\tsubmission: RendererSubmission\n): SubmissionValidationResult {\n\tswitch (interaction.type) {\n\t\tcase \"choice\":\n\t\t\tif (submission.type !== \"choice\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateChoice(interaction, submission))\n\t\tcase \"text-entry\":\n\t\t\tif (submission.type !== \"text-entry\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn { ok: true, value: submission }\n\t\tcase \"extended-text\":\n\t\t\tif (submission.type !== \"extended-text\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateExtendedText(interaction, submission))\n\t\tcase \"order\":\n\t\t\tif (submission.type !== \"order\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateOrder(interaction, submission))\n\t\tcase \"match\":\n\t\t\tif (submission.type !== \"match\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateMatch(interaction, submission))\n\t\tcase \"portable-custom\":\n\t\t\tif (submission.type !== \"portable-custom\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validatePortableCustom(interaction, submission))\n\t}\n}\n\nfunction submissionValidationMessage(result: SubmissionValidationFailure): string {\n\treturn result.issues.join(\"; \")\n}\n\nexport {\n\tChoiceSubmissionSchema,\n\tDivisionRemainderPciSubmissionSchema,\n\tExtendedTextSubmissionSchema,\n\tFractionAdditionPciSubmissionSchema,\n\tMatchPairSchema,\n\tMatchSubmissionSchema,\n\tOrderSubmissionSchema,\n\tRendererSubmissionSchema,\n\tTextEntrySubmissionSchema,\n\tsubmissionValidationMessage,\n\tvalidateSubmissionForInteraction\n}\nexport type { SubmissionValidationFailure, SubmissionValidationResult, SubmissionValidationSuccess }\n",
|
|
7
|
-
"import { z } from \"zod\"\n\nconst DivisionRemainderPropsSchema = z.object({\n\tdividend: z.number(),\n\tdivisor: z.number()\n})\n\nconst DivisionRemainderSubmissionSchema = z.object({\n\tquotient: z.string(),\n\tremainder: z.string()\n})\n\nconst FractionOperandSchema = z.object({\n\tnumerator: z.number(),\n\tdenominator: z.number()\n})\n\nconst FractionAdditionPropsSchema = z.object({\n\tleft: FractionOperandSchema,\n\tright: FractionOperandSchema\n})\n\nconst FractionAdditionSubmissionSchema = z.object({\n\tnumerator: z.string(),\n\tdenominator: z.string()\n})\n\nexport {\n\tDivisionRemainderPropsSchema,\n\tDivisionRemainderSubmissionSchema,\n\tFractionAdditionPropsSchema,\n\tFractionAdditionSubmissionSchema\n}\n"
|
|
6
|
+
"type FractionInputForm = \"whole\" | \"proper\" | \"improper\" | \"mixed\"\n\ninterface FractionInputProps {\n\tform: FractionInputForm\n\trequireSimplified: boolean\n}\n\ntype FractionInputSubmission =\n\t| { form: \"whole\"; whole: string }\n\t| { form: \"proper\"; numerator: string; denominator: string }\n\t| { form: \"improper\"; numerator: string; denominator: string }\n\t| { form: \"mixed\"; whole: string; numerator: string; denominator: string }\n\ntype PciUrn = `urn:primer:pci:${string}`\n\nconst PCI_IDS = [\"urn:primer:pci:fraction-input\"] as const\n\ninterface PciRegistry {\n\t\"urn:primer:pci:fraction-input\": {\n\t\tprops: FractionInputProps\n\t\tvalue: FractionInputSubmission\n\t}\n}\n\ntype AssertAllPciUrns = keyof PciRegistry extends PciUrn ? true : never\nconst urnCheck: AssertAllPciUrns = true\nvoid urnCheck\n\ntype PciId = keyof PciRegistry & string\ntype PciProps<K extends PciId> = PciRegistry[K][\"props\"]\ntype PciValue<K extends PciId> = PciRegistry[K][\"value\"]\n\nfunction isPciId(value: string): value is PciId {\n\tfor (const id of PCI_IDS) {\n\t\tif (id === value) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nexport { PCI_IDS, isPciId }\n\nexport type {\n\tFractionInputForm,\n\tFractionInputProps,\n\tFractionInputSubmission,\n\tPciId,\n\tPciProps,\n\tPciRegistry,\n\tPciUrn,\n\tPciValue\n}\n",
|
|
7
|
+
"import { z } from \"zod\"\n\nimport type { PciId } from \"@superbuilders/primer-tives/contracts/pci\"\n\nimport { FractionInputSubmissionSchema } from \"@superbuilders/primer-tives/contracts/pci-schemas\"\nimport type {\n\tMatchPair,\n\tRendererChoice,\n\tRendererInteraction,\n\tRendererMatchChoice,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/contracts/types\"\n\nconst MatchPairSchema = z.object({\n\tsource: z.string(),\n\ttarget: z.string()\n})\n\nconst ChoiceSubmissionSchema = z.object({\n\ttype: z.literal(\"choice\"),\n\tselectedKeys: z.array(z.string())\n})\n\nconst TextEntrySubmissionSchema = z.object({\n\ttype: z.literal(\"text-entry\"),\n\tvalue: z.string()\n})\n\nconst ExtendedTextSubmissionSchema = z.object({\n\ttype: z.literal(\"extended-text\"),\n\tvalues: z.array(z.string()).min(1)\n})\n\nconst OrderSubmissionSchema = z.object({\n\ttype: z.literal(\"order\"),\n\torderedKeys: z.array(z.string())\n})\n\nconst MatchSubmissionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tpairs: z.array(MatchPairSchema)\n})\n\nconst FractionInputPciSubmissionSchema = z.object({\n\ttype: z.literal(\"portable-custom\"),\n\tpciId: z.literal(\"urn:primer:pci:fraction-input\"),\n\tvalue: FractionInputSubmissionSchema\n})\n\nconst RendererSubmissionSchema = z.union([\n\tChoiceSubmissionSchema,\n\tTextEntrySubmissionSchema,\n\tExtendedTextSubmissionSchema,\n\tOrderSubmissionSchema,\n\tMatchSubmissionSchema,\n\tFractionInputPciSubmissionSchema\n])\n\nfunction duplicates<T>(values: readonly T[], keyOf: (value: T) => string): string[] {\n\tconst seen = new Set<string>()\n\tconst duplicated = new Set<string>()\n\tfor (const value of values) {\n\t\tconst key = keyOf(value)\n\t\tif (seen.has(key)) {\n\t\t\tduplicated.add(key)\n\t\t\tcontinue\n\t\t}\n\t\tseen.add(key)\n\t}\n\treturn [...duplicated]\n}\n\nfunction findUnknownIds(values: readonly string[], choices: RendererChoice[]): string[] {\n\tconst ids = new Set(\n\t\tchoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\treturn values.filter(function isUnknown(value) {\n\t\treturn !ids.has(value)\n\t})\n}\n\nfunction countByIdentifier(pairs: MatchPair[], side: \"source\" | \"target\"): Map<string, number> {\n\tconst counts = new Map<string, number>()\n\tfor (const pair of pairs) {\n\t\tconst key = pair[side]\n\t\tconst currentCount = counts.get(key)\n\t\tif (currentCount === undefined) {\n\t\t\tcounts.set(key, 1)\n\t\t\tcontinue\n\t\t}\n\t\tcounts.set(key, currentCount + 1)\n\t}\n\treturn counts\n}\n\nfunction validateUsageBounds(\n\tchoices: RendererMatchChoice[],\n\tcounts: Map<string, number>,\n\tside: \"source\" | \"target\"\n): string[] {\n\tconst issues: string[] = []\n\tfor (const choice of choices) {\n\t\tconst maybeCount = counts.get(choice.identifier)\n\t\tconst count = maybeCount === undefined ? 0 : maybeCount\n\t\tif (choice.matchMax !== 0 && count > choice.matchMax) {\n\t\t\tissues.push(`${side} '${choice.identifier}' used ${count} times, max ${choice.matchMax}`)\n\t\t}\n\t\tif (count < choice.matchMin) {\n\t\t\tissues.push(`${side} '${choice.identifier}' used ${count} times, min ${choice.matchMin}`)\n\t\t}\n\t}\n\treturn issues\n}\n\nfunction pciSubmissionSchema(pciId: PciId) {\n\tswitch (pciId) {\n\t\tcase \"urn:primer:pci:fraction-input\":\n\t\t\treturn FractionInputSubmissionSchema\n\t}\n\tconst exhaustiveCheck: never = pciId\n\treturn exhaustiveCheck\n}\n\ntype SubmissionValidationSuccess = {\n\tok: true\n\tvalue: RendererSubmission\n}\n\ntype SubmissionValidationFailure = {\n\tok: false\n\tissues: readonly string[]\n}\n\ntype SubmissionValidationResult = SubmissionValidationSuccess | SubmissionValidationFailure\n\nfunction typeMismatch(interactionType: string, submissionType: string): string {\n\treturn `submission type '${submissionType}' does not match interaction type '${interactionType}'`\n}\n\nfunction buildResult(\n\tsubmission: RendererSubmission,\n\tissues: readonly string[]\n): SubmissionValidationResult {\n\tif (issues.length > 0) {\n\t\treturn { ok: false, issues }\n\t}\n\treturn { ok: true, value: submission }\n}\n\nfunction validateChoice(\n\tinteraction: Extract<RendererInteraction, { type: \"choice\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"choice\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.selectedKeys.length < interaction.minChoices) {\n\t\tissues.push(`need at least ${interaction.minChoices} selections`)\n\t}\n\tif (submission.selectedKeys.length > interaction.maxChoices) {\n\t\tissues.push(`at most ${interaction.maxChoices} selections`)\n\t}\n\tconst duplicateKeys = duplicates(submission.selectedKeys, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateKeys.length > 0) {\n\t\tissues.push(\"duplicate selections\")\n\t}\n\tconst unknownKeys = findUnknownIds(submission.selectedKeys, interaction.options)\n\tif (unknownKeys.length > 0) {\n\t\tissues.push(`unknown options: ${unknownKeys.join(\", \")}`)\n\t}\n\treturn issues\n}\n\nfunction validateExtendedText(\n\tinteraction: Extract<RendererInteraction, { type: \"extended-text\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"extended-text\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (interaction.cardinality === \"single\") {\n\t\tif (submission.values.length !== 1) {\n\t\t\tissues.push(\"single-cardinality extended-text requires exactly one value\")\n\t\t}\n\t\treturn issues\n\t}\n\tif (submission.values.length < interaction.minStrings) {\n\t\tissues.push(`need at least ${interaction.minStrings} values`)\n\t}\n\tif (submission.values.length > interaction.maxStrings) {\n\t\tissues.push(`at most ${interaction.maxStrings} values`)\n\t}\n\tconst duplicateValues = duplicates(submission.values, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateValues.length > 0) {\n\t\tissues.push(\"duplicate values are not allowed for multiple-cardinality extended-text\")\n\t}\n\treturn issues\n}\n\nfunction validateOrder(\n\tinteraction: Extract<RendererInteraction, { type: \"order\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"order\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.orderedKeys.length < interaction.minChoices) {\n\t\tissues.push(`need at least ${interaction.minChoices} selections`)\n\t}\n\tif (submission.orderedKeys.length > interaction.maxChoices) {\n\t\tissues.push(`at most ${interaction.maxChoices} selections`)\n\t}\n\tconst duplicateKeys = duplicates(submission.orderedKeys, function keyOf(value) {\n\t\treturn value\n\t})\n\tif (duplicateKeys.length > 0) {\n\t\tissues.push(\"duplicate selections\")\n\t}\n\tconst unknownKeys = findUnknownIds(submission.orderedKeys, interaction.choices)\n\tif (unknownKeys.length > 0) {\n\t\tissues.push(`unknown choices: ${unknownKeys.join(\", \")}`)\n\t}\n\treturn issues\n}\n\nfunction validateMatch(\n\tinteraction: Extract<RendererInteraction, { type: \"match\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"match\" }>\n): readonly string[] {\n\tconst issues: string[] = []\n\tif (submission.pairs.length < interaction.minAssociations) {\n\t\tissues.push(`need at least ${interaction.minAssociations} associations`)\n\t}\n\tif (submission.pairs.length > interaction.maxAssociations) {\n\t\tissues.push(`at most ${interaction.maxAssociations} associations`)\n\t}\n\tconst duplicatePairs = duplicates(submission.pairs, function keyOf(pair) {\n\t\treturn `${pair.source}->${pair.target}`\n\t})\n\tif (duplicatePairs.length > 0) {\n\t\tissues.push(\"duplicate associations are not allowed\")\n\t}\n\tconst sourceIds = new Set(\n\t\tinteraction.sourceChoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\tconst targetIds = new Set(\n\t\tinteraction.targetChoices.map(function getId(choice) {\n\t\t\treturn choice.identifier\n\t\t})\n\t)\n\tfor (const pair of submission.pairs) {\n\t\tif (!sourceIds.has(pair.source)) {\n\t\t\tissues.push(`unknown source '${pair.source}'`)\n\t\t}\n\t\tif (!targetIds.has(pair.target)) {\n\t\t\tissues.push(`unknown target '${pair.target}'`)\n\t\t}\n\t}\n\tconst sourceCounts = countByIdentifier(submission.pairs, \"source\")\n\tconst targetCounts = countByIdentifier(submission.pairs, \"target\")\n\tissues.push(...validateUsageBounds(interaction.sourceChoices, sourceCounts, \"source\"))\n\tissues.push(...validateUsageBounds(interaction.targetChoices, targetCounts, \"target\"))\n\treturn issues\n}\n\nfunction validatePortableCustom(\n\tinteraction: Extract<RendererInteraction, { type: \"portable-custom\" }>,\n\tsubmission: Extract<RendererSubmission, { type: \"portable-custom\" }>\n): readonly string[] {\n\tif (submission.pciId !== interaction.pciId) {\n\t\treturn [\n\t\t\t`submission PCI '${submission.pciId}' does not match interaction PCI '${interaction.pciId}'`\n\t\t]\n\t}\n\tconst schema = pciSubmissionSchema(interaction.pciId)\n\tconst result = schema.safeParse(submission.value)\n\tif (!result.success) {\n\t\treturn result.error.issues.map(function toIssue(issue) {\n\t\t\treturn issue.message\n\t\t})\n\t}\n\treturn []\n}\n\nfunction validateSubmissionForInteraction(\n\tinteraction: RendererInteraction,\n\tsubmission: RendererSubmission\n): SubmissionValidationResult {\n\tswitch (interaction.type) {\n\t\tcase \"choice\":\n\t\t\tif (submission.type !== \"choice\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateChoice(interaction, submission))\n\t\tcase \"text-entry\":\n\t\t\tif (submission.type !== \"text-entry\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn { ok: true, value: submission }\n\t\tcase \"extended-text\":\n\t\t\tif (submission.type !== \"extended-text\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateExtendedText(interaction, submission))\n\t\tcase \"order\":\n\t\t\tif (submission.type !== \"order\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateOrder(interaction, submission))\n\t\tcase \"match\":\n\t\t\tif (submission.type !== \"match\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validateMatch(interaction, submission))\n\t\tcase \"portable-custom\":\n\t\t\tif (submission.type !== \"portable-custom\") {\n\t\t\t\treturn { ok: false, issues: [typeMismatch(interaction.type, submission.type)] }\n\t\t\t}\n\t\t\treturn buildResult(submission, validatePortableCustom(interaction, submission))\n\t}\n}\n\nfunction submissionValidationMessage(result: SubmissionValidationFailure): string {\n\treturn result.issues.join(\"; \")\n}\n\nexport {\n\tChoiceSubmissionSchema,\n\tExtendedTextSubmissionSchema,\n\tFractionInputPciSubmissionSchema,\n\tMatchPairSchema,\n\tMatchSubmissionSchema,\n\tOrderSubmissionSchema,\n\tRendererSubmissionSchema,\n\tTextEntrySubmissionSchema,\n\tsubmissionValidationMessage,\n\tvalidateSubmissionForInteraction\n}\nexport type { SubmissionValidationFailure, SubmissionValidationResult, SubmissionValidationSuccess }\n",
|
|
8
|
+
"import { z } from \"zod\"\n\nconst FractionInputPropsSchema = z.object({\n\tform: z.enum([\"whole\", \"proper\", \"improper\", \"mixed\"]),\n\trequireSimplified: z.boolean()\n})\n\nconst FractionInputSubmissionSchema = z.discriminatedUnion(\"form\", [\n\tz.object({ form: z.literal(\"whole\"), whole: z.string() }),\n\tz.object({\n\t\tform: z.literal(\"proper\"),\n\t\tnumerator: z.string(),\n\t\tdenominator: z.string()\n\t}),\n\tz.object({\n\t\tform: z.literal(\"improper\"),\n\t\tnumerator: z.string(),\n\t\tdenominator: z.string()\n\t}),\n\tz.object({\n\t\tform: z.literal(\"mixed\"),\n\t\twhole: z.string(),\n\t\tnumerator: z.string(),\n\t\tdenominator: z.string()\n\t})\n])\n\nexport { FractionInputPropsSchema, FractionInputSubmissionSchema }\n"
|
|
8
9
|
],
|
|
9
|
-
"mappings": ";AAMA,SAAS,kBAAkB,CAAC,OAAgC;AAAA,EAC3D,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,QAAQ,OAAO;AAAA,IACzB,QAAQ,KAAK;AAAA,WACP;AAAA,QACJ,MAAM,KAAK,KAAK,KAAK;AAAA,QACrB;AAAA,WACI;AAAA,QACJ,MAAM,KAAK,KAAK,KAAK;AAAA,QACrB;AAAA,WACI;AAAA,QACJ,MAAM,KAAK,KAAK,KAAK;AAAA,QACrB;AAAA;AAAA,EAEH;AAAA,EACA,OAAO,MAAM,KAAK,EAAE;AAAA;AAGrB,SAAS,iBAAiB,CAAC,QAAgC;AAAA,EAC1D,OAAO,OACL,IAAI,SAAS,SAAS,CAAC,OAAO;AAAA,IAC9B,OAAO,mBAAmB,MAAM,QAAQ;AAAA,GACxC,EACA,KAAK;AAAA,CAAI;AAAA;;
|
|
10
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "CAA0A7838A9BE23D64756E2164756E21",
|
|
11
12
|
"names": []
|
|
12
13
|
}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
declare const
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
declare const FractionInputPropsSchema: z.ZodObject<{
|
|
3
|
+
form: z.ZodEnum<{
|
|
4
|
+
whole: "whole";
|
|
5
|
+
proper: "proper";
|
|
6
|
+
improper: "improper";
|
|
7
|
+
mixed: "mixed";
|
|
8
|
+
}>;
|
|
9
|
+
requireSimplified: z.ZodBoolean;
|
|
5
10
|
}, z.core.$strip>;
|
|
6
|
-
declare const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}, z.core.$strip
|
|
10
|
-
|
|
11
|
-
left: z.ZodObject<{
|
|
12
|
-
numerator: z.ZodNumber;
|
|
13
|
-
denominator: z.ZodNumber;
|
|
14
|
-
}, z.core.$strip>;
|
|
15
|
-
right: z.ZodObject<{
|
|
16
|
-
numerator: z.ZodNumber;
|
|
17
|
-
denominator: z.ZodNumber;
|
|
18
|
-
}, z.core.$strip>;
|
|
19
|
-
}, z.core.$strip>;
|
|
20
|
-
declare const FractionAdditionSubmissionSchema: z.ZodObject<{
|
|
11
|
+
declare const FractionInputSubmissionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
12
|
+
form: z.ZodLiteral<"whole">;
|
|
13
|
+
whole: z.ZodString;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
form: z.ZodLiteral<"proper">;
|
|
21
16
|
numerator: z.ZodString;
|
|
22
17
|
denominator: z.ZodString;
|
|
23
|
-
}, z.core.$strip
|
|
24
|
-
|
|
18
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
19
|
+
form: z.ZodLiteral<"improper">;
|
|
20
|
+
numerator: z.ZodString;
|
|
21
|
+
denominator: z.ZodString;
|
|
22
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
23
|
+
form: z.ZodLiteral<"mixed">;
|
|
24
|
+
whole: z.ZodString;
|
|
25
|
+
numerator: z.ZodString;
|
|
26
|
+
denominator: z.ZodString;
|
|
27
|
+
}, z.core.$strip>], "form">;
|
|
28
|
+
export { FractionInputPropsSchema, FractionInputSubmissionSchema };
|
|
25
29
|
//# sourceMappingURL=pci-schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pci-schemas.d.ts","sourceRoot":"","sources":["../../src/contracts/pci-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,QAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"pci-schemas.d.ts","sourceRoot":"","sources":["../../src/contracts/pci-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,QAAA,MAAM,wBAAwB;;;;;;;;iBAG5B,CAAA;AAEF,QAAA,MAAM,6BAA6B;;;;;;;;;;;;;;;;2BAkBjC,CAAA;AAEF,OAAO,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,CAAA"}
|
package/dist/contracts/pci.d.ts
CHANGED
|
@@ -1,38 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
type FractionInputForm = "whole" | "proper" | "improper" | "mixed";
|
|
2
|
+
interface FractionInputProps {
|
|
3
|
+
form: FractionInputForm;
|
|
4
|
+
requireSimplified: boolean;
|
|
4
5
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
left: {
|
|
11
|
-
numerator: number;
|
|
12
|
-
denominator: number;
|
|
13
|
-
};
|
|
14
|
-
right: {
|
|
15
|
-
numerator: number;
|
|
16
|
-
denominator: number;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
interface FractionAdditionSubmission {
|
|
6
|
+
type FractionInputSubmission = {
|
|
7
|
+
form: "whole";
|
|
8
|
+
whole: string;
|
|
9
|
+
} | {
|
|
10
|
+
form: "proper";
|
|
20
11
|
numerator: string;
|
|
21
12
|
denominator: string;
|
|
22
|
-
}
|
|
13
|
+
} | {
|
|
14
|
+
form: "improper";
|
|
15
|
+
numerator: string;
|
|
16
|
+
denominator: string;
|
|
17
|
+
} | {
|
|
18
|
+
form: "mixed";
|
|
19
|
+
whole: string;
|
|
20
|
+
numerator: string;
|
|
21
|
+
denominator: string;
|
|
22
|
+
};
|
|
23
23
|
type PciUrn = `urn:primer:pci:${string}`;
|
|
24
|
+
declare const PCI_IDS: readonly ["urn:primer:pci:fraction-input"];
|
|
24
25
|
interface PciRegistry {
|
|
25
|
-
"urn:primer:pci:
|
|
26
|
-
props:
|
|
27
|
-
value:
|
|
28
|
-
};
|
|
29
|
-
"urn:primer:pci:fraction-addition": {
|
|
30
|
-
props: FractionAdditionProps;
|
|
31
|
-
value: FractionAdditionSubmission;
|
|
26
|
+
"urn:primer:pci:fraction-input": {
|
|
27
|
+
props: FractionInputProps;
|
|
28
|
+
value: FractionInputSubmission;
|
|
32
29
|
};
|
|
33
30
|
}
|
|
34
31
|
type PciId = keyof PciRegistry & string;
|
|
35
32
|
type PciProps<K extends PciId> = PciRegistry[K]["props"];
|
|
36
33
|
type PciValue<K extends PciId> = PciRegistry[K]["value"];
|
|
37
|
-
|
|
34
|
+
declare function isPciId(value: string): value is PciId;
|
|
35
|
+
export { PCI_IDS, isPciId };
|
|
36
|
+
export type { FractionInputForm, FractionInputProps, FractionInputSubmission, PciId, PciProps, PciRegistry, PciUrn, PciValue };
|
|
38
37
|
//# sourceMappingURL=pci.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pci.d.ts","sourceRoot":"","sources":["../../src/contracts/pci.ts"],"names":[],"mappings":"AAAA,UAAU,
|
|
1
|
+
{"version":3,"file":"pci.d.ts","sourceRoot":"","sources":["../../src/contracts/pci.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;AAElE,UAAU,kBAAkB;IAC3B,IAAI,EAAE,iBAAiB,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;CAC1B;AAED,KAAK,uBAAuB,GACzB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3E,KAAK,MAAM,GAAG,kBAAkB,MAAM,EAAE,CAAA;AAExC,QAAA,MAAM,OAAO,4CAA6C,CAAA;AAE1D,UAAU,WAAW;IACpB,+BAA+B,EAAE;QAChC,KAAK,EAAE,kBAAkB,CAAA;QACzB,KAAK,EAAE,uBAAuB,CAAA;KAC9B,CAAA;CACD;AAMD,KAAK,KAAK,GAAG,MAAM,WAAW,GAAG,MAAM,CAAA;AACvC,KAAK,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACxD,KAAK,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAExD,iBAAS,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAO9C;AAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAE3B,YAAY,EACX,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,EACR,CAAA"}
|
|
@@ -27,21 +27,26 @@ declare const MatchSubmissionSchema: z.ZodObject<{
|
|
|
27
27
|
target: z.ZodString;
|
|
28
28
|
}, z.core.$strip>>;
|
|
29
29
|
}, z.core.$strip>;
|
|
30
|
-
declare const
|
|
30
|
+
declare const FractionInputPciSubmissionSchema: z.ZodObject<{
|
|
31
31
|
type: z.ZodLiteral<"portable-custom">;
|
|
32
|
-
pciId: z.ZodLiteral<"urn:primer:pci:
|
|
33
|
-
value: z.ZodObject<{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}, z.core.$strip
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
pciId: z.ZodLiteral<"urn:primer:pci:fraction-input">;
|
|
33
|
+
value: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
34
|
+
form: z.ZodLiteral<"whole">;
|
|
35
|
+
whole: z.ZodString;
|
|
36
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
37
|
+
form: z.ZodLiteral<"proper">;
|
|
38
|
+
numerator: z.ZodString;
|
|
39
|
+
denominator: z.ZodString;
|
|
40
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
41
|
+
form: z.ZodLiteral<"improper">;
|
|
42
|
+
numerator: z.ZodString;
|
|
43
|
+
denominator: z.ZodString;
|
|
44
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
45
|
+
form: z.ZodLiteral<"mixed">;
|
|
46
|
+
whole: z.ZodString;
|
|
42
47
|
numerator: z.ZodString;
|
|
43
48
|
denominator: z.ZodString;
|
|
44
|
-
}, z.core.$strip>;
|
|
49
|
+
}, z.core.$strip>], "form">;
|
|
45
50
|
}, z.core.$strip>;
|
|
46
51
|
declare const RendererSubmissionSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
47
52
|
type: z.ZodLiteral<"choice">;
|
|
@@ -63,18 +68,24 @@ declare const RendererSubmissionSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
63
68
|
}, z.core.$strip>>;
|
|
64
69
|
}, z.core.$strip>, z.ZodObject<{
|
|
65
70
|
type: z.ZodLiteral<"portable-custom">;
|
|
66
|
-
pciId: z.ZodLiteral<"urn:primer:pci:
|
|
67
|
-
value: z.ZodObject<{
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}, z.core.$strip
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
pciId: z.ZodLiteral<"urn:primer:pci:fraction-input">;
|
|
72
|
+
value: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
73
|
+
form: z.ZodLiteral<"whole">;
|
|
74
|
+
whole: z.ZodString;
|
|
75
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
76
|
+
form: z.ZodLiteral<"proper">;
|
|
77
|
+
numerator: z.ZodString;
|
|
78
|
+
denominator: z.ZodString;
|
|
79
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
80
|
+
form: z.ZodLiteral<"improper">;
|
|
81
|
+
numerator: z.ZodString;
|
|
82
|
+
denominator: z.ZodString;
|
|
83
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
84
|
+
form: z.ZodLiteral<"mixed">;
|
|
85
|
+
whole: z.ZodString;
|
|
75
86
|
numerator: z.ZodString;
|
|
76
87
|
denominator: z.ZodString;
|
|
77
|
-
}, z.core.$strip>;
|
|
88
|
+
}, z.core.$strip>], "form">;
|
|
78
89
|
}, z.core.$strip>]>;
|
|
79
90
|
type SubmissionValidationSuccess = {
|
|
80
91
|
ok: true;
|
|
@@ -87,6 +98,6 @@ type SubmissionValidationFailure = {
|
|
|
87
98
|
type SubmissionValidationResult = SubmissionValidationSuccess | SubmissionValidationFailure;
|
|
88
99
|
declare function validateSubmissionForInteraction(interaction: RendererInteraction, submission: RendererSubmission): SubmissionValidationResult;
|
|
89
100
|
declare function submissionValidationMessage(result: SubmissionValidationFailure): string;
|
|
90
|
-
export { ChoiceSubmissionSchema,
|
|
101
|
+
export { ChoiceSubmissionSchema, ExtendedTextSubmissionSchema, FractionInputPciSubmissionSchema, MatchPairSchema, MatchSubmissionSchema, OrderSubmissionSchema, RendererSubmissionSchema, TextEntrySubmissionSchema, submissionValidationMessage, validateSubmissionForInteraction };
|
|
91
102
|
export type { SubmissionValidationFailure, SubmissionValidationResult, SubmissionValidationSuccess };
|
|
92
103
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/contracts/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/contracts/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,OAAO,KAAK,EAGX,mBAAmB,EAEnB,kBAAkB,EAClB,MAAM,6CAA6C,CAAA;AAEpD,QAAA,MAAM,eAAe;;;iBAGnB,CAAA;AAEF,QAAA,MAAM,sBAAsB;;;iBAG1B,CAAA;AAEF,QAAA,MAAM,yBAAyB;;;iBAG7B,CAAA;AAEF,QAAA,MAAM,4BAA4B;;;iBAGhC,CAAA;AAEF,QAAA,MAAM,qBAAqB;;;iBAGzB,CAAA;AAEF,QAAA,MAAM,qBAAqB;;;;;;iBAGzB,CAAA;AAEF,QAAA,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;iBAIpC,CAAA;AAEF,QAAA,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAO5B,CAAA;AAqEF,KAAK,2BAA2B,GAAG;IAClC,EAAE,EAAE,IAAI,CAAA;IACR,KAAK,EAAE,kBAAkB,CAAA;CACzB,CAAA;AAED,KAAK,2BAA2B,GAAG;IAClC,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACzB,CAAA;AAED,KAAK,0BAA0B,GAAG,2BAA2B,GAAG,2BAA2B,CAAA;AAuJ3F,iBAAS,gCAAgC,CACxC,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,kBAAkB,GAC5B,0BAA0B,CAiC5B;AAED,iBAAS,2BAA2B,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAEhF;AAED,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,gCAAgC,EAChC,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,gCAAgC,EAChC,CAAA;AACD,YAAY,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,CAAA"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
declare const ErrNetwork: Error;
|
|
2
2
|
declare const ErrJsonParse: Error;
|
|
3
3
|
declare const ErrUnsupportedPci: Error;
|
|
4
|
+
declare const ErrMissingRequiredPci: Error;
|
|
4
5
|
declare const ErrInvalidAccessToken: Error;
|
|
5
6
|
declare const ErrMalformedAccessToken: Error;
|
|
6
7
|
declare const ErrTokenExpired: Error;
|
|
@@ -10,16 +11,11 @@ declare const ErrTimeout: Error;
|
|
|
10
11
|
declare const ErrForbidden: Error;
|
|
11
12
|
declare const ErrNotFound: Error;
|
|
12
13
|
declare const ErrConflict: Error;
|
|
13
|
-
declare const ErrExternalAuthorityRequired: Error;
|
|
14
14
|
declare const ErrRateLimited: Error;
|
|
15
15
|
declare const ErrServiceUnavailable: Error;
|
|
16
16
|
declare const ErrNotSerializable: Error;
|
|
17
17
|
declare const ErrInvalidSubmission: Error;
|
|
18
18
|
declare const ErrInvalidSecretKey: Error;
|
|
19
|
-
declare const ErrStudentNotFound: Error;
|
|
20
|
-
declare const ErrUnsupportedGrade: Error;
|
|
21
|
-
declare const ErrTimebackUnavailable: Error;
|
|
22
|
-
declare const ErrNeedsHints: Error;
|
|
23
19
|
declare const ErrSdkUpgradeRequired: Error;
|
|
24
|
-
export { ErrBadRequest, ErrConflict,
|
|
20
|
+
export { ErrBadRequest, ErrConflict, ErrForbidden, ErrInvalidAccessToken, ErrInvalidSecretKey, ErrInvalidSubmission, ErrJsonParse, ErrMalformedAccessToken, ErrMissingRequiredPci, ErrNetwork, ErrNotFound, ErrNotSerializable, ErrRateLimited, ErrSdkUpgradeRequired, ErrServerError, ErrServiceUnavailable, ErrTimeout, ErrTokenExpired, ErrUnsupportedPci };
|
|
25
21
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA2B,CAAA;AAC7C,QAAA,MAAM,iBAAiB,OAAgC,CAAA;AACvD,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAChE,QAAA,MAAM,uBAAuB,OAAuC,CAAA;AACpE,QAAA,MAAM,eAAe,OAAqC,CAAA;AAC1D,QAAA,MAAM,aAAa,OAA4B,CAAA;AAC/C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA0B,CAAA;AAC5C,QAAA,MAAM,WAAW,OAA0B,CAAA;AAC3C,QAAA,MAAM,WAAW,OAAyB,CAAA;AAC1C,QAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA2B,CAAA;AAC7C,QAAA,MAAM,iBAAiB,OAAgC,CAAA;AACvD,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAChE,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAChE,QAAA,MAAM,uBAAuB,OAAuC,CAAA;AACpE,QAAA,MAAM,eAAe,OAAqC,CAAA;AAC1D,QAAA,MAAM,aAAa,OAA4B,CAAA;AAC/C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA0B,CAAA;AAC5C,QAAA,MAAM,WAAW,OAA0B,CAAA;AAC3C,QAAA,MAAM,WAAW,OAAyB,CAAA;AAC1C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,qBAAqB,OAAoC,CAAA;AAC/D,QAAA,MAAM,kBAAkB,OAEvB,CAAA;AACD,QAAA,MAAM,oBAAoB,OAAmC,CAAA;AAE7D,QAAA,MAAM,mBAAmB,OAAmC,CAAA;AAC5D,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAEhE,OAAO,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,CAAA"}
|
package/dist/errors.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as errors from "@superbuilders/errors";
|
|
|
3
3
|
var ErrNetwork = errors.new("network");
|
|
4
4
|
var ErrJsonParse = errors.new("json parse");
|
|
5
5
|
var ErrUnsupportedPci = errors.new("unsupported pci");
|
|
6
|
+
var ErrMissingRequiredPci = errors.new("missing required pci");
|
|
6
7
|
var ErrInvalidAccessToken = errors.new("invalid access token");
|
|
7
8
|
var ErrMalformedAccessToken = errors.new("malformed access token");
|
|
8
9
|
var ErrTokenExpired = errors.new("access token expired");
|
|
@@ -12,24 +13,16 @@ var ErrTimeout = errors.new("timeout");
|
|
|
12
13
|
var ErrForbidden = errors.new("forbidden");
|
|
13
14
|
var ErrNotFound = errors.new("not found");
|
|
14
15
|
var ErrConflict = errors.new("conflict");
|
|
15
|
-
var ErrExternalAuthorityRequired = errors.new("external authority required");
|
|
16
16
|
var ErrRateLimited = errors.new("rate limited");
|
|
17
17
|
var ErrServiceUnavailable = errors.new("service unavailable");
|
|
18
18
|
var ErrNotSerializable = errors.new("PrimerState is live in-memory state and must not be serialized or stored");
|
|
19
19
|
var ErrInvalidSubmission = errors.new("invalid submission");
|
|
20
20
|
var ErrInvalidSecretKey = errors.new("invalid secret key");
|
|
21
|
-
var ErrStudentNotFound = errors.new("student not found");
|
|
22
|
-
var ErrUnsupportedGrade = errors.new("unsupported grade");
|
|
23
|
-
var ErrTimebackUnavailable = errors.new("timeback unavailable");
|
|
24
|
-
var ErrNeedsHints = errors.new("student needs hints set before /advance");
|
|
25
21
|
var ErrSdkUpgradeRequired = errors.new("sdk upgrade required");
|
|
26
22
|
export {
|
|
27
23
|
ErrUnsupportedPci,
|
|
28
|
-
ErrUnsupportedGrade,
|
|
29
24
|
ErrTokenExpired,
|
|
30
25
|
ErrTimeout,
|
|
31
|
-
ErrTimebackUnavailable,
|
|
32
|
-
ErrStudentNotFound,
|
|
33
26
|
ErrServiceUnavailable,
|
|
34
27
|
ErrServerError,
|
|
35
28
|
ErrSdkUpgradeRequired,
|
|
@@ -37,16 +30,15 @@ export {
|
|
|
37
30
|
ErrNotSerializable,
|
|
38
31
|
ErrNotFound,
|
|
39
32
|
ErrNetwork,
|
|
40
|
-
|
|
33
|
+
ErrMissingRequiredPci,
|
|
41
34
|
ErrMalformedAccessToken,
|
|
42
35
|
ErrJsonParse,
|
|
43
36
|
ErrInvalidSubmission,
|
|
44
37
|
ErrInvalidSecretKey,
|
|
45
38
|
ErrInvalidAccessToken,
|
|
46
39
|
ErrForbidden,
|
|
47
|
-
ErrExternalAuthorityRequired,
|
|
48
40
|
ErrConflict,
|
|
49
41
|
ErrBadRequest
|
|
50
42
|
};
|
|
51
43
|
|
|
52
|
-
//# debugId=
|
|
44
|
+
//# debugId=D51B1F012B867B6764756E2164756E21
|
package/dist/errors.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/errors.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst
|
|
5
|
+
"import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrMissingRequiredPci = errors.new(\"missing required pci\")\nconst ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst ErrRateLimited = errors.new(\"rate limited\")\nconst ErrServiceUnavailable = errors.new(\"service unavailable\")\nconst ErrNotSerializable = errors.new(\n\t\"PrimerState is live in-memory state and must not be serialized or stored\"\n)\nconst ErrInvalidSubmission = errors.new(\"invalid submission\")\n\nconst ErrInvalidSecretKey = errors.new(\"invalid secret key\")\nconst ErrSdkUpgradeRequired = errors.new(\"sdk upgrade required\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrMissingRequiredPci,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrSdkUpgradeRequired,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedPci\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AAAA;AAEA,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,YAAY;AAC5C,IAAM,oBAA2B,WAAI,iBAAiB;AACtD,IAAM,wBAA+B,WAAI,sBAAsB;AAC/D,IAAM,0BAAiC,WAAI,wBAAwB;AACnE,IAAM,kBAAyB,WAAI,sBAAsB;AACzD,IAAM,gBAAuB,WAAI,aAAa;AAC9C,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,WAAW;AAC3C,IAAM,cAAqB,WAAI,WAAW;AAC1C,IAAM,cAAqB,WAAI,UAAU;AACzC,IAAM
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAAA;AAEA,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,YAAY;AAC5C,IAAM,oBAA2B,WAAI,iBAAiB;AACtD,IAAM,wBAA+B,WAAI,sBAAsB;AAC/D,IAAM,wBAA+B,WAAI,sBAAsB;AAC/D,IAAM,0BAAiC,WAAI,wBAAwB;AACnE,IAAM,kBAAyB,WAAI,sBAAsB;AACzD,IAAM,gBAAuB,WAAI,aAAa;AAC9C,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,WAAW;AAC3C,IAAM,cAAqB,WAAI,WAAW;AAC1C,IAAM,cAAqB,WAAI,UAAU;AACzC,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,wBAA+B,WAAI,qBAAqB;AAC9D,IAAM,qBAA4B,WACjC,0EACD;AACA,IAAM,uBAA8B,WAAI,oBAAoB;AAE5D,IAAM,sBAA6B,WAAI,oBAAoB;AAC3D,IAAM,wBAA+B,WAAI,sBAAsB;",
|
|
8
|
+
"debugId": "D51B1F012B867B6764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { PrimerLogger } from "../logger";
|
|
2
|
-
import { type
|
|
3
|
-
import { type PlacementHints, type PlacementHintsResult } from "./hints";
|
|
2
|
+
import { type GetTokenInput } from "./exchange";
|
|
4
3
|
interface PrimerServerConfig {
|
|
5
4
|
readonly origin: string;
|
|
6
5
|
readonly secretKey: string;
|
|
@@ -9,38 +8,9 @@ interface PrimerServerConfig {
|
|
|
9
8
|
readonly logger: PrimerLogger;
|
|
10
9
|
}
|
|
11
10
|
interface PrimerServer {
|
|
12
|
-
|
|
13
|
-
* Provisions a frontend-owned Primer student and returns the stable
|
|
14
|
-
* student id you persist in your own DB keyed by your user. Pure
|
|
15
|
-
* identity — the student has no hints and no placements yet. Call
|
|
16
|
-
* `setStudentHints(studentId, { gradeLevel })` before the student's
|
|
17
|
-
* first `/advance`. If a session calls `/advance` without hints set,
|
|
18
|
-
* the server returns 412 `needs_hints` (surfaced as `ErrNeedsHints`
|
|
19
|
-
* in the browser SDK).
|
|
20
|
-
*/
|
|
21
|
-
createStudent(): Promise<string>;
|
|
22
|
-
/**
|
|
23
|
-
* Partial update of a student's placement-routing hints. Pass only
|
|
24
|
-
* the fields you want to set; omitted fields are left untouched.
|
|
25
|
-
* Returns the persisted state after upsert. Today the only hint is
|
|
26
|
-
* `gradeLevel`; future hint kinds (raw context, interests, etc.)
|
|
27
|
-
* will appear as additional optional fields.
|
|
28
|
-
*/
|
|
29
|
-
setStudentHints(studentId: string, hints: PlacementHints): Promise<PlacementHintsResult>;
|
|
30
|
-
/**
|
|
31
|
-
* Exchanges a frontend-owned native/manual student id for a short-lived
|
|
32
|
-
* access token. Pass `accessToken` from the returned `SessionToken` to
|
|
33
|
-
* `create()` on the browser SDK.
|
|
34
|
-
*/
|
|
35
|
-
exchangeStudentForAccessToken(studentId: string): Promise<SessionToken>;
|
|
36
|
-
/**
|
|
37
|
-
* Verifies the learner against live Timeback authority, resolves or
|
|
38
|
-
* provisions the corresponding frontend-owned Primer student, and
|
|
39
|
-
* returns both the stable student id and a short-lived access token.
|
|
40
|
-
*/
|
|
41
|
-
exchangeTimebackStudentForAccessToken(sourcedId: string): Promise<TimebackSession>;
|
|
11
|
+
getToken(input: GetTokenInput): Promise<string>;
|
|
42
12
|
}
|
|
43
13
|
declare function createPrimerServer(config: PrimerServerConfig): PrimerServer;
|
|
44
|
-
export type { PrimerServer, PrimerServerConfig };
|
|
14
|
+
export type { GetTokenInput, PrimerServer, PrimerServerConfig };
|
|
45
15
|
export { createPrimerServer };
|
|
46
16
|
//# sourceMappingURL=create-server.d.ts.map
|