@timeback/qti 0.1.4 → 0.1.5

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 CHANGED
@@ -642,7 +642,26 @@ declare const QtiPaginationParams = z
642
642
  // ASSESSMENT ITEMS (REQUEST INPUTS)
643
643
  // ═══════════════════════════════════════════════════════════════════════════════
644
644
 
645
- declare const QtiAssessmentItemCreateInput = z
645
+ /**
646
+ * XML-format creation input.
647
+ *
648
+ * The preferred way to create assessment items — send raw QTI 3.0 XML and the
649
+ * server validates it against IMS QTI XSDs.
650
+ */
651
+ declare const QtiAssessmentItemXmlCreateInput = z
652
+ .object({
653
+ format: z.string().pipe(z.literal('xml')),
654
+ xml: z.string().min(1),
655
+ metadata: QtiItemMetadata.optional(),
656
+ })
657
+ .strict()
658
+
659
+ /**
660
+ * JSON-format creation input (experimental on the server side).
661
+ *
662
+ * Sends a structured/parsed representation of a QTI item.
663
+ */
664
+ declare const QtiAssessmentItemJsonCreateInput = z
646
665
  .object({
647
666
  identifier: z.string().min(1),
648
667
  title: z.string().min(1),
@@ -660,6 +679,17 @@ declare const QtiAssessmentItemCreateInput = z
660
679
  })
661
680
  .strict()
662
681
 
682
+ /**
683
+ * Union of XML and JSON creation inputs for assessment items.
684
+ *
685
+ * Accepts either `{ format: 'xml', xml, metadata? }` or the structured JSON
686
+ * shape with `{ identifier, title, type, ... }`.
687
+ */
688
+ declare const QtiAssessmentItemCreateInput = z.union([
689
+ QtiAssessmentItemXmlCreateInput,
690
+ QtiAssessmentItemJsonCreateInput,
691
+ ])
692
+
663
693
  declare const QtiAssessmentItemUpdateInput = z
664
694
  .object({
665
695
  identifier: z.string().min(1).optional(),
@@ -713,9 +743,9 @@ declare const QtiAssessmentSection = z
713
743
  declare const QtiTestPart = z
714
744
  .object({
715
745
  identifier: z.string().min(1),
716
- navigationMode: QtiNavigationMode,
717
- submissionMode: QtiSubmissionMode,
718
- 'qti-assessment-section': z.union([QtiAssessmentSection, z.array(QtiAssessmentSection)]),
746
+ navigationMode: z.string().pipe(QtiNavigationMode),
747
+ submissionMode: z.string().pipe(QtiSubmissionMode),
748
+ 'qti-assessment-section': z.array(QtiAssessmentSection),
719
749
  })
720
750
  .strict()
721
751
 
@@ -742,7 +772,7 @@ declare const QtiAssessmentTestCreateInput = z
742
772
  maxAttempts: z.number().optional(),
743
773
  toolsEnabled: z.record(z.string(), z.boolean()).optional(),
744
774
  metadata: z.record(z.string(), z.unknown()).optional(),
745
- 'qti-test-part': QtiTestPart,
775
+ 'qti-test-part': z.array(QtiTestPart),
746
776
  'qti-outcome-declaration': z.array(QtiTestOutcomeDeclaration).optional(),
747
777
  })
748
778
  .strict()
@@ -758,7 +788,7 @@ declare const QtiAssessmentTestUpdateInput = z
758
788
  maxAttempts: z.number().optional(),
759
789
  toolsEnabled: z.record(z.string(), z.boolean()).optional(),
760
790
  metadata: z.record(z.string(), z.unknown()).optional(),
761
- 'qti-test-part': QtiTestPart,
791
+ 'qti-test-part': z.array(QtiTestPart),
762
792
  'qti-outcome-declaration': z.array(QtiTestOutcomeDeclaration).optional(),
763
793
  })
764
794
  .strict()
