restrict_template_expressions

package
v0.0.0-...-4178710 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 13, 2025 License: MIT Imports: 5 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var RestrictTemplateExpressionsRule = rule.Rule{
	Name: "restrict-template-expressions",
	Run: func(ctx rule.RuleContext, options any) rule.RuleListeners {
		opts, ok := options.(RestrictTemplateExpressionsOptions)
		if !ok {
			opts = RestrictTemplateExpressionsOptions{}
		}
		if opts.Allow == nil {
			opts.Allow = []utils.TypeOrValueSpecifier{{
				From: utils.TypeOrValueSpecifierFromLib,
				Name: []string{"Error", "URL", "URLSearchParams"},
			}}
		}
		if opts.AllowInline == nil {
			opts.AllowInline = []string{}
		}
		if opts.AllowAny == nil {
			opts.AllowAny = utils.Ref(true)
		}
		if opts.AllowArray == nil {
			opts.AllowArray = utils.Ref(false)
		}
		if opts.AllowBoolean == nil {
			opts.AllowBoolean = utils.Ref(true)
		}
		if opts.AllowNullish == nil {
			opts.AllowNullish = utils.Ref(true)
		}
		if opts.AllowNumber == nil {
			opts.AllowNumber = utils.Ref(true)
		}
		if opts.AllowRegExp == nil {
			opts.AllowRegExp = utils.Ref(true)
		}
		if opts.AllowNever == nil {
			opts.AllowNever = utils.Ref(false)
		}

		allowedFlags := checker.TypeFlagsStringLike
		if *opts.AllowAny {
			allowedFlags |= checker.TypeFlagsAny
		}
		if *opts.AllowBoolean {
			allowedFlags |= checker.TypeFlagsBooleanLike
		}
		if *opts.AllowNullish {
			allowedFlags |= checker.TypeFlagsNullable
		}
		if *opts.AllowNumber {
			allowedFlags |= checker.TypeFlagsNumberLike | checker.TypeFlagsBigIntLike
		}
		if *opts.AllowNever {
			allowedFlags |= checker.TypeFlagsNever
		}

		globalRegexpType := checker.Checker_globalRegExpType(ctx.TypeChecker)

		var isTypeAllowed func(innerType *checker.Type) bool
		isTypeAllowed = func(innerType *checker.Type) bool {
			return utils.Every(utils.UnionTypeParts(innerType), func(t *checker.Type) bool {
				return utils.Some(utils.IntersectionTypeParts(t), func(t *checker.Type) bool {
					return utils.IsTypeFlagSet(t, allowedFlags) ||
						utils.TypeMatchesSomeSpecifier(t, opts.Allow, opts.AllowInline, ctx.Program) ||
						(*opts.AllowArray && checker.Checker_isArrayOrTupleType(ctx.TypeChecker, t) && isTypeAllowed(utils.GetNumberIndexType(ctx.TypeChecker, t))) ||
						(*opts.AllowRegExp && t == globalRegexpType)
				})
			})
		}

		return rule.RuleListeners{
			ast.KindTemplateExpression: func(node *ast.Node) {

				if ast.IsTaggedTemplateExpression(node.Parent) {
					return
				}

				for _, span := range node.AsTemplateExpression().TemplateSpans.Nodes {
					expression := span.Expression()
					expressionType := utils.GetConstrainedTypeAtLocation(
						ctx.TypeChecker,
						expression,
					)
					if !isTypeAllowed(expressionType) {
						ctx.ReportNode(expression, buildInvalidTypeMessage(ctx.TypeChecker.TypeToString(expressionType)))
					}
				}
			},
		}
	},
}

Functions

This section is empty.

Types

type RestrictTemplateExpressionsOptions

type RestrictTemplateExpressionsOptions struct {
	AllowAny     *bool
	AllowArray   *bool
	AllowBoolean *bool
	AllowNullish *bool
	AllowNumber  *bool
	AllowRegExp  *bool
	AllowNever   *bool
	Allow        []utils.TypeOrValueSpecifier
	AllowInline  []string
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL