@luckystack/core 0.8.3 → 0.8.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/CLAUDE.md +8 -8
  3. package/README.md +6 -8
  4. package/dist/{chunk-6HGH6S36.js → chunk-7VLA5TBT.js} +23 -2
  5. package/dist/chunk-7VLA5TBT.js.map +1 -0
  6. package/dist/{chunk-I4R7DMIX.js → chunk-IJYNVM2W.js} +2 -2
  7. package/dist/{chunk-RH65K3US.js → chunk-OWMII7WC.js} +1 -1
  8. package/dist/chunk-OWMII7WC.js.map +1 -0
  9. package/dist/{chunk-GZEHPARN.js → chunk-VRKJHE7E.js} +3 -3
  10. package/dist/{chunk-GZEHPARN.js.map → chunk-VRKJHE7E.js.map} +1 -1
  11. package/dist/client.d.ts +2 -2
  12. package/dist/client.js +4 -4
  13. package/dist/{config-DV8DGNt6.d.ts → config-CwW3KY9r.d.ts} +6 -2
  14. package/dist/config.d.ts +2 -2
  15. package/dist/config.js +10 -4
  16. package/dist/index.d.ts +23 -11
  17. package/dist/index.js +39 -13
  18. package/dist/index.js.map +1 -1
  19. package/dist/{projectConfig-PB5VK5AD.js → projectConfig-REH67TB2.js} +2 -2
  20. package/dist/{sentrySetup-G7NGISBY.js → sentrySetup-HNIURVUZ.js} +3 -3
  21. package/dist/{sessionTypes-iyUMf_pf.d.ts → sessionTypes-DanjuPaE.d.ts} +1 -1
  22. package/docs/app-bootstrap.md +10 -7
  23. package/docs/config-registry.md +2 -2
  24. package/docs/csrf-config.md +11 -11
  25. package/docs/hooks.md +1 -1
  26. package/docs/rate-limit-strategy.md +1 -1
  27. package/docs/redis-adapter.md +1 -1
  28. package/docs/session-types.md +1 -1
  29. package/docs/socket-bootstrap.md +3 -3
  30. package/package.json +1 -1
  31. package/dist/chunk-6HGH6S36.js.map +0 -1
  32. package/dist/chunk-RH65K3US.js.map +0 -1
  33. /package/dist/{chunk-I4R7DMIX.js.map → chunk-IJYNVM2W.js.map} +0 -0
  34. /package/dist/{projectConfig-PB5VK5AD.js.map → projectConfig-REH67TB2.js.map} +0 -0
  35. /package/dist/{sentrySetup-G7NGISBY.js.map → sentrySetup-HNIURVUZ.js.map} +0 -0
package/dist/index.js CHANGED
@@ -49,17 +49,20 @@ import {
49
49
  tryCatchSync,
50
50
  validatePagePath,
51
51
  waitForSocket
52
- } from "./chunk-GZEHPARN.js";
52
+ } from "./chunk-VRKJHE7E.js";
53
53
  import {
54
54
  getDeployConfig,
55
+ getPortOverride,
55
56
  getServicesConfig,
56
57
  isDeployConfigRegistered,
57
58
  isServicesConfigRegistered,
58
59
  notifySecretsResolved,
59
60
  registerDeployConfig,
61
+ registerPortOverride,
60
62
  registerSecretsResolvedListener,
61
- registerServicesConfig
62
- } from "./chunk-6HGH6S36.js";
63
+ registerServicesConfig,
64
+ resetPortOverrideForTests
65
+ } from "./chunk-7VLA5TBT.js";
63
66
  import {
64
67
  DEFAULT_REDACTED_LOG_KEYS,
65
68
  DEPTH_TRUNCATED_PLACEHOLDER,
@@ -93,7 +96,7 @@ import {
93
96
  startSpan,
94
97
  startSpanAcrossTrackers,
95
98
  startSpanHandle
96
- } from "./chunk-I4R7DMIX.js";
99
+ } from "./chunk-IJYNVM2W.js";
97
100
  import {
98
101
  DEFAULT_PROJECT_CONFIG,
99
102
  createRegistry,
@@ -103,7 +106,7 @@ import {
103
106
  isPlainObject,
104
107
  isProjectConfigRegistered,
105
108
  registerProjectConfig
106
- } from "./chunk-RH65K3US.js";
109
+ } from "./chunk-OWMII7WC.js";
107
110
 
