filename_case

package
v0.8.2 Latest Latest
Warning

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

Go to latest
Published: Aug 27, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var FilenameCaseRule = rule.Rule{
	Name:   filenameCaseRuleName,
	Schema: rule.NewSchema(schemaJSON),

	Run: func(ctx rule.RuleContext, options []any) rule.RuleListeners {
		if ctx.SourceFile == nil {
			return nil
		}
		fileName := ctx.SourceFile.FileName()
		if fileName == "" {
			return nil
		}
		pathSegments := getPathSegments(fileName, ctx.ProcessCurrentDirectory())
		basename := pathSegments[len(pathSegments)-1]

		if basename == "<input>" || basename == "<text>" {
			return nil
		}

		opts := parseOptions(options)
		reportRange := core.NewTextRange(0, 0)

		if len(opts.invalidIgnores) > 0 {
			if ctx.DisableManager.IsRuleDisabled(filenameCaseRuleName, reportRange.Pos()) {
				return nil
			}
			for _, bad := range opts.invalidIgnores {
				ctx.ReportRange(reportRange, rule.RuleMessage{
					Id: "invalidIgnorePattern",
					Description: fmt.Sprintf(
						"Invalid regular expression in `ignore` option: `%s`: %s",
						bad.pattern, bad.err.Error(),
					),
				})
			}
			return nil
		}

		for _, segment := range pathSegments {
			for _, re := range opts.ignores {
				if re.TestOrTimeout(segment) {
					return nil
				}
			}
		}
		cases := opts.selectedCases()
		if opts.checkDirectories {
			for _, directory := range pathSegments[:len(pathSegments)-1] {
				if strings.HasPrefix(directory, "$") {
					continue
				}
				leading, words := splitFilename(directory)
				valid, invalidWord, invalidCandidates := validateFilename(words, cases)
				if valid {
					continue
				}
				if ctx.DisableManager.IsRuleDisabled(filenameCaseRuleName, reportRange.Pos()) {
					return nil
				}
				renamed := fixFilename(words, cases, invalidWord, invalidCandidates, leading, "")
				ctx.ReportRange(reportRange, rule.RuleMessage{
					Id: messageIDDirectoryCase,
					Description: "Directory name `" + directory + "` is not in " +
						englishishCaseNames(cases) + ". Rename it to " + englishishBacktickJoin(renamed) + ".",
				})
				return nil
			}
		}
		if isIgnoredByDefault(basename) {
			return nil
		}

		ext := nodeExtname(basename)
		filename := basename[:len(basename)-len(ext)]
		middle := ""
		if opts.multipleFileExtensions {
			if i := strings.IndexByte(filename, '.'); i >= 0 {
				middle = filename[i:]
				filename = filename[:i]
			}
		}

		leading, words := splitFilename(filename)
		valid, invalidWord, invalidCandidates := validateFilename(words, cases)
		if strings.HasPrefix(filename, "$") {
			valid = true
		}
		lowerExt := ecmascript.StringToLowerCase(ext)
		if valid {
			if ext != lowerExt {
				if ctx.DisableManager.IsRuleDisabled(filenameCaseRuleName, reportRange.Pos()) {
					return nil
				}
				ctx.ReportRange(reportRange, rule.RuleMessage{
					Id: messageIDFilenameExtension,
					Description: "File extension `" + ext + "` is not in lowercase. Rename it to `" +
						filename + middle + lowerExt + "`.",
				})
			}
			return nil
		}

		if ctx.DisableManager.IsRuleDisabled(filenameCaseRuleName, reportRange.Pos()) {
			return nil
		}

		renamed := fixFilename(words, cases, invalidWord, invalidCandidates, leading, middle+lowerExt)
		ctx.ReportRange(reportRange, rule.RuleMessage{
			Id: messageIDFilenameCase,
			Description: "Filename is not in " + englishishCaseNames(cases) + ". Rename it to " +
				englishishBacktickJoin(renamed) + ".",
		})
		return nil
	},
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

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