@zmdb/compiler 1.0.0-beta.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/LICENSE +674 -0
- package/README.md +40 -0
- package/dist/codegen/index.d.ts +50 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +364 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/scan.d.ts +105 -0
- package/dist/codegen/scan.d.ts.map +1 -0
- package/dist/codegen/scan.js +450 -0
- package/dist/codegen/scan.js.map +1 -0
- package/dist/codegen/witness.d.ts +76 -0
- package/dist/codegen/witness.d.ts.map +1 -0
- package/dist/codegen/witness.js +690 -0
- package/dist/codegen/witness.js.map +1 -0
- package/dist/config/contract.d.ts +41 -0
- package/dist/config/contract.d.ts.map +1 -0
- package/dist/config/contract.js +5 -0
- package/dist/config/contract.js.map +1 -0
- package/dist/config/index.d.ts +53 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +277 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.zmdb.generated.d.ts +12 -0
- package/dist/config/index.zmdb.generated.js +28 -0
- package/dist/config/index.zmdb.witness.d.ts +3 -0
- package/dist/config/index.zmdb.witness.d.ts.map +1 -0
- package/dist/config/index.zmdb.witness.js +20 -0
- package/dist/config/index.zmdb.witness.js.map +1 -0
- package/dist/configured-plugin.d.ts +11 -0
- package/dist/configured-plugin.d.ts.map +1 -0
- package/dist/configured-plugin.js +27 -0
- package/dist/configured-plugin.js.map +1 -0
- package/dist/emit/index.d.ts +103 -0
- package/dist/emit/index.d.ts.map +1 -0
- package/dist/emit/index.js +1356 -0
- package/dist/emit/index.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/ast.d.ts +17 -0
- package/dist/lint/ast.d.ts.map +1 -0
- package/dist/lint/ast.js +77 -0
- package/dist/lint/ast.js.map +1 -0
- package/dist/lint/host-types.d.ts +9 -0
- package/dist/lint/host-types.d.ts.map +1 -0
- package/dist/lint/host-types.js +2 -0
- package/dist/lint/host-types.js.map +1 -0
- package/dist/lint/index.d.ts +23 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +53 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/lint/rules/no-distributed-nullable-tags.d.ts +3 -0
- package/dist/lint/rules/no-distributed-nullable-tags.d.ts.map +1 -0
- package/dist/lint/rules/no-distributed-nullable-tags.js +71 -0
- package/dist/lint/rules/no-distributed-nullable-tags.js.map +1 -0
- package/dist/lint/rules/no-empty-patch.d.ts +3 -0
- package/dist/lint/rules/no-empty-patch.d.ts.map +1 -0
- package/dist/lint/rules/no-empty-patch.js +26 -0
- package/dist/lint/rules/no-empty-patch.js.map +1 -0
- package/dist/lint/rules/no-interpolated-sql.d.ts +3 -0
- package/dist/lint/rules/no-interpolated-sql.d.ts.map +1 -0
- package/dist/lint/rules/no-interpolated-sql.js +35 -0
- package/dist/lint/rules/no-interpolated-sql.js.map +1 -0
- package/dist/lint/rules/no-unbounded-find.d.ts +3 -0
- package/dist/lint/rules/no-unbounded-find.d.ts.map +1 -0
- package/dist/lint/rules/no-unbounded-find.js +26 -0
- package/dist/lint/rules/no-unbounded-find.js.map +1 -0
- package/dist/lint/rules/no-unknown-json-column.d.ts +3 -0
- package/dist/lint/rules/no-unknown-json-column.d.ts.map +1 -0
- package/dist/lint/rules/no-unknown-json-column.js +35 -0
- package/dist/lint/rules/no-unknown-json-column.js.map +1 -0
- package/dist/lint/rules/require-sql-on-number.d.ts +3 -0
- package/dist/lint/rules/require-sql-on-number.d.ts.map +1 -0
- package/dist/lint/rules/require-sql-on-number.js +34 -0
- package/dist/lint/rules/require-sql-on-number.js.map +1 -0
- package/dist/lint/types.d.ts +12 -0
- package/dist/lint/types.d.ts.map +1 -0
- package/dist/lint/types.js +2 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/metro/metro.d.ts +22 -0
- package/dist/metro/metro.d.ts.map +1 -0
- package/dist/metro/metro.js +242 -0
- package/dist/metro/metro.js.map +1 -0
- package/dist/protobuf/decode.d.ts +20 -0
- package/dist/protobuf/decode.d.ts.map +1 -0
- package/dist/protobuf/decode.js +289 -0
- package/dist/protobuf/decode.js.map +1 -0
- package/dist/protobuf/descriptor.d.ts +16 -0
- package/dist/protobuf/descriptor.d.ts.map +1 -0
- package/dist/protobuf/descriptor.js +303 -0
- package/dist/protobuf/descriptor.js.map +1 -0
- package/dist/protobuf/encode.d.ts +20 -0
- package/dist/protobuf/encode.d.ts.map +1 -0
- package/dist/protobuf/encode.js +203 -0
- package/dist/protobuf/encode.js.map +1 -0
- package/dist/protobuf/grpc-ir.d.ts +16 -0
- package/dist/protobuf/grpc-ir.d.ts.map +1 -0
- package/dist/protobuf/grpc-ir.js +2 -0
- package/dist/protobuf/grpc-ir.js.map +1 -0
- package/dist/protobuf/plan.d.ts +42 -0
- package/dist/protobuf/plan.d.ts.map +1 -0
- package/dist/protobuf/plan.js +158 -0
- package/dist/protobuf/plan.js.map +1 -0
- package/dist/reflect/callsites.d.ts +40 -0
- package/dist/reflect/callsites.d.ts.map +1 -0
- package/dist/reflect/callsites.js +153 -0
- package/dist/reflect/callsites.js.map +1 -0
- package/dist/reflect/index.d.ts +106 -0
- package/dist/reflect/index.d.ts.map +1 -0
- package/dist/reflect/index.js +1421 -0
- package/dist/reflect/index.js.map +1 -0
- package/dist/reflect/session.d.ts +118 -0
- package/dist/reflect/session.d.ts.map +1 -0
- package/dist/reflect/session.js +228 -0
- package/dist/reflect/session.js.map +1 -0
- package/dist/testing/index.d.ts +69 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +210 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transform/index.d.ts +74 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +572 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/unplugin/index.d.ts +53 -0
- package/dist/unplugin/index.d.ts.map +1 -0
- package/dist/unplugin/index.js +130 -0
- package/dist/unplugin/index.js.map +1 -0
- package/dist/unplugin/inline-bench.d.ts +29 -0
- package/dist/unplugin/inline-bench.d.ts.map +1 -0
- package/dist/unplugin/inline-bench.js +82 -0
- package/dist/unplugin/inline-bench.js.map +1 -0
- package/package.json +110 -0
- package/src/codegen/index.ts +451 -0
- package/src/codegen/scan.ts +574 -0
- package/src/codegen/witness.ts +819 -0
- package/src/config/contract.ts +48 -0
- package/src/config/index.ts +384 -0
- package/src/config/index.zmdb.generated.d.ts +12 -0
- package/src/config/index.zmdb.generated.js +28 -0
- package/src/config/index.zmdb.witness.ts +22 -0
- package/src/configured-plugin.ts +35 -0
- package/src/emit/index.ts +1496 -0
- package/src/errors.ts +6 -0
- package/src/index.ts +336 -0
- package/src/lint/ast.ts +96 -0
- package/src/lint/host-types.ts +9 -0
- package/src/lint/index.ts +80 -0
- package/src/lint/rules/no-distributed-nullable-tags.ts +76 -0
- package/src/lint/rules/no-empty-patch.ts +26 -0
- package/src/lint/rules/no-interpolated-sql.ts +45 -0
- package/src/lint/rules/no-unbounded-find.ts +26 -0
- package/src/lint/rules/no-unknown-json-column.ts +36 -0
- package/src/lint/rules/require-sql-on-number.ts +34 -0
- package/src/lint/types.ts +11 -0
- package/src/metro/metro.ts +313 -0
- package/src/protobuf/decode.ts +375 -0
- package/src/protobuf/descriptor.ts +353 -0
- package/src/protobuf/encode.ts +277 -0
- package/src/protobuf/grpc-ir.ts +17 -0
- package/src/protobuf/plan.ts +244 -0
- package/src/reflect/callsites.ts +198 -0
- package/src/reflect/index.ts +1723 -0
- package/src/reflect/session.ts +276 -0
- package/src/testing/index.ts +298 -0
- package/src/transform/index.ts +690 -0
- package/src/unplugin/index.ts +182 -0
- package/src/unplugin/inline-bench.ts +92 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// TypeIR -> proto3 descriptor text.
|
|
2
|
+
//
|
|
3
|
+
// This is build-time only: the transformer calls it while replacing
|
|
4
|
+
// `protoDescriptor<T>()`, and the emitted application receives one string literal.
|
|
5
|
+
// No descriptor, parser or field table is walked at runtime.
|
|
6
|
+
import {} from '@zmdb/schema/ir';
|
|
7
|
+
import { IDENTIFIER, planScalar } from './plan.js';
|
|
8
|
+
const PACKAGE = /^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;
|
|
9
|
+
/** Emit a complete proto3 file, or named diagnostics when the IR has no honest spelling. */
|
|
10
|
+
export function emitProtoDescriptor(root, preferredName) {
|
|
11
|
+
return new DescriptorEmitter().emit(root, preferredName);
|
|
12
|
+
}
|
|
13
|
+
/** Emit one proto3 service and every request/response message it references. */
|
|
14
|
+
export function emitGrpcDescriptor(root, service, pkg) {
|
|
15
|
+
return new DescriptorEmitter().emitGrpc(root, service, pkg);
|
|
16
|
+
}
|
|
17
|
+
class DescriptorEmitter {
|
|
18
|
+
#diagnostics = [];
|
|
19
|
+
#definitions = [];
|
|
20
|
+
#objectNames = new Map();
|
|
21
|
+
#rawObjectNames = new Map();
|
|
22
|
+
#usedNames = new Set();
|
|
23
|
+
#renderedMessages = new Set();
|
|
24
|
+
#renderingMessages = new Set();
|
|
25
|
+
#renderedEnums = new Map();
|
|
26
|
+
#needsTimestamp = false;
|
|
27
|
+
emit(root, preferredName) {
|
|
28
|
+
if (root.kind !== 'object') {
|
|
29
|
+
const name = preferredName ?? rootName(root);
|
|
30
|
+
const reason = root.kind === 'union' && root.members.some(member => member.kind === 'object')
|
|
31
|
+
? 'a union of message types would require `oneof`, but union arms have no ProtoField<N> tag slot'
|
|
32
|
+
: 'a protobuf descriptor root must be an object message';
|
|
33
|
+
this.#refuse(name, reason);
|
|
34
|
+
return { diagnostics: this.#diagnostics };
|
|
35
|
+
}
|
|
36
|
+
const rootMessage = preferredName ?? root.name ?? 'Message';
|
|
37
|
+
this.#collectObjectNames(root, rootMessage);
|
|
38
|
+
this.#renderMessage(root, rootMessage);
|
|
39
|
+
if (this.#diagnostics.length > 0)
|
|
40
|
+
return { diagnostics: this.#diagnostics };
|
|
41
|
+
return { source: this.#document(), diagnostics: [] };
|
|
42
|
+
}
|
|
43
|
+
emitGrpc(root, service, pkg) {
|
|
44
|
+
if (!IDENTIFIER.test(service)) {
|
|
45
|
+
this.#refuse('service', `\`${service}\` is not a valid protobuf service identifier`);
|
|
46
|
+
}
|
|
47
|
+
if (!PACKAGE.test(pkg)) {
|
|
48
|
+
this.#refuse('package', `\`${pkg}\` is not a valid protobuf package name`);
|
|
49
|
+
}
|
|
50
|
+
for (const method of root.methods) {
|
|
51
|
+
if (!IDENTIFIER.test(method.name)) {
|
|
52
|
+
this.#refuse(method.name, `\`${method.name}\` is not a valid protobuf method identifier`);
|
|
53
|
+
}
|
|
54
|
+
if (method.request.kind !== 'object') {
|
|
55
|
+
this.#refuse(`${method.name}.request`, 'a gRPC request must be an object message');
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (method.response.kind !== 'object') {
|
|
59
|
+
this.#refuse(`${method.name}.response`, 'a gRPC response must be an object message');
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
this.#collectObjectNames(method.request, method.requestName);
|
|
63
|
+
this.#collectObjectNames(method.response, method.responseName);
|
|
64
|
+
}
|
|
65
|
+
const rpc = [];
|
|
66
|
+
for (const method of root.methods) {
|
|
67
|
+
if (method.request.kind !== 'object' || method.response.kind !== 'object')
|
|
68
|
+
continue;
|
|
69
|
+
const request = this.#renderMessage(method.request, `${method.name}.request`);
|
|
70
|
+
const response = this.#renderMessage(method.response, `${method.name}.response`);
|
|
71
|
+
if (request === undefined || response === undefined)
|
|
72
|
+
continue;
|
|
73
|
+
const requestType = method.requestStream ? `stream ${request}` : request;
|
|
74
|
+
const responseType = method.responseStream ? `stream ${response}` : response;
|
|
75
|
+
rpc.push(` rpc ${method.name} (${requestType}) returns (${responseType});`);
|
|
76
|
+
}
|
|
77
|
+
if (this.#diagnostics.length > 0)
|
|
78
|
+
return { diagnostics: this.#diagnostics };
|
|
79
|
+
this.#definitions.push(`service ${service} {\n${rpc.join('\n')}\n}`);
|
|
80
|
+
return { source: this.#document(pkg), diagnostics: [] };
|
|
81
|
+
}
|
|
82
|
+
#document(pkg) {
|
|
83
|
+
const lines = ['syntax = "proto3";'];
|
|
84
|
+
if (pkg !== undefined)
|
|
85
|
+
lines.push('', `package ${pkg};`);
|
|
86
|
+
if (this.#needsTimestamp)
|
|
87
|
+
lines.push('', 'import "google/protobuf/timestamp.proto";');
|
|
88
|
+
if (this.#definitions.length > 0)
|
|
89
|
+
lines.push('', this.#definitions.join('\n\n'));
|
|
90
|
+
lines.push('');
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}
|
|
93
|
+
#collectObjectNames(node, suggested) {
|
|
94
|
+
switch (node.kind) {
|
|
95
|
+
case 'object': {
|
|
96
|
+
const raw = node.name;
|
|
97
|
+
const existing = raw === undefined ? undefined : this.#rawObjectNames.get(raw);
|
|
98
|
+
const name = existing ?? this.#reserveName(raw ?? suggested);
|
|
99
|
+
this.#objectNames.set(node, name);
|
|
100
|
+
if (raw !== undefined && existing === undefined)
|
|
101
|
+
this.#rawObjectNames.set(raw, name);
|
|
102
|
+
for (const property of node.properties) {
|
|
103
|
+
this.#collectObjectNames(property.type, `${name}_${pascal(property.name)}`);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
case 'array':
|
|
108
|
+
this.#collectObjectNames(node.element, suggested);
|
|
109
|
+
return;
|
|
110
|
+
case 'tuple':
|
|
111
|
+
for (const [index, element] of node.elements.entries()) {
|
|
112
|
+
this.#collectObjectNames(element, `${suggested}_${index + 1}`);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
case 'union':
|
|
116
|
+
for (const member of node.members)
|
|
117
|
+
this.#collectObjectNames(member, suggested);
|
|
118
|
+
return;
|
|
119
|
+
default:
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
#renderMessage(node, path) {
|
|
124
|
+
const name = this.#objectNames.get(node);
|
|
125
|
+
if (name === undefined)
|
|
126
|
+
return this.#refuse(path, 'the protobuf message did not receive a deterministic name');
|
|
127
|
+
if (this.#renderedMessages.has(name) || this.#renderingMessages.has(name))
|
|
128
|
+
return name;
|
|
129
|
+
this.#renderingMessages.add(name);
|
|
130
|
+
const fields = [];
|
|
131
|
+
const ordered = node.properties.toSorted((left, right) => (left.protoField ?? Number.MAX_SAFE_INTEGER) - (right.protoField ?? Number.MAX_SAFE_INTEGER));
|
|
132
|
+
for (const property of ordered) {
|
|
133
|
+
const field = this.#field(name, property, `${path}.${property.name}`);
|
|
134
|
+
if (field !== undefined)
|
|
135
|
+
fields.push(field);
|
|
136
|
+
}
|
|
137
|
+
this.#renderingMessages.delete(name);
|
|
138
|
+
if (this.#diagnostics.length > 0)
|
|
139
|
+
return undefined;
|
|
140
|
+
const body = fields.map(field => ` ${field}`).join('\n');
|
|
141
|
+
this.#definitions.push(`message ${name} {\n${body}\n}`);
|
|
142
|
+
this.#renderedMessages.add(name);
|
|
143
|
+
return name;
|
|
144
|
+
}
|
|
145
|
+
#field(owner, property, path) {
|
|
146
|
+
if (!IDENTIFIER.test(property.name)) {
|
|
147
|
+
return this.#refuse(path, `\`${property.name}\` is not a valid protobuf field identifier`);
|
|
148
|
+
}
|
|
149
|
+
if (property.protoField === undefined) {
|
|
150
|
+
return this.#refuse(path, `protobuf property \`${property.name}\` has no ProtoField<N> field number`);
|
|
151
|
+
}
|
|
152
|
+
const fieldType = this.#fieldType(property.type, owner, property.name, path);
|
|
153
|
+
if (fieldType === undefined)
|
|
154
|
+
return undefined;
|
|
155
|
+
if (property.optional && fieldType.nullable) {
|
|
156
|
+
return this.#refuse(path, 'an optional nullable protobuf field has three TypeScript states but only two wire-presence states');
|
|
157
|
+
}
|
|
158
|
+
const qualifier = fieldType.repeated ? 'repeated ' : property.optional || fieldType.nullable ? 'optional ' : '';
|
|
159
|
+
return `${qualifier}${fieldType.type} ${property.name} = ${property.protoField};`;
|
|
160
|
+
}
|
|
161
|
+
#fieldType(node, owner, field, path) {
|
|
162
|
+
switch (node.kind) {
|
|
163
|
+
case 'scalar': {
|
|
164
|
+
const type = this.#scalar(node, path);
|
|
165
|
+
return type === undefined ? undefined : { type, repeated: false, nullable: false };
|
|
166
|
+
}
|
|
167
|
+
case 'array': {
|
|
168
|
+
if (node.element.kind === 'array') {
|
|
169
|
+
return this.#refuse(path, 'a nested array would require `repeated repeated`, which proto3 cannot spell without an explicit wrapper message');
|
|
170
|
+
}
|
|
171
|
+
const element = this.#fieldType(node.element, owner, field, `${path}[]`);
|
|
172
|
+
if (element === undefined)
|
|
173
|
+
return undefined;
|
|
174
|
+
if (element.repeated || element.nullable) {
|
|
175
|
+
return this.#refuse(path, 'a repeated protobuf element cannot itself be repeated or nullable');
|
|
176
|
+
}
|
|
177
|
+
return { type: element.type, repeated: true, nullable: false };
|
|
178
|
+
}
|
|
179
|
+
case 'object': {
|
|
180
|
+
const type = this.#renderMessage(node, path);
|
|
181
|
+
return type === undefined ? undefined : { type, repeated: false, nullable: false };
|
|
182
|
+
}
|
|
183
|
+
case 'ref': {
|
|
184
|
+
const type = this.#rawObjectNames.get(node.name);
|
|
185
|
+
return type === undefined
|
|
186
|
+
? this.#refuse(path, `protobuf back-reference \`${node.name}\` has no message declaration`)
|
|
187
|
+
: { type, repeated: false, nullable: false };
|
|
188
|
+
}
|
|
189
|
+
case 'union':
|
|
190
|
+
return this.#union(node.members, owner, field, path);
|
|
191
|
+
case 'literal':
|
|
192
|
+
if (typeof node.value === 'string') {
|
|
193
|
+
return {
|
|
194
|
+
type: this.#enum(owner, field, [node.value]),
|
|
195
|
+
repeated: false,
|
|
196
|
+
nullable: false,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return this.#refuse(path, 'a numeric or boolean literal has no protobuf descriptor constraint');
|
|
200
|
+
case 'tuple':
|
|
201
|
+
return this.#refuse(path, 'a tuple has no protobuf field spelling; declare a numbered wrapper message');
|
|
202
|
+
case 'unknown':
|
|
203
|
+
return this.#refuse(path, '`unknown` has no protobuf wire type');
|
|
204
|
+
case 'null':
|
|
205
|
+
case 'undefined':
|
|
206
|
+
return this.#refuse(path, 'a protobuf field cannot contain only null or undefined');
|
|
207
|
+
case 'unsupported':
|
|
208
|
+
return this.#refuse(path, node.reason, node.source);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
#union(members, owner, field, path) {
|
|
212
|
+
const values = members.filter(member => member.kind !== 'null' && member.kind !== 'undefined');
|
|
213
|
+
const nullable = members.some(member => member.kind === 'null');
|
|
214
|
+
const literals = values.filter(member => member.kind === 'literal' && typeof member.value === 'string');
|
|
215
|
+
if (literals.length === values.length && literals.length > 0) {
|
|
216
|
+
return {
|
|
217
|
+
type: this.#enum(owner, field, literals.map(member => (member.kind === 'literal' && typeof member.value === 'string' ? member.value : ''))),
|
|
218
|
+
repeated: false,
|
|
219
|
+
nullable,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const [only] = values;
|
|
223
|
+
if (values.length === 1 && only !== undefined) {
|
|
224
|
+
const resolved = this.#fieldType(only, owner, field, path);
|
|
225
|
+
return resolved === undefined ? undefined : { ...resolved, nullable: resolved.nullable || nullable };
|
|
226
|
+
}
|
|
227
|
+
if (values.some(member => member.kind === 'object')) {
|
|
228
|
+
return this.#refuse(path, 'a union of message types would require `oneof`, but union arms have no ProtoField<N> tag slot');
|
|
229
|
+
}
|
|
230
|
+
return this.#refuse(path, 'this TypeScript union has no single protobuf field spelling');
|
|
231
|
+
}
|
|
232
|
+
#scalar(node, path) {
|
|
233
|
+
const plan = planScalar(node, path, () => {
|
|
234
|
+
this.#needsTimestamp = true;
|
|
235
|
+
return 'google.protobuf.Timestamp';
|
|
236
|
+
}, (location, reason, source) => this.#refuse(location, reason, source));
|
|
237
|
+
return plan?.kind === 'timestamp' ? plan.helper : plan?.method;
|
|
238
|
+
}
|
|
239
|
+
#enum(owner, field, values) {
|
|
240
|
+
const fingerprint = `${owner}:${field}:${JSON.stringify(values)}`;
|
|
241
|
+
const cached = this.#renderedEnums.get(fingerprint);
|
|
242
|
+
if (cached !== undefined)
|
|
243
|
+
return cached;
|
|
244
|
+
const name = this.#reserveName(`${owner}_${pascal(field)}`);
|
|
245
|
+
const prefix = screaming(name);
|
|
246
|
+
const unspecified = `${prefix}_UNSPECIFIED`;
|
|
247
|
+
const used = new Set([unspecified]);
|
|
248
|
+
const members = [` ${unspecified} = 0;`];
|
|
249
|
+
for (const [index, value] of values.entries()) {
|
|
250
|
+
const base = `${prefix}_${screaming(value)}`;
|
|
251
|
+
let member = base;
|
|
252
|
+
let suffix = 2;
|
|
253
|
+
while (used.has(member))
|
|
254
|
+
member = `${base}_${suffix++}`;
|
|
255
|
+
used.add(member);
|
|
256
|
+
members.push(` ${member} = ${index + 1};`);
|
|
257
|
+
}
|
|
258
|
+
this.#definitions.push(`enum ${name} {\n${members.join('\n')}\n}`);
|
|
259
|
+
this.#renderedEnums.set(fingerprint, name);
|
|
260
|
+
return name;
|
|
261
|
+
}
|
|
262
|
+
#reserveName(raw) {
|
|
263
|
+
const base = protoName(raw);
|
|
264
|
+
let candidate = base;
|
|
265
|
+
let suffix = 2;
|
|
266
|
+
while (this.#usedNames.has(candidate))
|
|
267
|
+
candidate = `${base}_${suffix++}`;
|
|
268
|
+
this.#usedNames.add(candidate);
|
|
269
|
+
return candidate;
|
|
270
|
+
}
|
|
271
|
+
#refuse(path, reason, source) {
|
|
272
|
+
this.#diagnostics.push(source === undefined ? { path, reason } : { path, reason, source });
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function rootName(node) {
|
|
277
|
+
if (node.kind === 'object' && node.name !== undefined)
|
|
278
|
+
return node.name;
|
|
279
|
+
if (node.kind === 'union') {
|
|
280
|
+
for (const member of node.members) {
|
|
281
|
+
if (member.kind === 'object' && member.name !== undefined)
|
|
282
|
+
return member.name;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return 'message';
|
|
286
|
+
}
|
|
287
|
+
function protoName(raw) {
|
|
288
|
+
const cleaned = raw.replaceAll(/[^A-Za-z0-9_]/g, '_');
|
|
289
|
+
const nonEmpty = cleaned.length === 0 ? 'Message' : cleaned;
|
|
290
|
+
return /^[A-Za-z_]/.test(nonEmpty) ? nonEmpty : `Message_${nonEmpty}`;
|
|
291
|
+
}
|
|
292
|
+
function pascal(raw) {
|
|
293
|
+
const words = raw.split(/[^A-Za-z0-9]+/).filter(word => word.length > 0);
|
|
294
|
+
if (words.length === 0)
|
|
295
|
+
return 'Field';
|
|
296
|
+
return words.map(word => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`).join('');
|
|
297
|
+
}
|
|
298
|
+
function screaming(raw) {
|
|
299
|
+
const separated = raw.replaceAll(/([a-z0-9])([A-Z])/g, '$1_$2').replaceAll(/[^A-Za-z0-9]+/g, '_');
|
|
300
|
+
const upper = separated.replaceAll(/^_+|_+$/g, '').toUpperCase();
|
|
301
|
+
return upper.length === 0 ? 'VALUE' : upper;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/protobuf/descriptor.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,oEAAoE;AACpE,mFAAmF;AACnF,6DAA6D;AAE7D,OAAO,EAA8D,MAAM,iBAAiB,CAAC;AAG7F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAmBnD,MAAM,OAAO,GAAG,uDAAuD,CAAC;AAExE,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,aAAsB;IACtE,OAAO,IAAI,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,OAAe,EAAE,GAAW;IAClF,OAAO,IAAI,iBAAiB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,iBAAiB;IACZ,YAAY,GAAgC,EAAE,CAAC;IAC/C,YAAY,GAAa,EAAE,CAAC;IAC5B,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,eAAe,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC,IAAY,EAAE,aAAsB;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,MAAM,GACV,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;gBAC5E,CAAC,CAAC,+FAA+F;gBACjG,CAAC,CAAC,sDAAsD,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3B,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QAC5D,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5E,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,QAAQ,CAAC,IAAmB,EAAE,OAAe,EAAE,GAAW;QACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,OAAO,+CAA+C,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,GAAG,yCAAyC,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,8CAA8C,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,UAAU,EAAE,0CAA0C,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,EAAE,2CAA2C,CAAC,CAAC;gBACrF,SAAS;YACX,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACpF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;YAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC;YACjF,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,KAAK,WAAW,cAAc,YAAY,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,OAAO,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,GAAY;QACpB,MAAM,KAAK,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,eAAe;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,2CAA2C,CAAC,CAAC;QACtF,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,mBAAmB,CAAC,IAAY,EAAE,SAAiB;QACjD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;gBACtB,MAAM,QAAQ,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/E,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClC,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;oBAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACrF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACvC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9E,CAAC;gBACD,OAAO;YACT,CAAC;YACD,KAAK,OAAO;gBACV,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAClD,OAAO;YACT,KAAK,OAAO;gBACV,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;oBACvD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO;YACT,KAAK,OAAO;gBACV,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;oBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC/E,OAAO;YACT;gBACE,OAAO;QACX,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAc,EAAE,IAAY;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,2DAA2D,CAAC,CAAC;QAC/G,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvF,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAC9G,CAAC;QACF,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAEnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAoB,EAAE,IAAY;QACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,6CAA6C,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,uBAAuB,QAAQ,CAAC,IAAI,sCAAsC,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7E,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,IAAI,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,EACJ,mGAAmG,CACpG,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,UAAU,GAAG,CAAC;IACpF,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,IAAY;QACjE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACtC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACrF,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACb,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,EACJ,iHAAiH,CAClH,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;gBACzE,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAC5C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mEAAmE,CAAC,CAAC;gBACjG,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACjE,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACrF,CAAC;YACD,KAAK,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,IAAI,KAAK,SAAS;oBACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,6BAA6B,IAAI,CAAC,IAAI,+BAA+B,CAAC;oBAC3F,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACjD,CAAC;YACD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACvD,KAAK,SAAS;gBACZ,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACnC,OAAO;wBACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC5C,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,KAAK;qBAChB,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,oEAAoE,CAAC,CAAC;YAClG,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,4EAA4E,CAAC,CAAC;YAC1G,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;YACnE,KAAK,MAAM,CAAC;YACZ,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,wDAAwD,CAAC,CAAC;YACtF,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAA0B,EAAE,KAAa,EAAE,KAAa,EAAE,IAAY;QAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;QACxG,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,KAAK,CACd,KAAK,EACL,KAAK,EACL,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAC5G;gBACD,QAAQ,EAAE,KAAK;gBACf,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3D,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACvG,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,EACJ,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,6DAA6D,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,CAAC,IAAc,EAAE,IAAY;QAClC,MAAM,IAAI,GAAG,UAAU,CACrB,IAAI,EACJ,IAAI,EACJ,GAAG,EAAE;YACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,2BAA2B,CAAC;QACrC,CAAC,EACD,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CACrE,CAAC;QACF,OAAO,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,MAAyB;QAC3D,MAAM,WAAW,GAAG,GAAG,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,GAAG,MAAM,cAAc,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,KAAK,WAAW,OAAO,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,MAAc,EAAE,MAAe;QACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3F,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type TypeIR } from '@zmdb/schema/ir';
|
|
2
|
+
export interface ProtoEncodeDiagnostic {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
readonly source?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ProtoEncoderOptions {
|
|
8
|
+
/** Unique valid-identifier prefix supplied by the file-level emitter. */
|
|
9
|
+
readonly namespace: string;
|
|
10
|
+
/** Local identifier bound to the emitted wire-runtime import. */
|
|
11
|
+
readonly writer: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProtoEncoderResult {
|
|
14
|
+
readonly entry?: string;
|
|
15
|
+
readonly helpers: readonly string[];
|
|
16
|
+
readonly diagnostics: readonly ProtoEncodeDiagnostic[];
|
|
17
|
+
}
|
|
18
|
+
/** Emit all helper declarations and the root helper to call, or named diagnostics. */
|
|
19
|
+
export declare function emitProtoEncoder(root: TypeIR, preferredName: string, options: ProtoEncoderOptions): ProtoEncoderResult;
|
|
20
|
+
//# sourceMappingURL=encode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/protobuf/encode.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiD,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAe7F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACxD;AAID,sFAAsF;AACtF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAEpB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// TypeIR -> straight-line protobuf encoder JavaScript.
|
|
2
|
+
//
|
|
3
|
+
// This is build-time only. The generated functions access named properties directly
|
|
4
|
+
// and call the small wire runtime; no descriptor, field table or property-name loop
|
|
5
|
+
// reaches the application.
|
|
6
|
+
import {} from '@zmdb/schema/ir';
|
|
7
|
+
import { collectMessages, IDENTIFIER, isPacked, planField, planScalar, safeName, } from './plan.js';
|
|
8
|
+
/** Emit all helper declarations and the root helper to call, or named diagnostics. */
|
|
9
|
+
export function emitProtoEncoder(root, preferredName, options) {
|
|
10
|
+
return new EncoderEmitter(options).emit(root, preferredName);
|
|
11
|
+
}
|
|
12
|
+
class EncoderEmitter {
|
|
13
|
+
#options;
|
|
14
|
+
#diagnostics = [];
|
|
15
|
+
#objects = [];
|
|
16
|
+
#objectHelpers = new Map();
|
|
17
|
+
#namedHelpers = new Map();
|
|
18
|
+
#auxiliary = [];
|
|
19
|
+
#messages = [];
|
|
20
|
+
#counter = 0;
|
|
21
|
+
#timestampHelper;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.#options = options;
|
|
24
|
+
}
|
|
25
|
+
emit(root, preferredName) {
|
|
26
|
+
if (root.kind !== 'object') {
|
|
27
|
+
const reason = root.kind === 'union' && root.members.some(member => member.kind === 'object')
|
|
28
|
+
? 'a union of message types would require `oneof`, but union arms have no ProtoField<N> tag slot'
|
|
29
|
+
: 'a protobuf encoder root must be an object message';
|
|
30
|
+
this.#refuse(preferredName, reason);
|
|
31
|
+
return { helpers: [], diagnostics: this.#diagnostics };
|
|
32
|
+
}
|
|
33
|
+
this.#collect(root, preferredName);
|
|
34
|
+
for (const message of this.#objects)
|
|
35
|
+
this.#renderMessage(message);
|
|
36
|
+
if (this.#diagnostics.length > 0)
|
|
37
|
+
return { helpers: [], diagnostics: this.#diagnostics };
|
|
38
|
+
const entry = this.#objectHelpers.get(root);
|
|
39
|
+
if (entry === undefined) {
|
|
40
|
+
this.#refuse(preferredName, 'the protobuf root did not receive an encoder helper');
|
|
41
|
+
return { helpers: [], diagnostics: this.#diagnostics };
|
|
42
|
+
}
|
|
43
|
+
return { entry, helpers: [...this.#auxiliary, ...this.#messages], diagnostics: [] };
|
|
44
|
+
}
|
|
45
|
+
#collect(node, suggested) {
|
|
46
|
+
collectMessages(node, suggested, (message, name) => {
|
|
47
|
+
if (this.#objectHelpers.has(message))
|
|
48
|
+
return false;
|
|
49
|
+
const helper = this.#name(`Encode${safeName(message.name ?? name)}`);
|
|
50
|
+
this.#objectHelpers.set(message, helper);
|
|
51
|
+
if (message.name !== undefined && !this.#namedHelpers.has(message.name)) {
|
|
52
|
+
this.#namedHelpers.set(message.name, helper);
|
|
53
|
+
}
|
|
54
|
+
this.#objects.push(message);
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
#renderMessage(node) {
|
|
59
|
+
const helper = this.#objectHelpers.get(node);
|
|
60
|
+
if (helper === undefined) {
|
|
61
|
+
this.#refuse(node.name ?? 'Message', 'the protobuf message did not receive an encoder helper');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const lines = [`const _w = new ${this.#options.writer}();`];
|
|
65
|
+
const ordered = node.properties.toSorted((left, right) => (left.protoField ?? Number.MAX_SAFE_INTEGER) - (right.protoField ?? Number.MAX_SAFE_INTEGER));
|
|
66
|
+
for (const property of ordered) {
|
|
67
|
+
lines.push(...this.#field(property, `${node.name ?? 'Message'}.${property.name}`));
|
|
68
|
+
}
|
|
69
|
+
lines.push('return _w.finish();');
|
|
70
|
+
this.#messages.push(`function ${helper}(_v) { ${lines.join(' ')} }`);
|
|
71
|
+
}
|
|
72
|
+
#field(property, path) {
|
|
73
|
+
if (!IDENTIFIER.test(property.name)) {
|
|
74
|
+
this.#refuse(path, `\`${property.name}\` is not a valid protobuf field identifier`);
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
if (property.protoField === undefined) {
|
|
78
|
+
this.#refuse(path, `protobuf property \`${property.name}\` has no ProtoField<N> field number`);
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
const plan = this.#fieldPlan(property.type, path);
|
|
82
|
+
if (plan === undefined)
|
|
83
|
+
return [];
|
|
84
|
+
if (property.optional && plan.nullable) {
|
|
85
|
+
this.#refuse(path, 'an optional nullable protobuf field has three TypeScript states but only two wire-presence states');
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const value = `_v.${property.name}`;
|
|
89
|
+
if (plan.repeated) {
|
|
90
|
+
const body = this.#repeated(plan.atom, value, property.protoField);
|
|
91
|
+
if (property.optional)
|
|
92
|
+
return [`if (${value} !== undefined) { ${body.join(' ')} }`];
|
|
93
|
+
if (plan.nullable)
|
|
94
|
+
return [`if (${value} !== null) { ${body.join(' ')} }`];
|
|
95
|
+
return body;
|
|
96
|
+
}
|
|
97
|
+
const body = this.#singular(plan.atom, value, property.protoField);
|
|
98
|
+
if (property.optional)
|
|
99
|
+
return [`if (${value} !== undefined) { ${body.join(' ')} }`];
|
|
100
|
+
if (plan.nullable)
|
|
101
|
+
return [`if (${value} !== null) { ${body.join(' ')} }`];
|
|
102
|
+
const nonDefault = defaultGuard(plan.atom, value);
|
|
103
|
+
return nonDefault === undefined ? body : [`if (${nonDefault}) { ${body.join(' ')} }`];
|
|
104
|
+
}
|
|
105
|
+
#fieldPlan(node, path) {
|
|
106
|
+
return planField(node, path, (value, location) => this.#atom(value, location), (location, values) => this.#enum(location, values), (location, reason, origin) => this.#refuse(location, reason, origin));
|
|
107
|
+
}
|
|
108
|
+
#atom(node, path) {
|
|
109
|
+
switch (node.kind) {
|
|
110
|
+
case 'scalar':
|
|
111
|
+
return this.#scalar(node, path);
|
|
112
|
+
case 'object': {
|
|
113
|
+
const helper = this.#objectHelpers.get(node);
|
|
114
|
+
return helper === undefined
|
|
115
|
+
? this.#refuse(path, 'the nested protobuf message did not receive an encoder helper')
|
|
116
|
+
: { kind: 'message', helper, wire: 2 };
|
|
117
|
+
}
|
|
118
|
+
case 'ref': {
|
|
119
|
+
const helper = this.#namedHelpers.get(node.name);
|
|
120
|
+
return helper === undefined
|
|
121
|
+
? this.#refuse(path, `protobuf back-reference \`${node.name}\` has no message declaration`)
|
|
122
|
+
: { kind: 'message', helper, wire: 2 };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
#scalar(node, path) {
|
|
127
|
+
return planScalar(node, path, () => this.#timestamp(), (location, reason, origin) => this.#refuse(location, reason, origin));
|
|
128
|
+
}
|
|
129
|
+
#enum(path, values) {
|
|
130
|
+
const helper = this.#name('Enum');
|
|
131
|
+
const cases = values.map((value, index) => `case ${JSON.stringify(value)}: return ${index + 1};`);
|
|
132
|
+
const message = `unknown protobuf enum value for ${path}`;
|
|
133
|
+
this.#auxiliary.push(`function ${helper}(_v) { switch (_v) { ${cases.join(' ')} default: throw new TypeError(${JSON.stringify(message)}); } }`);
|
|
134
|
+
return { kind: 'enum', helper, wire: 0 };
|
|
135
|
+
}
|
|
136
|
+
#timestamp() {
|
|
137
|
+
if (this.#timestampHelper !== undefined)
|
|
138
|
+
return this.#timestampHelper;
|
|
139
|
+
const helper = this.#name('Timestamp');
|
|
140
|
+
this.#timestampHelper = helper;
|
|
141
|
+
this.#auxiliary.push(`function ${helper}(_v) { ` +
|
|
142
|
+
`const _w = new ${this.#options.writer}(); ` +
|
|
143
|
+
'const _ms = BigInt(_v.getTime()); ' +
|
|
144
|
+
'let _seconds = _ms / 1000n; ' +
|
|
145
|
+
'let _nanos = (_ms % 1000n) * 1000000n; ' +
|
|
146
|
+
'if (_nanos < 0n) { _seconds -= 1n; _nanos += 1000000000n; } ' +
|
|
147
|
+
'if (_seconds !== 0n) { _w.tag(1, 0); _w.int64(_seconds); } ' +
|
|
148
|
+
'if (_nanos !== 0n) { _w.tag(2, 0); _w.int32(Number(_nanos)); } ' +
|
|
149
|
+
'return _w.finish(); }');
|
|
150
|
+
return helper;
|
|
151
|
+
}
|
|
152
|
+
#singular(atom, value, fieldNumber) {
|
|
153
|
+
switch (atom.kind) {
|
|
154
|
+
case 'scalar':
|
|
155
|
+
return [`_w.tag(${fieldNumber}, ${atom.wire});`, `_w.${atom.method}(${value});`];
|
|
156
|
+
case 'enum':
|
|
157
|
+
return [`_w.tag(${fieldNumber}, 0);`, `_w.uint32(${atom.helper}(${value}));`];
|
|
158
|
+
case 'message':
|
|
159
|
+
case 'timestamp':
|
|
160
|
+
return [`_w.tag(${fieldNumber}, 2);`, `_w.bytes(${atom.helper}(${value}));`];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
#repeated(atom, value, fieldNumber) {
|
|
164
|
+
if (isPacked(atom)) {
|
|
165
|
+
const payload = this.#name('Packed');
|
|
166
|
+
const element = this.#name('Element');
|
|
167
|
+
const write = atom.kind === 'enum'
|
|
168
|
+
? `${payload}.uint32(${atom.helper}(${element}));`
|
|
169
|
+
: `${payload}.${atom.method}(${element});`;
|
|
170
|
+
return [
|
|
171
|
+
`if (${value}.length !== 0) { ` +
|
|
172
|
+
`const ${payload} = new ${this.#options.writer}(); ` +
|
|
173
|
+
`for (const ${element} of ${value}) { ${write} } ` +
|
|
174
|
+
`_w.tag(${fieldNumber}, 2); _w.bytes(${payload}.finish()); }`,
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
const element = this.#name('Element');
|
|
178
|
+
const write = this.#singular(atom, element, fieldNumber).join(' ');
|
|
179
|
+
return [`for (const ${element} of ${value}) { ${write} }`];
|
|
180
|
+
}
|
|
181
|
+
#name(hint) {
|
|
182
|
+
return `${this.#options.namespace}${hint}${this.#counter++}`;
|
|
183
|
+
}
|
|
184
|
+
#refuse(path, reason, source) {
|
|
185
|
+
this.#diagnostics.push(source === undefined ? { path, reason } : { path, reason, source });
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function defaultGuard(atom, value) {
|
|
190
|
+
if (atom.kind !== 'scalar')
|
|
191
|
+
return undefined;
|
|
192
|
+
switch (atom.zero) {
|
|
193
|
+
case 'number':
|
|
194
|
+
return `${value} !== 0`;
|
|
195
|
+
case 'bigint':
|
|
196
|
+
return `${value} !== 0n`;
|
|
197
|
+
case 'boolean':
|
|
198
|
+
return value;
|
|
199
|
+
case 'string':
|
|
200
|
+
return `${value} !== ""`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/protobuf/encode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type TypeIR } from '@zmdb/schema/ir';
|
|
2
|
+
/** One service method reflected into the existing protobuf message IR. */
|
|
3
|
+
export interface GrpcMethodIR {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly request: TypeIR;
|
|
6
|
+
readonly requestName: string;
|
|
7
|
+
readonly response: TypeIR;
|
|
8
|
+
readonly responseName: string;
|
|
9
|
+
readonly requestStream: boolean;
|
|
10
|
+
readonly responseStream: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** The build-time portion of a gRPC service declaration. */
|
|
13
|
+
export interface GrpcServiceIR {
|
|
14
|
+
readonly methods: readonly GrpcMethodIR[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=grpc-ir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc-ir.d.ts","sourceRoot":"","sources":["../../src/protobuf/grpc-ir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc-ir.js","sourceRoot":"","sources":["../../src/protobuf/grpc-ir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ObjectIR, type ScalarIR, type TypeIR } from '@zmdb/schema/ir';
|
|
2
|
+
type NumericMethod = 'uint32' | 'int32' | 'sint32' | 'uint64' | 'int64' | 'sint64' | 'fixed32' | 'sfixed32' | 'fixed64' | 'sfixed64' | 'float' | 'double';
|
|
3
|
+
export type ScalarZero = 'number' | 'bigint' | 'boolean' | 'string';
|
|
4
|
+
export interface ScalarPlan<Zero extends string = ScalarZero> {
|
|
5
|
+
readonly kind: 'scalar';
|
|
6
|
+
readonly method: NumericMethod | 'bool' | 'string';
|
|
7
|
+
readonly wire: 0 | 1 | 2 | 5;
|
|
8
|
+
readonly zero: Zero;
|
|
9
|
+
}
|
|
10
|
+
export interface EnumPlan {
|
|
11
|
+
readonly kind: 'enum';
|
|
12
|
+
readonly helper: string;
|
|
13
|
+
readonly wire: 0;
|
|
14
|
+
}
|
|
15
|
+
export interface MessagePlan {
|
|
16
|
+
readonly kind: 'message';
|
|
17
|
+
readonly helper: string;
|
|
18
|
+
readonly wire: 2;
|
|
19
|
+
}
|
|
20
|
+
export interface TimestampPlan {
|
|
21
|
+
readonly kind: 'timestamp';
|
|
22
|
+
readonly helper: string;
|
|
23
|
+
readonly wire: 2;
|
|
24
|
+
}
|
|
25
|
+
export type AtomPlan<Zero extends string = ScalarZero> = ScalarPlan<Zero> | EnumPlan | MessagePlan | TimestampPlan;
|
|
26
|
+
export interface FieldPlan<Atom> {
|
|
27
|
+
readonly atom: Atom;
|
|
28
|
+
readonly repeated: boolean;
|
|
29
|
+
readonly nullable: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare const IDENTIFIER: RegExp;
|
|
32
|
+
type Refuse = (path: string, reason: string, source?: string) => undefined;
|
|
33
|
+
export type FieldAtomIR = Extract<TypeIR, {
|
|
34
|
+
kind: 'scalar' | 'object' | 'ref';
|
|
35
|
+
}>;
|
|
36
|
+
export declare function collectMessages(node: TypeIR, suggested: string, register: (node: ObjectIR, suggested: string) => boolean): void;
|
|
37
|
+
export declare function planField<Atom>(node: TypeIR, path: string, atomPlan: (node: FieldAtomIR, path: string) => Atom | undefined, enumeration: (path: string, values: readonly string[]) => Atom, refuse: Refuse): FieldPlan<Atom> | undefined;
|
|
38
|
+
export declare function planScalar(node: ScalarIR, path: string, timestamp: () => string, refuse: Refuse): ScalarPlan | TimestampPlan | undefined;
|
|
39
|
+
export declare function isPacked<Zero extends string>(atom: AtomPlan<Zero>): atom is ScalarPlan<Zero> | EnumPlan;
|
|
40
|
+
export declare function safeName(raw: string): string;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=plan.d.ts.map
|