@playcademy/vite-plugin 1.3.1-beta.2 → 1.3.1-beta.3

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.
Files changed (2) hide show
  1. package/dist/index.js +17 -104
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -24317,7 +24317,7 @@ import path2 from "node:path";
24317
24317
  // package.json
24318
24318
  var package_default = {
24319
24319
  name: "@playcademy/vite-plugin",
24320
- version: "1.3.1-beta.2",
24320
+ version: "1.3.1-beta.3",
24321
24321
  type: "module",
24322
24322
  exports: {
24323
24323
  ".": {
@@ -25934,7 +25934,7 @@ var package_default2;
25934
25934
  var init_package = __esm(() => {
25935
25935
  package_default2 = {
25936
25936
  name: "@playcademy/sandbox",
25937
- version: "0.8.1-beta.2",
25937
+ version: "0.8.1-beta.3",
25938
25938
  description: "Local development server for Playcademy game development",
25939
25939
  type: "module",
25940
25940
  exports: {
@@ -35697,39 +35697,21 @@ function compareNewestCompletedAssessmentAttempt(left, right) {
35697
35697
  return newestAttempt(left, right, "scoreDate");
35698
35698
  }
35699
35699
  function compareAssessmentCatalogOrder(left, right) {
35700
- if (left.sortOrder !== null || right.sortOrder !== null) {
35701
- if (left.sortOrder === null) {
35702
- return 1;
35703
- }
35704
- if (right.sortOrder === null) {
35705
- return -1;
35706
- }
35707
- const orderDifference = left.sortOrder - right.sortOrder;
35708
- if (orderDifference) {
35709
- return orderDifference;
35710
- }
35711
- }
35712
- const leftUpdatedAt = Date.parse(left.updatedAt);
35713
- const rightUpdatedAt = Date.parse(right.updatedAt);
35714
- const leftHasValidDate = Number.isFinite(leftUpdatedAt);
35715
- const rightHasValidDate = Number.isFinite(rightUpdatedAt);
35716
- if (leftHasValidDate && rightHasValidDate) {
35717
- const updatedDifference = leftUpdatedAt - rightUpdatedAt;
35718
- if (updatedDifference) {
35719
- return updatedDifference;
35720
- }
35721
- } else if (leftHasValidDate !== rightHasValidDate) {
35722
- return leftHasValidDate ? -1 : 1;
35723
- }
35724
35700
  if (left.assessmentKey !== null && right.assessmentKey !== null) {
35725
- const keyDifference = left.assessmentKey.localeCompare(right.assessmentKey);
35701
+ const keyDifference = compareCodePoints(left.assessmentKey, right.assessmentKey);
35726
35702
  if (keyDifference) {
35727
35703
  return keyDifference;
35728
35704
  }
35729
35705
  } else if (left.assessmentKey !== null || right.assessmentKey !== null) {
35730
35706
  return left.assessmentKey === null ? 1 : -1;
35731
35707
  }
35732
- return left.qtiTestIdentifier.localeCompare(right.qtiTestIdentifier);
35708
+ return compareCodePoints(left.qtiTestIdentifier, right.qtiTestIdentifier);
35709
+ }
35710
+ function compareCodePoints(left, right) {
35711
+ if (left === right) {
35712
+ return 0;
35713
+ }
35714
+ return left < right ? -1 : 1;
35733
35715
  }
35734
35716
  function orderRuntimeAssessmentTests(tests) {
35735
35717
  return [...tests].toSorted(compareAssessmentCatalogOrder);
@@ -36574,7 +36556,7 @@ var REVIEW_SELECTION_POLICY_VERSION = "unseen-first-least-recently-delivered-v1"
36574
36556
  var PLAYCADEMY_REVIEW_BANK_MANIFEST_METADATA_KEY = "playcademyReviewBank";
36575
36557
  var PLAYCADEMY_REVIEW_BANK_MANIFEST_VERSION = 1;
36576
36558
  var DEFAULT_REVIEW_SELECTION_POLICY;
36577
- var ASSESSMENT_RUNTIME_FIXTURE_BUNDLE_VERSION = 7;
36559
+ var ASSESSMENT_RUNTIME_FIXTURE_BUNDLE_VERSION = 8;
36578
36560
  var RuntimeSubjectSchema;
36579
36561
  var RuntimeGradeSchema;
36580
36562
  var OptionalQueryGradeSchema;
@@ -71716,7 +71698,6 @@ var UpdateAssessmentRequestSchema;
71716
71698
  var CopyAssessmentRequestSchema;
71717
71699
  var AssessmentAssociationImportEntrySchema;
71718
71700
  var AttachExistingAssessmentsRequestSchema;
71719
- var ReorderAssessmentsRequestSchema;
71720
71701
  var ReorderQuestionsRequestSchema;
71721
71702
  var init_schemas4 = __esm(() => {
71722
71703
  init_esm();
@@ -72004,8 +71985,7 @@ var init_schemas4 = __esm(() => {
72004
71985
  assessmentKey: AssessmentKeySchema,
72005
71986
  qtiTestIdentifier: exports_external.string().trim().min(1, "Assessment identifier is required"),
72006
71987
  purpose: AssessmentPurposeSchema,
72007
- standard: AssessmentStandardRefSchema2.optional(),
72008
- sortOrder: exports_external.number().int().nonnegative().nullable()
71988
+ standard: AssessmentStandardRefSchema2.optional()
72009
71989
  }).superRefine((input, context2) => {
72010
71990
  requireMasteryStandard(input, context2);
72011
71991
  rejectSystemManagedReview(input, context2);
@@ -72055,10 +72035,6 @@ var init_schemas4 = __esm(() => {
72055
72035
  seenKeys.add(assessment.assessmentKey);
72056
72036
  });
72057
72037
  });
72058
- ReorderAssessmentsRequestSchema = exports_external.object({
72059
- purpose: AssessmentPurposeSchema,
72060
- testIdentifiers: exports_external.array(exports_external.string().trim().min(1, "Assessment identifier is required")).min(1, "At least one assessment is required")
72061
- }).superRefine(rejectSystemManagedReview);
72062
72038
  ReorderQuestionsRequestSchema = exports_external.object({
72063
72039
  items: exports_external.array(exports_external.object({
72064
72040
  identifier: exports_external.string().min(1),
@@ -126748,9 +126724,6 @@ function buildAssessmentAssociationUpdates(row, input) {
126748
126724
  updates.standardFramework = null;
126749
126725
  updates.standardIdentifier = null;
126750
126726
  }
126751
- if (row.status === "live" && input.purpose !== row.purpose) {
126752
- updates.sortOrder = null;
126753
- }
126754
126727
  }
126755
126728
  if (input.standard !== undefined) {
126756
126729
  updates.standardFramework = input.standard.framework;
@@ -126758,9 +126731,6 @@ function buildAssessmentAssociationUpdates(row, input) {
126758
126731
  }
126759
126732
  if (input.status !== undefined) {
126760
126733
  updates.status = input.status;
126761
- if (input.status === "archived") {
126762
- updates.sortOrder = null;
126763
- }
126764
126734
  }
126765
126735
  return updates;
126766
126736
  }
@@ -126769,24 +126739,8 @@ function assessmentStandardForRow(row) {
126769
126739
  }
126770
126740
  function validateUniqueAssessmentIdentifiers(testIdentifiers) {
126771
126741
  if (new Set(testIdentifiers).size !== testIdentifiers.length) {
126772
- throw new ValidationError("Assessment order must contain unique identifiers");
126773
- }
126774
- }
126775
- function assertAssessmentOrderUpdateSucceeded(updatedRow) {
126776
- if (!updatedRow) {
126777
- throw new ValidationError("Assessment order changed while it was being saved. Refresh and try again.");
126742
+ throw new ValidationError("Assessment manifests must contain unique QTI test identifiers");
126778
126743
  }
126779
- return updatedRow;
126780
- }
126781
- function lockOrderAssessmentRows(rows) {
126782
- return rows.toSorted((left, right) => left.id.localeCompare(right.id));
126783
- }
126784
- function orderLiveAssessmentRows(liveRows, purpose, testIdentifiers) {
126785
- const rowsByIdentifier = new Map(liveRows.map((row) => [row.qtiTestIdentifier, row]));
126786
- if (liveRows.length !== testIdentifiers.length || testIdentifiers.some((identifier) => !rowsByIdentifier.has(identifier))) {
126787
- throw new ValidationError(`Assessment order must include every live ${purpose} assessment exactly once`);
126788
- }
126789
- return testIdentifiers.map((identifier) => rowsByIdentifier.get(identifier));
126790
126744
  }
126791
126745
  var init_timeback_assessment_rules_util = __esm(() => {
126792
126746
  init_errors2();
@@ -128291,8 +128245,6 @@ var init_timeback_assessment_runtime_service = __esm(async () => {
128291
128245
  id: row.id,
128292
128246
  assessmentKey: row.assessmentKey,
128293
128247
  qtiTestIdentifier: row.qtiTestIdentifier,
128294
- sortOrder: row.sortOrder,
128295
- updatedAt: row.updatedAt.toISOString(),
128296
128248
  standard: assessmentStandardForRow(row)
128297
128249
  })).filter((test) => !matchesMasteryStandard || matchesMasteryStandard(test.standard));
128298
128250
  }
@@ -129903,7 +129855,6 @@ class TimebackAssessmentsService {
129903
129855
  ...test ? { title: test.title } : {},
129904
129856
  purpose: entry2.purpose,
129905
129857
  ...entry2.standard ? { standard: entry2.standard } : {},
129906
- sourceSortOrder: entry2.sortOrder,
129907
129858
  ...test && gameSlug ? { editable: isQtiTestOwnedByGame(test, gameSlug) } : {}
129908
129859
  };
129909
129860
  }
@@ -129963,7 +129914,6 @@ class TimebackAssessmentsService {
129963
129914
  qtiTestIdentifier: entry2.qtiTestIdentifier,
129964
129915
  purpose: entry2.purpose,
129965
129916
  status: input.targetStatus,
129966
- sortOrder: entry2.sortOrder,
129967
129917
  standardFramework: entry2.standard?.framework,
129968
129918
  standardIdentifier: entry2.standard?.identifier
129969
129919
  }).onConflictDoNothing().returning();
@@ -130096,7 +130046,7 @@ class TimebackAssessmentsService {
130096
130046
  if (plan.kind === "delete") {
130097
130047
  await tx.delete(gameTimebackAssessmentTests).where(eq(gameTimebackAssessmentTests.id, row.id));
130098
130048
  } else if (plan.kind === "archive") {
130099
- await tx.update(gameTimebackAssessmentTests).set({ status: "archived", sortOrder: null, updatedAt: new Date }).where(eq(gameTimebackAssessmentTests.id, row.id));
130049
+ await tx.update(gameTimebackAssessmentTests).set({ status: "archived", updatedAt: new Date }).where(eq(gameTimebackAssessmentTests.id, row.id));
130100
130050
  }
130101
130051
  if (plan.kind !== "none") {
130102
130052
  setAttribute("app.assessment.operation", plan.operation);
@@ -130104,27 +130054,6 @@ class TimebackAssessmentsService {
130104
130054
  return { action: plan.action };
130105
130055
  });
130106
130056
  }
130107
- async reorderAssessments(integrationId, purpose, testIdentifiers) {
130108
- if (purpose === "review") {
130109
- throw new ValidationError("The review bank is system-managed and cannot be reordered.");
130110
- }
130111
- await this.requireIntegration(integrationId);
130112
- validateUniqueAssessmentIdentifiers(testIdentifiers);
130113
- const updatedAt = new Date;
130114
- await this.deps.db.transaction(async (tx) => {
130115
- const liveRows = await tx.query.gameTimebackAssessmentTests.findMany({
130116
- where: and(eq(gameTimebackAssessmentTests.integrationId, integrationId), eq(gameTimebackAssessmentTests.purpose, purpose), eq(gameTimebackAssessmentTests.status, "live"))
130117
- });
130118
- const orderedRows = orderLiveAssessmentRows(liveRows, purpose, testIdentifiers);
130119
- const positionByRowId = new Map(orderedRows.map((row, index2) => [row.id, index2 + 1]));
130120
- for (const row of lockOrderAssessmentRows(orderedRows)) {
130121
- const testIdentifier = row.qtiTestIdentifier;
130122
- const [updatedRow] = await tx.update(gameTimebackAssessmentTests).set({ sortOrder: positionByRowId.get(row.id), updatedAt }).where(and(eq(gameTimebackAssessmentTests.id, row.id), eq(gameTimebackAssessmentTests.integrationId, integrationId), eq(gameTimebackAssessmentTests.qtiTestIdentifier, testIdentifier), eq(gameTimebackAssessmentTests.purpose, purpose), eq(gameTimebackAssessmentTests.status, "live"))).returning({ id: gameTimebackAssessmentTests.id });
130123
- assertAssessmentOrderUpdateSucceeded(updatedRow);
130124
- }
130125
- });
130126
- setAttribute("app.assessment.operation", "reorder_live_assessments");
130127
- }
130128
130057
  async listQuestions(integrationId, qtiTestIdentifier) {
130129
130058
  const client2 = this.requireClient();
130130
130059
  await this.requireAssessmentRow(integrationId, qtiTestIdentifier);
@@ -130587,15 +130516,14 @@ class TimebackAssessmentsService {
130587
130516
  if (reservedKeyOwner && reservedKeyOwner.purpose !== "review") {
130588
130517
  throw new ValidationError("The reserved review-bank assessment key is already in use.");
130589
130518
  }
130590
- const singletonCurrent = Boolean(singleton && singleton.assessmentKey === input.sinkIdentifier && singleton.status === "live" && singleton.sortOrder === null && singleton.standardFramework === null && singleton.standardIdentifier === null && singleton.diagnosticKey === null && singleton.diagnosticRoutingManifest === null);
130591
- const legacyCurrent = legacyReviews.every((association) => association.status === "archived" && association.sortOrder === null && association.assessmentKey !== input.sinkIdentifier);
130519
+ const singletonCurrent = Boolean(singleton && singleton.assessmentKey === input.sinkIdentifier && singleton.status === "live" && singleton.standardFramework === null && singleton.standardIdentifier === null && singleton.diagnosticKey === null && singleton.diagnosticRoutingManifest === null);
130520
+ const legacyCurrent = legacyReviews.every((association) => association.status === "archived" && association.assessmentKey !== input.sinkIdentifier);
130592
130521
  const changed = !singletonCurrent || !legacyCurrent;
130593
130522
  await input.beforeInstall();
130594
130523
  for (const legacy of legacyReviews) {
130595
- if (legacy.status !== "archived" || legacy.sortOrder !== null || legacy.assessmentKey === input.sinkIdentifier) {
130524
+ if (legacy.status !== "archived" || legacy.assessmentKey === input.sinkIdentifier) {
130596
130525
  await input.tx.update(gameTimebackAssessmentTests).set({
130597
130526
  status: "archived",
130598
- sortOrder: null,
130599
130527
  ...legacy.assessmentKey === input.sinkIdentifier ? { assessmentKey: null } : {},
130600
130528
  updatedAt: new Date
130601
130529
  }).where(eq(gameTimebackAssessmentTests.id, legacy.id));
@@ -130609,7 +130537,6 @@ class TimebackAssessmentsService {
130609
130537
  assessmentKey: input.sinkIdentifier,
130610
130538
  purpose: "review",
130611
130539
  status: "live",
130612
- sortOrder: null,
130613
130540
  standardFramework: null,
130614
130541
  standardIdentifier: null,
130615
130542
  diagnosticKey: null,
@@ -130624,7 +130551,6 @@ class TimebackAssessmentsService {
130624
130551
  qtiTestIdentifier: input.sinkIdentifier,
130625
130552
  purpose: "review",
130626
130553
  status: "live",
130627
- sortOrder: null,
130628
130554
  standardFramework: null,
130629
130555
  standardIdentifier: null,
130630
130556
  diagnosticKey: null,
@@ -130827,7 +130753,6 @@ class TimebackAssessmentsService {
130827
130753
  qtiTestIdentifier: row.qtiTestIdentifier,
130828
130754
  purpose: row.purpose,
130829
130755
  status: row.status,
130830
- sortOrder: row.sortOrder,
130831
130756
  standard: assessmentStandardForRow(row),
130832
130757
  diagnostic: diagnosticDefinitionForRow(row),
130833
130758
  createdAt: row.createdAt,
@@ -193561,7 +193486,6 @@ var createAssessment;
193561
193486
  var attachExistingAssessments;
193562
193487
  var updateAssessment;
193563
193488
  var synchronizeReviewBank;
193564
- var reorderAssessments;
193565
193489
  var reorderQuestions;
193566
193490
  var removeAssessment;
193567
193491
  var listQuestions;
@@ -194277,16 +194201,6 @@ var init_timeback_controller = __esm(() => {
194277
194201
  const integrationId = await ctx.services.timebackAssessments.resolveIntegrationId(gameId, courseId, ctx.user);
194278
194202
  return ctx.services.timebackAssessments.synchronizeReviewBank(integrationId);
194279
194203
  });
194280
- reorderAssessments = requireDeveloper(async (ctx) => {
194281
- const { gameId, courseId } = ctx.params;
194282
- if (!gameId || !courseId) {
194283
- throw ApiError.badRequest("Missing gameId or courseId parameter");
194284
- }
194285
- const body2 = await parseRequestBody(ctx.request, ReorderAssessmentsRequestSchema);
194286
- const integrationId = await ctx.services.timebackAssessments.resolveIntegrationId(gameId, courseId, ctx.user);
194287
- await ctx.services.timebackAssessments.reorderAssessments(integrationId, body2.purpose, body2.testIdentifiers);
194288
- return { success: true };
194289
- });
194290
194204
  reorderQuestions = requireDeveloper(async (ctx) => {
194291
194205
  const { gameId, courseId, testIdentifier } = ctx.params;
194292
194206
  if (!gameId || !courseId || !testIdentifier) {
@@ -194427,7 +194341,6 @@ var init_timeback_controller = __esm(() => {
194427
194341
  attachExistingAssessments,
194428
194342
  updateAssessment,
194429
194343
  synchronizeReviewBank,
194430
- reorderAssessments,
194431
194344
  removeAssessment,
194432
194345
  reorderQuestions,
194433
194346
  listQuestions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/vite-plugin",
3
- "version": "1.3.1-beta.2",
3
+ "version": "1.3.1-beta.3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -19,14 +19,14 @@
19
19
  "dependencies": {
20
20
  "archiver": "^7.0.1",
21
21
  "picocolors": "^1.1.1",
22
- "playcademy": "0.29.1-beta.2"
22
+ "playcademy": "0.29.1-beta.3"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@electric-sql/pglite": "^0.3.16",
26
26
  "@inquirer/prompts": "^7.8.6",
27
27
  "@playcademy/constants": "0.0.1",
28
- "@playcademy/sandbox": "0.8.1-beta.2",
29
- "@playcademy/sdk": "0.17.1-beta.2",
28
+ "@playcademy/sandbox": "0.8.1-beta.3",
29
+ "@playcademy/sdk": "0.17.1-beta.3",
30
30
  "@playcademy/types": "0.0.1",
31
31
  "@playcademy/utils": "0.0.1",
32
32
  "@types/archiver": "^6.0.3",