alepha 0.14.4 → 0.15.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/README.md +44 -102
- package/dist/api/audits/index.d.ts +331 -443
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +2 -2
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +0 -113
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +2 -3
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +151 -262
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/notifications/index.browser.js +4 -4
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +164 -276
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +4 -4
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +265 -377
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/users/index.browser.js +1 -2
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +195 -301
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +203 -184
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js +1 -2
- package/dist/batch/index.js.map +1 -1
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/index.d.ts +5900 -165
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1481 -639
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +8 -4
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +29 -25
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +563 -54
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +175 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +564 -54
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +563 -54
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +4 -4
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/index.d.ts +89 -42
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +129 -33
- package/dist/email/index.js.map +1 -1
- package/dist/fake/index.d.ts +7969 -2
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +22 -22
- package/dist/fake/index.js.map +1 -1
- package/dist/file/index.d.ts +134 -1
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +253 -1
- package/dist/file/index.js.map +1 -1
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +1 -2
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +1 -5
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +19 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +28 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/chunk-DH6iiROE.js +38 -0
- package/dist/orm/index.browser.js +9 -9
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.bun.js +2821 -0
- package/dist/orm/index.bun.js.map +1 -0
- package/dist/orm/index.d.ts +318 -169
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +2086 -1776
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +4 -4
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/redis/index.bun.js +285 -0
- package/dist/redis/index.bun.js.map +1 -0
- package/dist/redis/index.d.ts +13 -31
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +18 -38
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +83 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +393 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.browser.js +5 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +598 -112
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1808 -97
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +1200 -175
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1268 -37
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +6 -3
- package/dist/server/cache/index.d.ts.map +1 -1
- package/dist/server/cache/index.js +1 -1
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +3 -3
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.d.ts +115 -13
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +321 -139
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +0 -1
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +0 -1
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/helmet/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +9 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +1 -2
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +14 -7
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +514 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +4462 -4
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/multipart/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +1 -2
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +1 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -1
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +10 -10
- package/dist/sms/index.js.map +1 -1
- package/dist/thread/index.d.ts +0 -1
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/index.js +2 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/vite/index.d.ts +6315 -149
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +140 -469
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +9 -9
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +28 -28
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +9 -9
- package/dist/websocket/index.js.map +1 -1
- package/package.json +13 -18
- package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
- package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
- package/src/api/users/entities/users.ts +1 -1
- package/src/api/users/index.ts +8 -8
- package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
- package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
- package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
- package/src/api/users/services/CredentialService.ts +7 -7
- package/src/api/users/services/IdentityService.ts +4 -4
- package/src/api/users/services/RegistrationService.spec.ts +25 -27
- package/src/api/users/services/RegistrationService.ts +38 -27
- package/src/api/users/services/SessionCrudService.ts +3 -3
- package/src/api/users/services/SessionService.spec.ts +3 -3
- package/src/api/users/services/SessionService.ts +27 -18
- package/src/api/users/services/UserService.ts +7 -7
- package/src/batch/providers/BatchProvider.ts +1 -2
- package/src/cli/apps/AlephaCli.ts +2 -2
- package/src/cli/apps/AlephaPackageBuilderCli.ts +47 -20
- package/src/cli/assets/apiHelloControllerTs.ts +19 -0
- package/src/cli/assets/apiIndexTs.ts +16 -0
- package/src/cli/assets/biomeJson.ts +2 -1
- package/src/cli/assets/claudeMd.ts +308 -0
- package/src/cli/assets/dummySpecTs.ts +2 -1
- package/src/cli/assets/editorconfig.ts +2 -1
- package/src/cli/assets/mainBrowserTs.ts +4 -3
- package/src/cli/assets/mainCss.ts +24 -0
- package/src/cli/assets/mainServerTs.ts +24 -0
- package/src/cli/assets/tsconfigJson.ts +2 -1
- package/src/cli/assets/webAppRouterTs.ts +16 -0
- package/src/cli/assets/webHelloComponentTsx.ts +20 -0
- package/src/cli/assets/webIndexTs.ts +16 -0
- package/src/cli/atoms/appEntryOptions.ts +13 -0
- package/src/cli/atoms/buildOptions.ts +1 -1
- package/src/cli/atoms/changelogOptions.ts +1 -1
- package/src/cli/commands/build.ts +97 -61
- package/src/cli/commands/db.ts +21 -18
- package/src/cli/commands/deploy.ts +17 -5
- package/src/cli/commands/dev.ts +26 -47
- package/src/cli/commands/gen/env.ts +1 -1
- package/src/cli/commands/init.ts +79 -25
- package/src/cli/commands/lint.ts +9 -3
- package/src/cli/commands/test.ts +8 -2
- package/src/cli/commands/typecheck.ts +5 -1
- package/src/cli/commands/verify.ts +4 -2
- package/src/cli/defineConfig.ts +9 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/providers/AppEntryProvider.ts +131 -0
- package/src/cli/providers/ViteBuildProvider.ts +82 -0
- package/src/cli/providers/ViteDevServerProvider.ts +350 -0
- package/src/cli/providers/ViteTemplateProvider.ts +27 -0
- package/src/cli/services/AlephaCliUtils.ts +72 -602
- package/src/cli/services/PackageManagerUtils.ts +308 -0
- package/src/cli/services/ProjectScaffolder.ts +329 -0
- package/src/command/helpers/Runner.ts +15 -3
- package/src/core/Alepha.ts +2 -8
- package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/index.ts +2 -0
- package/src/core/primitives/$hook.ts +6 -2
- package/src/core/primitives/$module.spec.ts +4 -0
- package/src/core/primitives/$module.ts +12 -0
- package/src/core/providers/AlsProvider.ts +1 -1
- package/src/core/providers/CodecManager.spec.ts +12 -6
- package/src/core/providers/CodecManager.ts +26 -6
- package/src/core/providers/EventManager.ts +169 -13
- package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +878 -0
- package/src/core/providers/KeylessJsonSchemaCodec.ts +789 -0
- package/src/core/providers/SchemaValidator.spec.ts +236 -0
- package/src/core/providers/StateManager.spec.ts +27 -16
- package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
- package/src/email/providers/LocalEmailProvider.ts +52 -15
- package/src/email/providers/NodemailerEmailProvider.ts +167 -56
- package/src/file/errors/FileError.ts +7 -0
- package/src/file/index.ts +9 -1
- package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
- package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
- package/src/mcp/errors/McpError.ts +30 -0
- package/src/mcp/index.ts +3 -0
- package/src/mcp/transports/SseMcpTransport.ts +16 -6
- package/src/orm/index.browser.ts +1 -19
- package/src/orm/index.bun.ts +77 -0
- package/src/orm/index.shared-server.ts +22 -0
- package/src/orm/index.shared.ts +15 -0
- package/src/orm/index.ts +19 -39
- package/src/orm/providers/DrizzleKitProvider.ts +3 -5
- package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
- package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
- package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
- package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
- package/src/orm/services/Repository.ts +19 -0
- package/src/redis/index.bun.ts +35 -0
- package/src/redis/providers/BunRedisProvider.ts +12 -43
- package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
- package/src/redis/providers/NodeRedisProvider.ts +16 -34
- package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
- package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
- package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
- package/src/security/index.browser.ts +5 -0
- package/src/security/index.ts +90 -7
- package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
- package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
- package/src/security/primitives/$role.ts +5 -5
- package/src/security/primitives/$serviceAccount.spec.ts +5 -5
- package/src/security/primitives/$serviceAccount.ts +3 -3
- package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
- package/src/server/auth/primitives/$auth.ts +10 -10
- package/src/server/auth/primitives/$authCredentials.ts +3 -3
- package/src/server/auth/primitives/$authGithub.ts +3 -3
- package/src/server/auth/primitives/$authGoogle.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
- package/src/server/cache/providers/ServerCacheProvider.ts +1 -1
- package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
- package/src/server/core/index.ts +1 -1
- package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
- package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
- package/src/server/core/providers/NodeHttpServerProvider.ts +92 -24
- package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
- package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
- package/src/server/core/providers/ServerProvider.ts +144 -24
- package/src/server/core/providers/ServerRouterProvider.ts +259 -115
- package/src/server/core/providers/ServerTimingProvider.ts +2 -2
- package/src/server/links/atoms/apiLinksAtom.ts +7 -0
- package/src/server/links/index.browser.ts +2 -0
- package/src/server/links/index.ts +3 -1
- package/src/server/links/providers/LinkProvider.ts +1 -1
- package/src/server/swagger/index.ts +1 -1
- package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
- package/src/sms/providers/LocalSmsProvider.ts +8 -7
- package/src/vite/index.ts +3 -2
- package/src/vite/tasks/buildClient.ts +0 -1
- package/src/vite/tasks/buildServer.ts +80 -22
- package/src/vite/tasks/copyAssets.ts +5 -4
- package/src/vite/tasks/generateCloudflare.ts +7 -0
- package/src/vite/tasks/generateSitemap.ts +64 -23
- package/src/vite/tasks/index.ts +0 -2
- package/src/vite/tasks/prerenderPages.ts +49 -24
- package/dist/server/security/index.browser.js +0 -13
- package/dist/server/security/index.browser.js.map +0 -1
- package/dist/server/security/index.d.ts +0 -173
- package/dist/server/security/index.d.ts.map +0 -1
- package/dist/server/security/index.js +0 -311
- package/dist/server/security/index.js.map +0 -1
- package/src/cli/assets/appRouterTs.ts +0 -9
- package/src/cli/assets/indexHtml.ts +0 -15
- package/src/cli/assets/mainTs.ts +0 -13
- package/src/cli/commands/format.ts +0 -17
- package/src/server/security/index.browser.ts +0 -10
- package/src/server/security/index.ts +0 -94
- package/src/vite/helpers/boot.ts +0 -106
- package/src/vite/plugins/viteAlephaDev.ts +0 -177
- package/src/vite/tasks/devServer.ts +0 -69
- package/src/vite/tasks/runAlepha.ts +0 -270
- /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
- /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
package/dist/vite/index.js
CHANGED
|
@@ -1,86 +1,13 @@
|
|
|
1
1
|
import m, { createRequire } from "node:module";
|
|
2
|
-
import { access, cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import path, { basename, dirname, join, relative, resolve } from "node:path";
|
|
4
|
-
import { AlephaError } from "alepha";
|
|
5
|
-
import { pathToFileURL } from "node:url";
|
|
6
2
|
import { createHash } from "node:crypto";
|
|
7
3
|
import { existsSync, mkdirSync, promises, writeFileSync } from "node:fs";
|
|
4
|
+
import { basename, dirname, join, relative, resolve } from "node:path";
|
|
8
5
|
import { promisify } from "node:util";
|
|
9
6
|
import { brotliCompress, gzip } from "node:zlib";
|
|
10
7
|
import { analyzer } from "vite-bundle-analyzer";
|
|
8
|
+
import { access, cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
9
|
+
import { AlephaError } from "alepha";
|
|
11
10
|
|
|
12
|
-
//#region ../../src/vite/helpers/boot.ts
|
|
13
|
-
/**
|
|
14
|
-
* Remember:
|
|
15
|
-
* At first, functions was inside alepha/vite package, but it's now used in alepha too.
|
|
16
|
-
* For avoiding cli -> vite, all code moved here.
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Find browser/client entry file path.
|
|
20
|
-
*/
|
|
21
|
-
const getClientEntry = async (root = process.cwd()) => {
|
|
22
|
-
const indexPath = join(root, "index.html");
|
|
23
|
-
try {
|
|
24
|
-
return extractFirstModuleScriptSrc(await readFile(indexPath, "utf8")).replace(/\\/g, "/");
|
|
25
|
-
} catch {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Find server entry file path.
|
|
31
|
-
*/
|
|
32
|
-
const getServerEntry = async (root = process.cwd(), explicitEntry) => {
|
|
33
|
-
if (explicitEntry) {
|
|
34
|
-
const explicitPath = join(root, explicitEntry);
|
|
35
|
-
try {
|
|
36
|
-
await access(explicitPath);
|
|
37
|
-
return explicitPath;
|
|
38
|
-
} catch {
|
|
39
|
-
throw new AlephaError(`Explicit server entry file "${explicitEntry}" not found.`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
const maybeEntry = [
|
|
43
|
-
"src/main.server.ts",
|
|
44
|
-
"src/server-entry.ts",
|
|
45
|
-
"src/main.server.tsx",
|
|
46
|
-
"src/server-entry.tsx",
|
|
47
|
-
"src/main.ts",
|
|
48
|
-
"src/main.tsx"
|
|
49
|
-
];
|
|
50
|
-
for (const entry of maybeEntry) try {
|
|
51
|
-
const path$1 = join(root, entry).replace(/\\/g, "/");
|
|
52
|
-
await access(path$1);
|
|
53
|
-
return path$1;
|
|
54
|
-
} catch {}
|
|
55
|
-
const clientEntry = await getClientEntry(root);
|
|
56
|
-
if (clientEntry) return clientEntry;
|
|
57
|
-
throw new AlephaError(`Could not find a server entry file. List of supported entry file: ${maybeEntry.join(", ")}`);
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Extract first module script src from HTML.
|
|
61
|
-
*/
|
|
62
|
-
function extractFirstModuleScriptSrc(html) {
|
|
63
|
-
const scriptRegex = /<script\b[^>]*>[\s\S]*?<\/script>/gi;
|
|
64
|
-
let match = scriptRegex.exec(html);
|
|
65
|
-
while (match) {
|
|
66
|
-
const tag = match[0];
|
|
67
|
-
if (/type=["']module["']/i.test(tag)) {
|
|
68
|
-
const entry = tag.match(/\bsrc=["']([^"']+)["']/i)?.[1];
|
|
69
|
-
if (entry) {
|
|
70
|
-
if (entry.startsWith("/")) return entry.substring(1);
|
|
71
|
-
return entry;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
match = scriptRegex.exec(html);
|
|
75
|
-
}
|
|
76
|
-
throw new AlephaError(`No module script found in the provided HTML.`);
|
|
77
|
-
}
|
|
78
|
-
const boot = {
|
|
79
|
-
getClientEntry,
|
|
80
|
-
getServerEntry
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
//#endregion
|
|
84
11
|
//#region ../../src/vite/helpers/createBufferedLogger.ts
|
|
85
12
|
/**
|
|
86
13
|
* Creates a Vite logger that buffers all messages instead of printing them.
|
|
@@ -168,281 +95,20 @@ const importVite = async () => {
|
|
|
168
95
|
} catch (_error) {
|
|
169
96
|
try {
|
|
170
97
|
return createRequire(import.meta.url)("vite");
|
|
171
|
-
} catch (_error
|
|
98
|
+
} catch (_error) {
|
|
172
99
|
throw new Error("Vite is not installed. Please install it with `npm install vite`.");
|
|
173
100
|
}
|
|
174
101
|
}
|
|
175
102
|
};
|
|
176
103
|
|
|
177
104
|
//#endregion
|
|
178
|
-
//#region ../../src/vite/
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
*/
|
|
185
|
-
function createAlephaRunner(opts) {
|
|
186
|
-
return new AlephaRunner({
|
|
187
|
-
root: process.cwd().replace(/\\/g, "/"),
|
|
188
|
-
started: false,
|
|
189
|
-
log: opts.debug ? (...msg) => console.log(...msg) : () => {},
|
|
190
|
-
entry: opts.entry,
|
|
191
|
-
onReload: () => {}
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
var AlephaRunner = class {
|
|
195
|
-
state;
|
|
196
|
-
constructor(state) {
|
|
197
|
-
this.state = state;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Set resolved Vite config.
|
|
201
|
-
*/
|
|
202
|
-
setConfig(config) {
|
|
203
|
-
this.state.config = config;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Check if SSR is enabled for the running app.
|
|
207
|
-
*/
|
|
208
|
-
isSsrEnabled() {
|
|
209
|
-
if (!this.state.app) return false;
|
|
210
|
-
return this.state.app.store.get("alepha.react.server.ssr") ?? false;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Check if app is started.
|
|
214
|
-
*/
|
|
215
|
-
get isStarted() {
|
|
216
|
-
return this.state.started;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Get the running Alepha app instance.
|
|
220
|
-
*/
|
|
221
|
-
get app() {
|
|
222
|
-
return this.state.app;
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Start the Alepha application.
|
|
226
|
-
*/
|
|
227
|
-
async start(server) {
|
|
228
|
-
const { loadEnv } = await importVite();
|
|
229
|
-
global.ssrFixStacktrace = (e) => {
|
|
230
|
-
server.ssrFixStacktrace(e);
|
|
231
|
-
let it = e;
|
|
232
|
-
do {
|
|
233
|
-
server.ssrFixStacktrace(it);
|
|
234
|
-
it = it.cause;
|
|
235
|
-
} while (it instanceof Error);
|
|
236
|
-
};
|
|
237
|
-
if (this.state.started) {
|
|
238
|
-
await this.restart(server, true);
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
if (!this.state.config) {
|
|
242
|
-
this.state.log("[DEBUG] No config - skip starting");
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
this.state.onReload?.();
|
|
246
|
-
this.state.log("[DEBUG] Starting Alepha app...");
|
|
247
|
-
this.state.started = false;
|
|
248
|
-
this.state.app = void 0;
|
|
249
|
-
const fileUrl = pathToFileURL(`${path.resolve(this.state.config.root, this.state.entry)}`).href;
|
|
250
|
-
const env = loadEnv("development", this.state.config.root, "");
|
|
251
|
-
const before = { ...process.env };
|
|
252
|
-
for (const key in env) process.env[key] = env[key];
|
|
253
|
-
let port = 5173;
|
|
254
|
-
const address = server.httpServer?.address();
|
|
255
|
-
if (typeof address === "object" && address?.port) port = address.port;
|
|
256
|
-
process.env.NODE_ENV ??= "development";
|
|
257
|
-
process.env.VITE_ALEPHA_DEV = "true";
|
|
258
|
-
process.env.SERVER_HOST ??= typeof server.config.server.host === "string" ? server.config.server.host : "localhost";
|
|
259
|
-
process.env.SERVER_PORT ??= String(port);
|
|
260
|
-
try {
|
|
261
|
-
const now = Date.now();
|
|
262
|
-
await server.ssrLoadModule(fileUrl, { fixStacktrace: true });
|
|
263
|
-
this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);
|
|
264
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
265
|
-
this.state.app = globalThis.__alepha;
|
|
266
|
-
if (!this.state.app) {
|
|
267
|
-
this.state.log("[DEBUG] No app found - skip starting");
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
this.state.app.store.set("alepha.node.server", server.httpServer);
|
|
271
|
-
console.log("");
|
|
272
|
-
await this.state.app.start();
|
|
273
|
-
this.state.started = true;
|
|
274
|
-
process.env = { ...before };
|
|
275
|
-
this.state.log("[DEBUG] Starting Done!");
|
|
276
|
-
} catch (e) {
|
|
277
|
-
if (e instanceof Error) {
|
|
278
|
-
let it = e;
|
|
279
|
-
do {
|
|
280
|
-
server.ssrFixStacktrace(it);
|
|
281
|
-
it = it.cause;
|
|
282
|
-
} while (it instanceof Error);
|
|
283
|
-
server.ssrFixStacktrace(e);
|
|
284
|
-
if (e.cause instanceof Error) server.ssrFixStacktrace(e.cause);
|
|
285
|
-
this.state.app?.log?.error("App failed to start:", e);
|
|
286
|
-
this.state.app?.log?.info("Waiting for changes to restart...");
|
|
287
|
-
}
|
|
288
|
-
this.state.log("[DEBUG] Alepha app start error");
|
|
289
|
-
this.state.started = false;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Stop the Alepha application.
|
|
294
|
-
*/
|
|
295
|
-
async stop() {
|
|
296
|
-
if (this.state.app?.stop && this.state.started) {
|
|
297
|
-
this.state.log("[DEBUG] Stopping Alepha app...");
|
|
298
|
-
await this.state.app.stop();
|
|
299
|
-
this.state.started = false;
|
|
300
|
-
this.state.log("[DEBUG] Stopping Done!");
|
|
301
|
-
} else this.state.log("[DEBUG] Alepha app not started - skip stop");
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Restart the Alepha application.
|
|
305
|
-
*
|
|
306
|
-
* @returns true if the restart was skipped due to locking
|
|
307
|
-
*/
|
|
308
|
-
async restart(server, invalidate) {
|
|
309
|
-
if (this.state.lock) {
|
|
310
|
-
this.state.log("[DEBUG] STILL LOCKING");
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
this.state.log("[DEBUG] LOCK RESTART");
|
|
314
|
-
this.state.lock = Promise.withResolvers();
|
|
315
|
-
const now = Date.now();
|
|
316
|
-
this.state.log("[DEBUG] RESTART");
|
|
317
|
-
await this.stop();
|
|
318
|
-
this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);
|
|
319
|
-
if (invalidate) server.moduleGraph.invalidateAll();
|
|
320
|
-
await this.start(server);
|
|
321
|
-
this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);
|
|
322
|
-
setTimeout(() => {
|
|
323
|
-
this.state.log("[DEBUG] UNLOCK RESTART");
|
|
324
|
-
this.state.lock?.resolve();
|
|
325
|
-
this.state.lock = void 0;
|
|
326
|
-
}, 500);
|
|
327
|
-
return false;
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Send reload event to client.
|
|
331
|
-
*/
|
|
332
|
-
sendReload(server) {
|
|
333
|
-
server.ws.send({
|
|
334
|
-
type: "custom",
|
|
335
|
-
event: "alepha:reload",
|
|
336
|
-
data: {}
|
|
337
|
-
});
|
|
338
|
-
}
|
|
105
|
+
//#region ../../src/vite/helpers/importViteReact.ts
|
|
106
|
+
const importViteReact = async () => {
|
|
107
|
+
try {
|
|
108
|
+
const { default: viteReact } = createRequire(import.meta.url)("@vitejs/plugin-react");
|
|
109
|
+
return viteReact;
|
|
110
|
+
} catch {}
|
|
339
111
|
};
|
|
340
|
-
/**
|
|
341
|
-
* Check if a URL path is a Vite internal file.
|
|
342
|
-
*/
|
|
343
|
-
function isViteInternalPath(pathname) {
|
|
344
|
-
const [path$1] = pathname.split("?");
|
|
345
|
-
if (path$1.startsWith("/@") || path$1.startsWith("/src") || path$1.includes("/node_modules/")) return true;
|
|
346
|
-
return false;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
//#endregion
|
|
350
|
-
//#region ../../src/vite/plugins/viteAlephaDev.ts
|
|
351
|
-
/**
|
|
352
|
-
* Plug Alepha into Vite development server.
|
|
353
|
-
*
|
|
354
|
-
* This plugin manages the Alepha application lifecycle during development,
|
|
355
|
-
* handling hot module replacement and request forwarding.
|
|
356
|
-
*/
|
|
357
|
-
async function viteAlephaDev(options = {}) {
|
|
358
|
-
let entry = options.serverEntry;
|
|
359
|
-
if (!entry) {
|
|
360
|
-
entry = await boot.getServerEntry();
|
|
361
|
-
if (!entry) return {
|
|
362
|
-
name: "alepha-dev",
|
|
363
|
-
apply: "serve",
|
|
364
|
-
config() {}
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
const runner = createAlephaRunner({
|
|
368
|
-
entry,
|
|
369
|
-
debug: options.debug
|
|
370
|
-
});
|
|
371
|
-
const { loadEnv } = await importVite();
|
|
372
|
-
const env = loadEnv("development", process.cwd(), "SERVER");
|
|
373
|
-
const config = {};
|
|
374
|
-
if (env.SERVER_PORT) config.server = { port: parseInt(env.SERVER_PORT, 10) };
|
|
375
|
-
return {
|
|
376
|
-
name: "alepha-dev",
|
|
377
|
-
apply: "serve",
|
|
378
|
-
config: () => config,
|
|
379
|
-
configResolved(resolvedConfig) {
|
|
380
|
-
runner.setConfig(resolvedConfig);
|
|
381
|
-
},
|
|
382
|
-
async handleHotUpdate(ctx) {
|
|
383
|
-
if (options.debug) console.log("[DEBUG] HMR", ctx.file);
|
|
384
|
-
if (ctx.file.includes("/.idea/")) return [];
|
|
385
|
-
const isServerOnly = !ctx.modules[0]?._clientModule;
|
|
386
|
-
const isBrowserOnly = !ctx.modules[0]?._ssrModule;
|
|
387
|
-
const isSsrEnabled = runner.isSsrEnabled();
|
|
388
|
-
if (isBrowserOnly) {
|
|
389
|
-
if (options.debug) console.log("[DEBUG] HMR - browser only - no reason to reload server");
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
const root = process.cwd().replace(/\\/g, "/");
|
|
393
|
-
const invalidate = !ctx.file.startsWith(root);
|
|
394
|
-
if (invalidate && options.debug) console.log("[DEBUG] HMR - outside root - invalidate all");
|
|
395
|
-
if (!isSsrEnabled && isServerOnly) {
|
|
396
|
-
await runner.restart(ctx.server, invalidate);
|
|
397
|
-
return [];
|
|
398
|
-
}
|
|
399
|
-
if (isSsrEnabled && ctx.modules[0]) {
|
|
400
|
-
if (await runner.restart(ctx.server, invalidate)) return [];
|
|
401
|
-
if (!runner.isStarted) {
|
|
402
|
-
if (options.debug) console.log("[DEBUG] HMR - abort due to app not started");
|
|
403
|
-
return [];
|
|
404
|
-
}
|
|
405
|
-
if (isServerOnly && runner.isStarted) {
|
|
406
|
-
runner.sendReload(ctx.server);
|
|
407
|
-
return [];
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
},
|
|
411
|
-
async configureServer(server) {
|
|
412
|
-
if (env.SERVER_PORT) server.config.server.port = parseInt(env.SERVER_PORT, 10);
|
|
413
|
-
const middleware = (req, res, next) => {
|
|
414
|
-
if (runner.isStarted && runner.app && req.url && !isViteInternalPath(req.url)) {
|
|
415
|
-
let ended = false;
|
|
416
|
-
const writeHead = res.writeHead.bind(res);
|
|
417
|
-
res.writeHead = (...args) => {
|
|
418
|
-
ended = true;
|
|
419
|
-
return writeHead(args[0], args[1], args[2]);
|
|
420
|
-
};
|
|
421
|
-
return runner.app.events.emit("node:request", {
|
|
422
|
-
req,
|
|
423
|
-
res
|
|
424
|
-
}).then(() => {
|
|
425
|
-
if (!ended) next();
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
next();
|
|
429
|
-
};
|
|
430
|
-
server.middlewares.use((req, res, next) => {
|
|
431
|
-
middleware(req, res, next);
|
|
432
|
-
});
|
|
433
|
-
server.config.logger.info = (msg) => {
|
|
434
|
-
console.log(msg);
|
|
435
|
-
};
|
|
436
|
-
server.config.logger.clearScreen = () => {};
|
|
437
|
-
return () => {
|
|
438
|
-
server.httpServer?.once("listening", () => {
|
|
439
|
-
runner.start(server);
|
|
440
|
-
});
|
|
441
|
-
};
|
|
442
|
-
},
|
|
443
|
-
async closeBundle() {}
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
112
|
|
|
447
113
|
//#endregion
|
|
448
114
|
//#region ../../src/vite/plugins/viteAlephaSsrPreload.ts
|
|
@@ -605,11 +271,11 @@ function viteCompress(options = {}) {
|
|
|
605
271
|
};
|
|
606
272
|
}
|
|
607
273
|
async function compressFile(options = {}, filePath) {
|
|
608
|
-
const { brotli = true, gzip
|
|
274
|
+
const { brotli = true, gzip = true } = options;
|
|
609
275
|
const compressionTasks = [];
|
|
610
276
|
const fileContentPromise = promises.readFile(filePath);
|
|
611
|
-
if (gzip
|
|
612
|
-
const gzipOptions = typeof gzip
|
|
277
|
+
if (gzip) {
|
|
278
|
+
const gzipOptions = typeof gzip === "object" ? gzip : { level: 9 };
|
|
613
279
|
compressionTasks.push(fileContentPromise.then(async (content) => {
|
|
614
280
|
const compressed = await gzipCompress(content, gzipOptions);
|
|
615
281
|
await promises.writeFile(`${filePath}.gz`, compressed);
|
|
@@ -625,15 +291,6 @@ async function compressFile(options = {}, filePath) {
|
|
|
625
291
|
await Promise.all(compressionTasks);
|
|
626
292
|
}
|
|
627
293
|
|
|
628
|
-
//#endregion
|
|
629
|
-
//#region ../../src/vite/helpers/importViteReact.ts
|
|
630
|
-
const importViteReact = async () => {
|
|
631
|
-
try {
|
|
632
|
-
const { default: viteReact } = createRequire(import.meta.url)("@vitejs/plugin-react");
|
|
633
|
-
return viteReact;
|
|
634
|
-
} catch {}
|
|
635
|
-
};
|
|
636
|
-
|
|
637
294
|
//#endregion
|
|
638
295
|
//#region ../../src/vite/tasks/buildClient.ts
|
|
639
296
|
/**
|
|
@@ -661,7 +318,6 @@ async function buildClient(opts) {
|
|
|
661
318
|
chunkSizeWarningLimit: 1e3,
|
|
662
319
|
outDir: opts.dist,
|
|
663
320
|
manifest: true,
|
|
664
|
-
ssrManifest: true,
|
|
665
321
|
rollupOptions: { output: {
|
|
666
322
|
entryFileNames: "entry.[hash].js",
|
|
667
323
|
chunkFileNames: "chunk.[hash].js",
|
|
@@ -717,19 +373,29 @@ async function generateExternals(opts) {
|
|
|
717
373
|
* the dist/index.js entry wrapper.
|
|
718
374
|
*/
|
|
719
375
|
async function buildServer(opts) {
|
|
720
|
-
const { build: viteBuild,
|
|
376
|
+
const { build: viteBuild, resolveConfig } = await importVite();
|
|
721
377
|
const plugins = [];
|
|
722
378
|
const viteReact = await importViteReact();
|
|
723
379
|
if (viteReact && opts.clientDir) plugins.push(viteReact());
|
|
724
380
|
plugins.push(viteAlephaSsrPreload());
|
|
725
381
|
if (opts.stats) plugins.push(analyzer({ analyzerMode: "static" }));
|
|
726
382
|
const logger = opts.silent ? createBufferedLogger() : void 0;
|
|
383
|
+
const conditions = [
|
|
384
|
+
"node",
|
|
385
|
+
"import",
|
|
386
|
+
"module",
|
|
387
|
+
"default"
|
|
388
|
+
];
|
|
389
|
+
if (opts.conditions) conditions.unshift(...opts.conditions);
|
|
727
390
|
const viteBuildServerConfig = {
|
|
728
391
|
mode: "production",
|
|
729
392
|
logLevel: opts.silent ? "silent" : void 0,
|
|
730
393
|
define: { "process.env.NODE_ENV": "\"production\"" },
|
|
731
394
|
publicDir: false,
|
|
732
|
-
ssr: {
|
|
395
|
+
ssr: {
|
|
396
|
+
noExternal: true,
|
|
397
|
+
resolve: { conditions }
|
|
398
|
+
},
|
|
733
399
|
build: {
|
|
734
400
|
sourcemap: true,
|
|
735
401
|
ssr: opts.entry,
|
|
@@ -737,7 +403,7 @@ async function buildServer(opts) {
|
|
|
737
403
|
minify: true,
|
|
738
404
|
chunkSizeWarningLimit: 1e4,
|
|
739
405
|
rollupOptions: {
|
|
740
|
-
external: [
|
|
406
|
+
external: [/^bun(:|$)/, /^cloudflare:/],
|
|
741
407
|
output: {
|
|
742
408
|
entryFileNames: "[hash].js",
|
|
743
409
|
chunkFileNames: "[hash].js",
|
|
@@ -755,12 +421,14 @@ async function buildServer(opts) {
|
|
|
755
421
|
};
|
|
756
422
|
let result;
|
|
757
423
|
try {
|
|
758
|
-
result = await viteBuild(
|
|
424
|
+
result = await viteBuild(viteBuildServerConfig);
|
|
759
425
|
} catch (error) {
|
|
760
426
|
logger?.flush();
|
|
761
427
|
throw error;
|
|
762
428
|
}
|
|
763
|
-
const
|
|
429
|
+
const resolvedConfig = await resolveConfig(viteBuildServerConfig, "build");
|
|
430
|
+
const externals = [];
|
|
431
|
+
if (Array.isArray(resolvedConfig?.ssr?.external)) externals.push(...resolvedConfig.ssr.external);
|
|
764
432
|
await generateExternals({
|
|
765
433
|
distDir: opts.distDir,
|
|
766
434
|
externals
|
|
@@ -769,14 +437,17 @@ async function buildServer(opts) {
|
|
|
769
437
|
let template = "";
|
|
770
438
|
if (opts.clientDir) template = `__alepha.set("alepha.react.server.template", \`${(await readFile(`${opts.distDir}/${opts.clientDir}/index.html`, "utf-8")).replace(/>\s*</g, "><").trim()}\`);\n`;
|
|
771
439
|
let manifest = "";
|
|
440
|
+
let manifestData;
|
|
772
441
|
if (opts.clientDir) {
|
|
773
442
|
const viteDir = `${opts.distDir}/${opts.clientDir}/.vite`;
|
|
774
|
-
const
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
443
|
+
const clientManifest = await loadJsonFile(`${viteDir}/manifest.json`);
|
|
444
|
+
const preloadManifest = await loadJsonFile(`${viteDir}/preload-manifest.json`);
|
|
445
|
+
manifestData = {
|
|
446
|
+
client: stripClientManifest(clientManifest),
|
|
447
|
+
preload: preloadManifest
|
|
778
448
|
};
|
|
779
|
-
manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(
|
|
449
|
+
manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(manifestData)});\n`;
|
|
450
|
+
opts.alepha.store.set("alepha.react.ssr.manifest", manifestData);
|
|
780
451
|
await rm(viteDir, {
|
|
781
452
|
recursive: true,
|
|
782
453
|
force: true
|
|
@@ -785,20 +456,38 @@ async function buildServer(opts) {
|
|
|
785
456
|
await writeFile(`${opts.distDir}/index.js`, `// This file was automatically generated. DO NOT MODIFY.
|
|
786
457
|
// Changes to this file will be lost when the code is regenerated.
|
|
787
458
|
\n${template}${manifest}import './server/${entryFile}';\n`.trim());
|
|
788
|
-
return {
|
|
459
|
+
return {
|
|
460
|
+
entryFile,
|
|
461
|
+
manifest: manifestData
|
|
462
|
+
};
|
|
789
463
|
}
|
|
790
464
|
/**
|
|
791
465
|
* Load a JSON file, returning undefined if it doesn't exist.
|
|
792
466
|
*/
|
|
793
|
-
async function loadJsonFile(path
|
|
467
|
+
async function loadJsonFile(path) {
|
|
794
468
|
try {
|
|
795
|
-
const content = await readFile(path
|
|
469
|
+
const content = await readFile(path, "utf-8");
|
|
796
470
|
return JSON.parse(content);
|
|
797
471
|
} catch {
|
|
798
472
|
return;
|
|
799
473
|
}
|
|
800
474
|
}
|
|
801
475
|
/**
|
|
476
|
+
* Strip unused fields from client manifest to reduce bundle size.
|
|
477
|
+
* Only keeps: file, isEntry, imports, css
|
|
478
|
+
*/
|
|
479
|
+
function stripClientManifest(manifest) {
|
|
480
|
+
if (!manifest) return void 0;
|
|
481
|
+
const stripped = {};
|
|
482
|
+
for (const [key, entry] of Object.entries(manifest)) stripped[key] = {
|
|
483
|
+
file: entry.file,
|
|
484
|
+
...entry.isEntry && { isEntry: entry.isEntry },
|
|
485
|
+
...entry.imports?.length && { imports: entry.imports },
|
|
486
|
+
...entry.css?.length && { css: entry.css }
|
|
487
|
+
};
|
|
488
|
+
return stripped;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
802
491
|
* Extract entry filename from Vite build result.
|
|
803
492
|
*/
|
|
804
493
|
function extractEntryFromBundle(entry, result) {
|
|
@@ -808,28 +497,6 @@ function extractEntryFromBundle(entry, result) {
|
|
|
808
497
|
return entryFile;
|
|
809
498
|
}
|
|
810
499
|
|
|
811
|
-
//#endregion
|
|
812
|
-
//#region ../../src/vite/helpers/importAlepha.ts
|
|
813
|
-
/**
|
|
814
|
-
* Import Alepha instance from a transpiled server entry file.
|
|
815
|
-
*/
|
|
816
|
-
const importAlepha = async (entry, options) => {
|
|
817
|
-
if (global.__cli_alepha) return global.__cli_alepha;
|
|
818
|
-
const { loadEnv } = await importVite();
|
|
819
|
-
const env = loadEnv("development", process.cwd(), "");
|
|
820
|
-
for (const key in env) process.env[key] = env[key];
|
|
821
|
-
if (options?.env) for (const key in options.env) process.env[key] = options.env[key];
|
|
822
|
-
process.env.ALEPHA_CLI_IMPORT = "true";
|
|
823
|
-
process.env.LOG_LEVEL = "error";
|
|
824
|
-
process.env.LOG_FORMAT = "pretty";
|
|
825
|
-
process.env.NODE_ENV = "production";
|
|
826
|
-
const mod = await import(pathToFileURL(join(process.cwd(), entry)).href);
|
|
827
|
-
if (mod.default) return mod.default;
|
|
828
|
-
const alepha = global.__cli_alepha;
|
|
829
|
-
if (!alepha) throw new AlephaError("Alepha instance not found. Ensure Alepha is initialized.");
|
|
830
|
-
return alepha;
|
|
831
|
-
};
|
|
832
|
-
|
|
833
500
|
//#endregion
|
|
834
501
|
//#region ../../src/vite/tasks/copyAssets.ts
|
|
835
502
|
/**
|
|
@@ -842,8 +509,8 @@ const importAlepha = async (entry, options) => {
|
|
|
842
509
|
* Used by modules like AlephaServerSwagger to distribute UI files.
|
|
843
510
|
*/
|
|
844
511
|
async function copyAssets(opts) {
|
|
845
|
-
const root = opts.root
|
|
846
|
-
const assets =
|
|
512
|
+
const root = opts.root;
|
|
513
|
+
const assets = opts.alepha.store.get("alepha.build.assets");
|
|
847
514
|
if (!assets || assets.length === 0) return;
|
|
848
515
|
const fn = async () => {
|
|
849
516
|
const require = createRequire(join(root, opts.entry));
|
|
@@ -858,35 +525,6 @@ async function copyAssets(opts) {
|
|
|
858
525
|
else await fn();
|
|
859
526
|
}
|
|
860
527
|
|
|
861
|
-
//#endregion
|
|
862
|
-
//#region ../../src/vite/tasks/devServer.ts
|
|
863
|
-
/**
|
|
864
|
-
* Start Vite development server with Alepha plugins.
|
|
865
|
-
*
|
|
866
|
-
* This task starts the Vite dev server with all required plugins:
|
|
867
|
-
* - @vitejs/plugin-react (JSX/TSX compilation)
|
|
868
|
-
* - viteAlephaDev (Alepha server integration)
|
|
869
|
-
* - viteAlephaSsrPreload (SSR module preloading)
|
|
870
|
-
*/
|
|
871
|
-
async function devServer(opts = {}) {
|
|
872
|
-
const { createServer, mergeConfig } = await importVite();
|
|
873
|
-
const plugins = [];
|
|
874
|
-
const viteReact = await importViteReact();
|
|
875
|
-
if (viteReact) plugins.push(viteReact());
|
|
876
|
-
plugins.push(viteAlephaSsrPreload());
|
|
877
|
-
plugins.push(await viteAlephaDev({
|
|
878
|
-
serverEntry: opts.entry,
|
|
879
|
-
debug: opts.debug
|
|
880
|
-
}));
|
|
881
|
-
await (await createServer(mergeConfig({
|
|
882
|
-
plugins,
|
|
883
|
-
server: {
|
|
884
|
-
port: opts.port,
|
|
885
|
-
host: opts.host
|
|
886
|
-
}
|
|
887
|
-
}, {}))).listen();
|
|
888
|
-
}
|
|
889
|
-
|
|
890
528
|
//#endregion
|
|
891
529
|
//#region ../../src/vite/tasks/generateCloudflare.ts
|
|
892
530
|
const WARNING_COMMENT$1 = "// This file was automatically generated. DO NOT MODIFY.\n// Changes to this file will be lost when the code is regenerated.\n";
|
|
@@ -907,6 +545,11 @@ async function generateCloudflare(opts = {}) {
|
|
|
907
545
|
main: "./main.cloudflare.js",
|
|
908
546
|
compatibility_flags: ["nodejs_compat"],
|
|
909
547
|
compatibility_date: "2025-11-17",
|
|
548
|
+
no_bundle: true,
|
|
549
|
+
rules: [{
|
|
550
|
+
type: "ESModule",
|
|
551
|
+
globs: ["index.js", "server/*.js"]
|
|
552
|
+
}],
|
|
910
553
|
...opts.config
|
|
911
554
|
};
|
|
912
555
|
if (hasAssets) wrangler.assets ??= {
|
|
@@ -915,15 +558,15 @@ async function generateCloudflare(opts = {}) {
|
|
|
915
558
|
};
|
|
916
559
|
const url = process.env.DATABASE_URL;
|
|
917
560
|
if (url?.startsWith("cloudflare-d1:")) {
|
|
918
|
-
const [name
|
|
561
|
+
const [name, id] = url.replace("cloudflare-d1://", "").replace("cloudflare-d1:", "").split(":");
|
|
919
562
|
wrangler.d1_databases = wrangler.d1_databases || [];
|
|
920
563
|
wrangler.d1_databases.push({
|
|
921
|
-
binding: name
|
|
922
|
-
database_name: name
|
|
564
|
+
binding: name,
|
|
565
|
+
database_name: name,
|
|
923
566
|
database_id: id
|
|
924
567
|
});
|
|
925
568
|
wrangler.vars ??= {};
|
|
926
|
-
wrangler.vars.DATABASE_URL = `cloudflare-d1://${name
|
|
569
|
+
wrangler.vars.DATABASE_URL = `cloudflare-d1://${name}:${id}`;
|
|
927
570
|
}
|
|
928
571
|
await writeFile(join(root, distDir, "wrangler.jsonc"), JSON.stringify(wrangler, null, 2));
|
|
929
572
|
await writeWorkerEntryPoint(root, distDir);
|
|
@@ -953,8 +596,8 @@ export default {
|
|
|
953
596
|
|
|
954
597
|
//#endregion
|
|
955
598
|
//#region ../../src/vite/helpers/fileExists.ts
|
|
956
|
-
const fileExists = async (path
|
|
957
|
-
return await access(join(process.cwd(), path
|
|
599
|
+
const fileExists = async (path) => {
|
|
600
|
+
return await access(join(process.cwd(), path)).then(() => true).catch(() => false);
|
|
958
601
|
};
|
|
959
602
|
|
|
960
603
|
//#endregion
|
|
@@ -1000,41 +643,56 @@ CMD ["${command}", "index.js"]
|
|
|
1000
643
|
/**
|
|
1001
644
|
* Generate sitemap.xml from Alepha page primitives.
|
|
1002
645
|
*
|
|
1003
|
-
*
|
|
1004
|
-
* queries all page primitives, and generates a sitemap.xml
|
|
646
|
+
* Queries all page primitives and generates a sitemap.xml
|
|
1005
647
|
* containing URLs for all accessible pages.
|
|
1006
648
|
*/
|
|
1007
649
|
async function generateSitemap(opts) {
|
|
1008
|
-
const
|
|
1009
|
-
if (
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
650
|
+
const pages = getSitemapPages(opts.alepha);
|
|
651
|
+
if (pages.length === 0) return "";
|
|
652
|
+
let result = "";
|
|
653
|
+
const fn = async () => {
|
|
654
|
+
result = generateSitemapFromPages(pages, opts.baseUrl);
|
|
655
|
+
if (opts.output) await writeFile(opts.output, result);
|
|
656
|
+
};
|
|
657
|
+
if (opts.run) await opts.run({
|
|
658
|
+
name: "generate sitemap",
|
|
659
|
+
handler: fn
|
|
660
|
+
});
|
|
661
|
+
else await fn();
|
|
662
|
+
return result;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Get all pages that should be included in the sitemap.
|
|
666
|
+
*/
|
|
667
|
+
function getSitemapPages(alepha) {
|
|
668
|
+
return alepha.primitives("page").filter((page) => {
|
|
669
|
+
const options = page.options;
|
|
670
|
+
if (options.children) return false;
|
|
671
|
+
if (!options.schema?.params) return true;
|
|
672
|
+
if (options.static && typeof options.static === "object" && options.static.entries) return true;
|
|
673
|
+
return false;
|
|
674
|
+
});
|
|
1015
675
|
}
|
|
1016
|
-
function
|
|
1017
|
-
const pages = alepha.primitives("page");
|
|
676
|
+
function generateSitemapFromPages(pages, baseUrl) {
|
|
1018
677
|
const urls = [];
|
|
678
|
+
const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
|
|
1019
679
|
for (const page of pages) {
|
|
1020
680
|
const options = page.options;
|
|
1021
|
-
if (options.children) continue;
|
|
1022
681
|
if (!options.schema?.params) {
|
|
1023
|
-
const path
|
|
1024
|
-
const url = `${
|
|
682
|
+
const path = options.path || "";
|
|
683
|
+
const url = `${normalizedBaseUrl}${path === "" ? "/" : path}`;
|
|
1025
684
|
urls.push(url);
|
|
1026
685
|
} else if (options.static && typeof options.static === "object" && options.static.entries) for (const entry of options.static.entries) {
|
|
1027
|
-
const
|
|
1028
|
-
const url = `${baseUrl.replace(/\/$/, "")}${path$1}`;
|
|
686
|
+
const url = `${normalizedBaseUrl}${buildPathFromParams(options.path || "", entry.params || {})}`;
|
|
1029
687
|
urls.push(url);
|
|
1030
688
|
}
|
|
1031
689
|
}
|
|
1032
690
|
return buildSitemapXml(urls);
|
|
1033
691
|
}
|
|
1034
692
|
function buildPathFromParams(pathPattern, params) {
|
|
1035
|
-
let path
|
|
1036
|
-
for (const [key, value] of Object.entries(params)) path
|
|
1037
|
-
return path
|
|
693
|
+
let path = pathPattern;
|
|
694
|
+
for (const [key, value] of Object.entries(params)) path = path.replace(`:${key}`, String(value));
|
|
695
|
+
return path || "/";
|
|
1038
696
|
}
|
|
1039
697
|
function buildSitemapXml(urls) {
|
|
1040
698
|
const lastMod = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
@@ -1074,8 +732,8 @@ async function generateVercel(opts = {}) {
|
|
|
1074
732
|
/**
|
|
1075
733
|
* Check if a file or directory exists at the given path
|
|
1076
734
|
*/
|
|
1077
|
-
async function exists(path
|
|
1078
|
-
return stat(path
|
|
735
|
+
async function exists(path) {
|
|
736
|
+
return stat(path).then(() => true).catch(() => false);
|
|
1079
737
|
}
|
|
1080
738
|
/**
|
|
1081
739
|
* Create the serverless function entry point that bootstraps Alepha and handles requests
|
|
@@ -1121,10 +779,10 @@ async function writeProjectConfig(distDir, projectId, projectName, orgId) {
|
|
|
1121
779
|
* Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors
|
|
1122
780
|
*/
|
|
1123
781
|
async function ensureClientDir(distDir, clientDir) {
|
|
1124
|
-
const path
|
|
1125
|
-
if (!await exists(path
|
|
1126
|
-
await mkdir(path
|
|
1127
|
-
await writeFile(`${path
|
|
782
|
+
const path = `${distDir}/${clientDir}`;
|
|
783
|
+
if (!await exists(path)) {
|
|
784
|
+
await mkdir(path, { recursive: true });
|
|
785
|
+
await writeFile(`${path}/.keep`, "");
|
|
1128
786
|
}
|
|
1129
787
|
}
|
|
1130
788
|
|
|
@@ -1133,26 +791,39 @@ async function ensureClientDir(distDir, clientDir) {
|
|
|
1133
791
|
/**
|
|
1134
792
|
* Pre-render static pages defined in the Alepha application.
|
|
1135
793
|
*
|
|
1136
|
-
*
|
|
1137
|
-
*
|
|
1138
|
-
*
|
|
1139
|
-
* `static.entries` configuration.
|
|
794
|
+
* Queries all page primitives with `static: true` and generates
|
|
795
|
+
* static HTML files for each page. Supports pages with parameterized
|
|
796
|
+
* routes via `static.entries` configuration.
|
|
1140
797
|
*/
|
|
1141
798
|
async function prerenderPages(opts) {
|
|
1142
|
-
const alepha =
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
799
|
+
const alepha = opts.alepha;
|
|
800
|
+
const pages = getStaticPages(alepha);
|
|
801
|
+
if (pages.length === 0) return { count: 0 };
|
|
802
|
+
let result = { count: 0 };
|
|
803
|
+
const fn = async () => {
|
|
804
|
+
if (!alepha.isConfigured()) await alepha.events.emit("configure", alepha);
|
|
805
|
+
result = await prerenderFromAlepha(pages, opts.dist, opts.compress);
|
|
806
|
+
};
|
|
807
|
+
if (opts.run) await opts.run({
|
|
808
|
+
name: "pre-render pages",
|
|
809
|
+
handler: fn
|
|
810
|
+
});
|
|
811
|
+
else await fn();
|
|
812
|
+
return result;
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Get all static pages from the Alepha instance.
|
|
816
|
+
*/
|
|
817
|
+
function getStaticPages(alepha) {
|
|
818
|
+
return alepha.primitives("page").filter((page) => {
|
|
819
|
+
const options = page.options;
|
|
820
|
+
return options.static && !options.children;
|
|
821
|
+
});
|
|
1148
822
|
}
|
|
1149
|
-
async function prerenderFromAlepha(
|
|
823
|
+
async function prerenderFromAlepha(pages, dist, compress) {
|
|
1150
824
|
let count = 0;
|
|
1151
|
-
const pages = alepha.primitives("page");
|
|
1152
825
|
for (const page of pages) {
|
|
1153
826
|
const options = page.options;
|
|
1154
|
-
if (options.children) continue;
|
|
1155
|
-
if (!options.static) continue;
|
|
1156
827
|
const config = typeof options.static === "object" ? options.static : {};
|
|
1157
828
|
if (!options.schema?.params) {
|
|
1158
829
|
count += 1;
|
|
@@ -1179,5 +850,5 @@ async function renderFile(page, options, dist, compress) {
|
|
|
1179
850
|
}
|
|
1180
851
|
|
|
1181
852
|
//#endregion
|
|
1182
|
-
export {
|
|
853
|
+
export { buildClient, buildServer, compressFile, copyAssets, createBufferedLogger, generateCloudflare, generateDocker, generateExternals, generateSitemap, generateVercel, importVite, importViteReact, prerenderPages, viteAlephaSsrPreload, viteCompress };
|
|
1183
854
|
//# sourceMappingURL=index.js.map
|