@askrjs/askr 0.0.26 → 0.0.28
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 +62 -20
- package/dist/_virtual/_fs.js +1 -0
- package/dist/_virtual/_path.js +1 -0
- package/dist/bench/benchmark-entry.d.ts.map +1 -1
- package/dist/benchmark.js +1 -1
- package/dist/bin/askr-ssg.d.ts +32 -0
- package/dist/bin/askr-ssg.d.ts.map +1 -0
- package/dist/bin/askr-ssg.js +24 -0
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +2 -2
- package/dist/dev/vite-plugin-askr.d.ts +9 -2
- package/dist/dev/vite-plugin-askr.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/node_modules/esbuild/lib/main.js +9 -9
- package/dist/renderer/cleanup.d.ts +3 -0
- package/dist/renderer/cleanup.d.ts.map +1 -1
- package/dist/renderer/cleanup.js +1 -1
- package/dist/renderer/dom.d.ts +2 -0
- package/dist/renderer/dom.d.ts.map +1 -1
- package/dist/renderer/dom.js +1 -1
- package/dist/renderer/evaluate.d.ts.map +1 -1
- package/dist/renderer/evaluate.js +1 -1
- package/dist/renderer/fastpath.d.ts.map +1 -1
- package/dist/renderer/fastpath.js +1 -1
- package/dist/renderer/index.js +1 -1
- package/dist/renderer/keyed.d.ts.map +1 -1
- package/dist/renderer/keyed.js +1 -1
- package/dist/renderer/reconcile.js +1 -1
- package/dist/renderer/utils.d.ts.map +1 -1
- package/dist/renderer/utils.js +1 -1
- package/dist/router/route.d.ts +1 -0
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +1 -1
- package/dist/runtime/component.d.ts +5 -2
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/component.js +1 -1
- package/dist/runtime/derive.d.ts +10 -4
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +1 -1
- package/dist/runtime/events.d.ts +1 -0
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +1 -1
- package/dist/runtime/fastlane.d.ts.map +1 -1
- package/dist/runtime/fastlane.js +1 -1
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +1 -1
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/perf-metrics.d.ts +25 -0
- package/dist/runtime/perf-metrics.d.ts.map +1 -0
- package/dist/runtime/perf-metrics.js +1 -0
- package/dist/runtime/readable.d.ts +21 -0
- package/dist/runtime/readable.d.ts.map +1 -0
- package/dist/runtime/readable.js +1 -0
- package/dist/runtime/scheduler.d.ts +18 -2
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +1 -1
- package/dist/runtime/selector.d.ts +9 -0
- package/dist/runtime/selector.d.ts.map +1 -0
- package/dist/runtime/selector.js +1 -0
- package/dist/runtime/state.d.ts +2 -4
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +1 -1
- package/dist/ssg/batch-render.d.ts +16 -0
- package/dist/ssg/batch-render.d.ts.map +1 -0
- package/dist/ssg/batch-render.js +1 -0
- package/dist/ssg/create-static-gen.d.ts +51 -0
- package/dist/ssg/create-static-gen.d.ts.map +1 -0
- package/dist/ssg/create-static-gen.js +1 -0
- package/dist/ssg/discover-resources.d.ts +15 -0
- package/dist/ssg/discover-resources.d.ts.map +1 -0
- package/dist/ssg/generate-metadata.d.ts +27 -0
- package/dist/ssg/generate-metadata.d.ts.map +1 -0
- package/dist/ssg/generate-metadata.js +1 -0
- package/dist/ssg/incremental-manifest.d.ts +23 -0
- package/dist/ssg/incremental-manifest.d.ts.map +1 -0
- package/dist/ssg/incremental-manifest.js +1 -0
- package/dist/ssg/index.d.ts +28 -0
- package/dist/ssg/index.d.ts.map +1 -0
- package/dist/ssg/index.js +1 -0
- package/dist/ssg/resolve-ssg-data.d.ts +26 -0
- package/dist/ssg/resolve-ssg-data.d.ts.map +1 -0
- package/dist/ssg/resolve-ssg-data.js +1 -0
- package/dist/ssg/route-utils.d.ts +12 -0
- package/dist/ssg/route-utils.d.ts.map +1 -0
- package/dist/ssg/route-utils.js +1 -0
- package/dist/ssg/types.d.ts +164 -0
- package/dist/ssg/types.d.ts.map +1 -0
- package/dist/ssg/write-static-files.d.ts +21 -0
- package/dist/ssg/write-static-files.d.ts.map +1 -0
- package/dist/ssg/write-static-files.js +1 -0
- package/dist/ssr/attrs.d.ts +1 -1
- package/dist/ssr/attrs.d.ts.map +1 -1
- package/dist/ssr/attrs.js +1 -1
- package/dist/ssr/context.d.ts +3 -0
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +1 -1
- package/dist/ssr/index.d.ts +27 -0
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/vite/index.js +4 -3
- package/package.json +34 -7
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RouteConfig } from './types';
|
|
2
|
+
export interface ResolvedRouteDescriptor {
|
|
3
|
+
route: RouteConfig;
|
|
4
|
+
path: string;
|
|
5
|
+
filePath: string;
|
|
6
|
+
routeId: string;
|
|
7
|
+
invalidationKeys: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function getOutputFilePath(pathStr: string): string;
|
|
10
|
+
export declare function interpolateRoutePath(routePath: string, params?: Record<string, string>): string;
|
|
11
|
+
export declare function resolveRouteDescriptor(route: RouteConfig): ResolvedRouteDescriptor;
|
|
12
|
+
//# sourceMappingURL=route-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-utils.d.ts","sourceRoot":"","sources":["../../src/ssg/route-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,GACjB,uBAAuB,CAUzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(e){return e==="/"?"index.html":`${e.replace(/^\/|\/$/g,"")}/index.html`}function l(e,n){return n?e.replace(/\{([^}]+)\}/g,(t,i)=>n[i]??""):e}function o(e){const n=l(e.path,e.params),t=r(n);return{route:e,path:n,filePath:t,routeId:`${n}::${t}`,invalidationKeys:e.invalidationKeys?.slice()??[]}}export{r as getOutputFilePath,l as interpolateRoutePath,o as resolveRouteDescriptor};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Static Site Generation.
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentFunction } from '../common/component';
|
|
5
|
+
import type { RouteHandler } from '../common/router';
|
|
6
|
+
export type SSGMode = 'full' | 'incremental';
|
|
7
|
+
export type RouteRenderStatus = 'success' | 'error' | 'skipped' | 'removed';
|
|
8
|
+
export type RouteRenderReason = 'full' | 'changed-key' | 'changed-route' | 'new-route' | 'no-keys' | 'unchanged' | 'deleted';
|
|
9
|
+
/**
|
|
10
|
+
* Route config accepted by SSG.
|
|
11
|
+
*
|
|
12
|
+
* `handler` is preferred and matches router/SSR naming.
|
|
13
|
+
* `component` is kept for compatibility and is normalized to `handler`.
|
|
14
|
+
*/
|
|
15
|
+
export interface RouteConfig {
|
|
16
|
+
/** URL path to generate (e.g., "/blog/post-1", "/") */
|
|
17
|
+
path: string;
|
|
18
|
+
/** Route handler compatible with router/SSR */
|
|
19
|
+
handler?: RouteHandler;
|
|
20
|
+
/** Backward-compatible alias for handler */
|
|
21
|
+
component?: ComponentFunction;
|
|
22
|
+
/** Optional base props merged with route params during render */
|
|
23
|
+
props?: Record<string, unknown>;
|
|
24
|
+
/** Optional namespace for router compatibility */
|
|
25
|
+
namespace?: string;
|
|
26
|
+
/** Optional path parameter map for template paths like "/blog/{slug}" */
|
|
27
|
+
params?: Record<string, string>;
|
|
28
|
+
/** Optional explicit invalidation keys for incremental generation */
|
|
29
|
+
invalidationKeys?: string[];
|
|
30
|
+
}
|
|
31
|
+
/** Options for createStaticGen */
|
|
32
|
+
export interface SSGOptions {
|
|
33
|
+
/** Routes to generate */
|
|
34
|
+
routes: RouteConfig[];
|
|
35
|
+
/** Output directory for generated HTML files */
|
|
36
|
+
outputDir: string;
|
|
37
|
+
/** Optional seed for deterministic rendering */
|
|
38
|
+
seed?: number;
|
|
39
|
+
/** Optional override data for resources (route-keyed) */
|
|
40
|
+
dataOverrides?: Record<string, unknown>;
|
|
41
|
+
/** Optional concurrency limit for rendering (default: 10) */
|
|
42
|
+
concurrency?: number;
|
|
43
|
+
/** Preferred render parallelism. `'auto'` resolves from the host machine. */
|
|
44
|
+
parallelism?: number | 'auto';
|
|
45
|
+
}
|
|
46
|
+
/** Options for a single generation run */
|
|
47
|
+
export interface SSGGenerateOptions {
|
|
48
|
+
/** Generation mode */
|
|
49
|
+
mode?: SSGMode;
|
|
50
|
+
/** Changed invalidation keys for incremental runs */
|
|
51
|
+
changedKeys?: string[];
|
|
52
|
+
/** Changed concrete route paths for incremental runs */
|
|
53
|
+
changedRoutes?: string[];
|
|
54
|
+
/** Force a full rebuild even when incremental mode was requested */
|
|
55
|
+
forceFull?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** Result of rendering a single route */
|
|
58
|
+
export interface RouteRenderResult {
|
|
59
|
+
/** URL path */
|
|
60
|
+
path: string;
|
|
61
|
+
/** Output file path relative to outputDir */
|
|
62
|
+
filePath: string;
|
|
63
|
+
/** Generated HTML content */
|
|
64
|
+
html: string;
|
|
65
|
+
/** File size in bytes */
|
|
66
|
+
fileSize: number;
|
|
67
|
+
/** Render duration in milliseconds */
|
|
68
|
+
renderDuration: number;
|
|
69
|
+
/** Number of resources discovered and rendered */
|
|
70
|
+
resourceCount: number;
|
|
71
|
+
/** Render or generation status */
|
|
72
|
+
status: RouteRenderStatus;
|
|
73
|
+
/** Why this route was rendered, skipped, or removed */
|
|
74
|
+
reason: RouteRenderReason;
|
|
75
|
+
/** Whether the output file was written during this run */
|
|
76
|
+
written: boolean;
|
|
77
|
+
/** Error message if rendering failed */
|
|
78
|
+
error?: string;
|
|
79
|
+
}
|
|
80
|
+
/** Overall result from SSG generation */
|
|
81
|
+
export interface SSGResult {
|
|
82
|
+
/** ISO timestamp of generation */
|
|
83
|
+
generatedAt: string;
|
|
84
|
+
/** Total number of routes processed */
|
|
85
|
+
totalRoutes: number;
|
|
86
|
+
/** Number of successfully generated routes */
|
|
87
|
+
successful: number;
|
|
88
|
+
/** Number of failed routes */
|
|
89
|
+
failed: number;
|
|
90
|
+
/** Total generation duration in milliseconds */
|
|
91
|
+
totalDuration: number;
|
|
92
|
+
/** Effective generation mode */
|
|
93
|
+
mode: SSGMode;
|
|
94
|
+
/** Number of routes rendered during this run */
|
|
95
|
+
rebuilt: number;
|
|
96
|
+
/** Number of current routes skipped as unchanged */
|
|
97
|
+
skipped: number;
|
|
98
|
+
/** Number of stale routes removed from output */
|
|
99
|
+
removed: number;
|
|
100
|
+
/** Number of rendered routes whose HTML bytes were unchanged */
|
|
101
|
+
cacheHits: number;
|
|
102
|
+
/** Invalidation keys applied to this run */
|
|
103
|
+
invalidatedKeys: string[];
|
|
104
|
+
/** Concrete route paths applied to this run */
|
|
105
|
+
invalidatedRoutes: string[];
|
|
106
|
+
/** Per-route results */
|
|
107
|
+
routes: RouteRenderResult[];
|
|
108
|
+
}
|
|
109
|
+
/** Metadata to write to metadata.json */
|
|
110
|
+
export interface SSGMetadata extends Record<string, unknown> {
|
|
111
|
+
/** ISO timestamp of generation */
|
|
112
|
+
generatedAt: string;
|
|
113
|
+
/** Total number of routes processed */
|
|
114
|
+
totalRoutes: number;
|
|
115
|
+
/** Number of successfully generated routes */
|
|
116
|
+
successful: number;
|
|
117
|
+
/** Number of failed routes */
|
|
118
|
+
failed: number;
|
|
119
|
+
/** Total generation duration in milliseconds */
|
|
120
|
+
totalDuration: number;
|
|
121
|
+
/** Effective generation mode */
|
|
122
|
+
mode: SSGMode;
|
|
123
|
+
/** Number of routes rendered during this run */
|
|
124
|
+
rebuilt: number;
|
|
125
|
+
/** Number of current routes skipped as unchanged */
|
|
126
|
+
skipped: number;
|
|
127
|
+
/** Number of stale routes removed from output */
|
|
128
|
+
removed: number;
|
|
129
|
+
/** Number of rendered routes whose HTML bytes were unchanged */
|
|
130
|
+
cacheHits: number;
|
|
131
|
+
/** Invalidation keys applied to this run */
|
|
132
|
+
invalidatedKeys: string[];
|
|
133
|
+
/** Concrete route paths applied to this run */
|
|
134
|
+
invalidatedRoutes: string[];
|
|
135
|
+
/** Per-route details */
|
|
136
|
+
routes: Array<{
|
|
137
|
+
/** URL path */
|
|
138
|
+
path: string;
|
|
139
|
+
/** Output file path relative to outputDir */
|
|
140
|
+
filePath: string;
|
|
141
|
+
/** File size in bytes */
|
|
142
|
+
fileSize: number;
|
|
143
|
+
/** Render duration in milliseconds */
|
|
144
|
+
renderDuration: number;
|
|
145
|
+
/** Number of resources discovered and rendered */
|
|
146
|
+
resourceCount: number;
|
|
147
|
+
/** Render or generation status */
|
|
148
|
+
status: RouteRenderStatus;
|
|
149
|
+
/** Why this route was rendered, skipped, or removed */
|
|
150
|
+
reason: RouteRenderReason;
|
|
151
|
+
/** Whether the output file was written during this run */
|
|
152
|
+
written: boolean;
|
|
153
|
+
/** Error message if rendering failed */
|
|
154
|
+
error?: string;
|
|
155
|
+
}>;
|
|
156
|
+
}
|
|
157
|
+
/** Resource discovery result for a single route */
|
|
158
|
+
export interface DiscoveredResources {
|
|
159
|
+
[key: string]: {
|
|
160
|
+
count: number;
|
|
161
|
+
dependencies: string[];
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ssg/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File I/O for Static Site Generation
|
|
3
|
+
*
|
|
4
|
+
* Uses Node.js fs/path modules to write rendered HTML files to disk.
|
|
5
|
+
* This module is Node-only and not intended for browser builds.
|
|
6
|
+
*/
|
|
7
|
+
import type { RouteRenderResult } from './types';
|
|
8
|
+
interface WriteStaticFilesOptions {
|
|
9
|
+
concurrency?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Write rendered routes to disk
|
|
13
|
+
* Creates outputDir/{route-path}/index.html structure
|
|
14
|
+
*/
|
|
15
|
+
export declare function writeStaticFiles(results: RouteRenderResult[], outputDir: string, options?: WriteStaticFilesOptions): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Get the output file path for a route
|
|
18
|
+
* E.g., "/blog/post" -> "blog/post" or "/" -> ""
|
|
19
|
+
*/
|
|
20
|
+
export { getOutputFilePath } from './route-utils';
|
|
21
|
+
//# sourceMappingURL=write-static-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-static-files.d.ts","sourceRoot":"","sources":["../../src/ssg/write-static-files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,UAAU,uBAAuB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/__vite-browser-external.js";import*as l from"node:fs";import*as r from"node:path";import{getOutputFilePath as g}from"./route-utils.js";async function p(o,i,n={}){await(void 0)(i,{recursive:!0});for(const e of o){if(e.status!=="removed")continue;const t=r.join(i,e.filePath);l.existsSync(t)&&(await(void 0)(t,{force:!0}),await h(r.dirname(t),i))}const a=o.filter(e=>e.status==="error"?(console.warn(`Skipping failed route: ${e.path} - ${e.error}`),!1):e.status==="success"&&e.written),s=[],c=new Set;for(const e of a){const t=r.dirname(r.join(i,e.filePath));c.has(t)||(c.add(t),s.push(t))}for(const e of s)await(void 0)(e,{recursive:!0});const d=Math.max(1,Math.min(n.concurrency??8,a.length||1));let f=0;const u=async()=>{for(;;){const e=f;if(f+=1,e>=a.length)return;const t=a[e];await(void 0)(r.join(i,t.filePath),t.html,"utf8")}};await Promise.all(Array.from({length:d},()=>u()))}async function h(o,i){let n=o;const a=r.resolve(i);for(;n.startsWith(a)&&!(!l.existsSync(n)||(await(void 0)(n)).length>0||(await(void 0)(n),r.resolve(n)===a));)n=r.dirname(n)}export{g as getOutputFilePath,p as writeStaticFiles};
|
package/dist/ssr/attrs.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export type AttrsResult = {
|
|
|
12
12
|
* Render attributes directly to a sink without intermediate string allocations.
|
|
13
13
|
* This is the hot path for streaming SSR.
|
|
14
14
|
*/
|
|
15
|
-
export declare function renderAttrsDirect(props: Props | undefined, sink: RenderSink): void;
|
|
15
|
+
export declare function renderAttrsDirect(props: Props | undefined, sink: Pick<RenderSink, 'write'>): void;
|
|
16
16
|
/**
|
|
17
17
|
* Render attributes to HTML string, excluding event handlers
|
|
18
18
|
* Optimized for minimal allocations using push-based approach
|
package/dist/ssr/attrs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attrs.d.ts","sourceRoot":"","sources":["../../src/ssr/attrs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"attrs.d.ts","sourceRoot":"","sources":["../../src/ssr/attrs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAkCF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAC9B,IAAI,CA6DN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;AACnD,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,IAAI,EAAE;IAAE,mBAAmB,EAAE,IAAI,CAAA;CAAE,GAClC,WAAW,CAAC"}
|
package/dist/ssr/attrs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{escapeAttr as d,styleObjToCss as A,needsEscapeAttr as h}from"./escape.js";const w=512,f=new Map;function g(t){return t.length>=3&&t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>=65&&t.charCodeAt(2)<=90}function a(t){if(t.length>64)return d(t);const e=f.get(t);if(e!==void 0)return e;const o=d(t);return f.size>=w&&f.clear(),f.set(t,o),o}function m(t,e){if(!t||typeof t!="object")return;const o=t;for(const c in o){const i=o[c];if(c==="children"||c==="key"||c==="ref"||c==="dangerouslySetInnerHTML"||g(c)||c.charCodeAt(0)===95)continue;const s=c==="className"?"class":c;if(s==="style"){const n=typeof i=="string"?i:A(i);if(!n)continue;e.write(' style="'),h(n)?e.write(a(n)):e.write(n),e.write('"');continue}if(i===!0){e.write(" "),e.write(s);continue}if(i===!1||i===null||i===void 0)continue;const r=String(i);e.write(" "),e.write(s),e.write('="'),h(r)?e.write(a(r)):e.write(r),e.write('"')}}function p(t,e){if(!t||typeof t!="object")return e?.returnDangerousHtml?{attrs:""}:"";const o=[];let c;const i=t;for(const r in i){const n=i[r];if(r==="children"||r==="key"||r==="ref")continue;if(r==="dangerouslySetInnerHTML"){n&&typeof n=="object"&&"__html"in n&&(c=String(n.__html));continue}if(g(r)||r.charCodeAt(0)===95)continue;const l=r==="class"||r==="className"?"class":r;if(l==="style"){const u=typeof n=="string"?n:A(n);if(u===null||u==="")continue;o.push(` style="${a(u)}"`);continue}if(n===!0)o.push(` ${l}`);else{if(n===!1||n===null||n===void 0)continue;{const u=String(n);o.push(` ${l}="${a(u)}"`)}}}const s=o.join("");return e?.returnDangerousHtml?{attrs:s,dangerousHtml:c}:s}export{p as renderAttrs,m as renderAttrsDirect};
|
package/dist/ssr/context.d.ts
CHANGED
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
import { SSRDataMissingError } from './errors';
|
|
9
9
|
export type { SSRData } from '../common/ssr';
|
|
10
10
|
import type { SSRData } from '../common/ssr';
|
|
11
|
+
import type { Route } from '../common/router';
|
|
11
12
|
export interface RenderContext {
|
|
12
13
|
url: string;
|
|
13
14
|
seed: number;
|
|
14
15
|
data?: SSRData;
|
|
15
16
|
params?: Record<string, string>;
|
|
17
|
+
routes?: readonly Route[];
|
|
16
18
|
signal?: AbortSignal;
|
|
17
19
|
keyCounter: number;
|
|
18
20
|
renderData: Record<string, unknown> | null;
|
|
@@ -22,6 +24,7 @@ export declare function createRenderContext(seed?: number, opts?: {
|
|
|
22
24
|
url?: string;
|
|
23
25
|
data?: SSRData;
|
|
24
26
|
params?: Record<string, string>;
|
|
27
|
+
routes?: readonly Route[];
|
|
25
28
|
signal?: AbortSignal;
|
|
26
29
|
}): RenderContext;
|
|
27
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ssr/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ssr/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAGD,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AA0BvC,wBAAgB,mBAAmB,CACjC,IAAI,SAAQ,EACZ,IAAI,GAAE;IACJ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACjB,GACL,aAAa,CAWf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAYvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAKvD;AAGD,eAAO,MAAM,aAAa,yBAAmB,CAAC;AAC9C,eAAO,MAAM,cAAc,0BAAoB,CAAC;AAChD,eAAO,MAAM,oBAAoB,yBAAmB,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAGvE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/ssr/context.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./errors.js";import{SSRDataMissingError as c}from"../common/ssr-errors.js";let r=null;try{const
|
|
1
|
+
import"./errors.js";import{SSRDataMissingError as c}from"../common/ssr-errors.js";let r=null;try{const n=require("async_hooks");n?.AsyncLocalStorage&&(r=new n.AsyncLocalStorage)}catch{}let e=null;function S(n=12345,t={}){return{url:t.url??"",seed:n,data:t.data,params:t.params,routes:t.routes,signal:t.signal,keyCounter:0,renderData:null}}function o(n,t){if(r)return r.run(n,t);const u=e;e=n;try{return t()}finally{e=u}}function a(){return r?r.getStore()??null:e}const s=a,g=o,f=a;function C(n,t){return o(n,t)}function R(){throw new c}export{c as SSRDataMissingError,S as createRenderContext,f as getCurrentSSRContext,a as getRenderContext,s as getSSRContext,C as runWithSSRContext,R as throwSSRDataMissing,o as withRenderContext,g as withSSRContext};
|
package/dist/ssr/index.d.ts
CHANGED
|
@@ -27,6 +27,20 @@ export declare function renderToStringSync(component: (props?: Record<string, un
|
|
|
27
27
|
seed?: number;
|
|
28
28
|
data?: SSRData;
|
|
29
29
|
}): string;
|
|
30
|
+
export declare function renderResolvedToStringSync(opts: {
|
|
31
|
+
url: string;
|
|
32
|
+
routes: Array<{
|
|
33
|
+
path: string;
|
|
34
|
+
handler: RouteHandler;
|
|
35
|
+
namespace?: string;
|
|
36
|
+
}>;
|
|
37
|
+
handler: RouteHandler;
|
|
38
|
+
params?: Record<string, string>;
|
|
39
|
+
options?: {
|
|
40
|
+
seed?: number;
|
|
41
|
+
data?: SSRData;
|
|
42
|
+
};
|
|
43
|
+
}): string;
|
|
30
44
|
export declare function renderToStringSyncForUrl(opts: {
|
|
31
45
|
url: string;
|
|
32
46
|
routes: Array<{
|
|
@@ -39,6 +53,19 @@ export declare function renderToStringSyncForUrl(opts: {
|
|
|
39
53
|
data?: SSRData;
|
|
40
54
|
};
|
|
41
55
|
}): string;
|
|
56
|
+
export declare function verifyHydrationSyncForUrl(opts: {
|
|
57
|
+
root: Element;
|
|
58
|
+
url: string;
|
|
59
|
+
routes: Array<{
|
|
60
|
+
path: string;
|
|
61
|
+
handler: RouteHandler;
|
|
62
|
+
namespace?: string;
|
|
63
|
+
}>;
|
|
64
|
+
options?: {
|
|
65
|
+
seed?: number;
|
|
66
|
+
data?: SSRData;
|
|
67
|
+
};
|
|
68
|
+
}): boolean;
|
|
42
69
|
import { collectResources, resolvePlan, resolveResources, type ResourcePlan } from './render-keys';
|
|
43
70
|
export type SSRRoute = {
|
|
44
71
|
path: string;
|
package/dist/ssr/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,EAML,KAAK,OAAO,EACb,MAAM,WAAW,CAAC;AAWnB,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ssr/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{resolveRouteFromRoutes as E}from"../router/route.js";import"../jsx/index.js";import{DefaultPortal as U}from"../foundations/structures/portal.js";import{throwSSRDataMissing as D,getRenderContext as j,createRenderContext as w,withRenderContext as R}from"./context.js";import{installSSRBridge as I}from"../runtime/ssr-bridge.js";import{getNextKey as F,getCurrentRenderData as G,startRenderPhase as v,stopRenderPhase as A}from"./render-keys.js";import{collectResources as Ar,resolvePlan as Tr,resolveResources as br}from"./render-keys.js";import{getCurrentComponentInstance as V,createComponentInstance as O,setCurrentComponentInstance as H}from"../runtime/component.js";import{escapeText as d,VOID_ELEMENTS as P,styleObjToCss as q}from"./escape.js";import{renderAttrs as sr,renderAttrsDirect as c}from"./attrs.js";import{logger as ar}from"../dev/logger.js";import{StringSink as N,StreamSink as W}from"./sink.js";import{renderNodeToSink as B}from"./stream-render.js";import{Fragment as S,ELEMENT_TYPE as h}from"../common/jsx.js";import{SSRDataMissingError as $r}from"../common/ssr-errors.js";function z(r){return r.length>=3&&r.charCodeAt(0)===111&&r.charCodeAt(1)===110&&r.charCodeAt(2)>=65&&r.charCodeAt(2)<=90}I({getCurrentSSRContext:j,throwSSRDataMissing:D,getCurrentRenderData:G,getNextKey:F});const M=[];function yr(){}function Sr(){}function K(r,t,o){if(!(r==null||r===!1)){if(typeof r=="string"){t.write(d(r));return}if(typeof r=="number"){t.write(d(String(r)));return}r&&typeof r=="object"&&"type"in r&&m(r,t,o)}}function C(r,t,o){if(!(!r||!Array.isArray(r)||r.length===0)){if(r.length>=32){for(let u=0;u<r.length;u++){const e=r[u];if(!(e==null||e===!1)){if(typeof e=="string"){t.write(d(e));continue}if(typeof e=="number"){t.write(d(String(e)));continue}e&&typeof e=="object"&&"type"in e&&m(e,t,o)}}return}for(let u=0;u<r.length;u++)K(r[u],t,o)}}function p(r,t,o){if(typeof r.write2=="function"){r.write2(t,o);return}r.write(t),r.write(o)}function y(r,t,o,u){if(typeof r.write3=="function"){r.write3(t,o,u);return}r.write(t),r.write(o),r.write(u)}function m(r,t,o){const{type:u,props:e}=r;if(typeof u=="function"){const s=T(u,e,o);m(s,t,o);return}if(typeof u=="symbol"){if(u===S){const s=Array.isArray(r.children)?r.children:Array.isArray(e?.children)?e?.children:void 0;C(s,t,o);return}throw new Error(`renderNodeSyncToSink: unsupported VNode symbol type: ${String(u)}`)}const n=u;if(P.has(n)){p(t,"<",n),c(e,t),t.write(" />");return}const i=e?e?.dangerouslySetInnerHTML:void 0;if(i!=null){const s=typeof i=="object"&&"__html"in i?String(i.__html):void 0;p(t,"<",n),c(e,t),t.write(">"),s!==void 0?t.write(s):C(r.children,t,o),y(t,"</",n,">");return}let f=r.children;if(f===void 0&&e?.children!==void 0){const s=e.children;Array.isArray(s)?f=s:s!==null&&s!==!1&&(f=[s])}if(!f||Array.isArray(f)&&f.length===0){p(t,"<",n),c(e,t),t.write(">"),y(t,"</",n,">");return}if(Array.isArray(f)&&f.length===1){const s=f[0];if(typeof s=="string"){const l=d(s);p(t,"<",n),c(e,t),t.write(">"),t.write(l),y(t,"</",n,">");return}if(typeof s=="number"){const l=d(String(s));p(t,"<",n),c(e,t),t.write(">"),t.write(l),y(t,"</",n,">");return}}p(t,"<",n),c(e,t),t.write(">"),C(f,t,o),y(t,"</",n,">")}function T(r,t,o){{const u=V(),e=O("ssr-temp",r,t||{},null);e.ssr=!0,H(e);try{const n=r(t||{},{ssr:o});if(n instanceof Promise&&D(),typeof n=="string"||typeof n=="number"||typeof n=="boolean"||n===null||n===void 0){const i=n==null||n===!1?"":String(n);return{$$typeof:h,type:S,props:{children:i?[i]:[]}}}return n}finally{H(u)}}}function X(r){const t={$$typeof:h,type:U,props:{},key:"__default_portal"};return r==null?{$$typeof:h,type:S,props:{children:[t]}}:{$$typeof:h,type:S,props:{children:[r,t]}}}function _(r,t,o){return T((e,n)=>X(r(e??{},n)),t||{},o)}function x(r){if(Array.isArray(r.children))return r.children;if(Array.isArray(r.props?.children))return r.props.children;if(r.props?.children!==void 0&&r.props.children!==null&&r.props.children!==!1)return[r.props.children]}function $(r){return r.pendingText.length===0?!0:!r.current||r.current.nodeType!==Node.TEXT_NODE||r.current.textContent!==r.pendingText?!1:(r.current=r.current.nextSibling,r.pendingText="",!0)}function Y(r,t){const o=new Set;let u;if(!t||typeof t!="object")return{matched:r.attributes.length===0,dangerousHtml:u};const e=t;for(const n in e){const i=e[n];if(n==="children"||n==="key"||n==="ref"||n==="dangerouslySetInnerHTML"){n==="dangerouslySetInnerHTML"&&i&&typeof i=="object"&&"__html"in i&&(u=String(i.__html));continue}if(z(n)||n.charCodeAt(0)===95)continue;const f=n==="class"||n==="className"?"class":n;if(f==="style"){const l=typeof i=="string"?i:q(i);if(!l)continue;if(r.getAttribute("style")!==l)return{matched:!1};o.add("style");continue}if(i===!0){if(!r.hasAttribute(f))return{matched:!1};o.add(f);continue}if(i===!1||i===null||i===void 0)continue;const s=String(i);if(r.getAttribute(f)!==s)return{matched:!1};o.add(f)}return r.attributes.length!==o.size?{matched:!1}:{matched:!0,dangerousHtml:u}}function g(r,t,o){if(r==null||r===!1)return!0;if(typeof r=="string"||typeof r=="number")return t.pendingText+=String(r),!0;if(!r||typeof r!="object"||!("type"in r))return!0;const u=r,{type:e,props:n}=u;if(typeof e=="function")return g(T(e,n,o),t,o);if(typeof e=="symbol"){if(e!==S)throw new Error(`verifyHydrationSyncForUrl: unsupported VNode symbol type: ${String(e)}`);const a=x(u);if(!a||a.length===0)return!0;for(let b=0;b<a.length;b+=1)if(!g(a[b],t,o))return!1;return!0}if(!$(t)||!t.current||t.current.nodeType!==Node.ELEMENT_NODE)return!1;const i=t.current;if(i.tagName.toLowerCase()!==String(e).toLowerCase())return!1;const f=Y(i,n);if(!f.matched)return!1;if(P.has(String(e)))return i.firstChild!==null?!1:(t.current=i.nextSibling,!0);if(f.dangerousHtml!==void 0)return i.innerHTML!==f.dangerousHtml?!1:(t.current=i.nextSibling,!0);const s={current:i.firstChild,pendingText:""},l=x(u);if(l&&l.length>0){for(let a=0;a<l.length;a+=1)if(!g(l[a],s,o))return!1}return!$(s)||s.current!==null?!1:(t.current=i.nextSibling,!0)}function J(r,t,o){const u={current:r.firstChild,pendingText:""};return g(t,u,o)?$(u)&&u.current===null:!1}function Q(r,t,o){const u=o?.seed??12345,e=w(u,{data:o?.data});return R(e,()=>{v(o?.data??null);try{const n=_(r,t||{},e);if(!n)throw new Error("renderToStringSync: wrapped component returned empty");const i=new N;return m(n,i,e),i.end(),i.toString()}finally{A()}})}function Z(r){const{url:t,routes:o,handler:u,params:e,options:n}=r,i=n?.seed??12345,f=w(i,{url:t,data:n?.data,params:e,routes:o});return R(f,()=>{v(n?.data??null);try{const s=_(u,e||{},f),l=new N;return m(s,l,f),l.end(),l.toString()}finally{A()}})}function mr(r){const{url:t,routes:o,options:u}=r,e=o.map(f=>({...f})),n=new URL(t,"http://localhost"),i=E(n.pathname,e);if(!i)throw new Error(`renderToStringSyncForUrl: no route found for url: ${t}`);return Z({url:t,routes:e,handler:i.handler,params:i.params,options:u})}function hr(r){const{root:t,url:o,routes:u,options:e}=r,n=u.map(a=>({...a})),i=new URL(o,"http://localhost"),f=E(i.pathname,n);if(!f)throw new Error(`verifyHydrationSyncForUrl: no route found for url: ${o}`);const s=e?.seed??12345,l=w(s,{url:o,data:e?.data,params:f.params,routes:n});return R(l,()=>{v(e?.data??null);try{const a=_(f.handler,f.params||{},l);return J(t,a,l)}finally{A()}})}function gr(r){if(typeof r=="function")return Q(r);const t=r,o=new N;return L({...t,sink:o}),o.end(),o.toString()}function wr(r){const t=new W(r.onChunk,r.onComplete);L({...r,sink:t}),t.end()}function L(r){const{url:t,routes:o,seed:u=12345,data:e,sink:n}=r,i=o.map(a=>({...a})),f=new URL(t,"http://localhost"),s=E(f.pathname,i);if(!s)throw new Error(`SSR: no route found for url: ${t}`);const l=w(u,{url:t,data:e,params:s.params,routes:i});R(l,()=>{v(e||null);try{const a=T(s.handler,s.params,l);B(a,n,l)}finally{A()}})}export{$r as SSRDataMissingError,Ar as collectResources,Sr as popSSRStrictPurityGuard,yr as pushSSRStrictPurityGuard,Z as renderResolvedToStringSync,wr as renderToStream,gr as renderToString,Q as renderToStringSync,mr as renderToStringSyncForUrl,Tr as resolvePlan,br as resolveResources,hr as verifyHydrationSyncForUrl};
|
package/dist/vite/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_virtual/main.js","_virtual/_commonjsHelpers.js","node_modules/esbuild/lib/main.js","_virtual/___vite-browser-external.js","_virtual/__vite-browser-external.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{__vitePreload as
|
|
3
|
-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_virtual/main.js","_virtual/_commonjsHelpers.js","node_modules/esbuild/lib/main.js","_virtual/_fs.js","_virtual/___vite-browser-external.js","_virtual/__vite-browser-external.js","_virtual/_path.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{__vitePreload as p}from"../_virtual/preload-helper.js";function d(r={}){const n="askr:vite",c=r.transformJsx??!0,u=r.optimizeTemplates??!1;return{name:n,enforce:"pre",config(){return{define:{__ASKR_OPTIMIZE_TEMPLATES__:JSON.stringify(u)},resolve:{alias:[]},optimizeDeps:{include:["@askrjs/askr","@askrjs/askr/jsx-runtime","@askrjs/askr/jsx-dev-runtime"]},esbuild:{jsxInject:"import { jsx, jsxs, Fragment } from '@askrjs/askr/jsx-runtime';"}}},async transform(l,t,o){if(!c||!/\.(jsx|tsx)$/.test(t)||t.includes("node_modules"))return null;try{const i=await p(()=>import("../_virtual/main.js").then(f=>f.m),__vite__mapDeps([0,1,2,3,4,5,6])),e={loader:t.endsWith(".tsx")?"tsx":"jsx",jsx:"automatic",jsxImportSource:"@askrjs/askr",sourcefile:t,sourcemap:!0},a=i;let s=null;return typeof a.transformSync=="function"?s=a.transformSync(l,e):typeof a.transform=="function"&&(s=await a.transform(l,e)),!s||!s.code?null:{code:u?j(s.code):s.code,map:s.map}}catch{return null}}}}function j(r){const n=new Map;let c=0;const u=r.replace(/\b(class|className|style):\s*("([^"\\]|\\.)*")/g,(t,o,i)=>{const m=`${o}:${i}`;let e=n.get(m);if(!e){if(r.split(t).length-1<2)return t;e=`__askrStaticLiteral${c++}`,n.set(m,e)}return`${o}: ${e}`});return n.size===0?r:`${Array.from(n.entries()).map(([t,o])=>{const i=t.slice(t.indexOf(":")+1);return`const ${o} = ${i};`}).join(`
|
|
3
|
+
`)}
|
|
4
|
+
${u}`}const k=d;export{k as askr,d as askrVitePlugin,d as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askrjs/askr",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.28",
|
|
4
4
|
"description": "Actor-backed deterministic UI framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -58,6 +58,10 @@
|
|
|
58
58
|
"import": "./dist/ssr/index.js",
|
|
59
59
|
"types": "./dist/ssr/index.d.ts"
|
|
60
60
|
},
|
|
61
|
+
"./ssg": {
|
|
62
|
+
"import": "./dist/ssg/index.js",
|
|
63
|
+
"types": "./dist/ssg/index.d.ts"
|
|
64
|
+
},
|
|
61
65
|
"./jsx-runtime": {
|
|
62
66
|
"import": "./dist/jsx-runtime.js",
|
|
63
67
|
"types": "./dist/jsx-runtime.d.ts"
|
|
@@ -71,34 +75,57 @@
|
|
|
71
75
|
"types": "./dist/vite/index.d.ts"
|
|
72
76
|
}
|
|
73
77
|
},
|
|
78
|
+
"bin": {
|
|
79
|
+
"askr-ssg": "./dist/bin/askr-ssg.js"
|
|
80
|
+
},
|
|
74
81
|
"publishConfig": {
|
|
75
82
|
"access": "public"
|
|
76
83
|
},
|
|
77
84
|
"scripts": {
|
|
78
85
|
"build": "npm run build:prod",
|
|
79
86
|
"build:prod": "cross-env NODE_ENV=production vite build && npm run build:types",
|
|
87
|
+
"build:dev": "cross-env NODE_ENV=development vite build && npm run build:types",
|
|
80
88
|
"build:types": "tsc -p tsconfig.json --emitDeclarationOnly",
|
|
81
|
-
"build:bench": "npm run build:
|
|
89
|
+
"build:bench": "cross-env BUILD=bench NODE_ENV=production vite build && npm run build:types",
|
|
90
|
+
"dev:watch": "vite build --watch --mode development",
|
|
82
91
|
"prepare": "npm run build:prod",
|
|
83
92
|
"dev": "vite",
|
|
84
93
|
"test": "vitest run",
|
|
94
|
+
"test:docs": "vitest run checks/docs/public-api-imports.test.ts",
|
|
95
|
+
"test:examples": "vitest run checks/examples/ssg-config.test.ts",
|
|
85
96
|
"test:types": "npm run build && tsd",
|
|
86
|
-
"
|
|
97
|
+
"verify:release": "npm run lint && npm run build && npm test && npm run test:docs && npm run test:examples && npm run perf:size",
|
|
98
|
+
"bench": "npm run bench:dom && npm run bench:ssr",
|
|
99
|
+
"bench:dom": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts --run",
|
|
100
|
+
"bench:ssr": "cross-env NODE_ENV=production vitest bench -c vitest.bench.ssr.config.ts --run",
|
|
101
|
+
"bench:watch": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts --watch",
|
|
102
|
+
"bench:watch:ssr": "cross-env NODE_ENV=production vitest bench -c vitest.bench.ssr.config.ts --watch",
|
|
103
|
+
"bench:tier1": "npm run bench:tier1:dom && npm run bench:tier1:ssr",
|
|
104
|
+
"bench:tier1:dom": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts benches/tier1/ --run",
|
|
105
|
+
"bench:tier1:ssr": "cross-env NODE_ENV=production vitest bench -c vitest.bench.ssr.config.ts benches/tier1/ --run",
|
|
106
|
+
"bench:tier2": "npm run bench:tier2:dom && npm run bench:tier2:ssr",
|
|
107
|
+
"bench:tier2:dom": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts benches/tier2/ --run",
|
|
108
|
+
"bench:tier2:ssr": "cross-env NODE_ENV=production vitest bench -c vitest.bench.ssr.config.ts benches/tier2/ --run",
|
|
109
|
+
"bench:tier3": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts benches/tier3/ --run",
|
|
110
|
+
"bench:tier4": "cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts benches/tier4/ --run",
|
|
111
|
+
"bench:json": "node -e \"const fs=require('node:fs'); fs.rmSync('bench-results',{recursive:true,force:true}); fs.mkdirSync('bench-results',{recursive:true});\" && cross-env NODE_ENV=production vitest bench -c vitest.bench.dom.config.ts --run --outputJson bench-results/dom.json && cross-env NODE_ENV=production vitest bench -c vitest.bench.ssr.config.ts --run --outputJson bench-results/ssr.json && node scripts/generate-bench-log.js",
|
|
112
|
+
"perf:size": "node scripts/check-size-budgets.mjs",
|
|
113
|
+
"perf:release": "npm run bench:json && npm run perf:size",
|
|
87
114
|
"fmt": "prettier --write .",
|
|
88
|
-
"lint": "eslint src tests benches --ext .ts,.tsx"
|
|
115
|
+
"lint": "eslint src tests checks benches --ext .ts,.tsx"
|
|
89
116
|
},
|
|
90
117
|
"devDependencies": {
|
|
91
118
|
"@eslint/js": "^10.0.1",
|
|
92
|
-
"@types/node": "^25.
|
|
119
|
+
"@types/node": "^25.4.0",
|
|
93
120
|
"cross-env": "^10.1.0",
|
|
94
|
-
"eslint": "^10.0.
|
|
121
|
+
"eslint": "^10.0.3",
|
|
95
122
|
"eslint-config-prettier": "^10.1.8",
|
|
96
123
|
"jiti": "^2.6.1",
|
|
97
124
|
"jsdom": "^28.1.0",
|
|
98
125
|
"prettier": "^3.8.1",
|
|
99
126
|
"tsd": "^0.33.0",
|
|
100
127
|
"typescript": "^5.9.3",
|
|
101
|
-
"typescript-eslint": "^8.
|
|
128
|
+
"typescript-eslint": "^8.57.0",
|
|
102
129
|
"vite": "^7.3.1",
|
|
103
130
|
"vitest": "^4.0.18"
|
|
104
131
|
}
|