@@ -847,6 +877,8 @@ type UpdateSectionRequest = input<typeof QtiAssessmentSection>
847
877
  type AddItemRequest = input<typeof QtiAssessmentItemRef>
848
878
  type ReorderItemsRequest = input<typeof QtiReorderItemsInput>
849
879
 
880
+ type CreateAssessmentItemXmlRequest = input<typeof QtiAssessmentItemXmlCreateInput>
881
+ type CreateAssessmentItemJsonRequest = input<typeof QtiAssessmentItemJsonCreateInput>
850
882
  type CreateAssessmentItemRequest = input<typeof QtiAssessmentItemCreateInput>
851
883
  type UpdateAssessmentItemRequest = input<typeof QtiAssessmentItemUpdateInput>
852
884
  type ProcessResponseRequest = input<typeof QtiAssessmentItemProcessResponseInput>
@@ -933,6 +965,25 @@ declare class AssessmentItemsResource {
933
965
  * @returns Score and feedback
934
966
  */
935
967
  processResponse(identifier: string, body: Omit<ProcessResponseRequest, 'identifier'>): Promise<ProcessResponseResult>;
968
+ /**
969
+ * Create an assessment item from raw QTI 3.0 XML.
970
+ *
971
+ * This is the preferred creation method — the server validates the XML
972
+ * against IMS QTI XSDs. Optionally include metadata (subject, grade, etc.).
973
+ *
974
+ * @param body - XML string and optional metadata
975
+ * @returns The created assessment item
976
+ *
977
+ * @example
978
+ * ```typescript
979
+ * const item = await client.assessmentItems.createFromXml({
980
+ * format: 'xml',
981
+ * xml: '<qti-assessment-item ...>...</qti-assessment-item>',
982
+ * metadata: { subject: 'Math', difficulty: 'easy' },
983
+ * })
984
+ * ```
985
+ */
986
+ createFromXml(body: CreateAssessmentItemXmlRequest): Promise<AssessmentItem>;
936
987
  /**
937
988
  * Create an assessment item from metadata.
938
989
  *
@@ -941,7 +992,7 @@ declare class AssessmentItemsResource {
941
992
  * @param body - Assessment item metadata
942
993
  * @returns The created assessment item
943
994
  */
944
- createFromMetadata(body: CreateAssessmentItemRequest): Promise<AssessmentItem>;
995
+ createFromMetadata(body: CreateAssessmentItemJsonRequest): Promise<AssessmentItem>;
945
996
  }
946
997
 
