vorzelajs 0.0.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 +188 -0
- package/bin/vorzelajs.mjs +2 -0
- package/dist/analytics.d.ts +132 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +690 -0
- package/dist/cli/build.d.ts +2 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +22 -0
- package/dist/cli/dev.d.ts +2 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +93 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/serve.d.ts +2 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +43 -0
- package/dist/cookie.d.ts +33 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +198 -0
- package/dist/debug/error-stack.d.ts +14 -0
- package/dist/debug/error-stack.d.ts.map +1 -0
- package/dist/debug/error-stack.js +52 -0
- package/dist/internal/document.d.ts +12 -0
- package/dist/internal/document.d.ts.map +1 -0
- package/dist/internal/document.jsx +56 -0
- package/dist/internal/entry-client.d.ts +2 -0
- package/dist/internal/entry-client.d.ts.map +1 -0
- package/dist/internal/entry-client.jsx +8 -0
- package/dist/internal/entry-server.d.ts +14 -0
- package/dist/internal/entry-server.d.ts.map +1 -0
- package/dist/internal/entry-server.jsx +71 -0
- package/dist/runtime/create-route.d.ts +8 -0
- package/dist/runtime/create-route.d.ts.map +1 -0
- package/dist/runtime/create-route.js +18 -0
- package/dist/runtime/head.d.ts +10 -0
- package/dist/runtime/head.d.ts.map +1 -0
- package/dist/runtime/head.js +111 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.jsx +4 -0
- package/dist/runtime/navigation.d.ts +36 -0
- package/dist/runtime/navigation.d.ts.map +1 -0
- package/dist/runtime/navigation.js +70 -0
- package/dist/runtime/path.d.ts +11 -0
- package/dist/runtime/path.d.ts.map +1 -0
- package/dist/runtime/path.js +80 -0
- package/dist/runtime/resolve.d.ts +11 -0
- package/dist/runtime/resolve.d.ts.map +1 -0
- package/dist/runtime/resolve.js +449 -0
- package/dist/runtime/runtime.d.ts +40 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.jsx +779 -0
- package/dist/runtime/search.d.ts +23 -0
- package/dist/runtime/search.d.ts.map +1 -0
- package/dist/runtime/search.js +178 -0
- package/dist/runtime/server.d.ts +10 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +5 -0
- package/dist/runtime/types.d.ts +248 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +1 -0
- package/dist/seo.d.ts +16 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +69 -0
- package/dist/server/index.d.ts +53 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +268 -0
- package/dist/session.d.ts +23 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +58 -0
- package/dist/vite/index.d.ts +13 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +174 -0
- package/dist/vite/routes-plugin.d.ts +4 -0
- package/dist/vite/routes-plugin.d.ts.map +1 -0
- package/dist/vite/routes-plugin.js +345 -0
- package/dist/vite/server-only.d.ts +3 -0
- package/dist/vite/server-only.d.ts.map +1 -0
- package/dist/vite/server-only.js +342 -0
- package/package.json +76 -0
- package/templates/bare/README.md +22 -0
- package/templates/bare/src/components/counter-card.tsx +19 -0
- package/templates/bare/src/routes/__root.tsx +24 -0
- package/templates/bare/src/routes/index.tsx +36 -0
- package/templates/base/gitignore +4 -0
- package/templates/base/public/favicon.svg +5 -0
- package/templates/base/tsconfig.json +18 -0
- package/templates/modern/README.md +28 -0
- package/templates/modern/src/components/counter-card.tsx +19 -0
- package/templates/modern/src/routes/__root.tsx +42 -0
- package/templates/modern/src/routes/about.tsx +55 -0
- package/templates/modern/src/routes/index.tsx +51 -0
- package/templates/styling/css/styles.css +269 -0
- package/templates/styling/css-modules/styles.css +269 -0
- package/templates/styling/tailwind/styles.css +271 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { resolveVorzelaConfig, resolveVorzelalBuildConfig, vorzelaServerOnlyPlugin } from '../vite';
|
|
2
|
+
import { generateRoutes } from '../vite/routes-plugin';
|
|
3
|
+
export async function runBuild() {
|
|
4
|
+
const appRoot = process.cwd();
|
|
5
|
+
console.info('[VorzelaJs] Generating routes...');
|
|
6
|
+
await generateRoutes(appRoot);
|
|
7
|
+
const { build, mergeConfig } = await import('vite');
|
|
8
|
+
const baseConfig = await resolveVorzelaConfig(appRoot);
|
|
9
|
+
// Client build (includes server-only stripping)
|
|
10
|
+
console.info('[VorzelaJs] Building client...');
|
|
11
|
+
const clientBuildConfig = resolveVorzelalBuildConfig(appRoot, 'client');
|
|
12
|
+
const clientPlugins = [vorzelaServerOnlyPlugin()];
|
|
13
|
+
await build(mergeConfig(baseConfig, {
|
|
14
|
+
...clientBuildConfig,
|
|
15
|
+
plugins: clientPlugins,
|
|
16
|
+
}));
|
|
17
|
+
// Server build
|
|
18
|
+
console.info('[VorzelaJs] Building server...');
|
|
19
|
+
const serverBuildConfig = resolveVorzelalBuildConfig(appRoot, 'server');
|
|
20
|
+
await build(mergeConfig(baseConfig, serverBuildConfig));
|
|
21
|
+
console.info('[VorzelaJs] Build complete.');
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AA+DA,wBAAsB,MAAM,kBA4D3B"}
|
package/dist/cli/dev.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { createServer as createNetServer } from 'node:net';
|
|
3
|
+
import { getRequestListener } from '@hono/node-server';
|
|
4
|
+
import { createVorzelaApp } from '../server';
|
|
5
|
+
import { resolveVorzelaConfig } from '../vite';
|
|
6
|
+
async function findAvailablePort(startPort) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
const tryPort = (port) => {
|
|
9
|
+
const probe = createNetServer();
|
|
10
|
+
probe.once('error', () => {
|
|
11
|
+
tryPort(port + 1);
|
|
12
|
+
});
|
|
13
|
+
probe.once('listening', () => {
|
|
14
|
+
probe.close(() => resolve(port));
|
|
15
|
+
});
|
|
16
|
+
probe.listen(port);
|
|
17
|
+
};
|
|
18
|
+
tryPort(startPort);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function listenOnAvailablePort(server, startPort) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const tryListen = (candidatePort) => {
|
|
24
|
+
const handleError = (error) => {
|
|
25
|
+
server.off('listening', handleListening);
|
|
26
|
+
if (error.code === 'EADDRINUSE') {
|
|
27
|
+
console.warn(`Port ${candidatePort} is in use. Trying ${candidatePort + 1}...`);
|
|
28
|
+
tryListen(candidatePort + 1);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
reject(error);
|
|
32
|
+
};
|
|
33
|
+
const handleListening = () => {
|
|
34
|
+
server.off('error', handleError);
|
|
35
|
+
resolve(candidatePort);
|
|
36
|
+
};
|
|
37
|
+
server.once('error', handleError);
|
|
38
|
+
server.once('listening', handleListening);
|
|
39
|
+
server.listen(candidatePort);
|
|
40
|
+
};
|
|
41
|
+
tryListen(startPort);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function runDev() {
|
|
45
|
+
const appRoot = process.cwd();
|
|
46
|
+
const port = Number(process.env.PORT ?? 3080);
|
|
47
|
+
const hmrPort = Number(process.env.VORZELA_HMR_PORT ?? 24678);
|
|
48
|
+
const { vorzelaServerOnlyPlugin } = await import('../vite/server-only');
|
|
49
|
+
const solidPlugin = await import('vite-plugin-solid').then((m) => m.default).catch(() => null);
|
|
50
|
+
const baseConfig = await resolveVorzelaConfig(appRoot);
|
|
51
|
+
const { createServer: createViteServer } = await import('vite');
|
|
52
|
+
const resolvedHmrPort = await findAvailablePort(hmrPort);
|
|
53
|
+
const vite = await createViteServer({
|
|
54
|
+
...baseConfig,
|
|
55
|
+
appType: 'custom',
|
|
56
|
+
server: {
|
|
57
|
+
hmr: {
|
|
58
|
+
port: resolvedHmrPort,
|
|
59
|
+
},
|
|
60
|
+
middlewareMode: true,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const devAssets = {
|
|
64
|
+
css: ['/src/styles.css'],
|
|
65
|
+
js: ['/src/entry-client.tsx'],
|
|
66
|
+
};
|
|
67
|
+
const loadEntry = async () => {
|
|
68
|
+
return vite.ssrLoadModule('virtual:vorzela/entry-server');
|
|
69
|
+
};
|
|
70
|
+
const app = createVorzelaApp({
|
|
71
|
+
assets: devAssets,
|
|
72
|
+
isProd: false,
|
|
73
|
+
loadEntry,
|
|
74
|
+
vite,
|
|
75
|
+
});
|
|
76
|
+
const listener = getRequestListener(app.fetch);
|
|
77
|
+
const server = createServer((req, res) => {
|
|
78
|
+
vite.middlewares(req, res, (error) => {
|
|
79
|
+
if (error) {
|
|
80
|
+
vite.ssrFixStacktrace(error);
|
|
81
|
+
res.statusCode = 500;
|
|
82
|
+
res.end(error.stack ?? String(error));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!res.writableEnded) {
|
|
86
|
+
void listener(req, res);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
const resolvedPort = await listenOnAvailablePort(server, port);
|
|
91
|
+
console.info(`VorzelaJs running at http://localhost:${resolvedPort} (HMR ${resolvedHmrPort})`);
|
|
92
|
+
console.info(`[VorzelaJs][dev] document=* payload=/__vorzela/payload analytics=/api/analytics robots=/robots.txt sitemap=/sitemap.xml`);
|
|
93
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,OAAO,QAAkB,CAAA;AAE/B,iBAAe,IAAI,kBAsBlB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const command = process.argv[2];
|
|
3
|
+
async function main() {
|
|
4
|
+
switch (command) {
|
|
5
|
+
case 'dev': {
|
|
6
|
+
const { runDev } = await import('./dev');
|
|
7
|
+
await runDev();
|
|
8
|
+
break;
|
|
9
|
+
}
|
|
10
|
+
case 'build': {
|
|
11
|
+
const { runBuild } = await import('./build');
|
|
12
|
+
await runBuild();
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
case 'serve': {
|
|
16
|
+
const { runServe } = await import('./serve');
|
|
17
|
+
await runServe();
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
default:
|
|
21
|
+
console.error(`Unknown command: ${command ?? '(none)'}`);
|
|
22
|
+
console.error('Usage: vorzelajs <dev|build|serve>');
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
main().catch((error) => {
|
|
27
|
+
console.error(error);
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAiBA,wBAAsB,QAAQ,kBAkD7B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getRequestListener } from '@hono/node-server';
|
|
5
|
+
import { createVorzelaApp } from '../server';
|
|
6
|
+
export async function runServe() {
|
|
7
|
+
const appRoot = process.cwd();
|
|
8
|
+
const port = Number(process.env.PORT ?? 3080);
|
|
9
|
+
const manifestPath = path.resolve(appRoot, 'dist/client/.vite/manifest.json');
|
|
10
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf-8'));
|
|
11
|
+
// Find entry point — look for virtual entry first, then direct entry
|
|
12
|
+
const entry = manifest['virtual:vorzela/entry-client']
|
|
13
|
+
?? manifest['src/entry-client.tsx'];
|
|
14
|
+
const cssAssets = new Set();
|
|
15
|
+
entry?.css?.forEach((href) => {
|
|
16
|
+
cssAssets.add(href);
|
|
17
|
+
});
|
|
18
|
+
for (const manifestEntry of Object.values(manifest)) {
|
|
19
|
+
if (manifestEntry.file.endsWith('.css')) {
|
|
20
|
+
cssAssets.add(manifestEntry.file);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const assets = {
|
|
24
|
+
css: [...cssAssets].map((href) => `/${href}`),
|
|
25
|
+
js: entry ? [`/${entry.file}`] : [],
|
|
26
|
+
};
|
|
27
|
+
const serverEntryPath = path.resolve(appRoot, 'dist/server/entry-server.js');
|
|
28
|
+
const serverEntry = await import(serverEntryPath);
|
|
29
|
+
const loadEntry = async () => serverEntry;
|
|
30
|
+
const app = createVorzelaApp({
|
|
31
|
+
assets,
|
|
32
|
+
isProd: true,
|
|
33
|
+
loadEntry,
|
|
34
|
+
staticRoot: path.resolve(appRoot, 'dist/client'),
|
|
35
|
+
});
|
|
36
|
+
const listener = getRequestListener(app.fetch);
|
|
37
|
+
const server = createServer((req, res) => {
|
|
38
|
+
void listener(req, res);
|
|
39
|
+
});
|
|
40
|
+
server.listen(port, () => {
|
|
41
|
+
console.info(`VorzelaJs running at http://localhost:${port}`);
|
|
42
|
+
});
|
|
43
|
+
}
|
package/dist/cookie.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type CookiePolicy = 'cross-site' | 'host' | 'partitioned';
|
|
2
|
+
export interface CookieOptions {
|
|
3
|
+
domain?: string;
|
|
4
|
+
expires?: Date;
|
|
5
|
+
httpOnly?: boolean;
|
|
6
|
+
maxAge?: number;
|
|
7
|
+
partitioned?: boolean;
|
|
8
|
+
path?: string;
|
|
9
|
+
policy?: CookiePolicy;
|
|
10
|
+
priority?: 'high' | 'low' | 'medium';
|
|
11
|
+
sameSite?: 'lax' | 'none' | 'strict';
|
|
12
|
+
secrets?: string[];
|
|
13
|
+
secure?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface CookieHeaderTarget {
|
|
16
|
+
headers: Headers;
|
|
17
|
+
}
|
|
18
|
+
export interface VorzelaCookie {
|
|
19
|
+
name: string;
|
|
20
|
+
options: Required<Pick<CookieOptions, 'httpOnly' | 'path' | 'sameSite' | 'secure'>> & CookieOptions;
|
|
21
|
+
destroy: () => Promise<string>;
|
|
22
|
+
parse: (cookieHeader: string | null) => Promise<string | null>;
|
|
23
|
+
serialize: (value: string) => Promise<string>;
|
|
24
|
+
}
|
|
25
|
+
export declare const cookiePolicies: {
|
|
26
|
+
crossSite(options?: CookieOptions): CookieOptions;
|
|
27
|
+
host(options?: CookieOptions): CookieOptions;
|
|
28
|
+
partitioned(options?: CookieOptions): CookieOptions;
|
|
29
|
+
};
|
|
30
|
+
export declare function setCookie(target: CookieHeaderTarget | Headers, cookie: VorzelaCookie, value: string): Promise<string>;
|
|
31
|
+
export declare function deleteCookie(target: CookieHeaderTarget | Headers, cookie: VorzelaCookie): Promise<string>;
|
|
32
|
+
export declare function createCookie(name: string, options?: CookieOptions): VorzelaCookie;
|
|
33
|
+
//# sourceMappingURL=cookie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,aAAa,CAAA;AAEhE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;IACpC,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,aAAa,CAAA;IACnG,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9B,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC9D,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC9C;AAED,eAAO,MAAM,cAAc;wBACN,aAAa,GAAQ,aAAa;mBAOvC,aAAa,GAAQ,aAAa;0BAO3B,aAAa,GAAQ,aAAa;CAMxD,CAAA;AAqLD,wBAAsB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAIzG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,mBAI7F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa,CAsCrF"}
|
package/dist/cookie.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
export const cookiePolicies = {
|
|
3
|
+
crossSite(options = {}) {
|
|
4
|
+
return {
|
|
5
|
+
...options,
|
|
6
|
+
policy: 'cross-site',
|
|
7
|
+
};
|
|
8
|
+
},
|
|
9
|
+
host(options = {}) {
|
|
10
|
+
return {
|
|
11
|
+
...options,
|
|
12
|
+
policy: 'host',
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
partitioned(options = {}) {
|
|
16
|
+
return {
|
|
17
|
+
...options,
|
|
18
|
+
policy: 'partitioned',
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
function sign(value, secret) {
|
|
23
|
+
const signature = createHmac('sha256', secret).update(value).digest('base64url');
|
|
24
|
+
return `${value}.${signature}`;
|
|
25
|
+
}
|
|
26
|
+
function unsign(signed, secrets) {
|
|
27
|
+
const lastDot = signed.lastIndexOf('.');
|
|
28
|
+
if (lastDot === -1) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const value = signed.slice(0, lastDot);
|
|
32
|
+
const providedSignature = signed.slice(lastDot + 1);
|
|
33
|
+
for (const secret of secrets) {
|
|
34
|
+
const expectedSignature = createHmac('sha256', secret).update(value).digest('base64url');
|
|
35
|
+
try {
|
|
36
|
+
const providedBuffer = Buffer.from(providedSignature, 'base64url');
|
|
37
|
+
const expectedBuffer = Buffer.from(expectedSignature, 'base64url');
|
|
38
|
+
if (providedBuffer.length === expectedBuffer.length
|
|
39
|
+
&& timingSafeEqual(providedBuffer, expectedBuffer)) {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function startsWithCookiePrefix(name, prefix) {
|
|
50
|
+
return name.startsWith(prefix);
|
|
51
|
+
}
|
|
52
|
+
function normalizeDomain(domain) {
|
|
53
|
+
if (!domain) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
return domain.trim().replace(/^\.+/u, '') || undefined;
|
|
57
|
+
}
|
|
58
|
+
function resolveCookieOptions(name, options) {
|
|
59
|
+
const resolvedOptions = {
|
|
60
|
+
...options,
|
|
61
|
+
domain: normalizeDomain(options.domain),
|
|
62
|
+
httpOnly: options.httpOnly ?? true,
|
|
63
|
+
path: options.path ?? '/',
|
|
64
|
+
sameSite: options.sameSite ?? 'lax',
|
|
65
|
+
secure: options.secure ?? (process.env.NODE_ENV === 'production'),
|
|
66
|
+
};
|
|
67
|
+
if (resolvedOptions.policy === 'cross-site') {
|
|
68
|
+
resolvedOptions.sameSite = 'none';
|
|
69
|
+
resolvedOptions.secure = true;
|
|
70
|
+
}
|
|
71
|
+
if (resolvedOptions.policy === 'partitioned') {
|
|
72
|
+
resolvedOptions.partitioned = true;
|
|
73
|
+
resolvedOptions.sameSite = 'none';
|
|
74
|
+
resolvedOptions.secure = true;
|
|
75
|
+
}
|
|
76
|
+
if (resolvedOptions.partitioned) {
|
|
77
|
+
resolvedOptions.sameSite = resolvedOptions.sameSite ?? 'none';
|
|
78
|
+
resolvedOptions.secure = true;
|
|
79
|
+
}
|
|
80
|
+
if (resolvedOptions.sameSite === 'none') {
|
|
81
|
+
resolvedOptions.secure = true;
|
|
82
|
+
}
|
|
83
|
+
if (startsWithCookiePrefix(name, '__Secure-')
|
|
84
|
+
|| startsWithCookiePrefix(name, '__Host-')
|
|
85
|
+
|| startsWithCookiePrefix(name, '__Http-')
|
|
86
|
+
|| startsWithCookiePrefix(name, '__Host-Http-')) {
|
|
87
|
+
resolvedOptions.secure = true;
|
|
88
|
+
}
|
|
89
|
+
if (startsWithCookiePrefix(name, '__Http-') || startsWithCookiePrefix(name, '__Host-Http-')) {
|
|
90
|
+
resolvedOptions.httpOnly = true;
|
|
91
|
+
}
|
|
92
|
+
if (startsWithCookiePrefix(name, '__Host-') || startsWithCookiePrefix(name, '__Host-Http-')) {
|
|
93
|
+
resolvedOptions.path = '/';
|
|
94
|
+
if (resolvedOptions.domain) {
|
|
95
|
+
throw new Error(`Cookie '${name}' cannot set Domain when using a __Host- or __Host-Http- prefix`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return resolvedOptions;
|
|
99
|
+
}
|
|
100
|
+
function encodeCookieValue(name, value, options) {
|
|
101
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
|
|
102
|
+
if (options.domain) {
|
|
103
|
+
parts.push(`Domain=${options.domain}`);
|
|
104
|
+
}
|
|
105
|
+
if (options.httpOnly) {
|
|
106
|
+
parts.push('HttpOnly');
|
|
107
|
+
}
|
|
108
|
+
if (options.expires) {
|
|
109
|
+
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
110
|
+
}
|
|
111
|
+
if (options.maxAge !== undefined) {
|
|
112
|
+
parts.push(`Max-Age=${options.maxAge}`);
|
|
113
|
+
}
|
|
114
|
+
if (options.partitioned) {
|
|
115
|
+
parts.push('Partitioned');
|
|
116
|
+
}
|
|
117
|
+
if (options.path) {
|
|
118
|
+
parts.push(`Path=${options.path}`);
|
|
119
|
+
}
|
|
120
|
+
if (options.priority) {
|
|
121
|
+
parts.push(`Priority=${options.priority.charAt(0).toUpperCase()}${options.priority.slice(1)}`);
|
|
122
|
+
}
|
|
123
|
+
if (options.sameSite) {
|
|
124
|
+
parts.push(`SameSite=${options.sameSite.charAt(0).toUpperCase()}${options.sameSite.slice(1)}`);
|
|
125
|
+
}
|
|
126
|
+
if (options.secure) {
|
|
127
|
+
parts.push('Secure');
|
|
128
|
+
}
|
|
129
|
+
return parts.join('; ');
|
|
130
|
+
}
|
|
131
|
+
function parseCookieHeader(header) {
|
|
132
|
+
const cookies = new Map();
|
|
133
|
+
for (const pair of header.split(';')) {
|
|
134
|
+
const equalIndex = pair.indexOf('=');
|
|
135
|
+
if (equalIndex === -1) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const name = pair.slice(0, equalIndex).trim();
|
|
139
|
+
const value = pair.slice(equalIndex + 1).trim();
|
|
140
|
+
try {
|
|
141
|
+
cookies.set(decodeURIComponent(name), decodeURIComponent(value));
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
cookies.set(name, value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return cookies;
|
|
148
|
+
}
|
|
149
|
+
function resolveHeaders(target) {
|
|
150
|
+
return target instanceof Headers ? target : target.headers;
|
|
151
|
+
}
|
|
152
|
+
function createDestroyCookie(cookie) {
|
|
153
|
+
return createCookie(cookie.name, {
|
|
154
|
+
...cookie.options,
|
|
155
|
+
expires: new Date(0),
|
|
156
|
+
maxAge: 0,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
export async function setCookie(target, cookie, value) {
|
|
160
|
+
const serialized = await cookie.serialize(value);
|
|
161
|
+
resolveHeaders(target).append('Set-Cookie', serialized);
|
|
162
|
+
return serialized;
|
|
163
|
+
}
|
|
164
|
+
export async function deleteCookie(target, cookie) {
|
|
165
|
+
const serialized = await cookie.destroy();
|
|
166
|
+
resolveHeaders(target).append('Set-Cookie', serialized);
|
|
167
|
+
return serialized;
|
|
168
|
+
}
|
|
169
|
+
export function createCookie(name, options = {}) {
|
|
170
|
+
const resolvedOptions = resolveCookieOptions(name, options);
|
|
171
|
+
return {
|
|
172
|
+
name,
|
|
173
|
+
options: resolvedOptions,
|
|
174
|
+
async destroy() {
|
|
175
|
+
return createDestroyCookie(this).serialize('');
|
|
176
|
+
},
|
|
177
|
+
async parse(cookieHeader) {
|
|
178
|
+
if (!cookieHeader) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const cookies = parseCookieHeader(cookieHeader);
|
|
182
|
+
const raw = cookies.get(name);
|
|
183
|
+
if (raw === undefined) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
if (resolvedOptions.secrets?.length) {
|
|
187
|
+
return unsign(raw, resolvedOptions.secrets);
|
|
188
|
+
}
|
|
189
|
+
return raw;
|
|
190
|
+
},
|
|
191
|
+
async serialize(value) {
|
|
192
|
+
const signedValue = resolvedOptions.secrets?.length
|
|
193
|
+
? sign(value, resolvedOptions.secrets[0])
|
|
194
|
+
: value;
|
|
195
|
+
return encodeCookieValue(name, signedValue, resolvedOptions);
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface DebugStackFrame {
|
|
2
|
+
columnNumber?: number;
|
|
3
|
+
fileName?: string;
|
|
4
|
+
functionName?: string;
|
|
5
|
+
lineNumber?: number;
|
|
6
|
+
source: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DebugStackInfo {
|
|
9
|
+
frames: DebugStackFrame[];
|
|
10
|
+
stack?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseErrorStack(error: unknown): DebugStackInfo | undefined;
|
|
13
|
+
export declare function formatParsedStack(stack: DebugStackInfo | undefined, maxFrames?: number): string[];
|
|
14
|
+
//# sourceMappingURL=error-stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-stack.d.ts","sourceRoot":"","sources":["../../src/debug/error-stack.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAaD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAiC1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,SAAS,SAAI,YAYjF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import ErrorStackParser from 'error-stack-parser';
|
|
2
|
+
function formatFrameSource(frame) {
|
|
3
|
+
const fileName = frame.fileName ?? '<unknown>';
|
|
4
|
+
const lineNumber = frame.lineNumber ?? 0;
|
|
5
|
+
const columnNumber = frame.columnNumber ?? 0;
|
|
6
|
+
const functionName = frame.functionName && frame.functionName.trim() !== ''
|
|
7
|
+
? `${frame.functionName} `
|
|
8
|
+
: '';
|
|
9
|
+
return `${functionName}(${fileName}:${lineNumber}:${columnNumber})`;
|
|
10
|
+
}
|
|
11
|
+
export function parseErrorStack(error) {
|
|
12
|
+
if (!(error instanceof Error)) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const frames = ErrorStackParser.parse(error).map((frame) => {
|
|
17
|
+
const normalizedFrame = {
|
|
18
|
+
columnNumber: frame.columnNumber,
|
|
19
|
+
fileName: frame.fileName,
|
|
20
|
+
functionName: frame.functionName,
|
|
21
|
+
lineNumber: frame.lineNumber,
|
|
22
|
+
source: '',
|
|
23
|
+
};
|
|
24
|
+
normalizedFrame.source = formatFrameSource(normalizedFrame);
|
|
25
|
+
return normalizedFrame;
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
frames,
|
|
29
|
+
stack: error.stack,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
if (!error.stack) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
frames: [],
|
|
38
|
+
stack: error.stack,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function formatParsedStack(stack, maxFrames = 8) {
|
|
43
|
+
if (!stack) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
if (stack.frames.length > 0) {
|
|
47
|
+
return stack.frames.slice(0, maxFrames).map((frame) => frame.source);
|
|
48
|
+
}
|
|
49
|
+
return stack.stack
|
|
50
|
+
? stack.stack.split('\n').slice(0, maxFrames + 1).map((line) => line.trim()).filter(Boolean)
|
|
51
|
+
: [];
|
|
52
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JSX } from 'solid-js';
|
|
2
|
+
import type { BootstrapPayload, HeadObject, RenderAssets } from '../runtime';
|
|
3
|
+
interface DocumentProps {
|
|
4
|
+
assets: RenderAssets;
|
|
5
|
+
bootstrap: BootstrapPayload;
|
|
6
|
+
children: JSX.Element;
|
|
7
|
+
head: HeadObject;
|
|
8
|
+
nonce?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function Document(props: DocumentProps): JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/internal/document.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAInC,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5E,UAAU,aAAa;IACrB,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,gBAAgB,CAAA;IAC3B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAA;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAoBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,eAiE5C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { For } from 'solid-js';
|
|
2
|
+
import { HydrationScript } from 'solid-js/web';
|
|
3
|
+
const NoncedHydrationScript = HydrationScript;
|
|
4
|
+
function serializeBootstrapPayload(payload) {
|
|
5
|
+
return JSON.stringify(payload)
|
|
6
|
+
.replace(/&/gu, '\u0026')
|
|
7
|
+
.replace(/</gu, '\\u003c')
|
|
8
|
+
.replace(/>/gu, '\\u003e')
|
|
9
|
+
.replace(/\u2028/gu, '\\u2028')
|
|
10
|
+
.replace(/\u2029/gu, '\\u2029');
|
|
11
|
+
}
|
|
12
|
+
function serializeJsonLd(data) {
|
|
13
|
+
return JSON.stringify(data)
|
|
14
|
+
.replace(/&/gu, '\u0026')
|
|
15
|
+
.replace(/</gu, '\\u003c')
|
|
16
|
+
.replace(/>/gu, '\\u003e');
|
|
17
|
+
}
|
|
18
|
+
export function Document(props) {
|
|
19
|
+
const jsonLdItems = () => {
|
|
20
|
+
if (!props.head.jsonLd)
|
|
21
|
+
return [];
|
|
22
|
+
return Array.isArray(props.head.jsonLd) ? props.head.jsonLd : [props.head.jsonLd];
|
|
23
|
+
};
|
|
24
|
+
return (<html lang="en">
|
|
25
|
+
<head>
|
|
26
|
+
<meta charset="UTF-8"/>
|
|
27
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
28
|
+
<title>{props.head.title ?? 'VorzelaJs'}</title>
|
|
29
|
+
<For each={props.head.meta ?? []}>
|
|
30
|
+
{(meta) => (<meta charset={meta.charset} content={meta.content} http-equiv={meta.httpEquiv} name={meta.name} property={meta.property} data-vrz-head=""/>)}
|
|
31
|
+
</For>
|
|
32
|
+
<For each={props.head.links ?? []}>
|
|
33
|
+
{(link) => (<link as={link.as} crossorigin={link.crossorigin} href={link.href} hreflang={link.hreflang} media={link.media} rel={link.rel} sizes={link.sizes} type={link.type} data-vrz-head=""/>)}
|
|
34
|
+
</For>
|
|
35
|
+
{props.head.canonical && (<link rel="canonical" href={props.head.canonical} data-vrz-head=""/>)}
|
|
36
|
+
<For each={jsonLdItems()}>
|
|
37
|
+
{(item) => (<script type="application/ld+json" data-vrz-jsonld="" nonce={props.nonce}>
|
|
38
|
+
{serializeJsonLd(item)}
|
|
39
|
+
</script>)}
|
|
40
|
+
</For>
|
|
41
|
+
<NoncedHydrationScript nonce={props.nonce}/>
|
|
42
|
+
<For each={props.assets.css}>
|
|
43
|
+
{(href) => <link rel="stylesheet" href={href}/>}
|
|
44
|
+
</For>
|
|
45
|
+
</head>
|
|
46
|
+
<body>
|
|
47
|
+
<div id="app">{props.children}</div>
|
|
48
|
+
<script id="__VORZELA_DATA__" nonce={props.nonce} type="application/json">
|
|
49
|
+
{serializeBootstrapPayload(props.bootstrap)}
|
|
50
|
+
</script>
|
|
51
|
+
<For each={props.assets.js}>
|
|
52
|
+
{(src) => <script nonce={props.nonce} type="module" src={src}/>}
|
|
53
|
+
</For>
|
|
54
|
+
</body>
|
|
55
|
+
</html>);
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-client.d.ts","sourceRoot":"","sources":["../../src/internal/entry-client.tsx"],"names":[],"mappings":"AACA,OAAO,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @ts-expect-error resolved by vorzelajs vite plugin
|
|
2
|
+
import 'virtual:vorzela/styles';
|
|
3
|
+
import { createRouter, readBootstrapPayload } from '../runtime';
|
|
4
|
+
async function start() {
|
|
5
|
+
const router = createRouter(readBootstrapPayload());
|
|
6
|
+
await router.init();
|
|
7
|
+
}
|
|
8
|
+
void start();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RenderAssets, RoutePayloadEnvelope, SitemapEntry } from '../runtime';
|
|
2
|
+
export declare function renderDocument({ request, assets, nonce, }: {
|
|
3
|
+
assets: RenderAssets;
|
|
4
|
+
nonce?: string;
|
|
5
|
+
request: Request;
|
|
6
|
+
}): Promise<Response>;
|
|
7
|
+
export declare function renderPayload({ path, request, }: {
|
|
8
|
+
path: string;
|
|
9
|
+
request: Request;
|
|
10
|
+
}): Promise<RoutePayloadEnvelope & {
|
|
11
|
+
responseHeaders?: Headers;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function getSitemapEntries(): Promise<SitemapEntry[]>;
|
|
14
|
+
//# sourceMappingURL=entry-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-server.d.ts","sourceRoot":"","sources":["../../src/internal/entry-server.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AA6ClF,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,MAAM,EACN,KAAK,GACN,EAAE;IACD,MAAM,EAAE,YAAY,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB,qBAmBA;AAED,wBAAsB,aAAa,CAAC,EAClC,IAAI,EACJ,OAAO,GACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,OAAO,CAAC,oBAAoB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAahE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAMjE"}
|