@velarscript/node 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +102 -14
  2. package/dist/compiler.d.ts +3 -0
  3. package/dist/compiler.d.ts.map +1 -1
  4. package/dist/compiler.js +299 -76
  5. package/dist/compiler.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/node-host-runtime.d.ts.map +1 -1
  11. package/dist/node-host-runtime.js +30 -14
  12. package/dist/node-host-runtime.js.map +1 -1
  13. package/dist/node-host-worker-runtime.d.ts.map +1 -1
  14. package/dist/node-host-worker-runtime.js +495 -93
  15. package/dist/node-host-worker-runtime.js.map +1 -1
  16. package/dist/project-config.d.ts +17 -0
  17. package/dist/project-config.d.ts.map +1 -0
  18. package/dist/project-config.js +66 -0
  19. package/dist/project-config.js.map +1 -0
  20. package/dist/serve-runtime.d.ts.map +1 -1
  21. package/dist/serve-runtime.js +2885 -157
  22. package/dist/serve-runtime.js.map +1 -1
  23. package/dist/server-analyzer.d.ts +34 -0
  24. package/dist/server-analyzer.d.ts.map +1 -0
  25. package/dist/server-analyzer.js +659 -0
  26. package/dist/server-analyzer.js.map +1 -0
  27. package/dist/server-ast.d.ts +42 -0
  28. package/dist/server-ast.d.ts.map +1 -0
  29. package/dist/server-ast.js +16 -0
  30. package/dist/server-ast.js.map +1 -0
  31. package/dist/server-emitter.d.ts +16 -0
  32. package/dist/server-emitter.d.ts.map +1 -0
  33. package/dist/server-emitter.js +166 -0
  34. package/dist/server-emitter.js.map +1 -0
  35. package/dist/server-inspection.d.ts +3 -0
  36. package/dist/server-inspection.d.ts.map +1 -0
  37. package/dist/server-inspection.js +12 -0
  38. package/dist/server-inspection.js.map +1 -0
  39. package/dist/server-lexer.d.ts +13 -0
  40. package/dist/server-lexer.d.ts.map +1 -0
  41. package/dist/server-lexer.js +65 -0
  42. package/dist/server-lexer.js.map +1 -0
  43. package/dist/server-parser.d.ts +16 -0
  44. package/dist/server-parser.d.ts.map +1 -0
  45. package/dist/server-parser.js +207 -0
  46. package/dist/server-parser.js.map +1 -0
  47. package/dist/server-semantic.d.ts +3 -0
  48. package/dist/server-semantic.d.ts.map +1 -0
  49. package/dist/server-semantic.js +31 -0
  50. package/dist/server-semantic.js.map +1 -0
  51. package/dist/server-types.d.ts +25 -0
  52. package/dist/server-types.d.ts.map +1 -0
  53. package/dist/server-types.js +60 -0
  54. package/dist/server-types.js.map +1 -0
  55. package/dist/websocket-runtime.d.ts.map +1 -1
  56. package/dist/websocket-runtime.js +169 -15
  57. package/dist/websocket-runtime.js.map +1 -1
  58. package/package.json +10 -2
  59. package/dist/sqlite-runtime.d.ts +0 -3
  60. package/dist/sqlite-runtime.d.ts.map +0 -1
  61. package/dist/sqlite-runtime.js +0 -92
  62. 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 { VELAR_NODE_SQLITE_RUNTIME, VELAR_NODE_SQLITE_WORKER_SOURCE } from "./sqlite-runtime.js";
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 responseHeadersType = stringMapType;
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/sqlite", moduleInterface(new Map([
269
- ["Database", { kind: "typeObject", name: "Database", value: sqliteDatabaseType }],
270
- ["Statement", { kind: "typeObject", name: "Statement", value: sqliteStatementType }],
271
- ["Transaction", { kind: "typeObject", name: "Transaction", value: sqliteTransactionType }],
272
- ["SqliteError", { kind: "classConstructor", name: "SqliteError", identity: sqliteErrorIdentity }],
273
- ["SqliteBackpressureError", { kind: "classConstructor", name: "SqliteBackpressureError", identity: sqliteBackpressureErrorIdentity }],
274
- ["open", functionType(["path", "options"], [stringType, sqliteOptionsType], promise(sqliteDatabaseType), 1)],
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
- ["Database", sqliteDatabaseFields], ["Statement", sqliteStatementFields], ["Transaction", sqliteTransactionFields],
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
- ["Database", sqliteDatabaseIdentity], ["Statement", sqliteStatementIdentity], ["Transaction", sqliteTransactionIdentity],
279
- ]), new Map(), new Map([["SqliteError", sqliteErrorClass], ["SqliteBackpressureError", sqliteBackpressureErrorClass]]))],
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
- ["serve", functionType(["handler", "port", "host"], [handlerType, numberType, stringType], promise(serverType), 2)],
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
- ]), new Map([["ServeResponse", serveResponseAlias]]), new Map([["RequestBodyTooLargeError", requestBodyTooLargeErrorClass]]))],
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/sqlite", VELAR_NODE_SQLITE_RUNTIME.replace("WORKER_SOURCE", JSON.stringify(VELAR_NODE_SQLITE_WORKER_SOURCE))],
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,54 @@ 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
+ }),
1169
+ }),
1170
+ createEmitter(hints, forcedFunctionExports, _resourceContents, _extensionImports, options) {
1171
+ return new NodeJavaScriptEmitter(hints, forcedFunctionExports, options);
1172
+ },
953
1173
  });
1174
+ /** Conventional package entry used by the project extension loader. */
1175
+ export const velarCompilerExtension = velarNodeCompilerExtension;
1176
+ export { velarProjectExtension } from "./project-config.js";
954
1177
  //# sourceMappingURL=compiler.js.map