"use strict";
/*!
 * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
 * Licensed under the MIT License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.EncodedSharedBranch = exports.SummarySessionBranch = exports.SequencedCommit = void 0;
const typebox_1 = require("@sinclair/typebox");
const index_js_1 = require("../core/index.js");
const index_js_2 = require("../util/index.js");
const noAdditionalProps = { additionalProperties: false };
// Many of the return types in this module are intentionally derived, rather than explicitly specified.
/* eslint-disable @typescript-eslint/explicit-function-return-type */
const CommitBase = (tChange) => typebox_1.Type.Object({
    revision: index_js_1.RevisionTagSchema,
    change: tChange,
    sessionId: index_js_1.SessionIdSchema,
});
/**
 * @privateRemarks Commits are generally encoded from `GraphCommit`s, which often contain extra data.
 * This `noAdditionalProps` is especially important in that light.
 */
const Commit = (tChange) => typebox_1.Type.Composite([CommitBase(tChange)], noAdditionalProps);
const SeqNumber = (0, index_js_2.brandedNumberType)({ multipleOf: 1 });
const SequenceId = typebox_1.Type.Object({
    sequenceNumber: SeqNumber,
    indexInBatch: typebox_1.Type.Optional(typebox_1.Type.Number({ multipleOf: 1, minimum: 0 })),
});
const SequencedCommit = (tChange) => typebox_1.Type.Composite([CommitBase(tChange), SequenceId], noAdditionalProps);
exports.SequencedCommit = SequencedCommit;
const SummarySessionBranch = (tChange) => typebox_1.Type.Object({
    base: index_js_1.RevisionTagSchema,
    commits: typebox_1.Type.Array(Commit(tChange)),
}, noAdditionalProps);
exports.SummarySessionBranch = SummarySessionBranch;
const EncodedSharedBranch = (tChange) => typebox_1.Type.Object({
    id: typebox_1.Type.Optional(typebox_1.Type.Number()),
    name: typebox_1.Type.Optional(typebox_1.Type.String()),
    session: typebox_1.Type.Optional(index_js_1.SessionIdSchema),
    author: typebox_1.Type.Optional(typebox_1.Type.String()),
    base: typebox_1.Type.Optional(index_js_1.RevisionTagSchema),
    trunk: typebox_1.Type.Array((0, exports.SequencedCommit)(tChange)),
    peers: typebox_1.Type.Array(typebox_1.Type.Tuple([index_js_1.SessionIdSchema, (0, exports.SummarySessionBranch)(tChange)])),
}, noAdditionalProps);
exports.EncodedSharedBranch = EncodedSharedBranch;
/* eslint-enable @typescript-eslint/explicit-function-return-type */
//# sourceMappingURL=editManagerFormatCommons.js.map