# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.

# scanCode.py configuration file

# List of filenames containing the text of valid license (headers)
# These files SHOULD be in the same directory path where scanCode.py
# resides.
[Licenses]
ASFLicenseHeader.txt
ASFLicenseHeaderBash.txt
ASFLicenseHeaderMarkdown.txt
ASFLicenseHeaderLua.txt

# Filters (path/filename) with wildcards and associated scan checks
# that are to be run against them.  The checks are actual valid
# function names found in scanCode.py.
[Includes]
*=is_not_symlink, regex_check
*.conf=has_block_license, eol_at_eof, regex_check
*.go=has_block_license, eol_at_eof, regex_check
*.gradle=has_block_license, eol_at_eof, regex_check
*.groovy=has_block_license, eol_at_eof, regex_check
*.html=has_block_license, regex_check
*.java=no_tabs, has_block_license, eol_at_eof, regex_check
*.js=has_block_license, regex_check
*.md=no_tabs, has_block_license, eol_at_eof, regex_check
*.properties=no_tabs, has_block_license, eol_at_eof, regex_check
*.py=no_tabs, has_block_license, eol_at_eof, regex_check
*.scala=has_block_license, no_tabs, eol_at_eof, regex_check
*.sh=has_block_license, eol_at_eof, regex_check
*.swift=no_tabs, has_block_license, eol_at_eof, regex_check
*.yaml=has_block_license, eol_at_eof, regex_check
*.yml=has_block_license, eol_at_eof, regex_check
*.css=has_block_license, eol_at_eof, regex_check
*.tsx=has_block_license, eol_at_eof, regex_check
*.ts=has_block_license, eol_at_eof, regex_check
*.less=has_block_license, eol_at_eof, regex_check
*.toml=has_block_license, eol_at_eof, regex_check
*Dockerfile*=has_block_license
*.lua=has_block_license

# Sanity check files not required to have ASF headers because either they
# are excluded or are not packaged with the Apache source release.
*.cfg=regex_check
*.ini=regex_check
*.j2=regex_check
*.json=regex_check
*.txt=regex_check
*.xml=regex_check

# List of paths (inclusive of subdirectories) to exclude from code scanning
[Excludes]

# General tooling & binary file exclusions
.bin
.dockerignore
.eslintrc.*
.git
.gitattributes
.github
.gitignore
.gradle
.idea
.jshintrc
.pydevproject
.rat-excludes
.tox

# Skip files containing MIT License
web/src/components/HeaderDropdown
web/src/components/NoticeIcon
web/src/components/PageLoading/index.tsx
web/src/components/RightContent
web/src/components/PluginFlow/components/ConfigPanel
web/src/components/PluginFlow/components/Toolbar
web/src/e2e/__mocks__/antd-pro-merge-less.js
web/src/e2e/baseLayout.e2e.js
web/src/pages/404.tsx
web/src/libs/iconfont.js
api/build-tools/json.lua

# Skip files containing Apache 2.0 License
api/internal/core/store/query.go
api/internal/core/store/selector.go
api/internal/core/store/selector_test.go

# Skip temporarily for CI -- TODO: fix license issue
api/internal/core/store/validate_mock.go
api/internal/core/storage/storage_mock.go

# Skip other necessary files
netlify.toml


# Skip the "build.sh" file. Because "license" is not at the beginning of the file
api/build.sh

# Exclude Apache standard legal files
CREDITS.txt
DISCLAIMER.txt
LICENSE*.txt
NOTICE.txt

conf
.actions/openwhisk-utilities

[Options]
# Not all code files allow licenses to appear starting at the first character
# of the file. This option tells the scan to allow licenses to appear starting
# within the first 'x' characters of each code file (as provided by this option's
# value).
LICENSE_SLACK_LENGTH=500

# List of regular expressions for forbidden strings, e.g. \w+@company.com
[Regex]