947
998
  /**
package/dist/index.js CHANGED
@@ -16667,7 +16667,7 @@ var QtiItemMetadata = exports_external.object({
16667
16667
  grade: TimebackGrade.optional(),
16668
16668
  difficulty: QtiDifficulty.optional(),
16669
16669
  learningObjectiveSet: exports_external.array(QtiLearningObjectiveSet).optional()
16670
- }).strict();
16670
+ }).loose();
16671
16671
  var QtiModalFeedback = exports_external.object({
16672
16672
  outcomeIdentifier: exports_external.string().min(1),
16673
16673
  identifier: exports_external.string().min(1),
@@ -16704,7 +16704,12 @@ var QtiPaginationParams = exports_external.object({
16704
16704
  sort: exports_external.string().optional(),
16705
16705
  order: exports_external.enum(["asc", "desc"]).optional()
16706
16706
  }).strict();
16707
- var QtiAssessmentItemCreateInput = exports_external.object({
16707
+ var QtiAssessmentItemXmlCreateInput = exports_external.object({
16708
+ format: exports_external.string().pipe(exports_external.literal("xml")),
16709
+ xml: exports_external.string().min(1),
16710
+ metadata: QtiItemMetadata.optional()
16711
+ }).strict();
16712
+ var QtiAssessmentItemJsonCreateInput = exports_external.object({
16708
16713
  identifier: exports_external.string().min(1),
16709
16714
  title: exports_external.string().min(1),
16710
16715
  type: QtiAssessmentItemType,
@@ -16719,6 +16724,10 @@ var QtiAssessmentItemCreateInput = exports_external.object({
16719
16724
  feedbackInline: exports_external.array(QtiFeedbackInline).optional(),
16720
16725
  feedbackBlock: exports_external.array(QtiFeedbackBlock).optional()
16721
16726
  }).strict();
16727
+ var QtiAssessmentItemCreateInput = exports_external.union([
16728
+ QtiAssessmentItemXmlCreateInput,
16729
+ QtiAssessmentItemJsonCreateInput
16730
+ ]);
16722
16731
  var QtiAssessmentItemUpdateInput = exports_external.object({
16723
16732
  identifier: exports_external.string().min(1).optional(),
16724
16733
  title: exports_external.string().min(1),
@@ -16755,9 +16764,9 @@ var QtiAssessmentSection = exports_external.object({
16755
16764
  }).strict();
16756
16765
  var QtiTestPart = exports_external.object({
16757
16766
  identifier: exports_external.string().min(1),
16758
- navigationMode: QtiNavigationMode,
16759
- submissionMode: QtiSubmissionMode,
16760
- "qti-assessment-section": exports_external.union([QtiAssessmentSection, exports_external.array(QtiAssessmentSection)])
16767
+ navigationMode: exports_external.string().pipe(QtiNavigationMode),
16768
+ submissionMode: exports_external.string().pipe(QtiSubmissionMode),
16769
+ "qti-assessment-section": exports_external.array(QtiAssessmentSection)
16761
16770
  }).strict();
16762
16771
  var QtiReorderItemsInput = exports_external.object({
16763
16772
  items: exports_external.array(QtiAssessmentItemRef).min(1)
@@ -16775,7 +16784,7 @@ var QtiAssessmentTestCreateInput = exports_external.object({
16775
16784
  maxAttempts: exports_external.number().optional(),
16776
16785
  toolsEnabled: exports_external.record(exports_external.string(), exports_external.boolean()).optional(),
16777
16786
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
16778
- "qti-test-part": QtiTestPart,
16787
+ "qti-test-part": exports_external.array(QtiTestPart),
16779
16788
  "qti-outcome-declaration": exports_external.array(QtiTestOutcomeDeclaration).optional()
16780
16789
  }).strict();
16781
16790
  var QtiAssessmentTestUpdateInput = exports_external.object({
@@ -16788,7 +16797,7 @@ var QtiAssessmentTestUpdateInput = exports_external.object({
16788
16797
  maxAttempts: exports_external.number().optional(),
16789
16798
  toolsEnabled: exports_external.record(exports_external.string(), exports_external.boolean()).optional(),
16790
16799
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
16791
- "qti-test-part": QtiTestPart,
16800
+ "qti-test-part": exports_external.array(QtiTestPart),
16792
16801
  "qti-outcome-declaration": exports_external.array(QtiTestOutcomeDeclaration).optional()
16793
16802
  }).strict();
16794
16803
  var QtiStimulusCreateInput = exports_external.object({
@@ -16921,8 +16930,15 @@ class AssessmentItemsResource {
16921
16930
  body: { identifier, ...body }
16922
16931
  });
16923
16932
  }
16933
+ createFromXml(body) {
16934
+ validateWithSchema(QtiAssessmentItemXmlCreateInput, body, "assessment item XML");
16935
+ return this.transport.request("/assessment-items", {
16936
+ method: "POST",
16937
+ body
16938
+ });
16939
+ }
16924
16940
  createFromMetadata(body) {
16925
- validateWithSchema(QtiAssessmentItemCreateInput, body, "assessment item metadata");
16941
+ validateWithSchema(QtiAssessmentItemJsonCreateInput, body, "assessment item metadata");
16926
16942
  return this.transport.request("/assessment-items/metadata", {
16927
16943
  method: "POST",
16928
16944
  body
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { Paginator } from '../lib';
7
7
  import type { ListParams } from '@timeback/internal-client-infra';
8
- import type { CreateAssessmentItemRequest, ListAssessmentItemsParams, ProcessResponseRequest, UpdateAssessmentItemRequest } from '@timeback/types/zod';
8
+ import type { CreateAssessmentItemJsonRequest, CreateAssessmentItemRequest, CreateAssessmentItemXmlRequest, ListAssessmentItemsParams, ProcessResponseRequest, UpdateAssessmentItemRequest } from '@timeback/types/zod';
9
9
  import type { Transport } from '../lib/transport';
10
10
  import type { AssessmentItem, DeleteResponse, ListResponse, ProcessResponseResult } from '../types';
11
11
  /**
@@ -75,6 +75,25 @@ export declare class AssessmentItemsResource {
75
75
  * @returns Score and feedback
76
76
  */
