@velarscript/node 0.11.1 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -14
- package/dist/compiler.d.ts +3 -0
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +300 -76
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/node-host-runtime.d.ts.map +1 -1
- package/dist/node-host-runtime.js +30 -14
- package/dist/node-host-runtime.js.map +1 -1
- package/dist/node-host-worker-runtime.d.ts.map +1 -1
- package/dist/node-host-worker-runtime.js +495 -93
- package/dist/node-host-worker-runtime.js.map +1 -1
- package/dist/project-config.d.ts +17 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +66 -0
- package/dist/project-config.js.map +1 -0
- package/dist/serve-runtime.d.ts.map +1 -1
- package/dist/serve-runtime.js +2942 -158
- package/dist/serve-runtime.js.map +1 -1
- package/dist/server-analyzer.d.ts +35 -0
- package/dist/server-analyzer.d.ts.map +1 -0
- package/dist/server-analyzer.js +692 -0
- package/dist/server-analyzer.js.map +1 -0
- package/dist/server-ast.d.ts +54 -0
- package/dist/server-ast.d.ts.map +1 -0
- package/dist/server-ast.js +16 -0
- package/dist/server-ast.js.map +1 -0
- package/dist/server-emitter.d.ts +17 -0
- package/dist/server-emitter.d.ts.map +1 -0
- package/dist/server-emitter.js +177 -0
- package/dist/server-emitter.js.map +1 -0
- package/dist/server-inspection.d.ts +3 -0
- package/dist/server-inspection.d.ts.map +1 -0
- package/dist/server-inspection.js +12 -0
- package/dist/server-inspection.js.map +1 -0
- package/dist/server-lexer.d.ts +13 -0
- package/dist/server-lexer.d.ts.map +1 -0
- package/dist/server-lexer.js +65 -0
- package/dist/server-lexer.js.map +1 -0
- package/dist/server-parser.d.ts +18 -0
- package/dist/server-parser.d.ts.map +1 -0
- package/dist/server-parser.js +232 -0
- package/dist/server-parser.js.map +1 -0
- package/dist/server-semantic.d.ts +3 -0
- package/dist/server-semantic.d.ts.map +1 -0
- package/dist/server-semantic.js +31 -0
- package/dist/server-semantic.js.map +1 -0
- package/dist/server-types.d.ts +25 -0
- package/dist/server-types.d.ts.map +1 -0
- package/dist/server-types.js +60 -0
- package/dist/server-types.js.map +1 -0
- package/dist/websocket-runtime.d.ts.map +1 -1
- package/dist/websocket-runtime.js +169 -15
- package/dist/websocket-runtime.js.map +1 -1
- package/package.json +10 -2
- package/dist/sqlite-runtime.d.ts +0 -3
- package/dist/sqlite-runtime.d.ts.map +0 -1
- package/dist/sqlite-runtime.js +0 -92
- package/dist/sqlite-runtime.js.map +0 -1
package/dist/compiler.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { optionalOf as optional } from "@velarscript/compiler";
|
|
2
|
-
import { VELAR_ERROR_NORMALIZATION_MODULE, VELAR_STRICT_JSON_RUNTIME, VELAR_TYPE_REGISTRY_RUNTIME, VELAR_UTF8_RUNTIME } from "@velarscript/compiler/extension";
|
|
2
|
+
import { VELAR_ERROR_NORMALIZATION_MODULE, VELAR_COLLECTION_LOWERING_MODULE, VELAR_STRICT_JSON_RUNTIME, VELAR_TYPE_REGISTRY_RUNTIME, VELAR_UTF8_RUNTIME, } from "@velarscript/compiler/extension";
|
|
3
3
|
import { VELAR_NODE_ENV_RUNTIME } from "./environment-runtime.js";
|
|
4
4
|
import { VELAR_NODE_FILESYSTEM_RUNTIME } from "./filesystem-runtime.js";
|
|
5
5
|
import { VELAR_NODE_HTTP_RUNTIME } from "./http-runtime.js";
|
|
@@ -13,7 +13,14 @@ import { VELAR_NODE_TERMINAL_RUNTIME } from "./terminal-runtime.js";
|
|
|
13
13
|
import { VELAR_NODE_TERMINAL_WORKER_SOURCE } from "./terminal-worker-runtime.js";
|
|
14
14
|
import { VELAR_NODE_WORKER_RUNTIME } from "./worker-runtime.js";
|
|
15
15
|
import { VELAR_NODE_WEBSOCKET_RUNTIME } from "./websocket-runtime.js";
|
|
16
|
-
import {
|
|
16
|
+
import { NODE_STATEMENT_CONSTRUCTS, nodeServerStatementContainsDirectAwait, nodeStatementConstructKey } from "./server-ast.js";
|
|
17
|
+
import { inferNodeIntrinsic, VelarNodeAnalyzer } from "./server-analyzer.js";
|
|
18
|
+
import { NodeJavaScriptEmitter } from "./server-emitter.js";
|
|
19
|
+
import { velarNodeInspectionExtension } from "./server-inspection.js";
|
|
20
|
+
import { scanNodePathPatternForFormatting, scanNodeToken } from "./server-lexer.js";
|
|
21
|
+
import { VelarNodeParser } from "./server-parser.js";
|
|
22
|
+
import { velarNodeSemanticExtension } from "./server-semantic.js";
|
|
23
|
+
import { serveAppType, serveRequestType } from "./server-types.js";
|
|
17
24
|
export { VELAR_PROCESS_HOST_RUNTIME } from "./process-runtime.js";
|
|
18
25
|
export const VELAR_NODE_API_VERSION = "0.10";
|
|
19
26
|
export const VELAR_NODE_HOST_MODULE = "velar/node-host-v1";
|
|
@@ -24,8 +31,8 @@ const stringType = { kind: "string" };
|
|
|
24
31
|
const numberType = { kind: "number" };
|
|
25
32
|
const boolType = { kind: "bool" };
|
|
26
33
|
const bytesType = { kind: "named", name: "Bytes", identity: "velar/binary#type:Bytes" };
|
|
34
|
+
const cancellationType = { kind: "named", name: "Cancellation", identity: "velar/task#type:Cancellation" };
|
|
27
35
|
const listStringType = { kind: "list", element: stringType };
|
|
28
|
-
const listUnknownType = { kind: "list", element: unknownType };
|
|
29
36
|
const stringMapType = { kind: "map", key: stringType, value: stringType };
|
|
30
37
|
function promise(value) {
|
|
31
38
|
return { kind: "promise", value };
|
|
@@ -47,13 +54,14 @@ function object(fields, optionalFields = []) {
|
|
|
47
54
|
...(optionalFields.length > 0 ? { optionalFields: new Set(optionalFields) } : {}),
|
|
48
55
|
};
|
|
49
56
|
}
|
|
50
|
-
function moduleInterface(exports, namedTypes = new Map(), namedTypeIdentities = new Map(), typeAliases = new Map(), classes = new Map(), enums = new Map()) {
|
|
57
|
+
function moduleInterface(exports, namedTypes = new Map(), namedTypeIdentities = new Map(), typeAliases = new Map(), classes = new Map(), enums = new Map(), namedTypeReadonlyFields = new Map()) {
|
|
51
58
|
return {
|
|
52
59
|
exports,
|
|
53
60
|
mutableExports: new Set(),
|
|
54
61
|
reactiveExports: new Map(),
|
|
55
62
|
reExports: new Map(),
|
|
56
63
|
namedTypes,
|
|
64
|
+
namedTypeReadonlyFields,
|
|
57
65
|
namedTypeIdentities,
|
|
58
66
|
typeAliases,
|
|
59
67
|
enums,
|
|
@@ -63,9 +71,9 @@ function moduleInterface(exports, namedTypes = new Map(), namedTypeIdentities =
|
|
|
63
71
|
extensionData: new Map(),
|
|
64
72
|
};
|
|
65
73
|
}
|
|
66
|
-
const serveRequestType = { kind: "named", name: "ServeRequest", identity: "velar/serve#type:ServeRequest" };
|
|
67
74
|
const serverType = { kind: "named", name: "Server", identity: "velar/serve#type:Server" };
|
|
68
75
|
const requestBodyTooLargeErrorIdentity = "velar/serve#class:RequestBodyTooLargeError";
|
|
76
|
+
const responseHeadersType = stringMapType;
|
|
69
77
|
const requestBodyTooLargeErrorClass = {
|
|
70
78
|
identity: requestBodyTooLargeErrorIdentity,
|
|
71
79
|
parameters: [],
|
|
@@ -81,14 +89,104 @@ const requestBodyTooLargeErrorClass = {
|
|
|
81
89
|
staticGetters: new Set(),
|
|
82
90
|
staticMethods: new Map(),
|
|
83
91
|
};
|
|
92
|
+
const serveHttpErrorIdentity = "velar/serve#class:HttpError";
|
|
93
|
+
const serveHttpErrorClass = {
|
|
94
|
+
identity: serveHttpErrorIdentity,
|
|
95
|
+
parameters: [numberType, anyType, optional(responseHeadersType)],
|
|
96
|
+
parameterNames: ["status", "body", "headers"],
|
|
97
|
+
requiredParameters: 1,
|
|
98
|
+
base: "Error",
|
|
99
|
+
abstract: false,
|
|
100
|
+
fields: new Map([
|
|
101
|
+
["status", { mutable: false, type: numberType }],
|
|
102
|
+
["body", { mutable: false, type: anyType }],
|
|
103
|
+
["headers", { mutable: false, type: responseHeadersType }],
|
|
104
|
+
]),
|
|
105
|
+
getters: new Set(), abstractGetters: new Set(), methods: new Map(), abstractMethods: new Set(),
|
|
106
|
+
staticFields: new Map(), staticGetters: new Set(), staticMethods: new Map(),
|
|
107
|
+
};
|
|
84
108
|
const writeChunkType = functionType(["chunk"], [stringType], promise(nullType));
|
|
85
109
|
const streamProducerType = functionType(["write"], [writeChunkType], promise(nullType));
|
|
86
|
-
const
|
|
110
|
+
const sseEventType = object({
|
|
111
|
+
data: stringType,
|
|
112
|
+
event: optional(stringType),
|
|
113
|
+
id: optional(stringType),
|
|
114
|
+
retry: optional(numberType),
|
|
115
|
+
}, ["event", "id", "retry"]);
|
|
116
|
+
const sseSendType = functionType(["event"], [{ kind: "union", members: [stringType, sseEventType] }], promise(nullType));
|
|
117
|
+
const sseProducerType = functionType(["send"], [sseSendType], promise(nullType));
|
|
87
118
|
const jsonResponseType = object({ status: numberType, json: anyType, headers: responseHeadersType }, ["headers"]);
|
|
88
119
|
const textResponseType = object({ status: numberType, text: stringType, contentType: stringType, headers: responseHeadersType }, ["contentType", "headers"]);
|
|
89
120
|
const streamResponseType = object({ status: numberType, stream: streamProducerType, headers: responseHeadersType }, ["headers"]);
|
|
90
121
|
const serveResponseAlias = { kind: "union", members: [jsonResponseType, textResponseType, streamResponseType] };
|
|
122
|
+
const openApiDocumentType = object({
|
|
123
|
+
openapi: stringType,
|
|
124
|
+
info: object({ title: stringType, version: stringType }),
|
|
125
|
+
paths: { kind: "record", value: anyType },
|
|
126
|
+
});
|
|
127
|
+
const routeDocumentationType = object({
|
|
128
|
+
summary: optional(stringType),
|
|
129
|
+
description: optional(stringType),
|
|
130
|
+
tags: optional(listStringType),
|
|
131
|
+
status: optional(numberType),
|
|
132
|
+
errors: optional({ kind: "map", key: numberType, value: stringType }),
|
|
133
|
+
documented: optional(boolType),
|
|
134
|
+
}, ["summary", "description", "tags", "status", "errors", "documented"]);
|
|
135
|
+
const routeDocumentationMapType = { kind: "map", key: stringType, value: routeDocumentationType };
|
|
91
136
|
const handlerType = functionType(["request"], [serveRequestType], promise(serveResponseAlias));
|
|
137
|
+
const serveTargetType = { kind: "union", members: [handlerType, serveAppType] };
|
|
138
|
+
const middlewareNextType = functionType([], [], promise(serveResponseAlias));
|
|
139
|
+
const middlewareType = functionType(["request", "next"], [serveRequestType, middlewareNextType], promise(serveResponseAlias));
|
|
140
|
+
const middlewareListType = { kind: "list", element: middlewareType };
|
|
141
|
+
const middlewareInputType = { kind: "union", members: [middlewareType, middlewareListType] };
|
|
142
|
+
const providerType = { kind: "extension", extensionId: "@velarscript/node", family: "serve-provider", role: "provider", properties: new Map(), requiredProperties: new Set(), arguments: [unknownType, unknownType], display: { kind: "named", name: "Provider" } };
|
|
143
|
+
const routeInputType = { kind: "extension", extensionId: "@velarscript/node", family: "serve-input", role: "query", properties: new Map(), requiredProperties: new Set(), arguments: [unknownType], display: { kind: "named", name: "RouteInput" } };
|
|
144
|
+
const uploadType = { kind: "named", name: "Upload", identity: "velar/serve#type:Upload" };
|
|
145
|
+
const stringOrNullType = { kind: "union", members: [stringType, nullType] };
|
|
146
|
+
const inputType = object({
|
|
147
|
+
query: namedIntrinsic("serve.input.query", ["name", "default"], [stringType, stringOrNullType], routeInputType, 0),
|
|
148
|
+
header: namedIntrinsic("serve.input.header", ["name", "default"], [stringType, stringOrNullType], routeInputType, 0),
|
|
149
|
+
cookie: namedIntrinsic("serve.input.cookie", ["name", "default"], [stringType, stringOrNullType], routeInputType, 0),
|
|
150
|
+
form: namedIntrinsic("serve.input.form", ["target"], [anyType], routeInputType),
|
|
151
|
+
upload: namedIntrinsic("serve.input.upload", ["name", "maxBytes"], [stringType, numberType], routeInputType, 0),
|
|
152
|
+
dependency: namedIntrinsic("serve.input.dependency", ["provider"], [unknownType], routeInputType),
|
|
153
|
+
request: namedIntrinsic("serve.input.request", [], [], routeInputType, 0),
|
|
154
|
+
});
|
|
155
|
+
const securityType = object({
|
|
156
|
+
apiKey: namedIntrinsic("serve.security.apiKey", ["name", "source"], [stringType, stringType], routeInputType, 1),
|
|
157
|
+
basic: namedIntrinsic("serve.security.basic", ["realm"], [stringType], routeInputType, 0),
|
|
158
|
+
bearer: namedIntrinsic("serve.security.bearer", ["scheme"], [stringType], routeInputType, 0),
|
|
159
|
+
oauth2: namedIntrinsic("serve.security.oauth2", ["authorizationUrl", "tokenUrl", "scopes"], [stringType, stringType, listStringType], routeInputType, 1),
|
|
160
|
+
openId: namedIntrinsic("serve.security.openId", ["url"], [stringType], routeInputType),
|
|
161
|
+
});
|
|
162
|
+
const releaseProviderType = functionType(["value"], [unknownType], unknownType);
|
|
163
|
+
const errorHandlerType = functionType(["error", "request"], [anyType, serveRequestType], promise(serveResponseAlias));
|
|
164
|
+
const accessLoggerType = functionType(["entry"], [object({ method: stringType, path: stringType, status: numberType, durationMs: numberType })], unknownType);
|
|
165
|
+
const middlewareFactoriesType = object({
|
|
166
|
+
cors: functionType(["origins", "methods", "headers", "credentials", "maxAge"], [listStringType, listStringType, listStringType, boolType, numberType], middlewareType, 0),
|
|
167
|
+
trustedHosts: functionType(["hosts"], [listStringType], middlewareType),
|
|
168
|
+
requestId: functionType(["header"], [stringType], middlewareType, 0),
|
|
169
|
+
accessLog: functionType(["write"], [accessLoggerType], middlewareType),
|
|
170
|
+
securityHeaders: functionType([], [], middlewareType),
|
|
171
|
+
compression: functionType(["minimumBytes"], [numberType], middlewareType, 0),
|
|
172
|
+
errors: functionType(["handle"], [errorHandlerType], middlewareType),
|
|
173
|
+
timeout: functionType(["milliseconds"], [numberType], middlewareType),
|
|
174
|
+
concurrency: functionType(["maximum"], [numberType], middlewareType),
|
|
175
|
+
});
|
|
176
|
+
const lifecycleHookType = functionType([], [], unknownType);
|
|
177
|
+
const backgroundTaskType = functionType([], [], unknownType);
|
|
178
|
+
const testResponseType = { kind: "named", name: "TestResponse", identity: "velar/server-test#type:TestResponse" };
|
|
179
|
+
const testClientType = { kind: "named", name: "TestClient", identity: "velar/server-test#type:TestClient" };
|
|
180
|
+
const testUploadType = object({ filename: stringType, contentType: optional(stringType), data: { kind: "union", members: [stringType, bytesType] } }, ["contentType"]);
|
|
181
|
+
const testRequestOptionsType = object({
|
|
182
|
+
headers: optional(stringMapType),
|
|
183
|
+
json: optional(anyType),
|
|
184
|
+
text: optional(stringType),
|
|
185
|
+
form: optional(stringMapType),
|
|
186
|
+
files: optional({ kind: "map", key: stringType, value: testUploadType }),
|
|
187
|
+
}, ["headers", "json", "text", "form", "files"]);
|
|
188
|
+
const testRequestType = functionType(["method", "path", "options"], [stringType, stringType, testRequestOptionsType], promise(testResponseType), 2);
|
|
189
|
+
const testMethodType = functionType(["path", "options"], [stringType, testRequestOptionsType], promise(testResponseType), 1);
|
|
92
190
|
const fileInfoType = object({
|
|
93
191
|
name: stringType,
|
|
94
192
|
kind: stringType,
|
|
@@ -176,60 +274,6 @@ const nodeHttpType = object({
|
|
|
176
274
|
delete: functionType(["url", "options"], [stringType, nodeHttpOptionsType], nodeHttpRequestType, 1),
|
|
177
275
|
head: functionType(["url", "options"], [stringType, nodeHttpOptionsType], nodeHttpRequestType, 1),
|
|
178
276
|
});
|
|
179
|
-
const sqliteDatabaseIdentity = "velar/sqlite#type:Database";
|
|
180
|
-
const sqliteStatementIdentity = "velar/sqlite#type:Statement";
|
|
181
|
-
const sqliteTransactionIdentity = "velar/sqlite#type:Transaction";
|
|
182
|
-
const sqliteErrorIdentity = "velar/sqlite#class:SqliteError";
|
|
183
|
-
const sqliteBackpressureErrorIdentity = "velar/sqlite#class:SqliteBackpressureError";
|
|
184
|
-
const sqliteDatabaseType = { kind: "named", name: "Database", identity: sqliteDatabaseIdentity };
|
|
185
|
-
const sqliteStatementType = { kind: "named", name: "Statement", identity: sqliteStatementIdentity };
|
|
186
|
-
const sqliteTransactionType = { kind: "named", name: "Transaction", identity: sqliteTransactionIdentity };
|
|
187
|
-
const sqliteRowType = { kind: "parameter", name: "Row", index: 0 };
|
|
188
|
-
const sqliteRead = (name, withSql) => ({
|
|
189
|
-
kind: "function", typeParameterNames: ["Row"], parameterNames: withSql ? ["sql", "params", "RowType"] : ["params", "RowType"],
|
|
190
|
-
parameters: [
|
|
191
|
-
...(withSql ? [stringType] : []), listUnknownType, { kind: "runtimeType", value: sqliteRowType },
|
|
192
|
-
],
|
|
193
|
-
requiredParameters: withSql ? 3 : 2,
|
|
194
|
-
result: promise(name === "one" ? optional(sqliteRowType) : { kind: "list", element: sqliteRowType }),
|
|
195
|
-
});
|
|
196
|
-
const sqliteDatabaseFields = new Map([
|
|
197
|
-
["execute", functionType(["sql", "params"], [stringType, listUnknownType], promise(numberType), 1)],
|
|
198
|
-
["one", sqliteRead("one", true)], ["all", sqliteRead("all", true)],
|
|
199
|
-
["prepare", functionType(["sql"], [stringType], promise(sqliteStatementType))],
|
|
200
|
-
["transaction", functionType([], [], promise(sqliteTransactionType))],
|
|
201
|
-
["close", functionType([], [], promise(nullType))],
|
|
202
|
-
]);
|
|
203
|
-
const sqliteStatementFields = new Map([
|
|
204
|
-
["execute", functionType(["params"], [listUnknownType], promise(numberType), 0)],
|
|
205
|
-
["one", sqliteRead("one", false)], ["all", sqliteRead("all", false)],
|
|
206
|
-
["close", functionType([], [], promise(nullType))],
|
|
207
|
-
]);
|
|
208
|
-
const sqliteTransactionFields = new Map([
|
|
209
|
-
["execute", functionType(["sql", "params"], [stringType, listUnknownType], promise(numberType), 1)],
|
|
210
|
-
["one", sqliteRead("one", true)], ["all", sqliteRead("all", true)],
|
|
211
|
-
["prepare", functionType(["sql"], [stringType], promise(sqliteStatementType))],
|
|
212
|
-
["commit", functionType([], [], promise(nullType))], ["rollback", functionType([], [], promise(nullType))],
|
|
213
|
-
["close", functionType([], [], promise(nullType))],
|
|
214
|
-
]);
|
|
215
|
-
const sqliteOptionsType = object({
|
|
216
|
-
busyTimeout: optional(numberType), queueCapacity: optional(numberType), maxRows: optional(numberType), maxResultBytes: optional(numberType),
|
|
217
|
-
});
|
|
218
|
-
const sqliteErrorClass = {
|
|
219
|
-
identity: sqliteErrorIdentity,
|
|
220
|
-
parameters: [stringType, optional(stringType)], parameterNames: ["message", "code"], requiredParameters: 0,
|
|
221
|
-
base: "Error", abstract: false,
|
|
222
|
-
fields: new Map([["code", { mutable: false, type: optional(stringType) }]]),
|
|
223
|
-
getters: new Set(), abstractGetters: new Set(), methods: new Map(), abstractMethods: new Set(),
|
|
224
|
-
staticFields: new Map(), staticGetters: new Set(), staticMethods: new Map(),
|
|
225
|
-
};
|
|
226
|
-
const sqliteBackpressureErrorClass = {
|
|
227
|
-
identity: sqliteBackpressureErrorIdentity,
|
|
228
|
-
parameters: [stringType], parameterNames: ["message"], requiredParameters: 0,
|
|
229
|
-
base: "Error", abstract: false, fields: new Map(),
|
|
230
|
-
getters: new Set(), abstractGetters: new Set(), methods: new Map(), abstractMethods: new Set(),
|
|
231
|
-
staticFields: new Map(), staticGetters: new Set(), staticMethods: new Map(),
|
|
232
|
-
};
|
|
233
277
|
const httpTransportPhaseIdentity = "velar/http#enum:HttpTransportPhase";
|
|
234
278
|
const httpTransportPhaseMembers = new Set(["request", "response"]);
|
|
235
279
|
const httpTransportPhaseType = { kind: "enum", name: "HttpTransportPhase", identity: httpTransportPhaseIdentity };
|
|
@@ -264,44 +308,173 @@ const httpTransportErrorClass = {
|
|
|
264
308
|
getters: new Set(), abstractGetters: new Set(), methods: new Map(), abstractMethods: new Set(),
|
|
265
309
|
staticFields: new Map(), staticGetters: new Set(), staticMethods: new Map(),
|
|
266
310
|
};
|
|
311
|
+
const webSocketConnectionIdentity = "velar/websocket#type:WebSocketConnection";
|
|
312
|
+
const webSocketServerIdentity = "velar/websocket#type:WebSocketServer";
|
|
313
|
+
const webSocketConnectionType = { kind: "named", name: "WebSocketConnection", identity: webSocketConnectionIdentity };
|
|
314
|
+
const webSocketServerType = { kind: "named", name: "WebSocketServer", identity: webSocketServerIdentity };
|
|
315
|
+
const webSocketMessageType = { kind: "union", members: [stringType, bytesType] };
|
|
316
|
+
const webSocketConnectionFields = new Map([
|
|
317
|
+
["state", functionType([], [], stringType)],
|
|
318
|
+
["send", functionType(["message"], [webSocketMessageType], promise(nullType))],
|
|
319
|
+
["next", functionType([], [], promise(optional(webSocketMessageType)))],
|
|
320
|
+
["close", functionType(["code", "reason"], [numberType, stringType], promise(nullType), 0)],
|
|
321
|
+
]);
|
|
322
|
+
const webSocketServerFields = new Map([
|
|
323
|
+
["port", numberType],
|
|
324
|
+
["next", functionType([], [], promise(optional(webSocketConnectionType)))],
|
|
325
|
+
["stop", functionType([], [], promise(nullType))],
|
|
326
|
+
]);
|
|
327
|
+
const webSocketConnectOptions = object({
|
|
328
|
+
timeout: optional({ kind: "named", name: "Duration" }),
|
|
329
|
+
maxMessageBytes: optional(numberType),
|
|
330
|
+
maxQueuedMessages: optional(numberType),
|
|
331
|
+
maxQueuedBytes: optional(numberType),
|
|
332
|
+
maxPendingSendBytes: optional(numberType),
|
|
333
|
+
});
|
|
334
|
+
const webSocketListenOptions = object({
|
|
335
|
+
port: numberType,
|
|
336
|
+
host: optional(stringType),
|
|
337
|
+
path: optional(stringType),
|
|
338
|
+
http: optional({ kind: "union", members: [functionType(["request"], [serveRequestType], promise(serveResponseAlias)), serveAppType] }),
|
|
339
|
+
maxMessageBytes: optional(numberType),
|
|
340
|
+
maxQueuedMessages: optional(numberType),
|
|
341
|
+
maxQueuedBytes: optional(numberType),
|
|
342
|
+
maxPendingSendBytes: optional(numberType),
|
|
343
|
+
maxConnections: optional(numberType),
|
|
344
|
+
maxPendingConnections: optional(numberType),
|
|
345
|
+
});
|
|
346
|
+
const webSocketErrorIdentities = new Map([
|
|
347
|
+
["WebSocketBackpressureError", "velar/websocket#class:WebSocketBackpressureError"],
|
|
348
|
+
["WebSocketClosedError", "velar/websocket#class:WebSocketClosedError"],
|
|
349
|
+
["WebSocketProtocolError", "velar/websocket#class:WebSocketProtocolError"],
|
|
350
|
+
["WebSocketTimeoutError", "velar/websocket#class:WebSocketTimeoutError"],
|
|
351
|
+
]);
|
|
352
|
+
const webSocketErrorClass = (identity) => ({
|
|
353
|
+
identity,
|
|
354
|
+
parameters: [stringType],
|
|
355
|
+
parameterNames: ["message"],
|
|
356
|
+
requiredParameters: 0,
|
|
357
|
+
base: "Error",
|
|
358
|
+
abstract: false,
|
|
359
|
+
fields: new Map(),
|
|
360
|
+
getters: new Set(),
|
|
361
|
+
abstractGetters: new Set(),
|
|
362
|
+
methods: new Map(),
|
|
363
|
+
abstractMethods: new Set(),
|
|
364
|
+
staticFields: new Map(),
|
|
365
|
+
staticGetters: new Set(),
|
|
366
|
+
staticMethods: new Map(),
|
|
367
|
+
});
|
|
267
368
|
export const nodeModuleInterfaces = new Map([
|
|
268
|
-
["velar/
|
|
269
|
-
["
|
|
270
|
-
["
|
|
271
|
-
[
|
|
272
|
-
["
|
|
273
|
-
["
|
|
274
|
-
|
|
369
|
+
["velar/websocket", moduleInterface(new Map([
|
|
370
|
+
["WebSocketConnection", { kind: "typeObject", name: "WebSocketConnection", value: webSocketConnectionType }],
|
|
371
|
+
["WebSocketServer", { kind: "typeObject", name: "WebSocketServer", value: webSocketServerType }],
|
|
372
|
+
...[...webSocketErrorIdentities].map(([name, identity]) => [name, { kind: "classConstructor", name, identity }]),
|
|
373
|
+
["connect", functionType(["url", "options"], [stringType, webSocketConnectOptions], promise(webSocketConnectionType), 1)],
|
|
374
|
+
["listen", functionType(["options"], [webSocketListenOptions], promise(webSocketServerType))],
|
|
375
|
+
]), new Map([
|
|
376
|
+
["WebSocketConnection", webSocketConnectionFields],
|
|
377
|
+
["WebSocketServer", webSocketServerFields],
|
|
275
378
|
]), new Map([
|
|
276
|
-
["
|
|
379
|
+
["WebSocketConnection", webSocketConnectionIdentity],
|
|
380
|
+
["WebSocketServer", webSocketServerIdentity],
|
|
381
|
+
]), new Map(), new Map([...webSocketErrorIdentities].map(([name, identity]) => [name, webSocketErrorClass(identity)])), new Map(), new Map([
|
|
382
|
+
["WebSocketConnection", new Set(webSocketConnectionFields.keys())],
|
|
383
|
+
["WebSocketServer", new Set(webSocketServerFields.keys())],
|
|
384
|
+
]))],
|
|
385
|
+
["velar/server-test", moduleInterface(new Map([
|
|
386
|
+
["TestClient", { kind: "typeObject", name: "TestClient", value: testClientType }],
|
|
387
|
+
["TestResponse", { kind: "typeObject", name: "TestResponse", value: testResponseType }],
|
|
388
|
+
["client", functionType(["app", "overrides"], [serveAppType, { kind: "map", key: providerType, value: unknownType }], promise(testClientType), 1)],
|
|
277
389
|
]), new Map([
|
|
278
|
-
["
|
|
279
|
-
|
|
390
|
+
["TestClient", new Map([
|
|
391
|
+
["request", testRequestType], ["get", testMethodType], ["post", testMethodType], ["put", testMethodType], ["patch", testMethodType], ["delete", testMethodType], ["close", functionType(["grace"], [numberType], promise(nullType), 0)],
|
|
392
|
+
])],
|
|
393
|
+
["TestResponse", new Map([
|
|
394
|
+
["status", numberType], ["headers", stringMapType], ["text", functionType([], [], promise(stringType))], ["json", functionType([], [], promise(unknownType))],
|
|
395
|
+
])],
|
|
396
|
+
]), new Map([["TestClient", "velar/server-test#type:TestClient"], ["TestResponse", "velar/server-test#type:TestResponse"]]))],
|
|
280
397
|
["velar/serve", moduleInterface(new Map([
|
|
398
|
+
["Request", { kind: "typeObject", name: "Request", value: serveRequestType }],
|
|
281
399
|
["ServeRequest", { kind: "typeObject", name: "ServeRequest" }],
|
|
282
400
|
["ServeResponse", { kind: "typeObject", name: "ServeResponse" }],
|
|
401
|
+
["ServeApp", { kind: "typeObject", name: "ServeApp", value: serveAppType }],
|
|
283
402
|
["Server", { kind: "typeObject", name: "Server" }],
|
|
403
|
+
["HttpError", { kind: "classConstructor", name: "HttpError", identity: serveHttpErrorIdentity }],
|
|
284
404
|
["RequestBodyTooLargeError", { kind: "classConstructor", name: "RequestBodyTooLargeError", identity: requestBodyTooLargeErrorIdentity }],
|
|
285
|
-
["
|
|
405
|
+
["Upload", { kind: "typeObject", name: "Upload", value: uploadType }],
|
|
406
|
+
["Provider", { kind: "typeObject", name: "Provider", value: providerType }],
|
|
407
|
+
["RouteDocumentation", { kind: "typeObject", name: "RouteDocumentation" }],
|
|
408
|
+
["input", inputType],
|
|
409
|
+
["security", securityType],
|
|
410
|
+
["provide", namedIntrinsic("serve.provide", ["inputs", "resolve", "scope", "release", "eager"], [unknownType, unknownType, stringType, releaseProviderType, boolType], providerType, 2)],
|
|
411
|
+
["middleware", middlewareFactoriesType],
|
|
412
|
+
["serve", functionType(["app", "port", "host", "maxBodyBytes"], [serveTargetType, numberType, stringType, numberType], promise(serverType), 2)],
|
|
413
|
+
["json", namedIntrinsic("serve.response.json", ["value", "status", "headers"], [anyType, numberType, optional(responseHeadersType)], jsonResponseType, 1)],
|
|
414
|
+
["created", namedIntrinsic("serve.response.created", ["value", "headers"], [anyType, optional(responseHeadersType)], jsonResponseType, 1)],
|
|
415
|
+
["noContent", namedIntrinsic("serve.response.noContent", ["completion", "headers"], [nullType, optional(responseHeadersType)], textResponseType, 0)],
|
|
416
|
+
["redirect", namedIntrinsic("serve.response.redirect", ["location", "status", "headers"], [stringType, numberType, optional(responseHeadersType)], textResponseType, 1)],
|
|
417
|
+
["text", namedIntrinsic("serve.response.text", ["value", "status", "contentType", "headers"], [stringType, numberType, stringType, optional(responseHeadersType)], textResponseType, 1)],
|
|
418
|
+
["stream", functionType(["producer", "status", "headers"], [streamProducerType, numberType, optional(responseHeadersType)], streamResponseType, 1)],
|
|
419
|
+
["sse", namedIntrinsic("serve.response.sse", ["producer", "headers"], [sseProducerType, optional(responseHeadersType)], streamResponseType, 1)],
|
|
420
|
+
["file", functionType(["path", "root", "fallback"], [stringType, stringType, optional(stringType)], serveResponseAlias, 1)],
|
|
421
|
+
["prefix", functionType(["path", "app"], [stringType, serveAppType], serveAppType)],
|
|
422
|
+
["staticFiles", functionType(["path", "root", "fallback"], [stringType, stringType, optional(stringType)], serveAppType, 2)],
|
|
423
|
+
["use", functionType(["app", "middleware"], [serveAppType, middlewareInputType], serveAppType)],
|
|
424
|
+
["bodyLimit", functionType(["app", "maxBytes"], [serveAppType, numberType], serveAppType)],
|
|
425
|
+
["openapi", functionType(["app", "title", "version"], [serveAppType, optional(stringType), stringType], openApiDocumentType, 1)],
|
|
426
|
+
["docs", functionType(["app", "title", "version", "path", "openapiPath", "routes"], [serveAppType, optional(stringType), stringType, stringType, stringType, routeDocumentationMapType], serveAppType, 1)],
|
|
427
|
+
["lifecycle", functionType(["app", "startup", "shutdown"], [serveAppType, lifecycleHookType, lifecycleHookType], serveAppType, 1)],
|
|
428
|
+
["background", namedIntrinsic("serve.response.background", ["response", "task"], [serveResponseAlias, backgroundTaskType], serveResponseAlias)],
|
|
429
|
+
["setCookie", namedIntrinsic("serve.response.setCookie", ["response", "name", "value", "path", "httpOnly", "secure", "sameSite", "maxAge"], [serveResponseAlias, stringType, stringType, stringType, boolType, boolType, stringType, optional(numberType)], serveResponseAlias, 3)],
|
|
430
|
+
["clearCookie", namedIntrinsic("serve.response.clearCookie", ["response", "name", "path"], [serveResponseAlias, stringType, stringType], serveResponseAlias, 2)],
|
|
286
431
|
["fileResponse", functionType(["root", "path", "fallback"], [stringType, stringType, optional(stringType)], serveResponseAlias, 2)],
|
|
287
432
|
]), new Map([
|
|
433
|
+
["Request", new Map([
|
|
434
|
+
["method", stringType],
|
|
435
|
+
["path", stringType],
|
|
436
|
+
["query", stringMapType],
|
|
437
|
+
["queryAll", { kind: "map", key: stringType, value: listStringType }],
|
|
438
|
+
["headers", stringMapType],
|
|
439
|
+
["cancellation", cancellationType],
|
|
440
|
+
["text", functionType(["maxBytes"], [numberType], promise(stringType), 0)],
|
|
441
|
+
["bytes", functionType(["maxBytes"], [numberType], promise(bytesType), 0)],
|
|
442
|
+
["json", functionType(["maxBytes"], [numberType], promise(unknownType), 0)],
|
|
443
|
+
["parse", namedIntrinsic("runtime.parseAsync", ["target", "maxBytes"], [anyType, numberType], promise(anyType), 1)],
|
|
444
|
+
])],
|
|
288
445
|
["ServeRequest", new Map([
|
|
289
446
|
["method", stringType],
|
|
290
447
|
["path", stringType],
|
|
291
448
|
["query", stringMapType],
|
|
449
|
+
["queryAll", { kind: "map", key: stringType, value: listStringType }],
|
|
292
450
|
["headers", stringMapType],
|
|
451
|
+
["cancellation", cancellationType],
|
|
293
452
|
["text", functionType(["maxBytes"], [numberType], promise(stringType), 0)],
|
|
453
|
+
["bytes", functionType(["maxBytes"], [numberType], promise(bytesType), 0)],
|
|
294
454
|
["json", functionType(["maxBytes"], [numberType], promise(unknownType), 0)],
|
|
295
455
|
["parse", namedIntrinsic("runtime.parseAsync", ["target", "maxBytes"], [anyType, numberType], promise(anyType), 1)],
|
|
296
456
|
])],
|
|
297
457
|
["Server", new Map([
|
|
298
458
|
["port", numberType],
|
|
299
|
-
["stop", functionType([], [], promise(nullType))],
|
|
459
|
+
["stop", functionType(["grace"], [numberType], promise(nullType), 0)],
|
|
460
|
+
])],
|
|
461
|
+
["ServeApp", new Map()],
|
|
462
|
+
["Upload", new Map([
|
|
463
|
+
["name", stringType],
|
|
464
|
+
["filename", stringType],
|
|
465
|
+
["contentType", stringType],
|
|
466
|
+
["size", numberType],
|
|
467
|
+
["text", functionType([], [], promise(stringType))],
|
|
468
|
+
["bytes", functionType([], [], promise(bytesType))],
|
|
469
|
+
["save", functionType(["path"], [stringType], promise(nullType))],
|
|
300
470
|
])],
|
|
301
471
|
]), new Map([
|
|
472
|
+
["Request", "velar/serve#type:ServeRequest"],
|
|
302
473
|
["ServeRequest", "velar/serve#type:ServeRequest"],
|
|
474
|
+
["ServeApp", "velar/serve#type:ServeApp"],
|
|
303
475
|
["Server", "velar/serve#type:Server"],
|
|
304
|
-
|
|
476
|
+
["Upload", "velar/serve#type:Upload"],
|
|
477
|
+
]), new Map([["ServeResponse", serveResponseAlias], ["Provider", providerType], ["RouteDocumentation", routeDocumentationType]]), new Map([["HttpError", serveHttpErrorClass], ["RequestBodyTooLargeError", requestBodyTooLargeErrorClass]]))],
|
|
305
478
|
["velar/fs", moduleInterface(new Map([
|
|
306
479
|
["FileWatchBatch", { kind: "typeObject", name: "FileWatchBatch" }],
|
|
307
480
|
["FileWatcher", { kind: "typeObject", name: "FileWatcher" }],
|
|
@@ -379,7 +552,13 @@ export const nodeModuleInterfaces = new Map([
|
|
|
379
552
|
]), new Map([["HttpTransportPhase", { identity: httpTransportPhaseIdentity, members: httpTransportPhaseMembers }]]))],
|
|
380
553
|
]);
|
|
381
554
|
export const nodeModuleSources = new Map([
|
|
382
|
-
["velar/
|
|
555
|
+
["velar/server-test", String.raw `
|
|
556
|
+
import { ServeApp as __velarServerTestApp } from "velar/serve";
|
|
557
|
+
const __velarServerTestBridge = __velarServerTestApp.__velarCompilerBridge;
|
|
558
|
+
export async function client(app, overrides = null) { return await __velarServerTestBridge.testClient(app, overrides); }
|
|
559
|
+
export const TestClient = Object.freeze({is(value) { return !!value && typeof value === "object" && typeof value.request === "function" && typeof value.close === "function"; }, parse(value) { if (!TestClient.is(value)) throw new TypeError("Value does not match TestClient"); return value; }});
|
|
560
|
+
export const TestResponse = Object.freeze({is(value) { return !!value && typeof value === "object" && Number.isSafeInteger(value.status) && typeof value.text === "function" && typeof value.json === "function"; }, parse(value) { if (!TestResponse.is(value)) throw new TypeError("Value does not match TestResponse"); return value; }});
|
|
561
|
+
`.trimStart()],
|
|
383
562
|
["velar/websocket", VELAR_NODE_WEBSOCKET_RUNTIME],
|
|
384
563
|
["velar/worker", VELAR_NODE_WORKER_RUNTIME],
|
|
385
564
|
[VELAR_NODE_HOST_MODULE, VELAR_SHARED_NODE_HOST_RUNTIME.replace("WORKER_SOURCE", JSON.stringify(VELAR_NODE_HOST_WORKER_SOURCE))],
|
|
@@ -918,17 +1097,18 @@ ${VELAR_NODE_SERVE_RUNTIME}
|
|
|
918
1097
|
`.trimStart()],
|
|
919
1098
|
]);
|
|
920
1099
|
export const nodeModuleDependencies = new Map([
|
|
1100
|
+
["velar/server-test", ["velar/serve"]],
|
|
921
1101
|
["velar/worker", ["velar/worker-manifest", "velar/task"]],
|
|
922
1102
|
["velar/websocket", ["velar/serve"]],
|
|
923
1103
|
["velar/http", [VELAR_NODE_HOST_MODULE, "velar/binary"]],
|
|
924
1104
|
["velar/fs", [VELAR_NODE_HOST_MODULE, "velar/binary"]],
|
|
925
|
-
["velar/serve", [VELAR_NODE_HOST_MODULE]],
|
|
1105
|
+
["velar/serve", [VELAR_NODE_HOST_MODULE, VELAR_ERROR_NORMALIZATION_MODULE, VELAR_COLLECTION_LOWERING_MODULE, "velar/binary", "velar/fs", "velar/task"]],
|
|
926
1106
|
// D50 rule 89: the host proxy rebuilds the compiler-owned capability error
|
|
927
1107
|
// classes, so its module carries that dependency edge.
|
|
928
1108
|
[VELAR_NODE_HOST_MODULE, [VELAR_ERROR_NORMALIZATION_MODULE]],
|
|
929
1109
|
]);
|
|
930
1110
|
const nodeModules = new Set(nodeModuleInterfaces.keys());
|
|
931
|
-
const sharedPlatformModules = new Set(["velar/http"]);
|
|
1111
|
+
const sharedPlatformModules = new Set(["velar/http", "velar/websocket"]);
|
|
932
1112
|
export function isNodeModule(source) {
|
|
933
1113
|
return nodeModules.has(source);
|
|
934
1114
|
}
|
|
@@ -944,11 +1124,55 @@ export const velarNodeCompilerExtension = Object.freeze({
|
|
|
944
1124
|
id: "@velarscript/node",
|
|
945
1125
|
contract: Object.freeze({ protocolVersion: 1, apiVersion: VELAR_NODE_API_VERSION, kind: "capability", extends: Object.freeze({}) }),
|
|
946
1126
|
capabilities: Object.freeze(["node"]),
|
|
1127
|
+
formatting: Object.freeze({
|
|
1128
|
+
scanOpaqueSource: scanNodePathPatternForFormatting,
|
|
1129
|
+
}),
|
|
1130
|
+
lexical: Object.freeze({
|
|
1131
|
+
contextualKeywords: new Set(["server"]),
|
|
1132
|
+
scan: scanNodeToken,
|
|
1133
|
+
}),
|
|
1134
|
+
parser: Object.freeze({
|
|
1135
|
+
create(tokens, lexicalExtensions) {
|
|
1136
|
+
return new VelarNodeParser(tokens, lexicalExtensions);
|
|
1137
|
+
},
|
|
1138
|
+
}),
|
|
1139
|
+
syntax: Object.freeze({
|
|
1140
|
+
statementConstructs: NODE_STATEMENT_CONSTRUCTS,
|
|
1141
|
+
statementConstructKey: nodeStatementConstructKey,
|
|
1142
|
+
}),
|
|
1143
|
+
analyzer: Object.freeze({
|
|
1144
|
+
create(context, extensions) {
|
|
1145
|
+
return new VelarNodeAnalyzer(context, extensions);
|
|
1146
|
+
},
|
|
1147
|
+
}),
|
|
1148
|
+
semantic: velarNodeSemanticExtension,
|
|
1149
|
+
inspection: velarNodeInspectionExtension,
|
|
1150
|
+
analysis: Object.freeze({
|
|
1151
|
+
directAwaitStatement: nodeServerStatementContainsDirectAwait,
|
|
1152
|
+
inferIntrinsic: inferNodeIntrinsic,
|
|
1153
|
+
}),
|
|
947
1154
|
modules: Object.freeze({
|
|
948
1155
|
apiVersion: VELAR_NODE_API_VERSION,
|
|
949
1156
|
interfaces: nodeModuleInterfaces,
|
|
950
1157
|
sources: nodeModuleSources,
|
|
951
1158
|
dependencies: nodeModuleDependencies,
|
|
952
1159
|
}),
|
|
1160
|
+
editor: Object.freeze({
|
|
1161
|
+
keywordDocumentation: Object.freeze({
|
|
1162
|
+
server: "Declares an immutable Node HTTP route table.",
|
|
1163
|
+
"@get": "Declares an anonymous GET route in the current server.",
|
|
1164
|
+
"@post": "Declares an anonymous POST route in the current server.",
|
|
1165
|
+
"@put": "Declares an anonymous PUT route in the current server.",
|
|
1166
|
+
"@patch": "Declares an anonymous PATCH route in the current server.",
|
|
1167
|
+
"@delete": "Declares an anonymous DELETE route in the current server.",
|
|
1168
|
+
"@notFound": "Declares the application fallback for an unmatched request path.",
|
|
1169
|
+
}),
|
|
1170
|
+
}),
|
|
1171
|
+
createEmitter(hints, forcedFunctionExports, _resourceContents, _extensionImports, options) {
|
|
1172
|
+
return new NodeJavaScriptEmitter(hints, forcedFunctionExports, options);
|
|
1173
|
+
},
|
|
953
1174
|
});
|
|
1175
|
+
/** Conventional package entry used by the project extension loader. */
|
|
1176
|
+
export const velarCompilerExtension = velarNodeCompilerExtension;
|
|
1177
|
+
export { velarProjectExtension } from "./project-config.js";
|
|
954
1178
|
//# sourceMappingURL=compiler.js.map
|