effect
Version:
The missing standard library for TypeScript, for writing production-grade software.
1,821 lines (1,819 loc) • 75.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isBigIntKeyword = exports.isAnyKeyword = exports.hasStableFilter = exports.getTypeConstructorAnnotation = exports.getTransformationFrom = exports.getTitleAnnotation = exports.getTemplateLiteralRegExp = exports.getTemplateLiteralCapturingRegExp = exports.getSurrogateAnnotation = exports.getSchemaIdAnnotation = exports.getPropertySignatures = exports.getPropertyKeyIndexedAccess = exports.getParseOptionsAnnotation = exports.getParseIssueTitleAnnotation = exports.getNumberIndexedAccess = exports.getMissingMessageAnnotation = exports.getMessageAnnotation = exports.getJSONSchemaAnnotation = exports.getJSONIdentifierAnnotation = exports.getJSONIdentifier = exports.getIdentifierAnnotation = exports.getExamplesAnnotation = exports.getEncodedParameter = exports.getDocumentationAnnotation = exports.getDescriptionAnnotation = exports.getDefaultAnnotation = exports.getDecodingFallbackAnnotation = exports.getConcurrencyAnnotation = exports.getCompiler = exports.getBrandAnnotation = exports.getBatchingAnnotation = exports.getAutoTitleAnnotation = exports.getAnnotation = exports.flatten = exports.equals = exports.encodedBoundAST = exports.encodedAST = exports.defaultParseOption = exports.composeTransformation = exports.compose = exports.booleanKeyword = exports.bigIntKeyword = exports.anyKeyword = exports.annotations = exports.VoidKeyword = exports.UnknownKeyword = exports.UniqueSymbol = exports.Union = exports.UndefinedKeyword = exports.TypeLiteralTransformation = exports.TypeLiteral = exports.TypeConstructorAnnotationId = exports.Type = exports.TupleType = exports.Transformation = exports.TitleAnnotationId = exports.TemplateLiteralSpan = exports.TemplateLiteral = exports.SymbolKeyword = exports.Suspend = exports.SurrogateAnnotationId = exports.StringKeyword = exports.StableFilterAnnotationId = exports.SchemaIdAnnotationId = exports.Refinement = exports.PropertySignatureTransformation = exports.PropertySignature = exports.PrettyAnnotationId = exports.ParseOptionsAnnotationId = exports.ParseJsonSchemaId = exports.ParseIssueTitleAnnotationId = exports.OptionalType = exports.ObjectKeyword = exports.NumberKeyword = exports.NeverKeyword = exports.MissingMessageAnnotationId = exports.MessageAnnotationId = exports.Literal = exports.JSONSchemaAnnotationId = exports.JSONIdentifierAnnotationId = exports.IndexSignature = exports.IdentifierAnnotationId = exports.FinalTransformation = exports.ExamplesAnnotationId = exports.EquivalenceAnnotationId = exports.Enums = exports.DocumentationAnnotationId = exports.DescriptionAnnotationId = exports.DefaultAnnotationId = exports.DecodingFallbackAnnotationId = exports.Declaration = exports.ConcurrencyAnnotationId = exports.ComposeTransformation = exports.BrandAnnotationId = exports.BooleanKeyword = exports.BigIntKeyword = exports.BatchingAnnotationId = exports.AutoTitleAnnotationId = exports.ArbitraryAnnotationId = exports.AnyKeyword = void 0;
exports.voidKeyword = exports.unknownKeyword = exports.unify = exports.undefinedKeyword = exports.typeAST = exports.symbolKeyword = exports.stringKeyword = exports.required = exports.rename = exports.record = exports.pruneUndefined = exports.pickAnnotations = exports.pick = exports.partial = exports.orUndefined = exports.omitAnnotations = exports.omit = exports.objectKeyword = exports.numberKeyword = exports.null = exports.neverKeyword = exports.mutable = exports.mapMembers = exports.keyof = exports.isVoidKeyword = exports.isUnknownKeyword = exports.isUniqueSymbol = exports.isUnion = exports.isUndefinedKeyword = exports.isTypeLiteralTransformation = exports.isTypeLiteral = exports.isTupleType = exports.isTransformation = exports.isTemplateLiteral = exports.isSymbolKeyword = exports.isSuspend = exports.isStringKeyword = exports.isRefinement = exports.isParameter = exports.isObjectKeyword = exports.isNumberKeyword = exports.isNeverKeyword = exports.isMembers = exports.isLiteral = exports.isFinalTransformation = exports.isEnums = exports.isDeclaration = exports.isComposeTransformation = exports.isBooleanKeyword = void 0;
var Arr = _interopRequireWildcard(require("./Array.js"));
var _Function = require("./Function.js");
var _GlobalValue = require("./GlobalValue.js");
var Inspectable = _interopRequireWildcard(require("./Inspectable.js"));
var errors_ = _interopRequireWildcard(require("./internal/schema/errors.js"));
var util_ = _interopRequireWildcard(require("./internal/schema/util.js"));
var Number = _interopRequireWildcard(require("./Number.js"));
var Option = _interopRequireWildcard(require("./Option.js"));
var Order = _interopRequireWildcard(require("./Order.js"));
var Predicate = _interopRequireWildcard(require("./Predicate.js"));
var regexp = _interopRequireWildcard(require("./RegExp.js"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
/**
* @since 3.10.0
*/
/**
* @category annotations
* @since 3.19.0
* @experimental
*/
const TypeConstructorAnnotationId = exports.TypeConstructorAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/TypeConstructor");
/**
* @category annotations
* @since 3.10.0
*/
const BrandAnnotationId = exports.BrandAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Brand");
/**
* @category annotations
* @since 3.10.0
*/
const SchemaIdAnnotationId = exports.SchemaIdAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/SchemaId");
/**
* @category annotations
* @since 3.10.0
*/
const MessageAnnotationId = exports.MessageAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Message");
/**
* @category annotations
* @since 3.10.0
*/
const MissingMessageAnnotationId = exports.MissingMessageAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/MissingMessage");
/**
* @category annotations
* @since 3.10.0
*/
const IdentifierAnnotationId = exports.IdentifierAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Identifier");
/**
* @category annotations
* @since 3.10.0
*/
const TitleAnnotationId = exports.TitleAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Title");
/** @internal */
const AutoTitleAnnotationId = exports.AutoTitleAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/AutoTitle");
/**
* @category annotations
* @since 3.10.0
*/
const DescriptionAnnotationId = exports.DescriptionAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Description");
/**
* @category annotations
* @since 3.10.0
*/
const ExamplesAnnotationId = exports.ExamplesAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Examples");
/**
* @category annotations
* @since 3.10.0
*/
const DefaultAnnotationId = exports.DefaultAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Default");
/**
* @category annotations
* @since 3.10.0
*/
const JSONSchemaAnnotationId = exports.JSONSchemaAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/JSONSchema");
/**
* @category annotations
* @since 3.10.0
*/
const ArbitraryAnnotationId = exports.ArbitraryAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Arbitrary");
/**
* @category annotations
* @since 3.10.0
*/
const PrettyAnnotationId = exports.PrettyAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Pretty");
/**
* @category annotations
* @since 3.10.0
*/
const EquivalenceAnnotationId = exports.EquivalenceAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Equivalence");
/**
* @category annotations
* @since 3.10.0
*/
const DocumentationAnnotationId = exports.DocumentationAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Documentation");
/**
* @category annotations
* @since 3.10.0
*/
const ConcurrencyAnnotationId = exports.ConcurrencyAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Concurrency");
/**
* @category annotations
* @since 3.10.0
*/
const BatchingAnnotationId = exports.BatchingAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Batching");
/**
* @category annotations
* @since 3.10.0
*/
const ParseIssueTitleAnnotationId = exports.ParseIssueTitleAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/ParseIssueTitle");
/**
* @category annotations
* @since 3.10.0
*/
const ParseOptionsAnnotationId = exports.ParseOptionsAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/ParseOptions");
/**
* @category annotations
* @since 3.10.0
*/
const DecodingFallbackAnnotationId = exports.DecodingFallbackAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/DecodingFallback");
/**
* @category annotations
* @since 3.10.0
*/
const SurrogateAnnotationId = exports.SurrogateAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/Surrogate");
/** @internal */
const StableFilterAnnotationId = exports.StableFilterAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/StableFilter");
/**
* @category annotations
* @since 3.10.0
*/
const getAnnotation = exports.getAnnotation = /*#__PURE__*/(0, _Function.dual)(2, (annotated, key) => Object.prototype.hasOwnProperty.call(annotated.annotations, key) ? Option.some(annotated.annotations[key]) : Option.none());
/**
* @category annotations
* @since 3.19.0
* @experimental
*/
const getTypeConstructorAnnotation = exports.getTypeConstructorAnnotation = /*#__PURE__*/getAnnotation(TypeConstructorAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getBrandAnnotation = exports.getBrandAnnotation = /*#__PURE__*/getAnnotation(BrandAnnotationId);
/**
* @category annotations
* @since 3.14.2
*/
const getSchemaIdAnnotation = exports.getSchemaIdAnnotation = /*#__PURE__*/getAnnotation(SchemaIdAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getMessageAnnotation = exports.getMessageAnnotation = /*#__PURE__*/getAnnotation(MessageAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getMissingMessageAnnotation = exports.getMissingMessageAnnotation = /*#__PURE__*/getAnnotation(MissingMessageAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getTitleAnnotation = exports.getTitleAnnotation = /*#__PURE__*/getAnnotation(TitleAnnotationId);
/** @internal */
const getAutoTitleAnnotation = exports.getAutoTitleAnnotation = /*#__PURE__*/getAnnotation(AutoTitleAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getIdentifierAnnotation = exports.getIdentifierAnnotation = /*#__PURE__*/getAnnotation(IdentifierAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getDescriptionAnnotation = exports.getDescriptionAnnotation = /*#__PURE__*/getAnnotation(DescriptionAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getExamplesAnnotation = exports.getExamplesAnnotation = /*#__PURE__*/getAnnotation(ExamplesAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getDefaultAnnotation = exports.getDefaultAnnotation = /*#__PURE__*/getAnnotation(DefaultAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getJSONSchemaAnnotation = exports.getJSONSchemaAnnotation = /*#__PURE__*/getAnnotation(JSONSchemaAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getDocumentationAnnotation = exports.getDocumentationAnnotation = /*#__PURE__*/getAnnotation(DocumentationAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getConcurrencyAnnotation = exports.getConcurrencyAnnotation = /*#__PURE__*/getAnnotation(ConcurrencyAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getBatchingAnnotation = exports.getBatchingAnnotation = /*#__PURE__*/getAnnotation(BatchingAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getParseIssueTitleAnnotation = exports.getParseIssueTitleAnnotation = /*#__PURE__*/getAnnotation(ParseIssueTitleAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getParseOptionsAnnotation = exports.getParseOptionsAnnotation = /*#__PURE__*/getAnnotation(ParseOptionsAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getDecodingFallbackAnnotation = exports.getDecodingFallbackAnnotation = /*#__PURE__*/getAnnotation(DecodingFallbackAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getSurrogateAnnotation = exports.getSurrogateAnnotation = /*#__PURE__*/getAnnotation(SurrogateAnnotationId);
const getStableFilterAnnotation = /*#__PURE__*/getAnnotation(StableFilterAnnotationId);
/** @internal */
const hasStableFilter = annotated => Option.exists(getStableFilterAnnotation(annotated), b => b === true);
/**
* @category annotations
* @since 3.10.0
*/
exports.hasStableFilter = hasStableFilter;
const JSONIdentifierAnnotationId = exports.JSONIdentifierAnnotationId = /*#__PURE__*/Symbol.for("effect/annotation/JSONIdentifier");
/**
* @category annotations
* @since 3.10.0
*/
const getJSONIdentifierAnnotation = exports.getJSONIdentifierAnnotation = /*#__PURE__*/getAnnotation(JSONIdentifierAnnotationId);
/**
* @category annotations
* @since 3.10.0
*/
const getJSONIdentifier = annotated => Option.orElse(getJSONIdentifierAnnotation(annotated), () => getIdentifierAnnotation(annotated));
// -------------------------------------------------------------------------------------
// schema ids
// -------------------------------------------------------------------------------------
/**
* @category schema id
* @since 3.10.0
*/
exports.getJSONIdentifier = getJSONIdentifier;
const ParseJsonSchemaId = exports.ParseJsonSchemaId = /*#__PURE__*/Symbol.for("effect/schema/ParseJson");
/**
* @category model
* @since 3.10.0
*/
class Declaration {
typeParameters;
decodeUnknown;
encodeUnknown;
annotations;
/**
* @since 3.10.0
*/
_tag = "Declaration";
constructor(typeParameters, decodeUnknown, encodeUnknown, annotations = {}) {
this.typeParameters = typeParameters;
this.decodeUnknown = decodeUnknown;
this.encodeUnknown = encodeUnknown;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => "<declaration schema>");
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
typeParameters: this.typeParameters.map(ast => ast.toJSON()),
annotations: toJSONAnnotations(this.annotations)
};
}
}
exports.Declaration = Declaration;
const createASTGuard = tag => ast => ast._tag === tag;
/**
* @category guards
* @since 3.10.0
*/
const isDeclaration = exports.isDeclaration = /*#__PURE__*/createASTGuard("Declaration");
/**
* @category model
* @since 3.10.0
*/
class Literal {
literal;
annotations;
/**
* @since 3.10.0
*/
_tag = "Literal";
constructor(literal, annotations = {}) {
this.literal = literal;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => Inspectable.formatUnknown(this.literal));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
literal: Predicate.isBigInt(this.literal) ? String(this.literal) : this.literal,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.Literal = Literal;
const isLiteral = exports.isLiteral = /*#__PURE__*/createASTGuard("Literal");
const $null = exports.null = /*#__PURE__*/new Literal(null);
/**
* @category model
* @since 3.10.0
*/
class UniqueSymbol {
symbol;
annotations;
/**
* @since 3.10.0
*/
_tag = "UniqueSymbol";
constructor(symbol, annotations = {}) {
this.symbol = symbol;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => Inspectable.formatUnknown(this.symbol));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
symbol: String(this.symbol),
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.UniqueSymbol = UniqueSymbol;
const isUniqueSymbol = exports.isUniqueSymbol = /*#__PURE__*/createASTGuard("UniqueSymbol");
/**
* @category model
* @since 3.10.0
*/
class UndefinedKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "UndefinedKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.UndefinedKeyword = UndefinedKeyword;
const undefinedKeyword = exports.undefinedKeyword = /*#__PURE__*/new UndefinedKeyword({
[TitleAnnotationId]: "undefined"
});
/**
* @category guards
* @since 3.10.0
*/
const isUndefinedKeyword = exports.isUndefinedKeyword = /*#__PURE__*/createASTGuard("UndefinedKeyword");
/**
* @category model
* @since 3.10.0
*/
class VoidKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "VoidKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.VoidKeyword = VoidKeyword;
const voidKeyword = exports.voidKeyword = /*#__PURE__*/new VoidKeyword({
[TitleAnnotationId]: "void"
});
/**
* @category guards
* @since 3.10.0
*/
const isVoidKeyword = exports.isVoidKeyword = /*#__PURE__*/createASTGuard("VoidKeyword");
/**
* @category model
* @since 3.10.0
*/
class NeverKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "NeverKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.NeverKeyword = NeverKeyword;
const neverKeyword = exports.neverKeyword = /*#__PURE__*/new NeverKeyword({
[TitleAnnotationId]: "never"
});
/**
* @category guards
* @since 3.10.0
*/
const isNeverKeyword = exports.isNeverKeyword = /*#__PURE__*/createASTGuard("NeverKeyword");
/**
* @category model
* @since 3.10.0
*/
class UnknownKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "UnknownKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.UnknownKeyword = UnknownKeyword;
const unknownKeyword = exports.unknownKeyword = /*#__PURE__*/new UnknownKeyword({
[TitleAnnotationId]: "unknown"
});
/**
* @category guards
* @since 3.10.0
*/
const isUnknownKeyword = exports.isUnknownKeyword = /*#__PURE__*/createASTGuard("UnknownKeyword");
/**
* @category model
* @since 3.10.0
*/
class AnyKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "AnyKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.AnyKeyword = AnyKeyword;
const anyKeyword = exports.anyKeyword = /*#__PURE__*/new AnyKeyword({
[TitleAnnotationId]: "any"
});
/**
* @category guards
* @since 3.10.0
*/
const isAnyKeyword = exports.isAnyKeyword = /*#__PURE__*/createASTGuard("AnyKeyword");
/**
* @category model
* @since 3.10.0
*/
class StringKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "StringKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.StringKeyword = StringKeyword;
const stringKeyword = exports.stringKeyword = /*#__PURE__*/new StringKeyword({
[TitleAnnotationId]: "string",
[DescriptionAnnotationId]: "a string"
});
/**
* @category guards
* @since 3.10.0
*/
const isStringKeyword = exports.isStringKeyword = /*#__PURE__*/createASTGuard("StringKeyword");
/**
* @category model
* @since 3.10.0
*/
class NumberKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "NumberKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.NumberKeyword = NumberKeyword;
const numberKeyword = exports.numberKeyword = /*#__PURE__*/new NumberKeyword({
[TitleAnnotationId]: "number",
[DescriptionAnnotationId]: "a number"
});
/**
* @category guards
* @since 3.10.0
*/
const isNumberKeyword = exports.isNumberKeyword = /*#__PURE__*/createASTGuard("NumberKeyword");
/**
* @category model
* @since 3.10.0
*/
class BooleanKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "BooleanKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.BooleanKeyword = BooleanKeyword;
const booleanKeyword = exports.booleanKeyword = /*#__PURE__*/new BooleanKeyword({
[TitleAnnotationId]: "boolean",
[DescriptionAnnotationId]: "a boolean"
});
/**
* @category guards
* @since 3.10.0
*/
const isBooleanKeyword = exports.isBooleanKeyword = /*#__PURE__*/createASTGuard("BooleanKeyword");
/**
* @category model
* @since 3.10.0
*/
class BigIntKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "BigIntKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.BigIntKeyword = BigIntKeyword;
const bigIntKeyword = exports.bigIntKeyword = /*#__PURE__*/new BigIntKeyword({
[TitleAnnotationId]: "bigint",
[DescriptionAnnotationId]: "a bigint"
});
/**
* @category guards
* @since 3.10.0
*/
const isBigIntKeyword = exports.isBigIntKeyword = /*#__PURE__*/createASTGuard("BigIntKeyword");
/**
* @category model
* @since 3.10.0
*/
class SymbolKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "SymbolKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.SymbolKeyword = SymbolKeyword;
const symbolKeyword = exports.symbolKeyword = /*#__PURE__*/new SymbolKeyword({
[TitleAnnotationId]: "symbol",
[DescriptionAnnotationId]: "a symbol"
});
/**
* @category guards
* @since 3.10.0
*/
const isSymbolKeyword = exports.isSymbolKeyword = /*#__PURE__*/createASTGuard("SymbolKeyword");
/**
* @category model
* @since 3.10.0
*/
class ObjectKeyword {
annotations;
/**
* @since 3.10.0
*/
_tag = "ObjectKeyword";
constructor(annotations = {}) {
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return formatKeyword(this);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category constructors
* @since 3.10.0
*/
exports.ObjectKeyword = ObjectKeyword;
const objectKeyword = exports.objectKeyword = /*#__PURE__*/new ObjectKeyword({
[TitleAnnotationId]: "object",
[DescriptionAnnotationId]: "an object in the TypeScript meaning, i.e. the `object` type"
});
/**
* @category guards
* @since 3.10.0
*/
const isObjectKeyword = exports.isObjectKeyword = /*#__PURE__*/createASTGuard("ObjectKeyword");
/**
* @category model
* @since 3.10.0
*/
class Enums {
enums;
annotations;
/**
* @since 3.10.0
*/
_tag = "Enums";
constructor(enums, annotations = {}) {
this.enums = enums;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => `<enum ${this.enums.length} value(s): ${this.enums.map(([_, value]) => JSON.stringify(value)).join(" | ")}>`);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
enums: this.enums,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.Enums = Enums;
const isEnums = exports.isEnums = /*#__PURE__*/createASTGuard("Enums");
const isTemplateLiteralSpanType = ast => {
switch (ast._tag) {
case "Literal":
case "NumberKeyword":
case "StringKeyword":
case "TemplateLiteral":
return true;
case "Union":
return ast.types.every(isTemplateLiteralSpanType);
}
return false;
};
const templateLiteralSpanUnionTypeToString = type => {
switch (type._tag) {
case "Literal":
return JSON.stringify(String(type.literal));
case "StringKeyword":
return "string";
case "NumberKeyword":
return "number";
case "TemplateLiteral":
return String(type);
case "Union":
return type.types.map(templateLiteralSpanUnionTypeToString).join(" | ");
}
};
const templateLiteralSpanTypeToString = type => {
switch (type._tag) {
case "Literal":
return String(type.literal);
case "StringKeyword":
return "${string}";
case "NumberKeyword":
return "${number}";
case "TemplateLiteral":
return "${" + String(type) + "}";
case "Union":
return "${" + type.types.map(templateLiteralSpanUnionTypeToString).join(" | ") + "}";
}
};
/**
* @category model
* @since 3.10.0
*/
class TemplateLiteralSpan {
literal;
/**
* @since 3.10.0
*/
type;
constructor(type, literal) {
this.literal = literal;
if (isTemplateLiteralSpanType(type)) {
this.type = type;
} else {
throw new Error(errors_.getSchemaUnsupportedLiteralSpanErrorMessage(type));
}
}
/**
* @since 3.10.0
*/
toString() {
return templateLiteralSpanTypeToString(this.type) + this.literal;
}
/**
* @since 3.10.0
*/
toJSON() {
return {
type: this.type.toJSON(),
literal: this.literal
};
}
}
/**
* @category model
* @since 3.10.0
*/
exports.TemplateLiteralSpan = TemplateLiteralSpan;
class TemplateLiteral {
head;
spans;
annotations;
/**
* @since 3.10.0
*/
_tag = "TemplateLiteral";
constructor(head, spans, annotations = {}) {
this.head = head;
this.spans = spans;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => formatTemplateLiteral(this));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
head: this.head,
spans: this.spans.map(span => span.toJSON()),
annotations: toJSONAnnotations(this.annotations)
};
}
}
exports.TemplateLiteral = TemplateLiteral;
const formatTemplateLiteral = ast => "`" + ast.head + ast.spans.map(String).join("") + "`";
/**
* @category guards
* @since 3.10.0
*/
const isTemplateLiteral = exports.isTemplateLiteral = /*#__PURE__*/createASTGuard("TemplateLiteral");
/**
* @category model
* @since 3.10.0
*/
class Type {
type;
annotations;
constructor(type, annotations = {}) {
this.type = type;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toJSON() {
return {
type: this.type.toJSON(),
annotations: toJSONAnnotations(this.annotations)
};
}
/**
* @since 3.10.0
*/
toString() {
return String(this.type);
}
}
/**
* @category model
* @since 3.10.0
*/
exports.Type = Type;
class OptionalType extends Type {
isOptional;
constructor(type, isOptional, annotations = {}) {
super(type, annotations);
this.isOptional = isOptional;
}
/**
* @since 3.10.0
*/
toJSON() {
return {
type: this.type.toJSON(),
isOptional: this.isOptional,
annotations: toJSONAnnotations(this.annotations)
};
}
/**
* @since 3.10.0
*/
toString() {
return String(this.type) + (this.isOptional ? "?" : "");
}
}
exports.OptionalType = OptionalType;
const getRestASTs = rest => rest.map(annotatedAST => annotatedAST.type);
/**
* @category model
* @since 3.10.0
*/
class TupleType {
elements;
rest;
isReadonly;
annotations;
/**
* @since 3.10.0
*/
_tag = "TupleType";
constructor(elements, rest, isReadonly, annotations = {}) {
this.elements = elements;
this.rest = rest;
this.isReadonly = isReadonly;
this.annotations = annotations;
let hasOptionalElement = false;
let hasIllegalRequiredElement = false;
for (const e of elements) {
if (e.isOptional) {
hasOptionalElement = true;
} else if (hasOptionalElement) {
hasIllegalRequiredElement = true;
break;
}
}
if (hasIllegalRequiredElement || hasOptionalElement && rest.length > 1) {
throw new Error(errors_.getASTRequiredElementFollowinAnOptionalElementErrorMessage);
}
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => formatTuple(this));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
elements: this.elements.map(e => e.toJSON()),
rest: this.rest.map(ast => ast.toJSON()),
isReadonly: this.isReadonly,
annotations: toJSONAnnotations(this.annotations)
};
}
}
exports.TupleType = TupleType;
const formatTuple = ast => {
const formattedElements = ast.elements.map(String).join(", ");
return Arr.matchLeft(ast.rest, {
onEmpty: () => `readonly [${formattedElements}]`,
onNonEmpty: (head, tail) => {
const formattedHead = String(head);
const wrappedHead = formattedHead.includes(" | ") ? `(${formattedHead})` : formattedHead;
if (tail.length > 0) {
const formattedTail = tail.map(String).join(", ");
if (ast.elements.length > 0) {
return `readonly [${formattedElements}, ...${wrappedHead}[], ${formattedTail}]`;
} else {
return `readonly [...${wrappedHead}[], ${formattedTail}]`;
}
} else {
if (ast.elements.length > 0) {
return `readonly [${formattedElements}, ...${wrappedHead}[]]`;
} else {
return `ReadonlyArray<${formattedHead}>`;
}
}
}
});
};
/**
* @category guards
* @since 3.10.0
*/
const isTupleType = exports.isTupleType = /*#__PURE__*/createASTGuard("TupleType");
/**
* @category model
* @since 3.10.0
*/
class PropertySignature extends OptionalType {
name;
isReadonly;
constructor(name, type, isOptional, isReadonly, annotations) {
super(type, isOptional, annotations);
this.name = name;
this.isReadonly = isReadonly;
}
/**
* @since 3.10.0
*/
toString() {
return (this.isReadonly ? "readonly " : "") + String(this.name) + (this.isOptional ? "?" : "") + ": " + this.type;
}
/**
* @since 3.10.0
*/
toJSON() {
return {
name: String(this.name),
type: this.type.toJSON(),
isOptional: this.isOptional,
isReadonly: this.isReadonly,
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @since 3.10.0
*/
exports.PropertySignature = PropertySignature;
const isParameter = ast => {
switch (ast._tag) {
case "StringKeyword":
case "SymbolKeyword":
case "TemplateLiteral":
return true;
case "Refinement":
return isParameter(ast.from);
}
return false;
};
/**
* @category model
* @since 3.10.0
*/
exports.isParameter = isParameter;
class IndexSignature {
type;
isReadonly;
/**
* @since 3.10.0
*/
parameter;
constructor(parameter, type, isReadonly) {
this.type = type;
this.isReadonly = isReadonly;
if (isParameter(parameter)) {
this.parameter = parameter;
} else {
throw new Error(errors_.getASTIndexSignatureParameterErrorMessage);
}
}
/**
* @since 3.10.0
*/
toString() {
return (this.isReadonly ? "readonly " : "") + `[x: ${this.parameter}]: ${this.type}`;
}
/**
* @since 3.10.0
*/
toJSON() {
return {
parameter: this.parameter.toJSON(),
type: this.type.toJSON(),
isReadonly: this.isReadonly
};
}
}
/**
* @category model
* @since 3.10.0
*/
exports.IndexSignature = IndexSignature;
class TypeLiteral {
annotations;
/**
* @since 3.10.0
*/
_tag = "TypeLiteral";
/**
* @since 3.10.0
*/
propertySignatures;
/**
* @since 3.10.0
*/
indexSignatures;
constructor(propertySignatures, indexSignatures, annotations = {}) {
this.annotations = annotations;
// check for duplicate property signatures
const keys = {};
for (let i = 0; i < propertySignatures.length; i++) {
const name = propertySignatures[i].name;
if (Object.prototype.hasOwnProperty.call(keys, name)) {
throw new Error(errors_.getASTDuplicatePropertySignatureErrorMessage(name));
}
keys[name] = null;
}
// check for duplicate index signatures
const parameters = {
string: false,
symbol: false
};
for (let i = 0; i < indexSignatures.length; i++) {
const encodedParameter = getEncodedParameter(indexSignatures[i].parameter);
if (isStringKeyword(encodedParameter)) {
if (parameters.string) {
throw new Error(errors_.getASTDuplicateIndexSignatureErrorMessage("string"));
}
parameters.string = true;
} else if (isSymbolKeyword(encodedParameter)) {
if (parameters.symbol) {
throw new Error(errors_.getASTDuplicateIndexSignatureErrorMessage("symbol"));
}
parameters.symbol = true;
}
}
this.propertySignatures = propertySignatures;
this.indexSignatures = indexSignatures;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => formatTypeLiteral(this));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
propertySignatures: this.propertySignatures.map(ps => ps.toJSON()),
indexSignatures: this.indexSignatures.map(ps => ps.toJSON()),
annotations: toJSONAnnotations(this.annotations)
};
}
}
exports.TypeLiteral = TypeLiteral;
const formatIndexSignatures = iss => iss.map(String).join("; ");
const formatTypeLiteral = ast => {
if (ast.propertySignatures.length > 0) {
const pss = ast.propertySignatures.map(String).join("; ");
if (ast.indexSignatures.length > 0) {
return `{ ${pss}; ${formatIndexSignatures(ast.indexSignatures)} }`;
} else {
return `{ ${pss} }`;
}
} else {
if (ast.indexSignatures.length > 0) {
return `{ ${formatIndexSignatures(ast.indexSignatures)} }`;
} else {
return "{}";
}
}
};
/**
* @category guards
* @since 3.10.0
*/
const isTypeLiteral = exports.isTypeLiteral = /*#__PURE__*/createASTGuard("TypeLiteral");
const sortCandidates = /*#__PURE__*/Arr.sort(/*#__PURE__*/Order.mapInput(Number.Order, ast => {
switch (ast._tag) {
case "AnyKeyword":
return 0;
case "UnknownKeyword":
return 1;
case "ObjectKeyword":
return 2;
case "StringKeyword":
case "NumberKeyword":
case "BooleanKeyword":
case "BigIntKeyword":
case "SymbolKeyword":
return 3;
}
return 4;
}));
const literalMap = {
string: "StringKeyword",
number: "NumberKeyword",
boolean: "BooleanKeyword",
bigint: "BigIntKeyword"
};
/** @internal */
const flatten = candidates => Arr.flatMap(candidates, ast => isUnion(ast) ? flatten(ast.types) : [ast]);
/** @internal */
exports.flatten = flatten;
const unify = candidates => {
const cs = sortCandidates(candidates);
const out = [];
const uniques = {};
const literals = [];
for (const ast of cs) {
switch (ast._tag) {
case "NeverKeyword":
break;
case "AnyKeyword":
return [anyKeyword];
case "UnknownKeyword":
return [unknownKeyword];
// uniques
case "ObjectKeyword":
case "UndefinedKeyword":
case "VoidKeyword":
case "StringKeyword":
case "NumberKeyword":
case "BooleanKeyword":
case "BigIntKeyword":
case "SymbolKeyword":
{
if (!uniques[ast._tag]) {
uniques[ast._tag] = ast;
out.push(ast);
}
break;
}
case "Literal":
{
const type = typeof ast.literal;
switch (type) {
case "string":
case "number":
case "bigint":
case "boolean":
{
const _tag = literalMap[type];
if (!uniques[_tag] && !literals.includes(ast.literal)) {
literals.push(ast.literal);
out.push(ast);
}
break;
}
// null
case "object":
{
if (!literals.includes(ast.literal)) {
literals.push(ast.literal);
out.push(ast);
}
break;
}
}
break;
}
case "UniqueSymbol":
{
if (!uniques["SymbolKeyword"] && !literals.includes(ast.symbol)) {
literals.push(ast.symbol);
out.push(ast);
}
break;
}
case "TupleType":
{
if (!uniques["ObjectKeyword"]) {
out.push(ast);
}
break;
}
case "TypeLiteral":
{
if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 0) {
if (!uniques["{}"]) {
uniques["{}"] = ast;
out.push(ast);
}
} else if (!uniques["ObjectKeyword"]) {
out.push(ast);
}
break;
}
default:
out.push(ast);
}
}
return out;
};
/**
* @category model
* @since 3.10.0
*/
exports.unify = unify;
class Union {
types;
annotations;
static make = (types, annotations) => {
return isMembers(types) ? new Union(types, annotations) : types.length === 1 ? types[0] : neverKeyword;
};
/** @internal */
static unify = (candidates, annotations) => {
return Union.make(unify(flatten(candidates)), annotations);
};
/**
* @since 3.10.0
*/
_tag = "Union";
constructor(types, annotations = {}) {
this.types = types;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => this.types.map(String).join(" | "));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
types: this.types.map(ast => ast.toJSON()),
annotations: toJSONAnnotations(this.annotations)
};
}
}
/** @internal */
exports.Union = Union;
const mapMembers = (members, f) => members.map(f);
/** @internal */
exports.mapMembers = mapMembers;
const isMembers = as => as.length > 1;
/**
* @category guards
* @since 3.10.0
*/
exports.isMembers = isMembers;
const isUnion = exports.isUnion = /*#__PURE__*/createASTGuard("Union");
const toJSONMemoMap = /*#__PURE__*/(0, _GlobalValue.globalValue)(/*#__PURE__*/Symbol.for("effect/Schema/AST/toJSONMemoMap"), () => new WeakMap());
/**
* @category model
* @since 3.10.0
*/
class Suspend {
f;
annotations;
/**
* @since 3.10.0
*/
_tag = "Suspend";
constructor(f, annotations = {}) {
this.f = f;
this.annotations = annotations;
this.f = util_.memoizeThunk(f);
}
/**
* @since 3.10.0
*/
toString() {
return getExpected(this).pipe(Option.orElse(() => Option.flatMap(Option.liftThrowable(this.f)(), ast => getExpected(ast))), Option.getOrElse(() => "<suspended schema>"));
}
/**
* @since 3.10.0
*/
toJSON() {
const ast = this.f();
let out = toJSONMemoMap.get(ast);
if (out) {
return out;
}
toJSONMemoMap.set(ast, {
_tag: this._tag
});
out = {
_tag: this._tag,
ast: ast.toJSON(),
annotations: toJSONAnnotations(this.annotations)
};
toJSONMemoMap.set(ast, out);
return out;
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.Suspend = Suspend;
const isSuspend = exports.isSuspend = /*#__PURE__*/createASTGuard("Suspend");
/**
* @category model
* @since 3.10.0
*/
class Refinement {
from;
filter;
annotations;
/**
* @since 3.10.0
*/
_tag = "Refinement";
constructor(from, filter, annotations = {}) {
this.from = from;
this.filter = filter;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return getIdentifierAnnotation(this).pipe(Option.getOrElse(() => Option.match(getOrElseExpected(this), {
onNone: () => `{ ${this.from} | filter }`,
onSome: expected => isRefinement(this.from) ? String(this.from) + " & " + expected : expected
})));
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
from: this.from.toJSON(),
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.Refinement = Refinement;
const isRefinement = exports.isRefinement = /*#__PURE__*/createASTGuard("Refinement");
/**
* @since 3.10.0
*/
const defaultParseOption = exports.defaultParseOption = {};
/**
* @category model
* @since 3.10.0
*/
class Transformation {
from;
to;
transformation;
annotations;
/**
* @since 3.10.0
*/
_tag = "Transformation";
constructor(from, to, transformation, annotations = {}) {
this.from = from;
this.to = to;
this.transformation = transformation;
this.annotations = annotations;
}
/**
* @since 3.10.0
*/
toString() {
return Option.getOrElse(getExpected(this), () => `(${String(this.from)} <-> ${String(this.to)})`);
}
/**
* @since 3.10.0
*/
toJSON() {
return {
_tag: this._tag,
from: this.from.toJSON(),
to: this.to.toJSON(),
annotations: toJSONAnnotations(this.annotations)
};
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.Transformation = Transformation;
const isTransformation = exports.isTransformation = /*#__PURE__*/createASTGuard("Transformation");
/**
* @category model
* @since 3.10.0
*/
class FinalTransformation {
decode;
encode;
/**
* @since 3.10.0
*/
_tag = "FinalTransformation";
constructor(decode, encode) {
this.decode = decode;
this.encode = encode;
}
}
exports.FinalTransformation = FinalTransformation;
const createTransformationGuard = tag => ast => ast._tag === tag;
/**
* @category guards
* @since 3.10.0
*/
const isFinalTransformation = exports.isFinalTransformation = /*#__PURE__*/createTransformationGuard("FinalTransformation");
/**
* @category model
* @since 3.10.0
*/
class ComposeTransformation {
/**
* @since 3.10.0
*/
_tag = "ComposeTransformation";
}
/**
* @category constructors
* @since 3.10.0
*/
exports.ComposeTransformation = ComposeTransformation;
const composeTransformation = exports.composeTransformation = /*#__PURE__*/new ComposeTransformation();
/**
* @category guards
* @since 3.10.0
*/
const isComposeTransformation = exports.isComposeTransformation = /*#__PURE__*/createTransformationGuard("ComposeTransformation");
/**
* Represents a `PropertySignature -> PropertySignature` transformation
*
* The semantic of `decode` is:
* - `none()` represents the absence of the key/value pair
* - `some(value)` represents the presence of the key/value pair
*
* The semantic of `encode` is:
* - `none()` you don't want to output the key/value pair
* - `some(value)` you want to output the key/value pair
*
* @category model
* @since 3.10.0
*/
class PropertySignatureTransformation {
from;
to;
decode;
encode;
constructor(from, to, decode, encode) {
this.from = from;
this.to = to;
this.decode = decode;
this.encode = encode;
}
}
exports.PropertySignatureTransformation = PropertySignatureTransformation;
const isRenamingPropertySignatureTransformation = t => t.decode === _Function.identity && t.encode === _Function.identity;
/**
* @category model
* @since 3.10.0
*/
class TypeLiteralTransformation {
propertySignatureTransformations;
/**
* @since 3.10.0
*/
_tag = "TypeLiteralTransformation";
constructor(propertySignatureTransformations) {
this.propertySignatureTransformations = propertySignatureTransformations;
// check for duplicate property signature transformations
const fromKeys = {};
const toKeys = {};
for (const pst of propertySignatureTransformations) {
const from = pst.from;
if (fromKeys[from]) {
throw new Error(errors_.getASTDuplicatePropertySignatureTransformationErrorMessage(from));
}
fromKeys[from] = true;
const to = pst.to;
if (toKeys[to]) {
throw new Error(errors_.getASTDuplicatePropertySignatureTransformationErrorMessage(to));
}
toKeys[to] = true;
}
}
}
/**
* @category guards
* @since 3.10.0
*/
exports.TypeLiteralTransformation = TypeLiteralTransformation;
const isTypeLiteralTransformation = exports.isTypeLiteralTransformation = /*#__PURE__*/createTransformationGuard("TypeLiteralTransformation");
// -------------------------------------------------------------------------------------
// API
// -------------------------------------------------------------------------------------
/**
* Merges a set of new annotations with existing ones, potentially overwriting
* any duplicates.
*
* Any previously existing identifier annotations are deleted.
*
* @since 3.10.0
*/
const annotations = (ast, overrides) => {
const d = Object.getOwnPropertyDescriptors(ast);
const base = {
...ast.annotations
};
delete base[IdentifierAnnotationId];
const value = {
...base,
...overrides
};
const surrogate = getSurrogateAnnotation(ast);
if (Option.isSome(surrogate)) {
value[SurrogateAnnotationId] = annotations(surrogate.value, overrides);
}
d.annotations.value = value;
return Object.create(Object.getPrototypeOf(ast), d);
};
/**
* Equivalent at runtime to the TypeScript type-level `keyof` operator.
*
* @since 3.10.0
*/
exports.annotations = annotations;
const keyof = ast => Union.unify(_keyof(ast));
exports.keyof = keyof;
const STRING_KEYWORD_PATTERN = "[\\s\\S]*?"; // any string, including newlines
const NUMBER_KEYWORD_PATTERN = "[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?";
const getTemplateLiteralSpanTypePattern = (type, capture) => {
switch (type._tag) {
case "Literal":
return regexp.escape(String(type.literal));
case "StringKeyword":
return STRING_KEYWORD_PATTERN;
case "NumberKeyword":
return NUMBER_KEYWORD_PATTERN;
case "TemplateLiteral":
return getTemplateLiteralPattern(type, capture, false);
case "Union":
return type.types.map(type => getTemplateLiteralSpanTypePattern(type, capture)).join("|");
}
};
const handleTemplateLiteralSpanTypeParens = (type, s, capture, top) => {
if (isUnion(type)) {
if (capture && !top) {
return `(?:${s})`;
}
} else if (!capture || !top) {
return s;
}
return `(${s})`;
};
const getTemplateLiteralPattern = (ast, capture, top) => {
let pattern = ``;
if (ast.head !== "") {
const head = regexp.escape(ast.head);
pattern += capture && top ? `(${head})` : head;
}
for (const span of ast.spans) {
const spanPattern = getTemplateLiteralSpanTypePattern(span.type, capture);
pattern += handleTemplateLiteralSpanTypeParens(span.type, spanPattern, capture, top);
if (span.literal !== "") {
const literal = regexp.escape(span.literal);
pattern += capture && top ? `(${literal})` : literal;
}
}
return pattern;
};
/**
* Generates a regular expression from a `TemplateLiteral` AST node.
*
* @see {@link getTemplateLiteralCapturingRegExp} for a variant that captures the pattern.
*
* @since 3.10.0
*/
const getTemplateLiteralRegExp = ast => new RegExp(`^${getTemplateLiteralPattern(ast, false, true)}$`);
/**
* Generates a regular expression that captures the pattern defined by the given `TemplateLit