@vistagenic/vista 0.3.0 → 0.3.3

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 (101) hide show
  1. package/bin/vista.js +79 -109
  2. package/dist/ai/embeddings.d.ts +11 -11
  3. package/dist/ai/embeddings.js +71 -71
  4. package/dist/ai/index.d.ts +10 -10
  5. package/dist/ai/index.js +26 -26
  6. package/dist/ai/providers/base.js +85 -85
  7. package/dist/ai/react/react-server.d.ts +1 -1
  8. package/dist/ai/react/react-server.js +17 -17
  9. package/dist/ai/react/use-agent.js +138 -138
  10. package/dist/auth/core.d.ts +140 -140
  11. package/dist/auth/core.js +165 -165
  12. package/dist/auth/index.d.ts +20 -20
  13. package/dist/auth/index.js +369 -369
  14. package/dist/auth/react-server.d.ts +1 -1
  15. package/dist/auth/react-server.js +10 -10
  16. package/dist/auth/react.d.ts +18 -18
  17. package/dist/auth/react.js +71 -71
  18. package/dist/bin/build-rsc-flashpack.js +6 -0
  19. package/dist/bin/build-rsc.js +537 -492
  20. package/dist/bin/build.js +355 -353
  21. package/dist/bin/dev-error-overlay-snippet.js +379 -153
  22. package/dist/bin/generate.js +513 -510
  23. package/dist/bin/webpack.config.js +4 -3
  24. package/dist/build/manifest.d.ts +169 -169
  25. package/dist/build/manifest.js +423 -423
  26. package/dist/build/rsc/client-manifest.d.ts +62 -62
  27. package/dist/build/rsc/client-manifest.js +295 -295
  28. package/dist/build/rsc/compiler.js +5 -4
  29. package/dist/build/rsc/native-scanner.d.ts +135 -135
  30. package/dist/build/rsc/native-scanner.js +203 -203
  31. package/dist/build/rsc/react-client-reference-manifest.d.ts +28 -28
  32. package/dist/build/rsc/react-client-reference-manifest.js +240 -240
  33. package/dist/build/standalone.js +260 -254
  34. package/dist/client/dynamic.react-server.d.ts +2 -2
  35. package/dist/client/dynamic.react-server.js +23 -23
  36. package/dist/client/link.react-server.d.ts +2 -2
  37. package/dist/client/link.react-server.js +11 -11
  38. package/dist/client/navigation.react-server.d.ts +1 -1
  39. package/dist/client/navigation.react-server.js +17 -17
  40. package/dist/client/router.react-server.d.ts +1 -1
  41. package/dist/client/router.react-server.js +17 -17
  42. package/dist/client/rsc-router.react-server.d.ts +1 -1
  43. package/dist/client/rsc-router.react-server.js +17 -17
  44. package/dist/client/script.react-server.d.ts +2 -2
  45. package/dist/client/script.react-server.js +23 -23
  46. package/dist/config.d.ts +1 -1
  47. package/dist/config.js +1 -7
  48. package/dist/deploy/adapters/cloudflare.js +43 -19
  49. package/dist/deploy/adapters/docker.d.ts +1 -0
  50. package/dist/deploy/adapters/docker.js +5 -4
  51. package/dist/deploy/adapters/netlify.js +62 -17
  52. package/dist/deploy/adapters/vercel.js +80 -50
  53. package/dist/deploy/preflight.js +4 -3
  54. package/dist/deploy/runtime-pack.d.ts +11 -0
  55. package/dist/deploy/runtime-pack.js +300 -0
  56. package/dist/deploy/utils.d.ts +1 -1
  57. package/dist/deploy/utils.js +31 -2
  58. package/dist/dev-error.d.ts +14 -0
  59. package/dist/dev-error.js +1394 -336
  60. package/dist/flashpack/command.js +1 -0
  61. package/dist/flashpack/runtime.js +2 -1
  62. package/dist/index.d.ts +23 -23
  63. package/dist/index.js +61 -61
  64. package/dist/server/app-dir.d.ts +22 -0
  65. package/dist/server/app-dir.js +77 -0
  66. package/dist/server/cookie-parse.d.ts +4 -4
  67. package/dist/server/cookie-parse.js +14 -14
  68. package/dist/server/engine.js +6 -12
  69. package/dist/server/image-optimizer.js +2 -1
  70. package/dist/server/index.d.ts +109 -109
  71. package/dist/server/index.js +315 -315
  72. package/dist/server/middleware-runner.d.ts +125 -125
  73. package/dist/server/middleware-runner.js +607 -615
  74. package/dist/server/middleware-security.d.ts +36 -36
  75. package/dist/server/middleware-security.js +183 -183
  76. package/dist/server/module-compile-hook.js +695 -695
  77. package/dist/server/root-resolver.js +6 -5
  78. package/dist/server/rsc-engine-flashpack.d.ts +3 -1
  79. package/dist/server/rsc-engine-flashpack.js +12 -1
  80. package/dist/server/rsc-engine.d.ts +6 -1
  81. package/dist/server/rsc-engine.js +203 -229
  82. package/dist/server/rsc-upstream.js +893 -892
  83. package/dist/server/static-generator.js +4 -3
  84. package/dist/server/structure-validator.js +2 -1
  85. package/dist/server/structure-watch.js +2 -0
  86. package/dist/server/typed-api-runtime.js +639 -635
  87. package/dist/server/vista-import-map.js +134 -134
  88. package/dist/stack/index.d.ts +34 -34
  89. package/dist/stack/index.js +49 -49
  90. package/dist/stack/server/caller.d.ts +13 -13
  91. package/dist/stack/server/caller.js +42 -42
  92. package/dist/stack/server/executor.d.ts +40 -40
  93. package/dist/stack/server/executor.js +222 -222
  94. package/dist/stack/server/index.d.ts +11 -11
  95. package/dist/stack/server/index.js +24 -24
  96. package/dist/stack/server/procedure.d.ts +20 -20
  97. package/dist/stack/server/procedure.js +66 -66
  98. package/dist/stack/server/types.d.ts +113 -113
  99. package/dist/theme/react-server.d.ts +10 -10
  100. package/dist/theme/react-server.js +16 -16
  101. package/package.json +178 -178