77
77
  processResponse(identifier: string, body: Omit<ProcessResponseRequest, 'identifier'>): Promise<ProcessResponseResult>;
78
+ /**
79
+ * Create an assessment item from raw QTI 3.0 XML.
80
+ *
81
+ * This is the preferred creation method — the server validates the XML
82
+ * against IMS QTI XSDs. Optionally include metadata (subject, grade, etc.).
83
+ *
84
+ * @param body - XML string and optional metadata
85
+ * @returns The created assessment item
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const item = await client.assessmentItems.createFromXml({
90
+ * format: 'xml',
91
+ * xml: '<qti-assessment-item ...>...</qti-assessment-item>',
92
+ * metadata: { subject: 'Math', difficulty: 'easy' },
93
+ * })
94
+ * ```
95
+ */
96
+ createFromXml(body: CreateAssessmentItemXmlRequest): Promise<AssessmentItem>;
78
97
  /**
79
98
  * Create an assessment item from metadata.
80
99
  *
@@ -83,6 +102,6 @@ export declare class AssessmentItemsResource {
83
102
  * @param body - Assessment item metadata
84
103
  * @returns The created assessment item
85
104
  */
86
- createFromMetadata(body: CreateAssessmentItemRequest): Promise<AssessmentItem>;
105
+ createFromMetadata(body: CreateAssessmentItemJsonRequest): Promise<AssessmentItem>;
87
106
  }
88
107
  //# sourceMappingURL=assessment-items.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assessment-items.d.ts","sourceRoot":"","sources":["../../src/resources/assessment-items.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEnG;;;;;GAKG;AACH,qBAAa,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,EAAE,SAAS,EAAI;IAErD;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,yBAA8B,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAYlF;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,GAAE,UAAU,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,SAAS,CAAC,cAAc,CAAC,CAG5E;IAED;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAK/C;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAMjE;IAED;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAUrF;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQlD;IAED;;;;;;;;OAQG;IACH,eAAe,CACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,GAC9C,OAAO,CAAC,qBAAqB,CAAC,CAUhC;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAM7E;CACD"}
1
+ {"version":3,"file":"assessment-items.d.ts","sourceRoot":"","sources":["../../src/resources/assessment-items.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EACX,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEnG;;;;;GAKG;AACH,qBAAa,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,EAAE,SAAS,EAAI;IAErD;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,yBAA8B,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAYlF;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,GAAE,UAAU,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,SAAS,CAAC,cAAc,CAAC,CAG5E;IAED;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAK/C;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAMjE;IAED;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAUrF;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQlD;IAED;;;;;;;;OAQG;IACH,eAAe,CACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,GAC9C,OAAO,CAAC,qBAAqB,CAAC,CAUhC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAa,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,cAAc,CAAC,CAM3E;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,IAAI,EAAE,+BAA+B,GAAG,OAAO,CAAC,cAAc,CAAC,CAMjF;CACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timeback/qti",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {