Erster Commit
This commit is contained in:
+86
@@ -0,0 +1,86 @@
|
||||
"use strict";
|
||||
// Copyright 2021-2024 Buf Technologies, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.filterUnknownFields = exports.createExtensionContainer = exports.makeExtension = void 0;
|
||||
const scalars_js_1 = require("./scalars.js");
|
||||
/**
|
||||
* Create a new extension using the given runtime.
|
||||
*/
|
||||
function makeExtension(runtime, typeName, extendee, field) {
|
||||
let fi;
|
||||
return {
|
||||
typeName,
|
||||
extendee,
|
||||
get field() {
|
||||
if (!fi) {
|
||||
const i = (typeof field == "function" ? field() : field);
|
||||
i.name = typeName.split(".").pop();
|
||||
i.jsonName = `[${typeName}]`;
|
||||
fi = runtime.util.newFieldList([i]).list()[0];
|
||||
}
|
||||
return fi;
|
||||
},
|
||||
runtime,
|
||||
};
|
||||
}
|
||||
exports.makeExtension = makeExtension;
|
||||
/**
|
||||
* Create a container that allows us to read extension fields into it with the
|
||||
* same logic as regular fields.
|
||||
*/
|
||||
function createExtensionContainer(extension) {
|
||||
const localName = extension.field.localName;
|
||||
const container = Object.create(null);
|
||||
container[localName] = initExtensionField(extension);
|
||||
return [container, () => container[localName]];
|
||||
}
|
||||
exports.createExtensionContainer = createExtensionContainer;
|
||||
function initExtensionField(ext) {
|
||||
const field = ext.field;
|
||||
if (field.repeated) {
|
||||
return [];
|
||||
}
|
||||
if (field.default !== undefined) {
|
||||
return field.default;
|
||||
}
|
||||
switch (field.kind) {
|
||||
case "enum":
|
||||
return field.T.values[0].no;
|
||||
case "scalar":
|
||||
return (0, scalars_js_1.scalarZeroValue)(field.T, field.L);
|
||||
case "message":
|
||||
// eslint-disable-next-line no-case-declarations
|
||||
const T = field.T, value = new T();
|
||||
return T.fieldWrapper ? T.fieldWrapper.unwrapField(value) : value;
|
||||
case "map":
|
||||
throw "map fields are not allowed to be extensions";
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Helper to filter unknown fields, optimized based on field type.
|
||||
*/
|
||||
function filterUnknownFields(unknownFields, field) {
|
||||
if (!field.repeated && (field.kind == "enum" || field.kind == "scalar")) {
|
||||
// singular scalar fields do not merge, we pick the last
|
||||
for (let i = unknownFields.length - 1; i >= 0; --i) {
|
||||
if (unknownFields[i].no == field.no) {
|
||||
return [unknownFields[i]];
|
||||
}
|
||||
}
|
||||
return [];
|
||||
}
|
||||
return unknownFields.filter((uf) => uf.no === field.no);
|
||||
}
|
||||
exports.filterUnknownFields = filterUnknownFields;
|
||||
Reference in New Issue
Block a user