@@ -1,36 +1,36 @@
1
- /**
2
- * Middleware security primitives.
3
- *
4
- * These are Next-inspired helpers that apps can compose in `middleware.ts`.
5
- * The runner also uses the redirect/header sanitizers internally.
6
- */
7
- export declare const FORBIDDEN_REQUEST_HEADERS: Set<string>;
8
- export declare function isForbiddenRequestHeader(name: string): boolean;
9
- export declare function sanitizeRequestHeaderMap(headers: Map<string, string> | Headers | Record<string, string>): Map<string, string>;
10
- export declare function isSafeRedirectLocation(location: string, requestUrl: string, allowedHosts?: string[]): boolean;
11
- export declare function isSafeRewriteLocation(location: string): boolean;
12
- export declare function securityHeaders(init?: ResponseInit): Headers;
13
- export declare function cors(options?: {
14
- origin?: string | string[] | '*';
15
- methods?: string[];
16
- headers?: string[];
17
- credentials?: boolean;
18
- maxAge?: number;
19
- }): (request: Request) => Headers;
20
- export declare function rateLimit(options?: {
21
- key?: string;
22
- limit?: number;
23
- windowMs?: number;
24
- identifier?: (request: {
25
- headers: Headers;
26
- ip?: string;
27
- }) => string;
28
- }): (request: {
29
- headers: Headers;
30
- ip?: string;
31
- }) => {
32
- ok: boolean;
33
- remaining: number;
34
- };
35
- export type MiddlewareLike = (context: any) => Promise<Response | void> | Response | void;
36
- export declare function chain(middlewares: MiddlewareLike[]): MiddlewareLike;
1
+ /**
2
+ * Middleware security primitives.
3
+ *
4
+ * These are Next-inspired helpers that apps can compose in `middleware.ts`.
5
+ * The runner also uses the redirect/header sanitizers internally.
6
+ */
7
+ export declare const FORBIDDEN_REQUEST_HEADERS: Set<string>;
8
+ export declare function isForbiddenRequestHeader(name: string): boolean;
9
+ export declare function sanitizeRequestHeaderMap(headers: Map<string, string> | Headers | Record<string, string>): Map<string, string>;
10
+ export declare function isSafeRedirectLocation(location: string, requestUrl: string, allowedHosts?: string[]): boolean;
11
+ export declare function isSafeRewriteLocation(location: string): boolean;
12
+ export declare function securityHeaders(init?: ResponseInit): Headers;
13
+ export declare function cors(options?: {
14
+ origin?: string | string[] | '*';
15
+ methods?: string[];
16
+ headers?: string[];
17
+ credentials?: boolean;
18
+ maxAge?: number;
19
+ }): (request: Request) => Headers;
20
+ export declare function rateLimit(options?: {
21
+ key?: string;
22
+ limit?: number;
23
+ windowMs?: number;
24
+ identifier?: (request: {
25
+ headers: Headers;
26
+ ip?: string;
27
+ }) => string;
28
+ }): (request: {
29
+ headers: Headers;
30
+ ip?: string;
31
+ }) => {
32
+ ok: boolean;
33
+ remaining: number;
34
+ };
35
+ export type MiddlewareLike = (context: any) => Promise<Response | void> | Response | void;
36
+ export declare function chain(middlewares: MiddlewareLike[]): MiddlewareLike;
@@ -1,183 +1,183 @@
1
- "use strict";
2
- /**
3
- * Middleware security primitives.
4
- *
5
- * These are Next-inspired helpers that apps can compose in `middleware.ts`.
6
- * The runner also uses the redirect/header sanitizers internally.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.FORBIDDEN_REQUEST_HEADERS = void 0;
10
- exports.isForbiddenRequestHeader = isForbiddenRequestHeader;
11
- exports.sanitizeRequestHeaderMap = sanitizeRequestHeaderMap;
12
- exports.isSafeRedirectLocation = isSafeRedirectLocation;
13
- exports.isSafeRewriteLocation = isSafeRewriteLocation;
14
- exports.securityHeaders = securityHeaders;
15
- exports.cors = cors;
16
- exports.rateLimit = rateLimit;
17
- exports.chain = chain;
18
- exports.FORBIDDEN_REQUEST_HEADERS = new Set([
19
- 'host',
20
- 'cookie',
21
- 'content-length',
22
- 'content-type',
23
- 'transfer-encoding',
24
- 'x-forwarded-for',
25
- 'x-forwarded-host',
26
- 'x-forwarded-proto',
27
- 'x-forwarded-port',
28
- 'x-real-ip',
29
- 'x-middleware-next',
30
- 'x-middleware-rewrite',
31
- ]);
32
- function isForbiddenRequestHeader(name) {
33
- return exports.FORBIDDEN_REQUEST_HEADERS.has(name.toLowerCase());
34
- }
35
- function sanitizeRequestHeaderMap(headers) {
36
- const sanitized = new Map();
37
- const append = (key, value) => {
38
- if (!isForbiddenRequestHeader(key)) {
39
- sanitized.set(key.toLowerCase(), value);
40
- }
41
- };
42
- if (headers instanceof Map) {
43
- headers.forEach((value, key) => append(key, value));
44
- }
45
- else if (typeof headers.forEach === 'function' && !Array.isArray(headers)) {
46
- headers.forEach((value, key) => append(key, value));
47
- }
48
- else {
49
- for (const [key, value] of Object.entries(headers)) {
50
- append(key, value);
51
- }
52
- }
53
- return sanitized;
54
- }
55
- function isSafeRedirectLocation(location, requestUrl, allowedHosts = []) {
56
- const trimmed = String(location || '').trim();
57
- if (!trimmed)
58
- return false;
59
- if (trimmed.startsWith('/') && !trimmed.startsWith('//') && !trimmed.startsWith('/\\')) {
60
- return !trimmed.includes('://');
61
- }
62
- try {
63
- const base = new URL(requestUrl);
64
- const target = new URL(trimmed, base);
65
- if (target.origin === base.origin) {
66
- return true;
67
- }
68
- const allowed = new Set(allowedHosts.map((host) => host.toLowerCase()));
69
- return allowed.has(target.host.toLowerCase());
70
- }
71
- catch {
72
- return false;
73
- }
74
- }
75
- function isSafeRewriteLocation(location) {
76
- const trimmed = String(location || '').trim();
77
- if (!trimmed)
78
- return false;
79
- if (trimmed.startsWith('/') && !trimmed.startsWith('//') && !trimmed.startsWith('/\\')) {
80
- return !trimmed.includes('://');
81
- }
82
- return false;
83
- }
84
- function securityHeaders(init = {}) {
85
- const headers = new Headers(init.headers);
86
- if (!headers.has('X-Content-Type-Options'))
87
- headers.set('X-Content-Type-Options', 'nosniff');
88
- if (!headers.has('X-Frame-Options'))
89
- headers.set('X-Frame-Options', 'DENY');
90
- if (!headers.has('Referrer-Policy'))
91
- headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
92
- if (!headers.has('X-DNS-Prefetch-Control'))
93
- headers.set('X-DNS-Prefetch-Control', 'off');
94
- if (!headers.has('Permissions-Policy')) {
95
- headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
96
- }
97
- if (process.env.NODE_ENV === 'production' && !headers.has('Strict-Transport-Security')) {
98
- headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
99
- }
100
- return headers;
101
- }
102
- function cors(options = {}) {
103
- const origin = options.origin ?? '*';
104
- const methods = (options.methods ?? ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']).join(', ');
105
- const allowHeaders = (options.headers ?? ['Content-Type', 'Authorization']).join(', ');
106
- return (request) => {
107
- const headers = new Headers();
108
- const requestOrigin = request.headers.get('origin');
109
- if (origin === '*') {
110
- headers.set('Access-Control-Allow-Origin', '*');
111
- }
112
- else if (Array.isArray(origin)) {
113
- if (requestOrigin && origin.includes(requestOrigin)) {
114
- headers.set('Access-Control-Allow-Origin', requestOrigin);
115
- headers.set('Vary', 'Origin');
116
- }
117
- }
118
- else if (origin) {
119
- headers.set('Access-Control-Allow-Origin', origin);
120
- }
121
- headers.set('Access-Control-Allow-Methods', methods);
122
- headers.set('Access-Control-Allow-Headers', allowHeaders);
123
- if (options.credentials) {
124
- headers.set('Access-Control-Allow-Credentials', 'true');
125
- }
126
- if (options.maxAge != null) {
127
- headers.set('Access-Control-Max-Age', String(options.maxAge));
128
- }
129
- return headers;
130
- };
131
- }
132
- const rateLimitStores = new Map();
133
- function rateLimit(options = {}) {
134
- const limit = options.limit ?? 60;
135
- const windowMs = options.windowMs ?? 60_000;
136
- const storeKey = options.key ?? 'default';
137
- if (!rateLimitStores.has(storeKey)) {
138
- rateLimitStores.set(storeKey, new Map());
139
- }
140
- const store = rateLimitStores.get(storeKey);
141
- return (request) => {
142
- const identifier = options.identifier?.(request) ||
143
- request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||
144
- request.ip ||
145
- 'anonymous';
146
- const now = Date.now();
147
- const bucket = store.get(identifier) || { tokens: limit, updatedAt: now };
148
- const elapsed = now - bucket.updatedAt;
149
- const refill = (elapsed / windowMs) * limit;
150
- bucket.tokens = Math.min(limit, bucket.tokens + refill);
151
- bucket.updatedAt = now;
152
- if (bucket.tokens < 1) {
153
- store.set(identifier, bucket);
154
- return { ok: false, remaining: 0 };
155
- }
156
- bucket.tokens -= 1;
157
- store.set(identifier, bucket);
158
- return { ok: true, remaining: Math.floor(bucket.tokens) };
159
- };
160
- }
161
- function chain(middlewares) {
162
- return async (context) => {
163
- const originalNext = context.next;
164
- let index = -1;
165
- const dispatch = async (current) => {
166
- if (current <= index) {
167
- throw new Error('next() called multiple times');
168
- }
169
- index = current;
170
- const fn = middlewares[current];
171
- if (!fn) {
172
- return originalNext();
173
- }
174
- const next = async () => dispatch(current + 1);
175
- const result = await fn({ ...context, next });
176
- if (result instanceof Response) {
177
- return result;
178
- }
179
- return next();
180
- };
181
- return dispatch(0);
182
- };
183
- }
1
+ "use strict";
2
+ /**
3
+ * Middleware security primitives.
4
+ *
5
+ * These are Next-inspired helpers that apps can compose in `middleware.ts`.
6
+ * The runner also uses the redirect/header sanitizers internally.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.FORBIDDEN_REQUEST_HEADERS = void 0;
10
+ exports.isForbiddenRequestHeader = isForbiddenRequestHeader;
11
+ exports.sanitizeRequestHeaderMap = sanitizeRequestHeaderMap;
12
+ exports.isSafeRedirectLocation = isSafeRedirectLocation;
13
+ exports.isSafeRewriteLocation = isSafeRewriteLocation;
14
+ exports.securityHeaders = securityHeaders;
15
+ exports.cors = cors;
16
+ exports.rateLimit = rateLimit;
17
+ exports.chain = chain;
18
+ exports.FORBIDDEN_REQUEST_HEADERS = new Set([
19
+ 'host',
20
+ 'cookie',
21
+ 'content-length',
22
+ 'content-type',
23
+ 'transfer-encoding',
24
+ 'x-forwarded-for',
25
+ 'x-forwarded-host',
26
+ 'x-forwarded-proto',
27
+ 'x-forwarded-port',
28
+ 'x-real-ip',
29
+ 'x-middleware-next',
30
+ 'x-middleware-rewrite',
31
+ ]);
32
+ function isForbiddenRequestHeader(name) {
33
+ return exports.FORBIDDEN_REQUEST_HEADERS.has(name.toLowerCase());
34
+ }
35
+ function sanitizeRequestHeaderMap(headers) {
36
+ const sanitized = new Map();
37
+ const append = (key, value) => {
38
+ if (!isForbiddenRequestHeader(key)) {
39
+ sanitized.set(key.toLowerCase(), value);
40
+ }
41
+ };
42
+ if (headers instanceof Map) {
43
+ headers.forEach((value, key) => append(key, value));
44
+ }
45
+ else if (typeof headers.forEach === 'function' && !Array.isArray(headers)) {
46
+ headers.forEach((value, key) => append(key, value));
47
+ }
48
+ else {
49
+ for (const [key, value] of Object.entries(headers)) {
50
+ append(key, value);
51
+ }
52
+ }
53
+ return sanitized;
54
+ }
55
+ function isSafeRedirectLocation(location, requestUrl, allowedHosts = []) {
56
+ const trimmed = String(location || '').trim();
57
+ if (!trimmed)
58
+ return false;
59
+ if (trimmed.startsWith('/') && !trimmed.startsWith('//') && !trimmed.startsWith('/\\')) {
60
+ return !trimmed.includes('://');
61
+ }
62
+ try {
63
+ const base = new URL(requestUrl);
64
+ const target = new URL(trimmed, base);
65
+ if (target.origin === base.origin) {
66
+ return true;
67
+ }
68
+ const allowed = new Set(allowedHosts.map((host) => host.toLowerCase()));
69
+ return allowed.has(target.host.toLowerCase());
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ function isSafeRewriteLocation(location) {
76
+ const trimmed = String(location || '').trim();
77
+ if (!trimmed)
78
+ return false;
79
+ if (trimmed.startsWith('/') && !trimmed.startsWith('//') && !trimmed.startsWith('/\\')) {
80
+ return !trimmed.includes('://');
81
+ }
82
+ return false;
83
+ }
84
+ function securityHeaders(init = {}) {
85
+ const headers = new Headers(init.headers);
86
+ if (!headers.has('X-Content-Type-Options'))
87
+ headers.set('X-Content-Type-Options', 'nosniff');
88
+ if (!headers.has('X-Frame-Options'))
89
+ headers.set('X-Frame-Options', 'DENY');
90
+ if (!headers.has('Referrer-Policy'))
91
+ headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
92
+ if (!headers.has('X-DNS-Prefetch-Control'))
93
+ headers.set('X-DNS-Prefetch-Control', 'off');
94
+ if (!headers.has('Permissions-Policy')) {
95
+ headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
96
+ }
97
+ if (process.env.NODE_ENV === 'production' && !headers.has('Strict-Transport-Security')) {
98
+ headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
99
+ }
100
+ return headers;
101
+ }
102
+ function cors(options = {}) {
103
+ const origin = options.origin ?? '*';
104
+ const methods = (options.methods ?? ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']).join(', ');
105
+ const allowHeaders = (options.headers ?? ['Content-Type', 'Authorization']).join(', ');
106
+ return (request) => {
107
+ const headers = new Headers();
108
+ const requestOrigin = request.headers.get('origin');
109
+ if (origin === '*') {
110
+ headers.set('Access-Control-Allow-Origin', '*');
111
+ }
112
+ else if (Array.isArray(origin)) {
113
+ if (requestOrigin && origin.includes(requestOrigin)) {
114
+ headers.set('Access-Control-Allow-Origin', requestOrigin);
115
+ headers.set('Vary', 'Origin');
116
+ }
117
+ }
118
+ else if (origin) {
119
+ headers.set('Access-Control-Allow-Origin', origin);
120
+ }
121
+ headers.set('Access-Control-Allow-Methods', methods);
122
+ headers.set('Access-Control-Allow-Headers', allowHeaders);
123
+ if (options.credentials) {
124
+ headers.set('Access-Control-Allow-Credentials', 'true');
125
+ }
126
+ if (options.maxAge != null) {
127
+ headers.set('Access-Control-Max-Age', String(options.maxAge));
128
+ }
129
+ return headers;
130
+ };
131
+ }
132
+ const rateLimitStores = new Map();
133
+ function rateLimit(options = {}) {
134
+ const limit = options.limit ?? 60;
135
+ const windowMs = options.windowMs ?? 60_000;
136
+ const storeKey = options.key ?? 'default';
137
+ if (!rateLimitStores.has(storeKey)) {
138
+ rateLimitStores.set(storeKey, new Map());
139
+ }
140
+ const store = rateLimitStores.get(storeKey);
141
+ return (request) => {
142
+ const identifier = options.identifier?.(request) ||
143
+ request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||
144
+ request.ip ||
145
+ 'anonymous';
146
+ const now = Date.now();
147
+ const bucket = store.get(identifier) || { tokens: limit, updatedAt: now };
148
+ const elapsed = now - bucket.updatedAt;
149
+ const refill = (elapsed / windowMs) * limit;
150
+ bucket.tokens = Math.min(limit, bucket.tokens + refill);
151
+ bucket.updatedAt = now;
152
+ if (bucket.tokens < 1) {
153
+ store.set(identifier, bucket);
154
+ return { ok: false, remaining: 0 };
155
+ }
156
+ bucket.tokens -= 1;
157
+ store.set(identifier, bucket);
158
+ return { ok: true, remaining: Math.floor(bucket.tokens) };
159
+ };
160
+ }
161
+ function chain(middlewares) {
162
+ return async (context) => {
163
+ const originalNext = context.next;
164
+ let index = -1;
165
+ const dispatch = async (current) => {
166
+ if (current <= index) {
167
+ throw new Error('next() called multiple times');
168
+ }
169
+ index = current;
170
+ const fn = middlewares[current];
171
+ if (!fn) {
172
+ return originalNext();
173
+ }
174
+ const next = async () => dispatch(current + 1);
175
+ const result = await fn({ ...context, next });
176
+ if (result instanceof Response) {
177
+ return result;
178
+ }
179
+ return next();
180
+ };
181
+ return dispatch(0);
182
+ };
183
+ }