108
111
  // src/escapeHtml.ts
109
112
  var HTML_ESCAPE_MAP = {
@@ -132,6 +135,15 @@ var loadPeer = (packageName, hint, requireFn = defaultRequire) => {
132
135
  return requireFn(packageName);
133
136
  };
134
137
 
138
+ // src/testFileConvention.ts
139
+ var TEST_FILE_PATTERN = /\.(?:tests?|spec)\.(?:[cm]?[jt]sx?)$/i;
140
+ var TEST_DIRECTORY_NAMES = /* @__PURE__ */ new Set(["__tests__", "__mocks__"]);
141
+ var isTestFile = (fileNameOrPath) => {
142
+ const fileName = fileNameOrPath.split(/[/\\]/).pop() ?? fileNameOrPath;
143
+ return TEST_FILE_PATTERN.test(fileName);
144
+ };
145
+ var isTestDirectory = (directoryName) => TEST_DIRECTORY_NAMES.has(directoryName);
146
+
135
147
  // src/roomNameFormatterRegistry.ts
136
148
  var identityFormatter = (rawRoomName) => rawRoomName;
137
149
  var registry = createRegistry(identityFormatter);
@@ -393,7 +405,6 @@ import { z } from "zod";
393
405
  var EnvSchema = z.object({
394
406
  NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
395
407
  SERVER_IP: z.string().min(1).default("127.0.0.1"),
396
- SERVER_PORT: z.string().regex(/^\d+$/).default("80"),
397
408
  SECURE: z.enum(["true", "false"]).default("false"),
398
409
  REDIS_HOST: z.string().min(1).default("127.0.0.1"),
399
410
  REDIS_PORT: z.string().regex(/^\d+$/).default("6379"),
@@ -468,7 +479,6 @@ var loadEnvFiles = () => {
468
479
  var applyResolvedDefaultsToProcessEnv = (resolvedEnv) => {
469
480
  process.env.NODE_ENV = process.env.NODE_ENV ?? resolvedEnv.NODE_ENV;
470
481
  process.env.SERVER_IP = process.env.SERVER_IP ?? resolvedEnv.SERVER_IP;
471
- process.env.SERVER_PORT = process.env.SERVER_PORT ?? resolvedEnv.SERVER_PORT;
472
482
  process.env.SECURE = process.env.SECURE ?? resolvedEnv.SECURE;
473
483
  process.env.REDIS_HOST = process.env.REDIS_HOST ?? resolvedEnv.REDIS_HOST;
474
484
  process.env.REDIS_PORT = process.env.REDIS_PORT ?? resolvedEnv.REDIS_PORT;
@@ -479,7 +489,9 @@ var bootstrapEnv = () => {
479
489
  return cachedEnv;
480
490
  }
481
491
  loadEnvFiles();
482
- const parsed = EnvSchema.safeParse(process.env);
492
+ const envInput = { ...process.env };
493
+ Reflect.deleteProperty(envInput, "SERVER_PORT");
494
+ const parsed = EnvSchema.safeParse(envInput);
483
495
  if (!parsed.success) {
484
496
  const details = parsed.error.issues.map((issue) => `${issue.path.join(".") || "env"}: ${issue.message}`).join("; ");
485
497
  throw new Error(`Invalid environment configuration: ${details}`);
@@ -1221,11 +1233,14 @@ var processUpload = async (input) => {
1221
1233
  };
1222
1234
 
1223
1235
  // src/bindAddress.ts
1236
+ var DEFAULT_SERVER_PORT = "80";
1224
1237
  var intended = null;
1238
+ var configuredPort = null;
1225
1239
  var registered = null;
1226
1240
  var registerBindAddress = (address) => {
1227
- intended = address;
1228
- registered = address;
1241
+ intended = { ip: address.ip, port: address.port };
1242
+ configuredPort = address.configuredPort ?? null;
1243
+ registered = intended;
1229
1244
  };
1230
1245
  var registerBoundAddress = (address) => {
1231
1246
  intended ??= address;
@@ -1237,7 +1252,9 @@ var getBindAddress = () => {
1237
1252
  }
1238
1253
  return {
1239
1254
  ip: process.env.SERVER_IP ?? "127.0.0.1",
1240
- port: process.env.SERVER_PORT ?? ""
1255
+ //? A real server registers its intended/defaultPort before OAuth or CORS
1256
+ //? reads this value. Port 80 only remains the generic pre-bootstrap fallback.
1257
+ port: DEFAULT_SERVER_PORT
1241
1258
  };
1242
1259
  };
1243
1260
  var defaultPortForProtocol = (protocol) => protocol === "https:" ? "443" : "80";
@@ -1254,7 +1271,9 @@ var resolveDevCallbackUrl = (callbackUrl) => {
1254
1271
  const intendedPort = intended ? String(intended.port) : "";
1255
1272
  if (!boundPort || !intendedPort) return callbackUrl;
1256
1273
  const currentPort = url.port || defaultPortForProtocol(url.protocol);
1257
- if (currentPort === boundPort || currentPort !== intendedPort) return callbackUrl;
1274
+ const matchesIntendedPort = currentPort === intendedPort;
1275
+ const matchesConfiguredPort = configuredPort !== null && currentPort === String(configuredPort);
1276
+ if (currentPort === boundPort || !matchesIntendedPort && !matchesConfiguredPort) return callbackUrl;
1258
1277
  url.port = boundPort === defaultPortForProtocol(url.protocol) ? "" : boundPort;
1259
1278
  return url.toString();
1260
1279
  };
@@ -2063,7 +2082,7 @@ var validateInputByType = async ({
2063
2082
  return { status: "success" };
2064
2083
  }
2065
2084
  if (isProductionRuntime()) {
2066
- const { getProjectConfig: getProjectConfig2 } = await import("./projectConfig-PB5VK5AD.js");
2085
+ const { getProjectConfig: getProjectConfig2 } = await import("./projectConfig-REH67TB2.js");
2067
2086
  if (getProjectConfig2().validation.runtimeMode === "off") {
2068
2087
  return { status: "success" };
2069
2088
  }
@@ -2245,6 +2264,8 @@ export {
2245
2264
  SERVER_FUNCTIONS_DIR,
2246
2265
  SHARED_DIR,
2247
2266
  SRC_DIR,
2267
+ TEST_DIRECTORY_NAMES,
2268
+ TEST_FILE_PATTERN,
2248
2269
  TSCONFIG_ALIAS_FILES,
2249
2270
  UNKNOWN_CLIENT_IP,
2250
2271
  UPLOADS_DIR,
@@ -2331,6 +2352,7 @@ export {
2331
2352
  getLogger,
2332
2353
  getNotifier,
2333
2354
  getParams,
2355
+ getPortOverride,
2334
2356
  getPrismaClient,
2335
2357
  getPrismaClientFor,
2336
2358
  getPrismaClientKeys,
@@ -2390,6 +2412,8 @@ export {
2390
2412
  isRuntimeMapsProviderRegistered,
2391
2413
  isServicesConfigRegistered,
2392
2414
  isSessionProviderRegistered,
2415
+ isTestDirectory,
2416
+ isTestFile,
2393
2417
  isTestRuntime,
2394
2418
  issueOneTimeToken,
2395
2419
  listEmailSenderNames,
@@ -2430,6 +2454,7 @@ export {
2430
2454
  registerLocalizedNormalizer,
2431
2455
  registerLogger,
2432
2456
  registerNotifier,
2457
+ registerPortOverride,
2433
2458
  registerPreCaptureFilter,
2434
2459
  registerPrismaClient,
2435
2460
  registerProjectConfig,
@@ -2457,6 +2482,7 @@ export {
2457
2482
  resetDbHealthCheckForTests,
2458
2483
  resetDefaultRedisClient,
2459
2484
  resetLoggerForTests,
2485
+ resetPortOverrideForTests,
2460
2486
  resetRedactedLogKeysForTests,
2461
2487
  resetRedisKeyFormatterForTests,
2462
2488
  resetSessionProviderForTests,