@playcademy/vite-plugin 0.2.32-beta.1 → 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.
- package/dist/index.js +90 -50
- package/package.json +2 -2
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.17-beta.
|
|
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
|
-
|
|
30011
|
-
isLocal: false,
|
|
30012
|
+
sstStage: "test",
|
|
30012
30013
|
...overrides
|
|
30013
30014
|
});
|
|
30014
30015
|
}
|
|
30015
30016
|
function getPlatformEnvironment(config2) {
|
|
30016
|
-
return config2.
|
|
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
|
-
|
|
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
|
|
50171
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
50460
|
-
workerBindings.d1 =
|
|
50490
|
+
if (bindings?.database) {
|
|
50491
|
+
workerBindings.d1 = [deploymentId];
|
|
50461
50492
|
}
|
|
50462
|
-
if (bindings?.keyValue
|
|
50463
|
-
workerBindings.kv =
|
|
50493
|
+
if (bindings?.keyValue) {
|
|
50494
|
+
workerBindings.kv = [deploymentId];
|
|
50464
50495
|
}
|
|
50465
|
-
if (bindings?.bucket
|
|
50466
|
-
workerBindings.r2 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
3
|
+
"version": "0.2.33-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"archiver": "^7.0.1",
|
|
22
22
|
"picocolors": "^1.1.1",
|
|
23
|
-
"playcademy": "0.19.
|
|
23
|
+
"playcademy": "0.19.8"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@electric-sql/pglite": "^0.3.16",
|