@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.
- package/CHANGELOG.md +22 -0
- package/CLAUDE.md +8 -8
- package/README.md +6 -8
- package/dist/{chunk-6HGH6S36.js → chunk-7VLA5TBT.js} +23 -2
- package/dist/chunk-7VLA5TBT.js.map +1 -0
- package/dist/{chunk-I4R7DMIX.js → chunk-IJYNVM2W.js} +2 -2
- package/dist/{chunk-RH65K3US.js → chunk-OWMII7WC.js} +1 -1
- package/dist/chunk-OWMII7WC.js.map +1 -0
- package/dist/{chunk-GZEHPARN.js → chunk-VRKJHE7E.js} +3 -3
- package/dist/{chunk-GZEHPARN.js.map → chunk-VRKJHE7E.js.map} +1 -1
- package/dist/client.d.ts +2 -2
- package/dist/client.js +4 -4
- package/dist/{config-DV8DGNt6.d.ts → config-CwW3KY9r.d.ts} +6 -2
- package/dist/config.d.ts +2 -2
- package/dist/config.js +10 -4
- package/dist/index.d.ts +23 -11
- package/dist/index.js +39 -13
- package/dist/index.js.map +1 -1
- package/dist/{projectConfig-PB5VK5AD.js → projectConfig-REH67TB2.js} +2 -2
- package/dist/{sentrySetup-G7NGISBY.js → sentrySetup-HNIURVUZ.js} +3 -3
- package/dist/{sessionTypes-iyUMf_pf.d.ts → sessionTypes-DanjuPaE.d.ts} +1 -1
- package/docs/app-bootstrap.md +10 -7
- package/docs/config-registry.md +2 -2
- package/docs/csrf-config.md +11 -11
- package/docs/hooks.md +1 -1
- package/docs/rate-limit-strategy.md +1 -1
- package/docs/redis-adapter.md +1 -1
- package/docs/session-types.md +1 -1
- package/docs/socket-bootstrap.md +3 -3
- package/package.json +1 -1
- package/dist/chunk-6HGH6S36.js.map +0 -1
- package/dist/chunk-RH65K3US.js.map +0 -1
- /package/dist/{chunk-I4R7DMIX.js.map → chunk-IJYNVM2W.js.map} +0 -0
- /package/dist/{projectConfig-PB5VK5AD.js.map → projectConfig-REH67TB2.js.map} +0 -0
- /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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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,
|