playcademy 0.19.5 → 0.19.6-beta.2

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/cli.js CHANGED
@@ -1065,7 +1065,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1065
1065
  // ../better-auth/package.json
1066
1066
  var package_default = {
1067
1067
  name: "@playcademy/better-auth",
1068
- version: "0.0.10",
1068
+ version: "0.0.11-beta.2",
1069
1069
  type: "module",
1070
1070
  exports: {
1071
1071
  "./server": {
@@ -1956,6 +1956,7 @@ var TIMEBACK_API_URLS;
1956
1956
  var TIMEBACK_AUTH_URLS;
1957
1957
  var CALIPER_API_URLS;
1958
1958
  var ONEROSTER_ENDPOINTS;
1959
+ var QTI_ENDPOINTS;
1959
1960
  var CALIPER_ENDPOINTS;
1960
1961
  var CALIPER_CONSTANTS;
1961
1962
  var TIMEBACK_EVENT_TYPES;
@@ -2003,6 +2004,10 @@ var init_constants = __esm2(() => {
2003
2004
  assessmentResults: "/ims/oneroster/gradebook/v1p2/assessmentResults",
2004
2005
  users: "/ims/oneroster/rostering/v1p2/users"
2005
2006
  };
2007
+ QTI_ENDPOINTS = {
2008
+ assessmentTests: "/assessment-tests",
2009
+ assessmentItems: "/assessment-items"
2010
+ };
2006
2011
  CALIPER_ENDPOINTS = {
2007
2012
  event: "/caliper/event",
2008
2013
  events: "/caliper/events",
@@ -3016,7 +3021,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
3016
3021
  import { join as join13 } from "node:path";
3017
3022
 
3018
3023
  // src/version.ts
3019
- var cliVersion = false ? "0.0.0-dev" : "0.19.5";
3024
+ var cliVersion = false ? "0.0.0-dev" : "0.19.6-beta.2";
3020
3025
 
3021
3026
  // src/lib/init/database.ts
3022
3027
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
package/dist/constants.js CHANGED
@@ -20,7 +20,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
20
20
  // ../better-auth/package.json
21
21
  var package_default = {
22
22
  name: "@playcademy/better-auth",
23
- version: "0.0.10",
23
+ version: "0.0.11-beta.2",
24
24
  type: "module",
25
25
  exports: {
26
26
  "./server": {
package/dist/db.js CHANGED
@@ -36,7 +36,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
36
36
  // ../better-auth/package.json
37
37
  var package_default = {
38
38
  name: "@playcademy/better-auth",
39
- version: "0.0.10",
39
+ version: "0.0.11-beta.2",
40
40
  type: "module",
41
41
  exports: {
42
42
  "./server": {
package/dist/index.js CHANGED
@@ -326,7 +326,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
326
326
  // ../better-auth/package.json
327
327
  var package_default = {
328
328
  name: "@playcademy/better-auth",
329
- version: "0.0.10",
329
+ version: "0.0.11-beta.2",
330
330
  type: "module",
331
331
  exports: {
332
332
  "./server": {
@@ -2617,6 +2617,7 @@ var TIMEBACK_API_URLS;
2617
2617
  var TIMEBACK_AUTH_URLS;
2618
2618
  var CALIPER_API_URLS;
2619
2619
  var ONEROSTER_ENDPOINTS;
2620
+ var QTI_ENDPOINTS;
2620
2621
  var CALIPER_ENDPOINTS;
2621
2622
  var CALIPER_CONSTANTS;
2622
2623
  var TIMEBACK_EVENT_TYPES;
@@ -2664,6 +2665,10 @@ var init_constants = __esm2(() => {
2664
2665
  assessmentResults: "/ims/oneroster/gradebook/v1p2/assessmentResults",
2665
2666
  users: "/ims/oneroster/rostering/v1p2/users"
2666
2667
  };
2668
+ QTI_ENDPOINTS = {
2669
+ assessmentTests: "/assessment-tests",
2670
+ assessmentItems: "/assessment-items"
2671
+ };
2667
2672
  CALIPER_ENDPOINTS = {
2668
2673
  event: "/caliper/event",
2669
2674
  events: "/caliper/events",
@@ -2822,6 +2827,7 @@ var TIMEBACK_API_URLS2;
2822
2827
  var TIMEBACK_AUTH_URLS2;
2823
2828
  var CALIPER_API_URLS2;
2824
2829
  var ONEROSTER_ENDPOINTS2;
2830
+ var QTI_ENDPOINTS2;
2825
2831
  var CALIPER_ENDPOINTS2;
2826
2832
  var CALIPER_CONSTANTS2;
2827
2833
  var TIMEBACK_EVENT_TYPES2;
@@ -2869,6 +2875,10 @@ var init_constants2 = __esm3(() => {
2869
2875
  assessmentResults: "/ims/oneroster/gradebook/v1p2/assessmentResults",
2870
2876
  users: "/ims/oneroster/rostering/v1p2/users"
2871
2877
  };
2878
+ QTI_ENDPOINTS2 = {
2879
+ assessmentTests: "/assessment-tests",
2880
+ assessmentItems: "/assessment-items"
2881
+ };
2872
2882
  CALIPER_ENDPOINTS2 = {
2873
2883
  event: "/caliper/event",
2874
2884
  events: "/caliper/events",
@@ -4021,7 +4031,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, readFileSync as rea
4021
4031
  import { join as join13 } from "node:path";
4022
4032
 
4023
4033
  // src/version.ts
4024
- var cliVersion = false ? "0.0.0-dev" : "0.19.5";
4034
+ var cliVersion = false ? "0.0.0-dev" : "0.19.6-beta.2";
4025
4035
 
4026
4036
  // src/lib/init/database.ts
4027
4037
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -9854,7 +9864,7 @@ function findSingleBuildZip() {
9854
9864
  import * as esbuild3 from "esbuild";
9855
9865
 
9856
9866
  // ../edge-play/src/stub-entry.ts
9857
- var stub_entry_default = "/**\n * Stub Worker for Static-Only Games\n *\n * Minimal worker that serves static assets with CORS headers.\n * Used for games that don't have custom backend routes.\n *\n * Features:\n * - Serves files from Workers Assets or R2 bucket binding\n * - Supports hybrid deployment strategy (small files via Assets, large files via R2)\n * - Adds CORS headers for cross-origin manifest fetching\n * - Handles OPTIONS preflight requests\n * - Returns 404 for /api/* routes (no backend deployed)\n * - Supports SPA routing (falls back to index.html)\n */\n\ninterface AssetsFetcher {\n fetch(request: Request): Promise<Response>\n}\ninterface R2Bucket {\n get(key: string): Promise<R2Object | null>\n}\ninterface R2Object {\n body: ReadableStream\n httpMetadata?: { contentType?: string }\n etag: string\n}\n\ninterface Env {\n ASSETS: AssetsFetcher | R2Bucket\n}\n\n/**\n * Detect if ASSETS binding is an R2 bucket or Workers Assets Fetcher\n */\nfunction isR2Bucket(assets: AssetsFetcher | R2Bucket): assets is R2Bucket {\n return 'get' in assets && typeof assets.get === 'function' && !('fetch' in assets)\n}\n\n/**\n * Serve from Workers Assets (default for files <25MB)\n */\nasync function serveFromAssets(request: Request, assets: AssetsFetcher): Promise<Response> {\n const response = await assets.fetch(request)\n\n if (response.status !== 404) {\n // Add CORS headers\n const modifiedResponse = new Response(response.body, response)\n\n modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')\n modifiedResponse.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n return modifiedResponse\n }\n\n // SPA routing: if not a file request, try index.html\n const path = new URL(request.url).pathname\n\n if (path.includes('.')) {\n return response // File request not found\n }\n\n const indexUrl = new URL(request.url)\n\n indexUrl.pathname = '/index.html'\n\n const indexResponse = await assets.fetch(new Request(indexUrl.toString()))\n\n // Add CORS headers to index.html response\n const modifiedResponse = new Response(indexResponse.body, indexResponse)\n\n modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')\n modifiedResponse.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n return modifiedResponse\n}\n\n/**\n * Serve from R2 bucket (for large files like Godot WASM)\n */\nasync function serveFromR2(request: Request, bucket: R2Bucket): Promise<Response> {\n const path = new URL(request.url).pathname\n const key = path === '/' ? 'index.html' : path.slice(1)\n\n const object = await bucket.get(key)\n\n if (object) {\n return new Response(object.body, {\n headers: {\n 'Content-Type': object.httpMetadata?.contentType || 'application/octet-stream',\n // Use 1-hour caching - balances performance with update propagation\n // (Godot and other engines use non-hashed filenames)\n 'Cache-Control': key === 'index.html' ? 'no-cache' : 'public, max-age=3600',\n ETag: object.etag,\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS',\n },\n })\n }\n\n // SPA routing: if not a file request, try index.html\n if (path.includes('.')) {\n return new Response('Not Found', { status: 404 })\n }\n\n const indexObject = await bucket.get('index.html')\n\n if (indexObject) {\n return new Response(indexObject.body, {\n headers: {\n 'Content-Type': 'text/html',\n 'Cache-Control': 'no-cache',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS',\n },\n })\n }\n\n return new Response('Not Found', { status: 404 })\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url)\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n const headers = new Headers()\n\n headers.set('Access-Control-Allow-Origin', '*')\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n const reqHeaders = request.headers.get('Access-Control-Request-Headers')\n\n if (reqHeaders) {\n headers.set('Access-Control-Allow-Headers', reqHeaders)\n }\n\n headers.set('Access-Control-Max-Age', '86400')\n\n return new Response(null, { status: 204, headers })\n }\n\n // No backend routes available\n if (url.pathname.startsWith('/api/')) {\n return new Response('No backend deployed', { status: 404 })\n }\n\n // Serve static assets (auto-detect Workers Assets vs R2)\n if (!env.ASSETS) {\n return new Response('ASSETS binding not configured', { status: 500 })\n }\n\n return isR2Bucket(env.ASSETS)\n ? await serveFromR2(request, env.ASSETS)\n : await serveFromAssets(request, env.ASSETS)\n } catch (error) {\n return new Response(`Error: ${(error as Error).message}`, { status: 500 })\n }\n },\n}\n";
9867
+ var stub_entry_default = "/**\n * Stub Worker for Static-Only Games\n *\n * Minimal worker that serves static assets with CORS headers.\n * Used for games that don't have custom backend routes.\n *\n * ## Experiment: Direct asset serving (workers-assets-cache-headers)\n *\n * For Workers Assets deployments (files <25MB), static assets are now served\n * directly by Cloudflare's asset system \u2014 this worker is only invoked for\n * `/api/*` routes (via `run_worker_first: [\"/api/*\"]`). Cache headers and SPA\n * routing are handled by the asset system config (`_headers` and\n * `not_found_handling: 'single-page-application'`).\n *\n * For R2 deployments (large files like Godot WASM), this worker still handles\n * all asset serving since R2 is not part of the Workers Assets system.\n *\n * Features:\n * - Serves files from Workers Assets or R2 bucket binding\n * - Supports hybrid deployment strategy (small files via Assets, large files via R2)\n * - Adds CORS headers for cross-origin manifest fetching\n * - Handles OPTIONS preflight requests\n * - Returns 404 for /api/* routes (no backend deployed)\n * - Supports SPA routing (falls back to index.html)\n */\n\ninterface AssetsFetcher {\n fetch(request: Request): Promise<Response>\n}\ninterface R2Bucket {\n get(key: string): Promise<R2Object | null>\n}\ninterface R2Object {\n body: ReadableStream\n httpMetadata?: { contentType?: string }\n etag: string\n}\n\ninterface Env {\n ASSETS: AssetsFetcher | R2Bucket\n}\n\n/**\n * Detect if ASSETS binding is an R2 bucket or Workers Assets Fetcher\n */\nfunction isR2Bucket(assets: AssetsFetcher | R2Bucket): assets is R2Bucket {\n return 'get' in assets && typeof assets.get === 'function' && !('fetch' in assets)\n}\n\n/**\n * Serve from R2 bucket (for large files like Godot WASM).\n * The worker always handles R2 asset serving since R2 is not part of Workers Assets.\n */\nasync function serveFromR2(request: Request, bucket: R2Bucket): Promise<Response> {\n const path = new URL(request.url).pathname\n const key = path === '/' ? 'index.html' : path.slice(1)\n\n const object = await bucket.get(key)\n\n if (object) {\n return new Response(object.body, {\n headers: {\n 'Content-Type': object.httpMetadata?.contentType || 'application/octet-stream',\n // Use 1-hour caching - balances performance with update propagation\n // (Godot and other engines use non-hashed filenames)\n 'Cache-Control': key === 'index.html' ? 'no-cache' : 'public, max-age=3600',\n ETag: object.etag,\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS',\n },\n })\n }\n\n // SPA routing: if not a file request, try index.html\n if (path.includes('.')) {\n return new Response('Not Found', { status: 404 })\n }\n\n const indexObject = await bucket.get('index.html')\n\n if (indexObject) {\n return new Response(indexObject.body, {\n headers: {\n 'Content-Type': 'text/html',\n 'Cache-Control': 'no-cache',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS',\n },\n })\n }\n\n return new Response('Not Found', { status: 404 })\n}\n\n/**\n * Serve from Workers Assets (safety net).\n *\n * In the new deploy config, Workers Assets requests are served directly by the\n * asset system and never reach this worker. This function exists only as a\n * fallback for backwards compatibility with old deploy configs that still use\n * `run_worker_first: true`.\n */\nasync function serveFromAssets(request: Request, assets: AssetsFetcher): Promise<Response> {\n const response = await assets.fetch(request)\n\n if (response.status !== 404) {\n const modifiedResponse = new Response(response.body, response)\n\n modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')\n modifiedResponse.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n return modifiedResponse\n }\n\n // SPA routing: if not a file request, try index.html\n const path = new URL(request.url).pathname\n\n if (path.includes('.')) {\n return response // File request not found\n }\n\n const indexUrl = new URL(request.url)\n\n indexUrl.pathname = '/index.html'\n\n const indexResponse = await assets.fetch(new Request(indexUrl.toString()))\n\n // Add CORS headers to index.html response\n const modifiedResponse = new Response(indexResponse.body, indexResponse)\n\n modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')\n modifiedResponse.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n return modifiedResponse\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url)\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n const headers = new Headers()\n\n headers.set('Access-Control-Allow-Origin', '*')\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n\n const reqHeaders = request.headers.get('Access-Control-Request-Headers')\n\n if (reqHeaders) {\n headers.set('Access-Control-Allow-Headers', reqHeaders)\n }\n\n headers.set('Access-Control-Max-Age', '86400')\n\n return new Response(null, { status: 204, headers })\n }\n\n // No backend routes available\n if (url.pathname.startsWith('/api/')) {\n return new Response('No backend deployed', { status: 404 })\n }\n\n // Serve static assets (auto-detect Workers Assets vs R2)\n if (!env.ASSETS) {\n return new Response('ASSETS binding not configured', { status: 500 })\n }\n\n return isR2Bucket(env.ASSETS)\n ? await serveFromR2(request, env.ASSETS)\n : await serveFromAssets(request, env.ASSETS)\n } catch (error) {\n return new Response(`Error: ${(error as Error).message}`, { status: 500 })\n }\n },\n}\n";
9858
9868
 
9859
9869
  // src/lib/bundle/stub.ts
9860
9870
  var stubEntryTemplate = stub_entry_default.toString();
@@ -352,9 +352,9 @@ var init_routes = __esm({
352
352
  // ../edge-play/src/entry/metadata.ts
353
353
  function getRuntimeMetadata() {
354
354
  return {
355
- cliVersion: true ? "0.19.5" : "0.0.0-dev",
356
- sdkVersion: true ? "0.7.2" : "0.0.0-dev",
357
- buildId: true ? "9df877eda20e" : "dev-source"
355
+ cliVersion: true ? "0.19.6-beta.2" : "0.0.0-dev",
356
+ sdkVersion: true ? "0.7.3-beta.2" : "0.0.0-dev",
357
+ buildId: true ? "5444c6c1c794" : "dev-source"
358
358
  };
359
359
  }
360
360
  var init_metadata = __esm({
@@ -3055,19 +3055,6 @@ function registerApiNotFoundHandler(app) {
3055
3055
  function isR2AssetsBinding(assets) {
3056
3056
  return "get" in assets && typeof assets.get === "function" && !("fetch" in assets);
3057
3057
  }
3058
- async function serveFromWorkersAssets(c, assets) {
3059
- const response = await assets.fetch(c.req.raw);
3060
- if (response.status !== 404) {
3061
- return response;
3062
- }
3063
- const path = new URL(c.req.url).pathname;
3064
- if (path.includes(".")) {
3065
- return response;
3066
- }
3067
- const indexUrl = new URL(c.req.url);
3068
- indexUrl.pathname = "/index.html";
3069
- return await assets.fetch(new Request(indexUrl.toString()));
3070
- }
3071
3058
  async function serveFromR2(c, bucket) {
3072
3059
  const path = new URL(c.req.url).pathname;
3073
3060
  const key = path === "/" ? "index.html" : path.slice(1);
@@ -3109,7 +3096,21 @@ function registerAssetFallback(app) {
3109
3096
  404
3110
3097
  );
3111
3098
  }
3112
- return isR2AssetsBinding(c.env.ASSETS) ? await serveFromR2(c, c.env.ASSETS) : await serveFromWorkersAssets(c, c.env.ASSETS);
3099
+ if (isR2AssetsBinding(c.env.ASSETS)) {
3100
+ return await serveFromR2(c, c.env.ASSETS);
3101
+ }
3102
+ const assets = c.env.ASSETS;
3103
+ const response = await assets.fetch(c.req.raw);
3104
+ if (response.status !== 404) {
3105
+ return response;
3106
+ }
3107
+ const path = new URL(c.req.url).pathname;
3108
+ if (path.includes(".")) {
3109
+ return response;
3110
+ }
3111
+ const indexUrl = new URL(c.req.url);
3112
+ indexUrl.pathname = "/index.html";
3113
+ return await assets.fetch(new Request(indexUrl.toString()));
3113
3114
  });
3114
3115
  }
3115
3116
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.19.5",
3
- "sdkVersion": "0.7.2",
4
- "runtimeBuildId": "9df877eda20e",
5
- "inputFingerprint": "9df877eda20eba99d8a795cc1604b237ad952ce7e8de755f4bebfad559197eb3",
2
+ "cliVersion": "0.19.6-beta.2",
3
+ "sdkVersion": "0.7.3-beta.2",
4
+ "runtimeBuildId": "5444c6c1c794",
5
+ "inputFingerprint": "5444c6c1c79435ca312f88adf9ea7d5bf4a9efce39c1aa9dc03768a67955c5ac",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -479,7 +479,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
479
479
  // ../better-auth/package.json
480
480
  var package_default = {
481
481
  name: "@playcademy/better-auth",
482
- version: "0.0.10",
482
+ version: "0.0.11-beta.2",
483
483
  type: "module",
484
484
  exports: {
485
485
  "./server": {
@@ -2560,7 +2560,7 @@ import { existsSync as existsSync8, mkdirSync as mkdirSync2, writeFileSync as wr
2560
2560
  import { dirname as dirname4, join as join13 } from "node:path";
2561
2561
 
2562
2562
  // src/version.ts
2563
- var cliVersion = false ? "0.0.0-dev" : "0.19.5";
2563
+ var cliVersion = false ? "0.0.0-dev" : "0.19.6-beta.2";
2564
2564
 
2565
2565
  // src/lib/build/binary-resource.ts
2566
2566
  function writeFileTree(baseDir, files) {
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var cliVersion = false ? "0.0.0-dev" : "0.19.5";
2
+ var cliVersion = false ? "0.0.0-dev" : "0.19.6-beta.2";
3
3
  export {
4
4
  cliVersion
5
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playcademy",
3
- "version": "0.19.5",
3
+ "version": "0.19.6-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {