@weft-js/start 0.1.1 → 0.1.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.
- package/README.md +1278 -12
- package/crate/Cargo.lock +1347 -0
- package/crate/Cargo.toml +72 -0
- package/crate/README.md +322 -0
- package/crate/rust-toolchain.toml +3 -0
- package/crate/src/build/emit.rs +103 -0
- package/crate/src/build.rs +367 -0
- package/crate/src/ctx.rs +186 -0
- package/crate/src/envelope.rs +163 -0
- package/crate/src/functions.rs +173 -0
- package/crate/src/lib.rs +118 -0
- package/crate/src/native.rs +212 -0
- package/crate/src/otel.rs +62 -0
- package/crate/src/server.rs +203 -0
- package/package.json +46 -37
- package/src/app.mjs +38 -8
- package/src/asset-receipt.d.mts +13 -0
- package/src/asset-receipt.mjs +61 -0
- package/src/auth/better-auth.ts +215 -17
- package/src/auth/drizzle.ts +1 -1
- package/src/auth.ts +21 -6
- package/src/boot.ts +19 -8
- package/src/bus/postgres.ts +32 -19
- package/src/bus.ts +7 -4
- package/src/{capture.mjs → capture.ts} +34 -1
- package/src/changes-sql.d.mts +8 -2
- package/src/changes-sql.mjs +26 -10
- package/src/changes.ts +165 -66
- package/src/channel/connections.ts +216 -0
- package/src/channel/socket.ts +396 -0
- package/src/channel-fake.ts +19 -4
- package/src/channel.ts +120 -492
- package/src/client.tsx +9 -2
- package/src/contract/describe.mjs +231 -0
- package/src/contract.mjs +144 -157
- package/src/data/cache.ts +354 -0
- package/src/data/definitions.ts +94 -0
- package/src/data/draft.ts +104 -0
- package/src/data/foundation.ts +95 -0
- package/src/data/live-api.ts +22 -0
- package/src/data/mutation.ts +138 -0
- package/src/data/primitives.ts +135 -0
- package/src/data/query.ts +106 -0
- package/src/data/transport.ts +121 -0
- package/src/data/types.ts +303 -0
- package/src/data.ts +69 -894
- package/src/db/bun-sqlite.d.ts +4 -1
- package/src/db/changes-mysql.ts +61 -21
- package/src/db/changes-postgres.ts +197 -118
- package/src/db/changes-sqlite.ts +131 -64
- package/src/db/core.ts +38 -13
- package/src/db/index.ts +20 -4
- package/src/db/mysql.ts +22 -6
- package/src/db/postgres.ts +49 -13
- package/src/db/sqlite.ts +53 -27
- package/src/derive.d.mts +4 -1
- package/src/derive.mjs +136 -39
- package/src/dev-runtime.mjs +8 -4
- package/src/exec/errors.ts +57 -0
- package/src/exec/landing.ts +66 -0
- package/src/exec/scope.ts +174 -0
- package/src/exec/touch.ts +80 -0
- package/src/exec/validation.ts +176 -0
- package/src/exec.ts +191 -341
- package/src/extension.ts +8 -2
- package/src/first-paint.ts +26 -9
- package/src/form/value.ts +15 -0
- package/src/form.tsx +132 -43
- package/src/hub/channels.ts +102 -0
- package/src/hub/connections.ts +147 -0
- package/src/hub/delivery.ts +62 -0
- package/src/hub/feed.ts +168 -0
- package/src/hub/presence.ts +64 -0
- package/src/hub/route.ts +158 -0
- package/src/hub/subscriptions.ts +212 -0
- package/src/hub/topic.ts +98 -0
- package/src/hub/tracked.ts +12 -0
- package/src/hub/types.ts +190 -0
- package/src/hub/view.ts +147 -0
- package/src/hub.ts +132 -758
- package/src/index.ts +84 -10
- package/src/inline.mjs +356 -0
- package/src/inspect/compare.mjs +162 -0
- package/src/inspect/routes.mjs +154 -0
- package/src/inspect/samples.mjs +59 -0
- package/src/inspect/url.mjs +2 -0
- package/src/inspect.mjs +146 -187
- package/src/link/election.ts +178 -0
- package/src/link/lines.ts +27 -0
- package/src/link.ts +90 -166
- package/src/list-drizzle.ts +104 -18
- package/src/list.ts +127 -36
- package/src/listen.ts +32 -6
- package/src/live/api.ts +18 -0
- package/src/live/backoff.ts +6 -0
- package/src/live/frames.ts +42 -0
- package/src/live/read.ts +77 -0
- package/src/live/sub-types.ts +24 -0
- package/src/live/transport.ts +86 -0
- package/src/live/types.ts +52 -0
- package/src/live-fake.ts +20 -5
- package/src/live-target.mjs +112 -37
- package/src/live.ts +116 -225
- package/src/media.ts +8 -1
- package/src/migrations.mjs +14 -6
- package/src/mux.ts +161 -64
- package/src/og/DefaultCard.tsx +40 -9
- package/src/og/fonts.mjs +16 -8
- package/src/og/images.mjs +43 -22
- package/src/og/index.mjs +119 -43
- package/src/og/native.mjs +11 -4
- package/src/range.mjs +15 -3
- package/src/router.ts +56 -6
- package/src/routes.mjs +73 -22
- package/src/run/admission.ts +80 -0
- package/src/run/boot.tsx +115 -0
- package/src/run/cache-presentation.ts +67 -0
- package/src/run/cache.ts +254 -0
- package/src/run/helpers.ts +197 -0
- package/src/run/listeners.ts +155 -0
- package/src/run/navigation.ts +382 -0
- package/src/run/page-skeleton.tsx +35 -0
- package/src/run/prefetch.ts +128 -0
- package/src/run/retain-view.ts +18 -0
- package/src/run/shape-preparation.ts +97 -0
- package/src/run/shape-styles.ts +72 -0
- package/src/run/source-context/pin.ts +124 -0
- package/src/run/source-context.ts +311 -0
- package/src/run.tsx +50 -178
- package/src/rust/common.ts +163 -0
- package/src/rust/native.ts +282 -0
- package/src/rust.ts +103 -229
- package/src/server/card.tsx +65 -0
- package/src/server/compression.ts +115 -0
- package/src/server/core.ts +70 -0
- package/src/server/dispatch.ts +70 -0
- package/src/server/form.ts +85 -0
- package/src/server/functions.ts +129 -0
- package/src/server/handler.ts +39 -0
- package/src/server/head.ts +96 -0
- package/src/server/media.ts +60 -0
- package/src/server/navigation-cache.ts +80 -0
- package/src/server/navigation.tsx +85 -0
- package/src/server/page-cold.ts +95 -0
- package/src/server/page-stream.tsx +181 -0
- package/src/server/page-types.ts +51 -0
- package/src/server/page-warm.ts +130 -0
- package/src/server/page.ts +69 -0
- package/src/server/payload.ts +89 -0
- package/src/server/prerender.ts +60 -0
- package/src/server/preview.tsx +67 -0
- package/src/server/render.ts +167 -0
- package/src/server/request.ts +98 -0
- package/src/server/resolver.ts +228 -0
- package/src/server/routes.ts +150 -0
- package/src/server/services.ts +69 -0
- package/src/server/text.ts +29 -0
- package/src/server/types.ts +160 -0
- package/src/server.tsx +82 -971
- package/src/shape.mjs +30 -6
- package/src/share/display.ts +50 -0
- package/src/share/network.ts +119 -0
- package/src/share/receive.ts +70 -0
- package/src/share/state.ts +30 -0
- package/src/share/tab-queue.ts +28 -0
- package/src/share-server.ts +128 -43
- package/src/share.ts +103 -209
- package/src/sheets.mjs +30 -18
- package/src/sidecar/build.mjs +170 -0
- package/src/sidecar/cargo.mjs +164 -0
- package/src/sidecar/common.mjs +17 -0
- package/src/sidecar/dev-build.mjs +91 -0
- package/src/sidecar/dev-watch.mjs +88 -0
- package/src/sidecar/manifest.mjs +19 -0
- package/src/sidecar/process.mjs +58 -0
- package/src/sidecar/refresh.mjs +19 -0
- package/src/sidecar.mjs +75 -416
- package/src/socket/check.ts +50 -0
- package/src/socket/deliver.ts +16 -0
- package/src/socket/publish.ts +56 -0
- package/src/socket/rooms.ts +41 -0
- package/src/socket/route.ts +79 -0
- package/src/socket/shared.ts +26 -0
- package/src/socket/types.ts +48 -0
- package/src/socket.ts +205 -194
- package/src/stream.ts +10 -1
- package/src/verify/app.ts +39 -0
- package/src/verify/cleanup.ts +27 -0
- package/src/verify/database.ts +11 -0
- package/src/verify/live.ts +63 -0
- package/src/verify/notify.ts +35 -0
- package/src/verify/skip.ts +19 -0
- package/src/verify/support.ts +149 -0
- package/src/verify/timing.ts +15 -0
- package/src/verify/trigger.ts +14 -0
- package/src/verify.ts +77 -176
- package/src/view.tsx +96 -11
- package/src/vite/asset-bytes.mjs +95 -0
- package/src/vite/assets.mjs +117 -0
- package/src/vite/config-hooks.mjs +166 -0
- package/src/vite/dev-hooks.mjs +103 -0
- package/src/vite/dev.mjs +102 -0
- package/src/vite/entries.mjs +145 -0
- package/src/vite/module-hooks.mjs +288 -0
- package/src/vite/route-modules.mjs +289 -0
- package/src/vite/server-functions.mjs +222 -0
- package/src/vite/shape-entry-css.mjs +187 -0
- package/src/vite/shape-override.mjs +226 -0
- package/src/vite/shared.mjs +51 -0
- package/src/vite/sheets.mjs +92 -0
- package/src/vite/state.mjs +89 -0
- package/src/vite/syntax.mjs +139 -0
- package/src/vite.mjs +152 -853
- package/src/capture.d.mts +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { parseSync } from 'vite'
|
|
2
|
+
|
|
3
|
+
const SERVER_EXPORTS = new Set(['load', 'meta', 'prerender'])
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The client build of a route module: `load`, `meta` and `prerender` removed (they run on the server; loaders can
|
|
7
|
+
* hold database code and secrets), then imports nothing else uses. Exported for tests.
|
|
8
|
+
*/
|
|
9
|
+
function serverCuts(code, file) {
|
|
10
|
+
const ast = parseSync(file, code, {
|
|
11
|
+
lang: file.endsWith('.tsx') ? 'tsx' : file.endsWith('.ts') ? 'ts' : 'jsx',
|
|
12
|
+
sourceType: 'module',
|
|
13
|
+
})
|
|
14
|
+
const cuts = []
|
|
15
|
+
for (const node of ast.program.body) {
|
|
16
|
+
if (node.type !== 'ExportNamedDeclaration' || !node.declaration) continue
|
|
17
|
+
const d = node.declaration
|
|
18
|
+
const names =
|
|
19
|
+
d.type === 'VariableDeclaration' ? d.declarations.map((x) => x.id?.name) : [d.id?.name]
|
|
20
|
+
if (names.length && names.every((n) => SERVER_EXPORTS.has(n))) cuts.push([node.start, node.end])
|
|
21
|
+
}
|
|
22
|
+
return cuts
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const serverExports = (code, file) =>
|
|
26
|
+
serverCuts(code, file)
|
|
27
|
+
.map(([a, b]) => code.slice(a, b))
|
|
28
|
+
.join('\n')
|
|
29
|
+
|
|
30
|
+
/** The server-only exports of a route file, cut out of the client's copy. */
|
|
31
|
+
export function stripServerExports(code, file = 'route.tsx') {
|
|
32
|
+
const cuts = serverCuts(code, file)
|
|
33
|
+
if (!cuts.length) return code
|
|
34
|
+
let out = code
|
|
35
|
+
for (const [a, b] of cuts.sort((x, y) => y[0] - x[0])) out = out.slice(0, a) + out.slice(b)
|
|
36
|
+
// Imports whose bindings are no longer used go too (a db client a loader imported must not reach the browser).
|
|
37
|
+
return pruneImports(out, file)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const parse = (file, code) =>
|
|
41
|
+
parseSync(file, code, {
|
|
42
|
+
lang: file.endsWith('.tsx') ? 'tsx' : /\.[cm]?ts$/.test(file) ? 'ts' : 'jsx',
|
|
43
|
+
sourceType: 'module',
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/** The TS nodes that hold code; every other `TS*` node is a type, gone once TypeScript is stripped. */
|
|
47
|
+
const TS_VALUE =
|
|
48
|
+
/^TS((As|Satisfies|NonNull|Instantiation)Expression|TypeAssertion|Enum\w+|Module\w+|ImportEqualsDeclaration|ExternalModuleReference|ParameterProperty|ExportAssignment)$/
|
|
49
|
+
const NAMED_MEMBER = /^(Property|MethodDefinition|PropertyDefinition|AccessorProperty)$/
|
|
50
|
+
const binds = (p) =>
|
|
51
|
+
!p
|
|
52
|
+
? []
|
|
53
|
+
: p.type === 'Identifier'
|
|
54
|
+
? [p.name]
|
|
55
|
+
: (p.properties ?? p.elements ?? [p.value ?? p.left ?? p.argument ?? p.parameter]).flatMap(
|
|
56
|
+
binds,
|
|
57
|
+
)
|
|
58
|
+
const declares = (s) =>
|
|
59
|
+
s.type === 'VariableDeclaration'
|
|
60
|
+
? s.declarations.flatMap((d) => binds(d.id))
|
|
61
|
+
: /^(Function|Class)Declaration$/.test(s.type) && s.id
|
|
62
|
+
? [s.id.name]
|
|
63
|
+
: []
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The outer names `ast` reads at run time. Not types (`typeof x` in one reads nothing), property names, or what a
|
|
67
|
+
* function or block binds itself: `optimistic: ({ input }) => …` doesn't use a top-level `input`. It errs towards a name
|
|
68
|
+
* being used: a kept import is a bigger bundle, a dropped one a crash.
|
|
69
|
+
*/
|
|
70
|
+
export function valueNames(ast) {
|
|
71
|
+
const out = new Set()
|
|
72
|
+
const walk = (n, bound) => {
|
|
73
|
+
if (Array.isArray(n)) return n.forEach((x) => walk(x, bound))
|
|
74
|
+
if (
|
|
75
|
+
typeof n?.type !== 'string' ||
|
|
76
|
+
n.type === 'ImportDeclaration' ||
|
|
77
|
+
n.exportKind === 'type' ||
|
|
78
|
+
(n.type.startsWith('TS') && !TS_VALUE.test(n.type))
|
|
79
|
+
)
|
|
80
|
+
return
|
|
81
|
+
if (n.type === 'Identifier' || n.type === 'JSXIdentifier') {
|
|
82
|
+
if (!bound.has(n.name)) out.add(n.name)
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
const inner = /^(Arrow)?Function/.test(n.type)
|
|
86
|
+
? [...(n.id ? [n.id.name] : []), ...n.params.flatMap(binds)]
|
|
87
|
+
: n.type === 'BlockStatement'
|
|
88
|
+
? n.body.flatMap(declares)
|
|
89
|
+
: []
|
|
90
|
+
const scope = inner.length ? new Set([...bound, ...inner]) : bound
|
|
91
|
+
const skip = n.computed
|
|
92
|
+
? undefined
|
|
93
|
+
: n.type === 'MemberExpression'
|
|
94
|
+
? 'property'
|
|
95
|
+
: NAMED_MEMBER.test(n.type)
|
|
96
|
+
? 'key'
|
|
97
|
+
: undefined
|
|
98
|
+
for (const k in n)
|
|
99
|
+
if (k !== skip && k !== 'parent' && n[k] && typeof n[k] === 'object') walk(n[k], scope)
|
|
100
|
+
}
|
|
101
|
+
walk(ast.program.body, new Set())
|
|
102
|
+
return out
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Drop value import specifiers nothing in `out` reads (and imports left empty). */
|
|
106
|
+
export function pruneImports(out, file) {
|
|
107
|
+
const again = parse(file, out)
|
|
108
|
+
const imports = again.program.body.filter(
|
|
109
|
+
(n) => n.type === 'ImportDeclaration' && n.specifiers.length,
|
|
110
|
+
)
|
|
111
|
+
const used = valueNames(again)
|
|
112
|
+
let rest = out
|
|
113
|
+
for (const imp of imports)
|
|
114
|
+
rest = rest.slice(0, imp.start) + ' '.repeat(imp.end - imp.start) + rest.slice(imp.end)
|
|
115
|
+
const spelled = new Set(rest.match(/[A-Za-z_$][\w$]*/g)) // a type import is erased, so a type may keep it
|
|
116
|
+
for (const imp of imports.sort((x, y) => y.start - x.start)) {
|
|
117
|
+
const keep = imp.specifiers.filter((s) =>
|
|
118
|
+
(imp.importKind === 'type' || s.importKind === 'type' ? spelled : used).has(s.local.name),
|
|
119
|
+
)
|
|
120
|
+
if (keep.length === imp.specifiers.length) continue
|
|
121
|
+
const text = keep.length ? rewriteImport(imp, keep, out) : ''
|
|
122
|
+
out = out.slice(0, imp.start) + text + out.slice(imp.end)
|
|
123
|
+
}
|
|
124
|
+
return out
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function rewriteImport(imp, keep, code) {
|
|
128
|
+
const def = keep.find((s) => s.type === 'ImportDefaultSpecifier')
|
|
129
|
+
const ns = keep.find((s) => s.type === 'ImportNamespaceSpecifier')
|
|
130
|
+
const named = keep
|
|
131
|
+
.filter((s) => s.type === 'ImportSpecifier')
|
|
132
|
+
.map((s) => code.slice(s.start, s.end))
|
|
133
|
+
const parts = [
|
|
134
|
+
def && def.local.name,
|
|
135
|
+
ns && `* as ${ns.local.name}`,
|
|
136
|
+
named.length && `{ ${named.join(', ')} }`,
|
|
137
|
+
].filter(Boolean)
|
|
138
|
+
return `import ${imp.importKind === 'type' ? 'type ' : ''}${parts.join(', ')} from ${code.slice(imp.source.start, imp.source.end)}`
|
|
139
|
+
}
|