@playcademy/vite-plugin 0.2.32 → 0.2.33-beta.1

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 +90 -50
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -24356,7 +24356,8 @@ var GAME_WORKER_DOMAINS;
24356
24356
  var init_domains = __esm(() => {
24357
24357
  PLAYCADEMY_BASE_URLS = {
24358
24358
  production: "https://hub.playcademy.net",
24359
- staging: "https://hub.dev.playcademy.net"
24359
+ staging: "https://hub.dev.playcademy.net",
24360
+ local: "http://localhost:5174"
24360
24361
  };
24361
24362
  GAME_WORKER_DOMAINS = {
24362
24363
  production: "playcademy.gg",
@@ -24469,7 +24470,8 @@ var CLOUDFLARE_COMPATIBILITY_DATE = "2025-10-11";
24469
24470
  var init_workers = __esm(() => {
24470
24471
  WORKER_NAMING = {
24471
24472
  STAGING_PREFIX: "staging-",
24472
- STAGING_SUFFIX: "-staging"
24473
+ STAGING_SUFFIX: "-staging",
24474
+ LOCAL_PREFIX: "local-"
24473
24475
  };
24474
24476
  });
24475
24477
  var init_src = __esm(() => {
@@ -25370,7 +25372,7 @@ var package_default;
25370
25372
  var init_package = __esm(() => {
25371
25373
  package_default = {
25372
25374
  name: "@playcademy/sandbox",
25373
- version: "0.3.16",
25375
+ version: "0.3.17-beta.38",
25374
25376
  description: "Local development server for Playcademy game development",
25375
25377
  type: "module",
25376
25378
  exports: {
@@ -30007,24 +30009,18 @@ var init_esm = __esm(() => {
30007
30009
  });
30008
30010
  function createMinimalConfig(overrides) {
30009
30011
  return apiConfigSchema.parse({
30010
- stage: "local",
30011
- isLocal: false,
30012
+ sstStage: "test",
30012
30013
  ...overrides
30013
30014
  });
30014
30015
  }
30015
30016
  function getPlatformEnvironment(config2) {
30016
- return config2.stage === "production" ? "production" : "staging";
30017
+ return config2.sstStage === "production" ? "production" : "staging";
30017
30018
  }
30018
- function isProduction2(config2) {
30019
- return config2.stage === "production";
30020
- }
30021
- var stageSchema;
30022
30019
  var ltiConfigSchema;
30023
30020
  var realtimeConfigSchema;
30024
30021
  var apiConfigSchema;
30025
30022
  var init_schema = __esm(() => {
30026
30023
  init_esm();
30027
- stageSchema = exports_external.enum(["production", "dev", "local"]);
30028
30024
  ltiConfigSchema = exports_external.object({
30029
30025
  audience: exports_external.string(),
30030
30026
  jwksUrl: exports_external.string().url(),
@@ -30035,7 +30031,7 @@ var init_schema = __esm(() => {
30035
30031
  publishSecret: exports_external.string()
30036
30032
  });
30037
30033
  apiConfigSchema = exports_external.object({
30038
- stage: stageSchema,
30034
+ sstStage: exports_external.string(),
30039
30035
  isLocal: exports_external.boolean().default(false),
30040
30036
  baseUrl: exports_external.string().url().optional(),
30041
30037
  gameDomain: exports_external.string().optional(),
@@ -50167,8 +50163,36 @@ var init_playcademy = __esm(() => {
50167
50163
  init_workers3();
50168
50164
  init_infra();
50169
50165
  });
50170
- function getDeploymentId(gameSlug, isProduction3) {
50171
- return isProduction3 ? gameSlug : `${WORKER_NAMING.STAGING_PREFIX}${gameSlug}`;
50166
+ async function getTunnelUrl() {
50167
+ let response;
50168
+ try {
50169
+ response = await fetch(`${METRICS_BASE}/config`);
50170
+ } catch {
50171
+ throw new Error("Local tunnel is not running. Start it with `bun dev` or `bun scripts/infra/tunnel.ts`.");
50172
+ }
50173
+ if (!response.ok) {
50174
+ throw new Error(`Tunnel metrics endpoint returned ${response.status}`);
50175
+ }
50176
+ const data = await response.json();
50177
+ const hostname = data.config.ingress.find((r) => r.hostname)?.hostname;
50178
+ if (!hostname) {
50179
+ throw new Error("Tunnel is running but no hostname found in ingress config");
50180
+ }
50181
+ return `https://${hostname}`;
50182
+ }
50183
+ var TUNNEL_METRICS_PORT = 20241;
50184
+ var METRICS_BASE;
50185
+ var init_tunnel = __esm(() => {
50186
+ METRICS_BASE = `http://127.0.0.1:${TUNNEL_METRICS_PORT}`;
50187
+ });
50188
+ function getDeploymentId(gameSlug, sstStage) {
50189
+ if (sstStage === "production") {
50190
+ return gameSlug;
50191
+ }
50192
+ if (sstStage === "dev") {
50193
+ return `${WORKER_NAMING.STAGING_PREFIX}${gameSlug}`;
50194
+ }
50195
+ return `${WORKER_NAMING.LOCAL_PREFIX}${sstStage}-${gameSlug}`;
50172
50196
  }
50173
50197
  function getGameWorkerApiKeyName(slug) {
50174
50198
  return `game-worker-${slug}`.substring(0, 32);
@@ -50392,8 +50416,7 @@ class DeployService {
50392
50416
  const game = await this.deps.validateDeveloperAccessBySlug(user, slug);
50393
50417
  const flags2 = this.validateDeployRequest(request, slug);
50394
50418
  const { hasBackend, hasFrontend } = flags2;
50395
- const isProd = isProduction2(this.deps.config);
50396
- const deploymentId = getDeploymentId(slug, isProd);
50419
+ const deploymentId = getDeploymentId(slug, this.deps.config.sstStage);
50397
50420
  let frontendAssetsPath;
50398
50421
  let tempDir;
50399
50422
  if (hasFrontend) {
@@ -50407,7 +50430,15 @@ class DeployService {
50407
50430
  frontendAssetsPath = extracted.assetsPath;
50408
50431
  yield { type: "status", data: { message: "Extracting assets" } };
50409
50432
  }
50410
- const env = { GAME_ID: game.id, PLAYCADEMY_BASE_URL: this.deps.config.baseUrl };
50433
+ let platformBaseUrl = this.deps.config.baseUrl;
50434
+ if (this.deps.config.isLocal) {
50435
+ try {
50436
+ platformBaseUrl = await getTunnelUrl();
50437
+ } catch {
50438
+ throw new ValidationError("Local tunnel is not running. Ensure cloudflared is installed (`brew install cloudflared`) and the tunnel DevCommand started successfully.");
50439
+ }
50440
+ }
50441
+ const env = { GAME_ID: game.id, PLAYCADEMY_BASE_URL: platformBaseUrl };
50411
50442
  yield {
50412
50443
  type: "status",
50413
50444
  data: { message: hasBackend ? "Deploying backend code" : "Deploying to platform" }
@@ -50456,14 +50487,14 @@ class DeployService {
50456
50487
  return;
50457
50488
  }
50458
50489
  const workerBindings = {};
50459
- if (bindings?.database?.length) {
50460
- workerBindings.d1 = bindings.database;
50490
+ if (bindings?.database) {
50491
+ workerBindings.d1 = [deploymentId];
50461
50492
  }
50462
- if (bindings?.keyValue?.length) {
50463
- workerBindings.kv = bindings.keyValue;
50493
+ if (bindings?.keyValue) {
50494
+ workerBindings.kv = [deploymentId];
50464
50495
  }
50465
- if (bindings?.bucket?.length) {
50466
- workerBindings.r2 = bindings.bucket;
50496
+ if (bindings?.bucket) {
50497
+ workerBindings.r2 = [deploymentId];
50467
50498
  }
50468
50499
  if (bindings?.queues) {
50469
50500
  let toQueueName = function(queueKey) {
@@ -50530,7 +50561,7 @@ var init_deploy_service = __esm(() => {
50530
50561
  init_src();
50531
50562
  init_tables_index();
50532
50563
  init_src2();
50533
- init_config2();
50564
+ init_tunnel();
50534
50565
  init_errors();
50535
50566
  init_deployment_util();
50536
50567
  logger3 = log.scope("DeployService");
@@ -52065,8 +52096,7 @@ class DatabaseService {
52065
52096
  async reset(slug, user, schema2) {
52066
52097
  const d1 = this.getD1();
52067
52098
  const game = await this.deps.validateDeveloperAccessBySlug(user, slug);
52068
- const isProd = isProduction2(this.deps.config);
52069
- const deploymentId = getDeploymentId(slug, isProd);
52099
+ const deploymentId = getDeploymentId(slug, this.deps.config.sstStage);
52070
52100
  logger9.debug("Resetting database", {
52071
52101
  userId: user.id,
52072
52102
  gameId: game.id,
@@ -52142,7 +52172,6 @@ var init_database_service = __esm(() => {
52142
52172
  init_drizzle_orm();
52143
52173
  init_tables_index();
52144
52174
  init_src2();
52145
- init_config2();
52146
52175
  init_errors();
52147
52176
  init_deployment_util();
52148
52177
  logger9 = log.scope("DatabaseService");
@@ -52657,8 +52686,7 @@ class SecretsService {
52657
52686
  return this.deps.cloudflare;
52658
52687
  }
52659
52688
  getDeploymentId(slug) {
52660
- const isProd = isProduction2(this.deps.config);
52661
- return getDeploymentId(slug, isProd);
52689
+ return getDeploymentId(slug, this.deps.config.sstStage);
52662
52690
  }
52663
52691
  async listKeys(slug, user) {
52664
52692
  const game = await this.deps.validateDeveloperAccessBySlug(user, slug);
@@ -52787,7 +52815,6 @@ var INTERNAL_SECRET_KEYS;
52787
52815
  var init_secrets_service = __esm(() => {
52788
52816
  init_src();
52789
52817
  init_src2();
52790
- init_config2();
52791
52818
  init_errors();
52792
52819
  init_deployment_util();
52793
52820
  logger13 = log.scope("SecretsService");
@@ -52835,8 +52862,7 @@ class SeedService {
52835
52862
  async seed(slug, code, user, secrets) {
52836
52863
  const cf = this.getCloudflare();
52837
52864
  const game = await this.deps.validateDeveloperAccessBySlug(user, slug);
52838
- const isProd = isProduction2(this.deps.config);
52839
- const deploymentId = getDeploymentId(slug, isProd);
52865
+ const deploymentId = getDeploymentId(slug, this.deps.config.sstStage);
52840
52866
  const uniqueSuffix = Date.now().toString(36);
52841
52867
  const seedDeploymentId = `seed-${deploymentId}-${uniqueSuffix}`;
52842
52868
  logger14.debug("Seeding database", {
@@ -53075,7 +53101,6 @@ var init_seed_service = __esm(() => {
53075
53101
  init_src();
53076
53102
  init_setup2();
53077
53103
  init_src2();
53078
- init_config2();
53079
53104
  init_errors();
53080
53105
  init_deployment_util();
53081
53106
  logger14 = log.scope("SeedService");
@@ -58788,7 +58813,7 @@ class LogsService {
58788
58813
  constructor(deps) {
58789
58814
  this.deps = deps;
58790
58815
  }
58791
- async generateToken(user, slug2, environment) {
58816
+ async generateToken(user, slug2, sstStage) {
58792
58817
  const db2 = this.deps.db;
58793
58818
  if (user.role === "admin") {
58794
58819
  const game = await db2.query.games.findFirst({
@@ -58798,7 +58823,7 @@ class LogsService {
58798
58823
  if (!game) {
58799
58824
  throw new NotFoundError("Game", slug2);
58800
58825
  }
58801
- logger28.info("Admin accessing game logs", { adminId: user.id, slug: slug2, environment });
58826
+ logger28.info("Admin accessing game logs", { adminId: user.id, slug: slug2, sstStage });
58802
58827
  } else {
58803
58828
  const isApprovedDev = user.developerStatus === "approved";
58804
58829
  if (!isApprovedDev) {
@@ -58824,8 +58849,7 @@ class LogsService {
58824
58849
  throw new NotFoundError("Game", slug2);
58825
58850
  }
58826
58851
  }
58827
- const isProduction3 = environment === "production";
58828
- const workerId = getDeploymentId(slug2, isProduction3);
58852
+ const workerId = getDeploymentId(slug2, sstStage);
58829
58853
  const token = await this.deps.mintLogStreamToken(user.id, workerId);
58830
58854
  logger28.debug("Generated log stream token", {
58831
58855
  userId: user.id,
@@ -59559,7 +59583,7 @@ function createServices(ctx) {
59559
59583
  discord,
59560
59584
  cloudflare,
59561
59585
  storage,
59562
- stage: config2.stage
59586
+ stage: config2.sstStage
59563
59587
  });
59564
59588
  const player = createPlayerServices({
59565
59589
  db: db2,
@@ -62825,7 +62849,7 @@ var init_providers = __esm(() => {
62825
62849
  function buildConfig(options) {
62826
62850
  const baseUrl = `http://localhost:${options.port ?? 3000}`;
62827
62851
  return createMinimalConfig({
62828
- stage: "local",
62852
+ sstStage: "sandbox",
62829
62853
  baseUrl,
62830
62854
  gameDomain: "localhost",
62831
62855
  uploadBucket: "sandbox-uploads",
@@ -62862,7 +62886,7 @@ function createSandboxContext(options) {
62862
62886
  Object.assign(services, createServices(ctx));
62863
62887
  cachedServiceContext = ctx;
62864
62888
  log.debug("[Sandbox] ServiceContext initialized", {
62865
- stage: config2.stage,
62889
+ sstStage: config2.sstStage,
62866
62890
  baseUrl: config2.baseUrl,
62867
62891
  hasTimeback: Boolean(timeback2)
62868
62892
  });
@@ -121505,9 +121529,9 @@ var init_schemas2 = __esm(() => {
121505
121529
  compatibilityDate: exports_external.string().optional(),
121506
121530
  compatibilityFlags: exports_external.array(exports_external.string()).optional(),
121507
121531
  bindings: exports_external.object({
121508
- database: exports_external.array(exports_external.string()).optional(),
121509
- keyValue: exports_external.array(exports_external.string()).optional(),
121510
- bucket: exports_external.array(exports_external.string()).optional(),
121532
+ database: exports_external.union([exports_external.literal(true), exports_external.array(exports_external.string())]).optional(),
121533
+ keyValue: exports_external.union([exports_external.literal(true), exports_external.array(exports_external.string())]).optional(),
121534
+ bucket: exports_external.union([exports_external.literal(true), exports_external.array(exports_external.string())]).optional(),
121511
121535
  queues: exports_external.record(exports_external.string(), exports_external.union([
121512
121536
  exports_external.literal(true),
121513
121537
  exports_external.object({
@@ -123541,8 +123565,8 @@ var init_logs_controller = __esm(() => {
123541
123565
  let body2;
123542
123566
  try {
123543
123567
  const json4 = await ctx.request.json();
123544
- if (json4.environment !== "staging" && json4.environment !== "production") {
123545
- throw ApiError.badRequest('Invalid environment. Must be "staging" or "production".');
123568
+ if (json4.environment !== "local" && json4.environment !== "staging" && json4.environment !== "production") {
123569
+ throw ApiError.badRequest('Invalid environment. Must be "local", "staging", or "production".');
123546
123570
  }
123547
123571
  body2 = json4;
123548
123572
  } catch (error2) {
@@ -123556,7 +123580,13 @@ var init_logs_controller = __esm(() => {
123556
123580
  slug: slug2,
123557
123581
  environment: body2.environment
123558
123582
  });
123559
- return ctx.services.logs.generateToken(ctx.user, slug2, body2.environment);
123583
+ const envToSstStage = {
123584
+ local: ctx.config.sstStage,
123585
+ staging: "dev",
123586
+ production: "production"
123587
+ };
123588
+ const sstStage = envToSstStage[body2.environment] ?? "dev";
123589
+ return ctx.services.logs.generateToken(ctx.user, slug2, sstStage);
123560
123590
  });
123561
123591
  logs = {
123562
123592
  generateToken
@@ -123919,6 +123949,7 @@ var mintToken;
123919
123949
  var sessions2;
123920
123950
  var init_session_controller = __esm(() => {
123921
123951
  init_src2();
123952
+ init_tunnel();
123922
123953
  init_errors();
123923
123954
  init_utils11();
123924
123955
  logger61 = log.scope("SessionController");
@@ -123953,7 +123984,14 @@ var init_session_controller = __esm(() => {
123953
123984
  throw ApiError.badRequest("Missing game ID or slug");
123954
123985
  }
123955
123986
  logger61.debug("Minting token", { userId: ctx.user.id, gameIdOrSlug, launchId: ctx.launchId });
123956
- return ctx.services.session.mintToken(gameIdOrSlug, ctx.user.id);
123987
+ const { token, exp } = await ctx.services.session.mintToken(gameIdOrSlug, ctx.user.id);
123988
+ let baseUrl;
123989
+ if (ctx.config.isLocal) {
123990
+ try {
123991
+ baseUrl = await getTunnelUrl();
123992
+ } catch {}
123993
+ }
123994
+ return { token, exp, baseUrl };
123957
123995
  });
123958
123996
  sessions2 = {
123959
123997
  start: start2,
@@ -126961,7 +126999,8 @@ var GAME_WORKER_DOMAINS2;
126961
126999
  var init_domains3 = __esm8(() => {
126962
127000
  PLAYCADEMY_BASE_URLS2 = {
126963
127001
  production: "https://hub.playcademy.net",
126964
- staging: "https://hub.dev.playcademy.net"
127002
+ staging: "https://hub.dev.playcademy.net",
127003
+ local: "http://localhost:5174"
126965
127004
  };
126966
127005
  GAME_WORKER_DOMAINS2 = {
126967
127006
  production: "playcademy.gg",
@@ -127067,7 +127106,8 @@ var WORKER_NAMING2;
127067
127106
  var init_workers4 = __esm8(() => {
127068
127107
  WORKER_NAMING2 = {
127069
127108
  STAGING_PREFIX: "staging-",
127070
- STAGING_SUFFIX: "-staging"
127109
+ STAGING_SUFFIX: "-staging",
127110
+ LOCAL_PREFIX: "local-"
127071
127111
  };
127072
127112
  });
127073
127113
  var init_src5 = __esm8(() => {
@@ -127701,7 +127741,7 @@ var import_picocolors12 = __toESM(require_picocolors(), 1);
127701
127741
  // package.json
127702
127742
  var package_default2 = {
127703
127743
  name: "@playcademy/vite-plugin",
127704
- version: "0.2.32",
127744
+ version: "0.2.33-beta.1",
127705
127745
  type: "module",
127706
127746
  exports: {
127707
127747
  ".": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/vite-plugin",
3
- "version": "0.2.32",
3
+ "version": "0.2.33-beta.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {