@reckona/mreact-router 0.0.73 → 0.0.74
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 +1 -1
- package/dist/actions.d.ts +14 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +55 -44
- package/dist/actions.js.map +1 -1
- package/dist/build.d.ts +12 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +44 -44
- package/dist/build.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +17 -8
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +2 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +4 -0
- package/dist/render.js.map +1 -1
- package/dist/route-source.d.ts +8 -0
- package/dist/route-source.d.ts.map +1 -1
- package/dist/route-source.js +15 -1
- package/dist/route-source.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +6 -0
- package/dist/serve.js.map +1 -1
- package/dist/server-action-inference.d.ts +50 -0
- package/dist/server-action-inference.d.ts.map +1 -0
- package/dist/server-action-inference.js +488 -0
- package/dist/server-action-inference.js.map +1 -0
- package/package.json +12 -11
- package/src/actions.ts +92 -62
- package/src/build.ts +78 -61
- package/src/client.ts +14 -11
- package/src/index.ts +1 -0
- package/src/render.ts +9 -0
- package/src/route-source.ts +25 -0
- package/src/serve.ts +22 -0
- package/src/server-action-inference.ts +804 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { dirname, relative, sep } from "node:path";
|
|
3
|
+
import { collectFormActionExpressionReferences, hasModuleDirective, } from "@reckona/mreact-compiler";
|
|
4
|
+
let ts = undefined;
|
|
5
|
+
let typescriptLoaded = false;
|
|
6
|
+
export const dynamicFormActionInferenceCode = "MR_SERVER_ACTION_INFERENCE_DYNAMIC_FORM_ACTION";
|
|
7
|
+
const dynamicFormActionInferenceMessage = "mreact could not infer a single server action from this form action expression. Pass the action function directly or use an explicit escape hatch.";
|
|
8
|
+
export async function collectRuntimeInferredServerActions(options) {
|
|
9
|
+
const formReferences = collectFormActionExpressionReferences({
|
|
10
|
+
code: options.code,
|
|
11
|
+
filename: options.pageFile,
|
|
12
|
+
});
|
|
13
|
+
if (formReferences.length === 0) {
|
|
14
|
+
return { diagnostics: [], references: new Map() };
|
|
15
|
+
}
|
|
16
|
+
await loadTypeScript();
|
|
17
|
+
const program = ts.createProgram({
|
|
18
|
+
host: createRuntimeProgramHost({
|
|
19
|
+
code: options.code,
|
|
20
|
+
compilerOptions: defaultCompilerOptions(),
|
|
21
|
+
pageFile: options.pageFile,
|
|
22
|
+
}),
|
|
23
|
+
options: {
|
|
24
|
+
allowJs: true,
|
|
25
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
26
|
+
module: ts.ModuleKind.NodeNext,
|
|
27
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
28
|
+
noEmit: true,
|
|
29
|
+
target: ts.ScriptTarget.ES2022,
|
|
30
|
+
},
|
|
31
|
+
rootNames: [options.pageFile],
|
|
32
|
+
});
|
|
33
|
+
const checker = program.getTypeChecker();
|
|
34
|
+
const sourceFile = program.getSourceFile(options.pageFile);
|
|
35
|
+
if (sourceFile === undefined) {
|
|
36
|
+
return { diagnostics: [], references: new Map() };
|
|
37
|
+
}
|
|
38
|
+
const diagnostics = [];
|
|
39
|
+
const references = new Map();
|
|
40
|
+
for (const formReference of formReferences) {
|
|
41
|
+
const expression = findExpressionAt(sourceFile, formReference);
|
|
42
|
+
if (expression === undefined) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const resolved = await resolveRuntimeActionExpression({
|
|
46
|
+
appDir: options.appDir,
|
|
47
|
+
checker,
|
|
48
|
+
expression,
|
|
49
|
+
fileSystem: options.fileSystem,
|
|
50
|
+
pageFile: options.pageFile,
|
|
51
|
+
seen: new Set(),
|
|
52
|
+
});
|
|
53
|
+
if (resolved.kind === "resolved") {
|
|
54
|
+
references.set(formActionOccurrenceKey(formReference), resolved.reference);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (resolved.kind === "dynamic") {
|
|
58
|
+
diagnostics.push({
|
|
59
|
+
code: dynamicFormActionInferenceCode,
|
|
60
|
+
filename: options.pageFile,
|
|
61
|
+
level: "warn",
|
|
62
|
+
message: dynamicFormActionInferenceMessage,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { diagnostics, references };
|
|
67
|
+
}
|
|
68
|
+
export async function collectBuildInferredServerActions(options) {
|
|
69
|
+
const formReferences = collectFormActionExpressionReferences({
|
|
70
|
+
code: options.source,
|
|
71
|
+
filename: options.file,
|
|
72
|
+
});
|
|
73
|
+
if (formReferences.length === 0) {
|
|
74
|
+
return { diagnostics: [], references: [] };
|
|
75
|
+
}
|
|
76
|
+
await loadTypeScript();
|
|
77
|
+
const program = createBuildProgram(options.file, options.files, options.source);
|
|
78
|
+
const checker = program.getTypeChecker();
|
|
79
|
+
const sourceFile = program.getSourceFile(options.file);
|
|
80
|
+
if (sourceFile === undefined) {
|
|
81
|
+
return { diagnostics: [], references: [] };
|
|
82
|
+
}
|
|
83
|
+
const diagnostics = [];
|
|
84
|
+
const references = [];
|
|
85
|
+
const sourceHash = formActionSourceHash(options.source);
|
|
86
|
+
for (const formReference of formReferences) {
|
|
87
|
+
const expression = findExpressionAt(sourceFile, formReference);
|
|
88
|
+
if (expression === undefined) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const resolved = resolveBuildActionExpression({
|
|
92
|
+
checker,
|
|
93
|
+
expression,
|
|
94
|
+
file: options.file,
|
|
95
|
+
files: options.files,
|
|
96
|
+
relativeRoutesDir: options.relativeRoutesDir,
|
|
97
|
+
resolveSourceImport: options.resolveSourceImport,
|
|
98
|
+
seen: new Set(),
|
|
99
|
+
});
|
|
100
|
+
if (resolved.kind === "resolved") {
|
|
101
|
+
references.push({
|
|
102
|
+
...resolved.reference,
|
|
103
|
+
end: formReference.end,
|
|
104
|
+
expression: formReference.expression,
|
|
105
|
+
expressionEnd: formReference.expressionEnd,
|
|
106
|
+
expressionStart: formReference.expressionStart,
|
|
107
|
+
sourceHash,
|
|
108
|
+
start: formReference.start,
|
|
109
|
+
});
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (resolved.kind === "dynamic") {
|
|
113
|
+
diagnostics.push({
|
|
114
|
+
code: dynamicFormActionInferenceCode,
|
|
115
|
+
filename: options.file,
|
|
116
|
+
level: "warn",
|
|
117
|
+
message: dynamicFormActionInferenceMessage,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { diagnostics, references };
|
|
122
|
+
}
|
|
123
|
+
async function resolveRuntimeActionExpression(options) {
|
|
124
|
+
const expression = unwrapExpression(options.expression);
|
|
125
|
+
if (options.seen.has(expression)) {
|
|
126
|
+
return { kind: "unresolved" };
|
|
127
|
+
}
|
|
128
|
+
options.seen.add(expression);
|
|
129
|
+
if (ts.isIdentifier(expression)) {
|
|
130
|
+
return await resolveRuntimeIdentifier({ ...options, expression });
|
|
131
|
+
}
|
|
132
|
+
if (ts.isPropertyAccessExpression(expression)) {
|
|
133
|
+
return await resolveRuntimePropertyAccess({ ...options, expression });
|
|
134
|
+
}
|
|
135
|
+
if (ts.isConditionalExpression(expression)) {
|
|
136
|
+
return { kind: "dynamic" };
|
|
137
|
+
}
|
|
138
|
+
return { kind: "unresolved" };
|
|
139
|
+
}
|
|
140
|
+
async function resolveRuntimeIdentifier(options) {
|
|
141
|
+
const symbol = options.checker.getSymbolAtLocation(options.expression);
|
|
142
|
+
if (symbol === undefined) {
|
|
143
|
+
return { kind: "unresolved" };
|
|
144
|
+
}
|
|
145
|
+
for (const declaration of symbol.declarations ?? []) {
|
|
146
|
+
if (ts.isImportSpecifier(declaration)) {
|
|
147
|
+
return await referenceFromRuntimeImportSpecifier(options, declaration);
|
|
148
|
+
}
|
|
149
|
+
if (ts.isVariableDeclaration(declaration)) {
|
|
150
|
+
if (declaration.initializer === undefined) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
return await resolveRuntimeActionExpression({
|
|
154
|
+
...options,
|
|
155
|
+
expression: declaration.initializer,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const aliased = aliasTargetSymbol(options.checker, symbol);
|
|
160
|
+
if (aliased !== undefined) {
|
|
161
|
+
const reference = await referenceFromRuntimeSymbolDeclaration(options, aliased);
|
|
162
|
+
if (reference !== undefined) {
|
|
163
|
+
return { kind: "resolved", reference };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { kind: "unresolved" };
|
|
167
|
+
}
|
|
168
|
+
async function resolveRuntimePropertyAccess(options) {
|
|
169
|
+
const object = unwrapExpression(options.expression.expression);
|
|
170
|
+
if (!ts.isIdentifier(object)) {
|
|
171
|
+
return { kind: "unresolved" };
|
|
172
|
+
}
|
|
173
|
+
const symbol = options.checker.getSymbolAtLocation(object);
|
|
174
|
+
for (const declaration of symbol?.declarations ?? []) {
|
|
175
|
+
if (!ts.isVariableDeclaration(declaration) || declaration.initializer === undefined) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const initializer = unwrapExpression(declaration.initializer);
|
|
179
|
+
if (!ts.isObjectLiteralExpression(initializer)) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const property = initializer.properties.find((candidate) => objectLiteralPropertyName(candidate) === options.expression.name.text);
|
|
183
|
+
if (property === undefined) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (ts.isShorthandPropertyAssignment(property)) {
|
|
187
|
+
return await resolveRuntimeSymbol(options, options.checker.getShorthandAssignmentValueSymbol(property));
|
|
188
|
+
}
|
|
189
|
+
if (ts.isPropertyAssignment(property)) {
|
|
190
|
+
return await resolveRuntimeActionExpression({
|
|
191
|
+
...options,
|
|
192
|
+
expression: property.initializer,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return { kind: "dynamic" };
|
|
196
|
+
}
|
|
197
|
+
return { kind: "unresolved" };
|
|
198
|
+
}
|
|
199
|
+
async function resolveRuntimeSymbol(options, symbol) {
|
|
200
|
+
if (symbol === undefined) {
|
|
201
|
+
return { kind: "unresolved" };
|
|
202
|
+
}
|
|
203
|
+
for (const declaration of symbol.declarations ?? []) {
|
|
204
|
+
if (ts.isImportSpecifier(declaration)) {
|
|
205
|
+
return await referenceFromRuntimeImportSpecifier(options, declaration);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const aliased = aliasTargetSymbol(options.checker, symbol);
|
|
209
|
+
if (aliased === undefined) {
|
|
210
|
+
return { kind: "unresolved" };
|
|
211
|
+
}
|
|
212
|
+
const reference = await referenceFromRuntimeSymbolDeclaration(options, aliased);
|
|
213
|
+
return reference === undefined ? { kind: "unresolved" } : { kind: "resolved", reference };
|
|
214
|
+
}
|
|
215
|
+
async function referenceFromRuntimeImportSpecifier(options, declaration) {
|
|
216
|
+
const importDeclaration = declaration.parent.parent.parent;
|
|
217
|
+
const source = importDeclaration.moduleSpecifier;
|
|
218
|
+
if (!ts.isStringLiteral(source) || !source.text.startsWith(".")) {
|
|
219
|
+
return { kind: "unresolved" };
|
|
220
|
+
}
|
|
221
|
+
const file = await options.fileSystem.resolveSourceFile(dirname(options.pageFile), source.text);
|
|
222
|
+
if (file === undefined) {
|
|
223
|
+
return { kind: "unresolved" };
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
kind: "resolved",
|
|
227
|
+
reference: {
|
|
228
|
+
exportName: declaration.propertyName?.text ?? declaration.name.text,
|
|
229
|
+
inferred: !(await options.fileSystem.isUseServerFile(file)),
|
|
230
|
+
moduleId: moduleIdForFile(options.appDir, file),
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async function referenceFromRuntimeSymbolDeclaration(options, symbol) {
|
|
235
|
+
const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];
|
|
236
|
+
if (declaration === undefined) {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
const file = declaration.getSourceFile().fileName;
|
|
240
|
+
if (file === options.pageFile || !isInsideAppDir(options.appDir, file)) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
exportName: symbol.getName(),
|
|
245
|
+
inferred: !(await options.fileSystem.isUseServerFile(file)),
|
|
246
|
+
moduleId: moduleIdForFile(options.appDir, file),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function resolveBuildActionExpression(options) {
|
|
250
|
+
const expression = unwrapExpression(options.expression);
|
|
251
|
+
if (options.seen.has(expression)) {
|
|
252
|
+
return { kind: "unresolved" };
|
|
253
|
+
}
|
|
254
|
+
options.seen.add(expression);
|
|
255
|
+
if (ts.isIdentifier(expression)) {
|
|
256
|
+
return resolveBuildIdentifier({ ...options, expression });
|
|
257
|
+
}
|
|
258
|
+
if (ts.isPropertyAccessExpression(expression)) {
|
|
259
|
+
return resolveBuildPropertyAccess({ ...options, expression });
|
|
260
|
+
}
|
|
261
|
+
if (ts.isConditionalExpression(expression)) {
|
|
262
|
+
return { kind: "dynamic" };
|
|
263
|
+
}
|
|
264
|
+
return { kind: "unresolved" };
|
|
265
|
+
}
|
|
266
|
+
function resolveBuildIdentifier(options) {
|
|
267
|
+
const symbol = options.checker.getSymbolAtLocation(options.expression);
|
|
268
|
+
if (symbol === undefined) {
|
|
269
|
+
return { kind: "unresolved" };
|
|
270
|
+
}
|
|
271
|
+
for (const declaration of symbol.declarations ?? []) {
|
|
272
|
+
if (ts.isImportSpecifier(declaration)) {
|
|
273
|
+
return referenceFromBuildImportSpecifier(options, declaration);
|
|
274
|
+
}
|
|
275
|
+
if (ts.isVariableDeclaration(declaration)) {
|
|
276
|
+
if (declaration.initializer === undefined) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
return resolveBuildActionExpression({
|
|
280
|
+
...options,
|
|
281
|
+
expression: declaration.initializer,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { kind: "unresolved" };
|
|
286
|
+
}
|
|
287
|
+
function resolveBuildPropertyAccess(options) {
|
|
288
|
+
const object = unwrapExpression(options.expression.expression);
|
|
289
|
+
if (!ts.isIdentifier(object)) {
|
|
290
|
+
return { kind: "unresolved" };
|
|
291
|
+
}
|
|
292
|
+
const symbol = options.checker.getSymbolAtLocation(object);
|
|
293
|
+
for (const declaration of symbol?.declarations ?? []) {
|
|
294
|
+
if (!ts.isVariableDeclaration(declaration) || declaration.initializer === undefined) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
const initializer = unwrapExpression(declaration.initializer);
|
|
298
|
+
if (!ts.isObjectLiteralExpression(initializer)) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
const property = initializer.properties.find((candidate) => objectLiteralPropertyName(candidate) === options.expression.name.text);
|
|
302
|
+
if (property === undefined) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
if (ts.isShorthandPropertyAssignment(property)) {
|
|
306
|
+
return resolveBuildSymbol(options, options.checker.getShorthandAssignmentValueSymbol(property));
|
|
307
|
+
}
|
|
308
|
+
if (ts.isPropertyAssignment(property)) {
|
|
309
|
+
return resolveBuildActionExpression({
|
|
310
|
+
...options,
|
|
311
|
+
expression: property.initializer,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return { kind: "dynamic" };
|
|
315
|
+
}
|
|
316
|
+
return { kind: "unresolved" };
|
|
317
|
+
}
|
|
318
|
+
function resolveBuildSymbol(options, symbol) {
|
|
319
|
+
if (symbol === undefined) {
|
|
320
|
+
return { kind: "unresolved" };
|
|
321
|
+
}
|
|
322
|
+
for (const declaration of symbol.declarations ?? []) {
|
|
323
|
+
if (ts.isImportSpecifier(declaration)) {
|
|
324
|
+
return referenceFromBuildImportSpecifier(options, declaration);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return { kind: "unresolved" };
|
|
328
|
+
}
|
|
329
|
+
function referenceFromBuildImportSpecifier(options, declaration) {
|
|
330
|
+
const importDeclaration = declaration.parent.parent.parent;
|
|
331
|
+
const source = importDeclaration.moduleSpecifier;
|
|
332
|
+
if (!ts.isStringLiteral(source) || !source.text.startsWith(".")) {
|
|
333
|
+
return { kind: "unresolved" };
|
|
334
|
+
}
|
|
335
|
+
const localFile = options.resolveSourceImport(options.file, source.text);
|
|
336
|
+
if (localFile === undefined) {
|
|
337
|
+
return { kind: "unresolved" };
|
|
338
|
+
}
|
|
339
|
+
const sourceCode = options.files[localFile];
|
|
340
|
+
if (sourceCode === undefined) {
|
|
341
|
+
return { kind: "unresolved" };
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
kind: "resolved",
|
|
345
|
+
reference: {
|
|
346
|
+
exportName: declaration.propertyName?.text ?? declaration.name.text,
|
|
347
|
+
inferred: !hasUseServerDirectiveInSource({ code: sourceCode, filename: localFile }),
|
|
348
|
+
moduleId: moduleIdForBuildFile(localFile, options.relativeRoutesDir),
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function aliasTargetSymbol(checker, symbol) {
|
|
353
|
+
if ((symbol.flags & ts.SymbolFlags.Alias) === 0) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
return checker.getAliasedSymbol(symbol);
|
|
357
|
+
}
|
|
358
|
+
function findExpressionAt(sourceFile, reference) {
|
|
359
|
+
let found;
|
|
360
|
+
const visit = (node) => {
|
|
361
|
+
if (found !== undefined) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (ts.isExpression(node) &&
|
|
365
|
+
node.getStart(sourceFile) === reference.expressionStart &&
|
|
366
|
+
node.getEnd() === reference.expressionEnd) {
|
|
367
|
+
found = node;
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
ts.forEachChild(node, visit);
|
|
371
|
+
};
|
|
372
|
+
visit(sourceFile);
|
|
373
|
+
return found;
|
|
374
|
+
}
|
|
375
|
+
function objectLiteralPropertyName(property) {
|
|
376
|
+
if (ts.isShorthandPropertyAssignment(property) ||
|
|
377
|
+
ts.isPropertyAssignment(property) ||
|
|
378
|
+
ts.isMethodDeclaration(property)) {
|
|
379
|
+
return propertyNameText(property.name);
|
|
380
|
+
}
|
|
381
|
+
return undefined;
|
|
382
|
+
}
|
|
383
|
+
function propertyNameText(name) {
|
|
384
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
|
|
385
|
+
return name.text;
|
|
386
|
+
}
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
function unwrapExpression(expression) {
|
|
390
|
+
let current = expression;
|
|
391
|
+
while (ts.isParenthesizedExpression(current) ||
|
|
392
|
+
ts.isAsExpression(current) ||
|
|
393
|
+
ts.isSatisfiesExpression(current) ||
|
|
394
|
+
ts.isTypeAssertionExpression(current) ||
|
|
395
|
+
ts.isNonNullExpression(current)) {
|
|
396
|
+
current = current.expression;
|
|
397
|
+
}
|
|
398
|
+
return current;
|
|
399
|
+
}
|
|
400
|
+
function moduleIdForFile(appDir, file) {
|
|
401
|
+
return relative(appDir, file).split(sep).join("/");
|
|
402
|
+
}
|
|
403
|
+
function isInsideAppDir(appDir, file) {
|
|
404
|
+
const relativePath = relative(appDir, file);
|
|
405
|
+
return relativePath === "" || (!relativePath.startsWith("..") && !relativePath.startsWith("/"));
|
|
406
|
+
}
|
|
407
|
+
function moduleIdForBuildFile(file, relativeRoutesDir) {
|
|
408
|
+
return relativeRoutesDir === "" ? file : file.slice(relativeRoutesDir.length + 1);
|
|
409
|
+
}
|
|
410
|
+
function createBuildProgram(file, files, source) {
|
|
411
|
+
const compilerOptions = defaultCompilerOptions();
|
|
412
|
+
const defaultHost = ts.createCompilerHost(compilerOptions, true);
|
|
413
|
+
const host = {
|
|
414
|
+
...defaultHost,
|
|
415
|
+
fileExists: (filename) => filename === file || files[filename] !== undefined,
|
|
416
|
+
getSourceFile: (filename, languageVersion) => {
|
|
417
|
+
const fileSource = filename === file ? source : files[filename];
|
|
418
|
+
if (fileSource !== undefined) {
|
|
419
|
+
return ts.createSourceFile(filename, fileSource, languageVersion, true);
|
|
420
|
+
}
|
|
421
|
+
return defaultHost.getSourceFile(filename, languageVersion);
|
|
422
|
+
},
|
|
423
|
+
readFile: (filename) => (filename === file ? source : files[filename]),
|
|
424
|
+
};
|
|
425
|
+
return ts.createProgram({
|
|
426
|
+
host,
|
|
427
|
+
options: compilerOptions,
|
|
428
|
+
rootNames: [file],
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
function createRuntimeProgramHost(options) {
|
|
432
|
+
const defaultHost = ts.createCompilerHost(options.compilerOptions, true);
|
|
433
|
+
return {
|
|
434
|
+
...defaultHost,
|
|
435
|
+
fileExists: (filename) => filename === options.pageFile || defaultHost.fileExists(filename),
|
|
436
|
+
getSourceFile: (filename, languageVersion) => {
|
|
437
|
+
if (filename === options.pageFile) {
|
|
438
|
+
return ts.createSourceFile(filename, options.code, languageVersion, true);
|
|
439
|
+
}
|
|
440
|
+
return defaultHost.getSourceFile(filename, languageVersion);
|
|
441
|
+
},
|
|
442
|
+
readFile: (filename) => filename === options.pageFile ? options.code : defaultHost.readFile(filename),
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
function defaultCompilerOptions() {
|
|
446
|
+
return {
|
|
447
|
+
allowJs: true,
|
|
448
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
449
|
+
module: ts.ModuleKind.NodeNext,
|
|
450
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
451
|
+
noEmit: true,
|
|
452
|
+
target: ts.ScriptTarget.ES2022,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
async function loadTypeScript() {
|
|
456
|
+
if (typescriptLoaded) {
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
ts = await import("typescript");
|
|
460
|
+
typescriptLoaded = true;
|
|
461
|
+
}
|
|
462
|
+
export function __readServerActionInferenceTypeScriptLoadedForTests() {
|
|
463
|
+
return typescriptLoaded;
|
|
464
|
+
}
|
|
465
|
+
export function __resetServerActionInferenceTypeScriptForTests() {
|
|
466
|
+
ts = undefined;
|
|
467
|
+
typescriptLoaded = false;
|
|
468
|
+
}
|
|
469
|
+
function formActionOccurrenceKey(reference) {
|
|
470
|
+
return [
|
|
471
|
+
reference.start,
|
|
472
|
+
reference.end,
|
|
473
|
+
reference.expressionStart,
|
|
474
|
+
reference.expressionEnd,
|
|
475
|
+
reference.expression,
|
|
476
|
+
].join(":");
|
|
477
|
+
}
|
|
478
|
+
function formActionSourceHash(code) {
|
|
479
|
+
return createHash("sha256").update(code).digest("base64url");
|
|
480
|
+
}
|
|
481
|
+
export function hasUseServerDirectiveInSource(input) {
|
|
482
|
+
return hasModuleDirective({
|
|
483
|
+
code: input.code,
|
|
484
|
+
directive: "use server",
|
|
485
|
+
filename: input.filename,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=server-action-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-action-inference.js","sourceRoot":"","sources":["../src/server-action-inference.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { dirname, relative, sep } from \"node:path\";\nimport {\n collectFormActionExpressionReferences,\n hasModuleDirective,\n type FormActionExpressionReference,\n} from \"@reckona/mreact-compiler\";\nimport type * as Ts from \"typescript\";\n\nlet ts = undefined as unknown as typeof Ts;\nlet typescriptLoaded = false;\n\nexport interface InferredServerActionReference {\n exportName: string;\n inferred: boolean;\n moduleId: string;\n}\n\nexport interface InferredServerActionExpressionReference\n extends InferredServerActionReference {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n sourceHash: string;\n start: number;\n}\n\nexport interface ServerActionInferenceDiagnostic {\n code: typeof dynamicFormActionInferenceCode;\n filename: string;\n level: \"warn\";\n message: string;\n}\n\nexport interface RuntimeServerActionInferenceFileSystem {\n isUseServerFile(file: string): Promise<boolean>;\n resolveSourceFile(directory: string, source: string): Promise<string | undefined>;\n}\n\nexport const dynamicFormActionInferenceCode =\n \"MR_SERVER_ACTION_INFERENCE_DYNAMIC_FORM_ACTION\";\n\nconst dynamicFormActionInferenceMessage =\n \"mreact could not infer a single server action from this form action expression. Pass the action function directly or use an explicit escape hatch.\";\n\nexport async function collectRuntimeInferredServerActions(options: {\n appDir: string;\n code: string;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n}): Promise<{\n diagnostics: ServerActionInferenceDiagnostic[];\n references: Map<string, InferredServerActionReference>;\n}> {\n const formReferences = collectFormActionExpressionReferences({\n code: options.code,\n filename: options.pageFile,\n });\n\n if (formReferences.length === 0) {\n return { diagnostics: [], references: new Map() };\n }\n\n await loadTypeScript();\n const program = ts.createProgram({\n host: createRuntimeProgramHost({\n code: options.code,\n compilerOptions: defaultCompilerOptions(),\n pageFile: options.pageFile,\n }),\n options: {\n allowJs: true,\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n noEmit: true,\n target: ts.ScriptTarget.ES2022,\n },\n rootNames: [options.pageFile],\n });\n const checker = program.getTypeChecker();\n const sourceFile = program.getSourceFile(options.pageFile);\n\n if (sourceFile === undefined) {\n return { diagnostics: [], references: new Map() };\n }\n\n const diagnostics: ServerActionInferenceDiagnostic[] = [];\n const references = new Map<string, InferredServerActionReference>();\n\n for (const formReference of formReferences) {\n const expression = findExpressionAt(sourceFile, formReference);\n\n if (expression === undefined) {\n continue;\n }\n\n const resolved = await resolveRuntimeActionExpression({\n appDir: options.appDir,\n checker,\n expression,\n fileSystem: options.fileSystem,\n pageFile: options.pageFile,\n seen: new Set(),\n });\n\n if (resolved.kind === \"resolved\") {\n references.set(formActionOccurrenceKey(formReference), resolved.reference);\n continue;\n }\n\n if (resolved.kind === \"dynamic\") {\n diagnostics.push({\n code: dynamicFormActionInferenceCode,\n filename: options.pageFile,\n level: \"warn\",\n message: dynamicFormActionInferenceMessage,\n });\n }\n }\n\n return { diagnostics, references };\n}\n\nexport async function collectBuildInferredServerActions(options: {\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n source: string;\n}): Promise<{\n diagnostics: ServerActionInferenceDiagnostic[];\n references: InferredServerActionExpressionReference[];\n}> {\n const formReferences = collectFormActionExpressionReferences({\n code: options.source,\n filename: options.file,\n });\n\n if (formReferences.length === 0) {\n return { diagnostics: [], references: [] };\n }\n\n await loadTypeScript();\n const program = createBuildProgram(options.file, options.files, options.source);\n const checker = program.getTypeChecker();\n const sourceFile = program.getSourceFile(options.file);\n\n if (sourceFile === undefined) {\n return { diagnostics: [], references: [] };\n }\n\n const diagnostics: ServerActionInferenceDiagnostic[] = [];\n const references: InferredServerActionExpressionReference[] = [];\n const sourceHash = formActionSourceHash(options.source);\n\n for (const formReference of formReferences) {\n const expression = findExpressionAt(sourceFile, formReference);\n\n if (expression === undefined) {\n continue;\n }\n\n const resolved = resolveBuildActionExpression({\n checker,\n expression,\n file: options.file,\n files: options.files,\n relativeRoutesDir: options.relativeRoutesDir,\n resolveSourceImport: options.resolveSourceImport,\n seen: new Set(),\n });\n\n if (resolved.kind === \"resolved\") {\n references.push({\n ...resolved.reference,\n end: formReference.end,\n expression: formReference.expression,\n expressionEnd: formReference.expressionEnd,\n expressionStart: formReference.expressionStart,\n sourceHash,\n start: formReference.start,\n });\n continue;\n }\n\n if (resolved.kind === \"dynamic\") {\n diagnostics.push({\n code: dynamicFormActionInferenceCode,\n filename: options.file,\n level: \"warn\",\n message: dynamicFormActionInferenceMessage,\n });\n }\n }\n\n return { diagnostics, references };\n}\n\ntype RuntimeResolveResult =\n | { kind: \"dynamic\" }\n | { kind: \"resolved\"; reference: InferredServerActionReference }\n | { kind: \"unresolved\" };\n\ntype BuildResolveResult =\n | { kind: \"dynamic\" }\n | { kind: \"resolved\"; reference: InferredServerActionReference }\n | { kind: \"unresolved\" };\n\nasync function resolveRuntimeActionExpression(options: {\n appDir: string;\n checker: Ts.TypeChecker;\n expression: Ts.Expression;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n seen: Set<Ts.Node>;\n}): Promise<RuntimeResolveResult> {\n const expression = unwrapExpression(options.expression);\n\n if (options.seen.has(expression)) {\n return { kind: \"unresolved\" };\n }\n\n options.seen.add(expression);\n\n if (ts.isIdentifier(expression)) {\n return await resolveRuntimeIdentifier({ ...options, expression });\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n return await resolveRuntimePropertyAccess({ ...options, expression });\n }\n\n if (ts.isConditionalExpression(expression)) {\n return { kind: \"dynamic\" };\n }\n\n return { kind: \"unresolved\" };\n}\n\nasync function resolveRuntimeIdentifier(options: {\n appDir: string;\n checker: Ts.TypeChecker;\n expression: Ts.Identifier;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n seen: Set<Ts.Node>;\n}): Promise<RuntimeResolveResult> {\n const symbol = options.checker.getSymbolAtLocation(options.expression);\n\n if (symbol === undefined) {\n return { kind: \"unresolved\" };\n }\n\n for (const declaration of symbol.declarations ?? []) {\n if (ts.isImportSpecifier(declaration)) {\n return await referenceFromRuntimeImportSpecifier(options, declaration);\n }\n\n if (ts.isVariableDeclaration(declaration)) {\n if (declaration.initializer === undefined) {\n continue;\n }\n\n return await resolveRuntimeActionExpression({\n ...options,\n expression: declaration.initializer,\n });\n }\n }\n\n const aliased = aliasTargetSymbol(options.checker, symbol);\n\n if (aliased !== undefined) {\n const reference = await referenceFromRuntimeSymbolDeclaration(options, aliased);\n\n if (reference !== undefined) {\n return { kind: \"resolved\", reference };\n }\n }\n\n return { kind: \"unresolved\" };\n}\n\nasync function resolveRuntimePropertyAccess(options: {\n appDir: string;\n checker: Ts.TypeChecker;\n expression: Ts.PropertyAccessExpression;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n seen: Set<Ts.Node>;\n}): Promise<RuntimeResolveResult> {\n const object = unwrapExpression(options.expression.expression);\n\n if (!ts.isIdentifier(object)) {\n return { kind: \"unresolved\" };\n }\n\n const symbol = options.checker.getSymbolAtLocation(object);\n\n for (const declaration of symbol?.declarations ?? []) {\n if (!ts.isVariableDeclaration(declaration) || declaration.initializer === undefined) {\n continue;\n }\n\n const initializer = unwrapExpression(declaration.initializer);\n\n if (!ts.isObjectLiteralExpression(initializer)) {\n continue;\n }\n\n const property = initializer.properties.find((candidate) =>\n objectLiteralPropertyName(candidate) === options.expression.name.text,\n );\n\n if (property === undefined) {\n continue;\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n return await resolveRuntimeSymbol(\n options,\n options.checker.getShorthandAssignmentValueSymbol(property),\n );\n }\n\n if (ts.isPropertyAssignment(property)) {\n return await resolveRuntimeActionExpression({\n ...options,\n expression: property.initializer,\n });\n }\n\n return { kind: \"dynamic\" };\n }\n\n return { kind: \"unresolved\" };\n}\n\nasync function resolveRuntimeSymbol(\n options: {\n appDir: string;\n checker: Ts.TypeChecker;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n },\n symbol: Ts.Symbol | undefined,\n): Promise<RuntimeResolveResult> {\n if (symbol === undefined) {\n return { kind: \"unresolved\" };\n }\n\n for (const declaration of symbol.declarations ?? []) {\n if (ts.isImportSpecifier(declaration)) {\n return await referenceFromRuntimeImportSpecifier(options, declaration);\n }\n }\n\n const aliased = aliasTargetSymbol(options.checker, symbol);\n\n if (aliased === undefined) {\n return { kind: \"unresolved\" };\n }\n\n const reference = await referenceFromRuntimeSymbolDeclaration(options, aliased);\n\n return reference === undefined ? { kind: \"unresolved\" } : { kind: \"resolved\", reference };\n}\n\nasync function referenceFromRuntimeImportSpecifier(\n options: {\n appDir: string;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n },\n declaration: Ts.ImportSpecifier,\n): Promise<RuntimeResolveResult> {\n const importDeclaration = declaration.parent.parent.parent;\n const source = importDeclaration.moduleSpecifier;\n\n if (!ts.isStringLiteral(source) || !source.text.startsWith(\".\")) {\n return { kind: \"unresolved\" };\n }\n\n const file = await options.fileSystem.resolveSourceFile(dirname(options.pageFile), source.text);\n\n if (file === undefined) {\n return { kind: \"unresolved\" };\n }\n\n return {\n kind: \"resolved\",\n reference: {\n exportName: declaration.propertyName?.text ?? declaration.name.text,\n inferred: !(await options.fileSystem.isUseServerFile(file)),\n moduleId: moduleIdForFile(options.appDir, file),\n },\n };\n}\n\nasync function referenceFromRuntimeSymbolDeclaration(\n options: {\n appDir: string;\n fileSystem: RuntimeServerActionInferenceFileSystem;\n pageFile: string;\n },\n symbol: Ts.Symbol,\n): Promise<InferredServerActionReference | undefined> {\n const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];\n\n if (declaration === undefined) {\n return undefined;\n }\n\n const file = declaration.getSourceFile().fileName;\n\n if (file === options.pageFile || !isInsideAppDir(options.appDir, file)) {\n return undefined;\n }\n\n return {\n exportName: symbol.getName(),\n inferred: !(await options.fileSystem.isUseServerFile(file)),\n moduleId: moduleIdForFile(options.appDir, file),\n };\n}\n\nfunction resolveBuildActionExpression(options: {\n checker: Ts.TypeChecker;\n expression: Ts.Expression;\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n seen: Set<Ts.Node>;\n}): BuildResolveResult {\n const expression = unwrapExpression(options.expression);\n\n if (options.seen.has(expression)) {\n return { kind: \"unresolved\" };\n }\n\n options.seen.add(expression);\n\n if (ts.isIdentifier(expression)) {\n return resolveBuildIdentifier({ ...options, expression });\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n return resolveBuildPropertyAccess({ ...options, expression });\n }\n\n if (ts.isConditionalExpression(expression)) {\n return { kind: \"dynamic\" };\n }\n\n return { kind: \"unresolved\" };\n}\n\nfunction resolveBuildIdentifier(options: {\n checker: Ts.TypeChecker;\n expression: Ts.Identifier;\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n seen: Set<Ts.Node>;\n}): BuildResolveResult {\n const symbol = options.checker.getSymbolAtLocation(options.expression);\n\n if (symbol === undefined) {\n return { kind: \"unresolved\" };\n }\n\n for (const declaration of symbol.declarations ?? []) {\n if (ts.isImportSpecifier(declaration)) {\n return referenceFromBuildImportSpecifier(options, declaration);\n }\n\n if (ts.isVariableDeclaration(declaration)) {\n if (declaration.initializer === undefined) {\n continue;\n }\n\n return resolveBuildActionExpression({\n ...options,\n expression: declaration.initializer,\n });\n }\n }\n\n return { kind: \"unresolved\" };\n}\n\nfunction resolveBuildPropertyAccess(options: {\n checker: Ts.TypeChecker;\n expression: Ts.PropertyAccessExpression;\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n seen: Set<Ts.Node>;\n}): BuildResolveResult {\n const object = unwrapExpression(options.expression.expression);\n\n if (!ts.isIdentifier(object)) {\n return { kind: \"unresolved\" };\n }\n\n const symbol = options.checker.getSymbolAtLocation(object);\n\n for (const declaration of symbol?.declarations ?? []) {\n if (!ts.isVariableDeclaration(declaration) || declaration.initializer === undefined) {\n continue;\n }\n\n const initializer = unwrapExpression(declaration.initializer);\n\n if (!ts.isObjectLiteralExpression(initializer)) {\n continue;\n }\n\n const property = initializer.properties.find((candidate) =>\n objectLiteralPropertyName(candidate) === options.expression.name.text,\n );\n\n if (property === undefined) {\n continue;\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n return resolveBuildSymbol(options, options.checker.getShorthandAssignmentValueSymbol(property));\n }\n\n if (ts.isPropertyAssignment(property)) {\n return resolveBuildActionExpression({\n ...options,\n expression: property.initializer,\n });\n }\n\n return { kind: \"dynamic\" };\n }\n\n return { kind: \"unresolved\" };\n}\n\nfunction resolveBuildSymbol(\n options: {\n checker: Ts.TypeChecker;\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n },\n symbol: Ts.Symbol | undefined,\n): BuildResolveResult {\n if (symbol === undefined) {\n return { kind: \"unresolved\" };\n }\n\n for (const declaration of symbol.declarations ?? []) {\n if (ts.isImportSpecifier(declaration)) {\n return referenceFromBuildImportSpecifier(options, declaration);\n }\n }\n\n return { kind: \"unresolved\" };\n}\n\nfunction referenceFromBuildImportSpecifier(\n options: {\n file: string;\n files: Record<string, string>;\n relativeRoutesDir: string;\n resolveSourceImport: (importer: string, source: string) => string | undefined;\n },\n declaration: Ts.ImportSpecifier,\n): BuildResolveResult {\n const importDeclaration = declaration.parent.parent.parent;\n const source = importDeclaration.moduleSpecifier;\n\n if (!ts.isStringLiteral(source) || !source.text.startsWith(\".\")) {\n return { kind: \"unresolved\" };\n }\n\n const localFile = options.resolveSourceImport(options.file, source.text);\n\n if (localFile === undefined) {\n return { kind: \"unresolved\" };\n }\n\n const sourceCode = options.files[localFile];\n\n if (sourceCode === undefined) {\n return { kind: \"unresolved\" };\n }\n\n return {\n kind: \"resolved\",\n reference: {\n exportName: declaration.propertyName?.text ?? declaration.name.text,\n inferred: !hasUseServerDirectiveInSource({ code: sourceCode, filename: localFile }),\n moduleId: moduleIdForBuildFile(localFile, options.relativeRoutesDir),\n },\n };\n}\n\nfunction aliasTargetSymbol(checker: Ts.TypeChecker, symbol: Ts.Symbol): Ts.Symbol | undefined {\n if ((symbol.flags & ts.SymbolFlags.Alias) === 0) {\n return undefined;\n }\n\n return checker.getAliasedSymbol(symbol);\n}\n\nfunction findExpressionAt(\n sourceFile: Ts.SourceFile,\n reference: FormActionExpressionReference,\n): Ts.Expression | undefined {\n let found: Ts.Expression | undefined;\n\n const visit = (node: Ts.Node): void => {\n if (found !== undefined) {\n return;\n }\n\n if (\n ts.isExpression(node) &&\n node.getStart(sourceFile) === reference.expressionStart &&\n node.getEnd() === reference.expressionEnd\n ) {\n found = node;\n return;\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return found;\n}\n\nfunction objectLiteralPropertyName(property: Ts.ObjectLiteralElementLike): string | undefined {\n if (\n ts.isShorthandPropertyAssignment(property) ||\n ts.isPropertyAssignment(property) ||\n ts.isMethodDeclaration(property)\n ) {\n return propertyNameText(property.name);\n }\n\n return undefined;\n}\n\nfunction propertyNameText(name: Ts.PropertyName): string | undefined {\n if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n\n return undefined;\n}\n\nfunction unwrapExpression(expression: Ts.Expression): Ts.Expression {\n let current = expression;\n\n while (\n ts.isParenthesizedExpression(current) ||\n ts.isAsExpression(current) ||\n ts.isSatisfiesExpression(current) ||\n ts.isTypeAssertionExpression(current) ||\n ts.isNonNullExpression(current)\n ) {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction moduleIdForFile(appDir: string, file: string): string {\n return relative(appDir, file).split(sep).join(\"/\");\n}\n\nfunction isInsideAppDir(appDir: string, file: string): boolean {\n const relativePath = relative(appDir, file);\n\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !relativePath.startsWith(\"/\"));\n}\n\nfunction moduleIdForBuildFile(file: string, relativeRoutesDir: string): string {\n return relativeRoutesDir === \"\" ? file : file.slice(relativeRoutesDir.length + 1);\n}\n\nfunction createBuildProgram(\n file: string,\n files: Record<string, string>,\n source: string,\n): Ts.Program {\n const compilerOptions = defaultCompilerOptions();\n const defaultHost = ts.createCompilerHost(compilerOptions, true);\n const host: Ts.CompilerHost = {\n ...defaultHost,\n fileExists: (filename) => filename === file || files[filename] !== undefined,\n getSourceFile: (filename, languageVersion) => {\n const fileSource = filename === file ? source : files[filename];\n\n if (fileSource !== undefined) {\n return ts.createSourceFile(filename, fileSource, languageVersion, true);\n }\n\n return defaultHost.getSourceFile(filename, languageVersion);\n },\n readFile: (filename) => (filename === file ? source : files[filename]),\n };\n\n return ts.createProgram({\n host,\n options: compilerOptions,\n rootNames: [file],\n });\n}\n\nfunction createRuntimeProgramHost(options: {\n code: string;\n compilerOptions: Ts.CompilerOptions;\n pageFile: string;\n}): Ts.CompilerHost {\n const defaultHost = ts.createCompilerHost(options.compilerOptions, true);\n\n return {\n ...defaultHost,\n fileExists: (filename) => filename === options.pageFile || defaultHost.fileExists(filename),\n getSourceFile: (filename, languageVersion) => {\n if (filename === options.pageFile) {\n return ts.createSourceFile(filename, options.code, languageVersion, true);\n }\n\n return defaultHost.getSourceFile(filename, languageVersion);\n },\n readFile: (filename) =>\n filename === options.pageFile ? options.code : defaultHost.readFile(filename),\n };\n}\n\nfunction defaultCompilerOptions(): Ts.CompilerOptions {\n return {\n allowJs: true,\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n noEmit: true,\n target: ts.ScriptTarget.ES2022,\n };\n}\n\nasync function loadTypeScript(): Promise<void> {\n if (typescriptLoaded) {\n return;\n }\n\n ts = await import(\"typescript\");\n typescriptLoaded = true;\n}\n\nexport function __readServerActionInferenceTypeScriptLoadedForTests(): boolean {\n return typescriptLoaded;\n}\n\nexport function __resetServerActionInferenceTypeScriptForTests(): void {\n ts = undefined as unknown as typeof Ts;\n typescriptLoaded = false;\n}\n\nfunction formActionOccurrenceKey(reference: {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n start: number;\n}): string {\n return [\n reference.start,\n reference.end,\n reference.expressionStart,\n reference.expressionEnd,\n reference.expression,\n ].join(\":\");\n}\n\nfunction formActionSourceHash(code: string): string {\n return createHash(\"sha256\").update(code).digest(\"base64url\");\n}\n\nexport function hasUseServerDirectiveInSource(input: {\n code: string;\n filename: string;\n}): boolean {\n return hasModuleDirective({\n code: input.code,\n directive: \"use server\",\n filename: input.filename,\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reckona/mreact-router",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.74",
|
|
4
4
|
"description": "File-system app router, SSR, actions, and deployment adapters for mreact.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jsx",
|
|
@@ -104,20 +104,21 @@
|
|
|
104
104
|
"access": "public"
|
|
105
105
|
},
|
|
106
106
|
"dependencies": {
|
|
107
|
-
"
|
|
108
|
-
"@reckona/mreact
|
|
109
|
-
"@reckona/mreact-
|
|
110
|
-
"@reckona/mreact-devtools": "0.0.
|
|
111
|
-
"@reckona/mreact-query": "0.0.
|
|
112
|
-
"@reckona/mreact-
|
|
113
|
-
"@reckona/mreact-
|
|
114
|
-
"@reckona/mreact-
|
|
115
|
-
"@reckona/mreact-
|
|
107
|
+
"typescript": "^6.0.3",
|
|
108
|
+
"@reckona/mreact": "0.0.74",
|
|
109
|
+
"@reckona/mreact-compat": "0.0.74",
|
|
110
|
+
"@reckona/mreact-devtools": "0.0.74",
|
|
111
|
+
"@reckona/mreact-query": "0.0.74",
|
|
112
|
+
"@reckona/mreact-compiler": "0.0.74",
|
|
113
|
+
"@reckona/mreact-reactive-core": "0.0.74",
|
|
114
|
+
"@reckona/mreact-reactive-dom": "0.0.74",
|
|
115
|
+
"@reckona/mreact-server": "0.0.74",
|
|
116
|
+
"@reckona/mreact-shared": "0.0.74"
|
|
116
117
|
},
|
|
117
118
|
"peerDependencies": {
|
|
118
119
|
"vite": ">=8 <9"
|
|
119
120
|
},
|
|
120
121
|
"optionalDependencies": {
|
|
121
|
-
"@reckona/mreact-router-native": "0.0.
|
|
122
|
+
"@reckona/mreact-router-native": "0.0.74"
|
|
122
123
|
}
|
|
123
124
|
}
|