diff --git a/bin/report_dependency_licenses.py b/bin/report_dependency_licenses.py new file mode 100755 index 000000000..e24e11edd --- /dev/null +++ b/bin/report_dependency_licenses.py @@ -0,0 +1,385 @@ +#!/usr/bin/env python3 +""" +Script to search this project for Python and NodeJS dependencies, identify their licenses, and write the results to a +CSV file. + +Note: Some dependencies don't make finding their license information very easy (shame, Python devs!), so this script does its best +to mine PyPi and GitHub for license data. It does not find all licenses. The resulting CSV will have some NOASSERTION licenses, +which will need manual search and entry. + +This script is intended to be run from the root of the project. +""" + +from __future__ import annotations + +import csv +import json +import logging +import os +import re +import subprocess +from abc import ABC, abstractmethod +from collections.abc import Iterable +from urllib.parse import urlparse + +from requests import Session +from requests.adapters import HTTPAdapter +from urllib3 import Retry + +logger = logging.getLogger(__name__) + + +# We can exceed the rate limit for the GitHub API if we're not careful, so we'll use a retry strategy with a +# conservative backoff factor +session = Session() +retry = Retry( + total=5, + read=5, + connect=5, + backoff_factor=3, + status_forcelist=(500, 502, 504, 403, 429), +) +adapter = HTTPAdapter(max_retries=retry) +session.mount('http://', adapter) +session.mount('https://', adapter) + + +class Dependency(ABC): + def __init__(self, name: str, version: str, location: str, language: str): + self.name = name + self.version = version + self.language = language + self.location: set[str] = {location} + self.package_url: str | None = None + + self._licensee = None + self.repo_url: str | None = None + + @property + def license(self) -> str | None: + return self._license + + @license.setter + def license(self, value: str | None): + """ + Perform some data consistency corrections as the value is set + """ + # We'll stick with the SPDX license short identifiers. + if isinstance(value, str): + if value.lower() == 'mit license': + value = 'MIT' + if value.lower() in ('apache license 2.0', 'apache 2.0'): + value = 'Apache-2.0' + if value.lower() == 'unknown': + value = None + elif value is not None: + raise ValueError(f'License must be a string or None: {value}') + self._license = value + + @classmethod + @abstractmethod + def load_dependencies(cls, file_path: str) -> list[Dependency]: + pass + + @abstractmethod + def get_license_info(self): + pass + + @staticmethod + def _get_github_license(github_url: str) -> str | None: + """Get license information from a GitHub repository.""" + logger.info('Fetching GitHub license for %s', github_url) + # Convert full GitHub URL to API URL + # From: https://github.com/owner/repo + # To: https://api.github.com/repos/owner/repo + parsed = urlparse(github_url) + if parsed.netloc != 'github.com': + raise ValueError(f'Not a GitHub URL: {github_url}') + + path_parts = parsed.path.strip('/').split('/') + if len(path_parts) < 2: + raise ValueError(f'Invalid GitHub URL format: {github_url}') + + owner, repo = path_parts[:2] + api_url = f'https://api.github.com/repos/{owner}/{repo}' + + try: + response = session.get(api_url) + response.raise_for_status() + repo_data = response.json() + return repo_data.get('license', {}).get('spdx_id') + except Exception as e: # noqa: BLE001 + logger.error('Error getting GitHub license for %s: %s', github_url, e, exc_info=e) + raise + + +class NodeJSDependency(Dependency): + def __init__(self, name: str, version: str, location: str): + super().__init__(name, version, location, 'NodeJS') + self.package_url = f'https://www.npmjs.com/package/{name}' + + @classmethod + def load_dependencies(cls, file_path: str) -> list[Dependency]: + """Parse package.json to get direct dependencies.""" + deps = [] + + with open(file_path) as f: + data = json.load(f) + + # Regular dependencies + if 'dependencies' in data: + for name, version in data['dependencies'].items(): + # Strip version prefix characters + clean_version = re.sub(r'^[~^]', '', version) + deps.append(cls(name, clean_version, os.path.dirname(file_path))) + + # Dev dependencies + if 'devDependencies' in data: + for name, version in data['devDependencies'].items(): + clean_version = re.sub(r'^[~^]', '', version) + deps.append(cls(name, clean_version, os.path.dirname(file_path))) + + return deps + + def get_license_info(self): + """Get license information for an NPM package.""" + logger.info('Getting license information for NPM package %s', self.name) + result = subprocess.run( # noqa: S603 + ['yarn', 'info', f'{self.name}@{self.version}', '--json'], # noqa: S607 + capture_output=True, + text=True, + cwd=list(self.location)[0], + ) + if result.returncode != 0: + logger.error('Error getting license for NPM package %s: %s', self.name, result.stderr) + raise RuntimeError(f'Error getting license for NPM package {self.name}: {result.stderr}') + data = json.loads(result.stdout)['data'] + license_name = data['license'] + + repo_url = None + repo_url = data.get('repository', {}).get('url') + # If they don't list a repository, we'll use the homepage as a fallback + if not repo_url: + repo_url = data.get('homepage', '').split('#')[0] + + # As a last resort, point to npmjs.com (e.g., https://www.npmjs.com/package/@usewaypoint/email-builder) + if not repo_url: + repo_url = f'https://www.npmjs.com/package/{self.name}' + + # Convert funky git URLs to https URL if it's for GitHub + if 'github.com' in repo_url: + repo_url = repo_url.replace('git+', '').replace('.git', '').replace('ssh://git@', 'https://') + + self.license = license_name + self.repo_url = repo_url + + +class PythonDependency(Dependency): + def __init__(self, name: str, version: str, location: str): + super().__init__(name, version, location, 'Python') + self.package_url = f'https://pypi.org/project/{name}' + + @classmethod + def load_dependencies(cls, file_path: str) -> list[Dependency]: + """Parse requirements.txt to get direct dependencies.""" + deps = [] + with open(file_path) as f: + for line in f: + line = line.strip() + # Skip comments and empty lines + if not line or line.startswith(('#', '-r')): + continue + + # Parse package name and version + # Handle different formats like: + # package==1.0.0 + # package>=1.0.0 + # package>=1.0.0,<2.0.0 + # package[option]>=1.0.0 + parts = re.split(r'[=<>\[\]]', line)[0].strip() + version_match = re.search(r'[=<>]=\s*([\d.]+)', line) + version = version_match.group(1) if version_match else 'latest' + + deps.append(cls(parts, version, os.path.dirname(file_path))) + + return deps + + def get_license_info(self): + """Get license information for a Python package.""" + logger.info('Getting license information for Python package %s', self.name) + result = subprocess.run(['pip', 'show', self.name], capture_output=True, text=True) # noqa: S607 S603 + + if result.returncode != 0: + logger.error('Error getting license for Python package %s: %s', self.name, result.stderr) + raise RuntimeError(f'Error getting license for Python package {self.name}: {result.stderr}') + + # Extract license from pip show output + license_match = re.search(r'License: (.+)', result.stdout) + self.license = license_match.group(1) if license_match else None + + # Try to get the home page as a potential license URL + home_page_match = re.search(r'Home-page: (.+)', result.stdout) + self.repo_url = home_page_match.group(1) if home_page_match else None + + # A bunch of pip packages don't include their license in pip metadata, so we'll go mining for that info + # via PyPi and GitHub + + # If we don't get a license and url from pip metadata, we'll go mining for it on PyPI + if not self.license or not self.repo_url: + self.repo_url, self.license = self._get_pypi_info() + + # If we still don't have a license, we'll go mining for it on GitHub + if not self.license: + self.license = self._get_github_license(self.repo_url) + + def _get_pypi_info(self) -> tuple[str, str | None]: + """Get package information from PyPI when pip metadata is insufficient.""" + logger.info('Fetching PyPI info for %s', self.name) + response = session.get(f'https://pypi.org/pypi/{self.name}/json') + response.raise_for_status() + data = response.json() + + # Get repository URL from project URLs + repo_url = None + license_name = data['info'].get('license') + + pypi_info = data['info'] + if license_name is not None: + # If we found a license, we'll take any URL we can find + repo_url = self._find_url_in_pypi_info(pypi_info, github_only=False) + else: + # If we still haven't found a license, we'll try to find a GitHub URL so we can + # look for a license there. + repo_url = self._find_url_in_pypi_info(pypi_info, github_only=True) + + if not repo_url: + raise RuntimeError(f'No suitable URL found for {self.name}') + + return repo_url, license_name + + def _find_url_in_pypi_info(self, pypi_info: dict, github_only: bool = False) -> str: + """ + URLs or can be found under a bunch of different names and places in PyPI info + """ + project_urls = pypi_info.get('project_urls', {}) + for key in [ + 'Code', + 'code', + 'GitHub', + 'Github', + 'github', + 'Repository', + 'repository', + 'Source Code', + 'Source code', + 'source code', + 'Source', + 'source', + 'Homepage', + 'homepage', + ]: + if key in project_urls and ('github.com' in project_urls[key] or not github_only): + return project_urls[key] + + # Fallback to homepage + homepage = pypi_info.get('home_page') + if homepage and ('github.com' in homepage or not github_only): + return homepage + raise RuntimeError(f'No suitable URL found for {self.name}') + + +def find_dependency_files() -> tuple[list[str], list[str]]: + """Find all package.json and requirements.txt files in the project.""" + package_jsons = [] + requirements_txts = [] + + for root, dirs, files in os.walk('.'): + # Filter for some exclude patterns + dirs[:] = [d for d in dirs if d not in ['node_modules', 'cdk.out', '.git']] + + for file in files: + if file == 'package.json': + package_jsons.append(os.path.join(root, file)) + elif file in ['requirements.txt', 'requirements-dev.txt']: + requirements_txts.append(os.path.join(root, file)) + + return package_jsons, requirements_txts + + +def deduplicate_dependencies(deps: Iterable[Dependency]) -> Iterable[Dependency]: + """Deduplicate dependencies by name, keeping the most specific version.""" + unique_deps: dict[str, Dependency] = {} + + for dep in deps: + key = f'{dep.language}:{dep.name}' + if key not in unique_deps: + unique_deps[key] = dep + else: + existing = unique_deps[key] + # If the existing version is 'latest', prefer the specific version + if existing.version == 'latest' and dep.version != 'latest': + unique_deps[key] = dep + existing.location |= dep.location + + return unique_deps.values() + + +def main(): + logger.info('Starting dependency analysis') + + # Find all dependency files + logger.info('Finding dependency files') + package_jsons, requirements_txts = find_dependency_files() + + # Parse all dependencies + all_deps: list[Dependency] = [] + + # Parse NodeJS dependencies + logger.info('Parsing NodeJS dependencies') + for package_json in package_jsons: + logger.info('Parsing NodeJS dependencies from %s', package_json) + deps = NodeJSDependency.load_dependencies(package_json) + all_deps.extend(deps) + + # Parse Python dependencies + logger.info('Parsing Python dependencies') + for requirements_txt in requirements_txts: + logger.info('Parsing Python dependencies from %s', requirements_txt) + deps = PythonDependency.load_dependencies(requirements_txt) + all_deps.extend(deps) + + # Deduplicate dependencies + unique_deps = deduplicate_dependencies(all_deps) + + # Get license information for each dependency + logger.info('Getting license information for each dependency') + for dep in unique_deps: + dep.get_license_info() + + # Write results to CSV + logger.info('Writing results to CSV') + with open('dependency_licenses.csv', 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['Package Name', 'Version', 'Language', 'License', 'Package URL', 'Repo URL', 'Location']) + + # an Unknown license should never appear here, since we raise an exception if we don't find a license, but + # we'll add a value that's easy to check for in case of a bug. + for dep in sorted(unique_deps, key=lambda x: (x.language, x.license or 'Unknown', x.name.lower(), x.version)): + writer.writerow( + [ + dep.name, + dep.version, + dep.language, + dep.license or 'Unknown', + dep.package_url or 'N/A', + dep.repo_url or 'N/A', + ':'.join(dep.location), + ] + ) + logger.info('Done!') + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + + main() diff --git a/licenses/authorizenet_license.txt b/licenses/authorizenet_license.txt new file mode 100644 index 000000000..e30b8b919 --- /dev/null +++ b/licenses/authorizenet_license.txt @@ -0,0 +1,43 @@ +Sourced from: https://raw.githubusercontent.com/AuthorizeNet/sdk-python/refs/heads/master/LICENSE.txt on Feb 21, 2025 + +SDK LICENSE AGREEMENT +This Software Development Kit (“SDK”) License Agreement (“Agreement”) is between you (both the individual downloading the SDK and any legal entity on behalf of which such individual is acting) (“You” or “Your”) and Authorize.Net LLC (“Authorize.Net’). +IT IS IMPORTANT THAT YOU READ CAREFULLY AND UNDERSTAND THIS AGREEMENT. BY CLICKING THE “I ACCEPT” BUTTON OR AN EQUIVALENT INDICATOR OR BY DOWNLOADING, INSTALLING OR USING THE SDK OR THE DOCUMENTATION, YOU AGREE TO BE BOUND BY THIS AGREEMENT. + +1. DEFINITIONS + 1.1 “Application(s)” means software programs that You develop to operate with the Gateway using components of the Software. + 1.2 “Documentation” means the materials made available to You in connection with the Software by or on behalf of Authorize.Net pursuant to this Agreement. + 1.3 “Gateway” means any electronic payment platform maintained and operated by Authorize.Net and any of its affiliates. + 1.4 “Software” means all of the software included in the software development kit made available to You by or on behalf of Authorize.Net pursuant to this Agreement, including but not limited to sample source code, code snippets, software tools, code libraries, sample applications, Documentation and any upgrades, modified versions, updates, and/or additions thereto, if any, made available to You by or on behalf of Authorize.Net pursuant to this Agreement. +2. GRANT OF LICENSE; RESTRICTIONS + 2.1 Limited License. Subject to and conditioned upon Your compliance with the terms of this Agreement, Authorize.Net hereby grants to You a limited, revocable, non-exclusive, non-transferable, royalty-free license during the term of this Agreement to: (a) in any country worldwide, use, reproduce, modify, and create derivative works of the components of the Software solely for the purpose of developing, testing and manufacturing Applications; (b) distribute, sell or otherwise provide Your Applications that include components of the Software to Your end users; and (c) use the Documentation in connection with the foregoing activities. The license to distribute Applications that include components of the Software as set forth in subsection (b) above includes the right to grant sublicenses to Your end users to use such components of the Software as incorporated into such Applications, subject to the limitations and restrictions set forth in this Agreement. + 2.2 Restrictions. You shall not (and shall have no right to): (a) make or distribute copies of the Software or the Documentation, in whole or in part, except as expressly permitted pursuant to Section 2.1; (b) alter or remove any copyright, trademark, trade name or other proprietary notices, legends, symbols or labels appearing on or in the Software or Documentation; (c) sublicense (or purport to sublicense) the Software or the Documentation, in whole or in part, to any third party except as expressly permitted pursuant to Section 2.1; (d) engage in any activity with the Software, including the development or distribution of an Application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the Gateway or platform, servers, or systems of Authorize.Net, any of its affiliates, or any third party; (e) make any statements that Your Application is “certified” or otherwise endorsed, or that its performance is guaranteed, by Authorize.Net or any of its affiliates; or (f) otherwise use or exploit the Software or the Documentation for any purpose other than to develop and distribute Applications as expressly permitted by this Agreement. + 2.3 Ownership. You shall retain ownership of Your Applications developed in accordance with this Agreement, subject to Authorize.Net’s ownership of the Software and Documentation (including Authorize.Net’s ownership of any portion of the Software or Documentation incorporated in Your Applications). You acknowledge and agree that all right, title and interest in and to the Software and Documentation shall, at all times, be and remain the exclusive property of Authorize.Net and that You do not have or acquire any rights, express or implied, in the Software or Documentation except those rights expressly granted under this Agreement. + 2.4 No Support. Authorize.Net has no obligation to provide support, maintenance, upgrades, modifications or new releases of the Software. + 2.5 Open Source Software. You hereby acknowledge that the Software may contain software that is distributed under “open source” license terms (“Open Source Software”). You shall review the Documentation in order to determine which portions of the Software are Open Source Software and are licensed under such Open Source Software license terms. To the extent any such license requires that Authorize.Net provide You any rights with respect to such Open Source Software that are inconsistent with the limited rights granted to You in this Agreement, then such rights in the applicable Open Source Software license shall take precedence over the rights and restrictions granted in this Agreement, but solely with respect to such Open Source Software. You acknowledge that the Open Source Software license is solely between You and the applicable licensor of the Open Source Software and that Your use, reproduction and distribution of Open Source Software shall be in compliance with applicable Open Source Software license. You understand and agree that Authorize.Net is not liable for any loss or damage that You may experience as a result of Your use of Open Source Software and that You will look solely to the licensor of the Open Source Software in the event of any such loss or damage. + 2.6 License to Authorize.Net. In the event You choose to submit any suggestions, feedback or other information or materials related to the Software or Documentation or Your use thereof (collectively, “Feedback”) to Authorize.Net, You hereby grant to Authorize.Net a worldwide, non-exclusive, royalty-free, transferable, sublicensable, perpetual and irrevocable license to use and otherwise exploit such Feedback in connection with the Software, Documentation, and other products and services. + 2.7 Use. + (a) You represent, warrant and agree to use the Software and write Applications only for purposes permitted by (i) this Agreement; (ii) applicable law and regulation, including, without limitation, the Payment Card Industry Data Security Standard (PCI DSS); and (iii) generally accepted practices or guidelines in the relevant jurisdictions. You represent, warrant and agree that if You use the Software to develop Applications for general public end users, that You will protect the privacy and legal rights of those users. If the Application receives or stores personal or sensitive information provided by end users, it must do so securely and in compliance with all applicable laws and regulations, including card association regulations. If the Application receives Authorize.Net account information, the Application may only use that information to access the end user's Authorize.Net account. You represent, warrant and agree that You are solely responsible for (and that neither Authorize.Net nor its affiliates have any responsibility to You or to any third party for): (i) any data, content, or resources that You obtain, transmit or display through the Application; and (ii) any breach of Your obligations under this Agreement, any applicable third party license, or any applicable law or regulation, and for the consequences of any such breach. + 3. WARRANTY DISCLAIMER; LIMITATION OF LIABILITY + 3.1 Disclaimer. THE SOFTWARE AND THE DOCUMENTATION ARE PROVIDED ON AN “AS IS” AND “AS AVAILABLE” BASIS WITH NO WARRANTY. YOU AGREE THAT YOUR USE OF THE SOFTWARE AND THE DOCUMENTATION IS AT YOUR SOLE RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, AUTHORIZE.NET AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE AND THE DOCUMENTATION, INCLUDING ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, SATISFACTORY QUALITY, ACCURACY, TITLE AND NON-INFRINGEMENT, AND ANY WARRANTIES THAT MAY ARISE OUT OF COURSE OF PERFORMANCE, COURSE OF DEALING OR USAGE OF TRADE. NEITHER AUTHORIZE.NET NOR ITS AFFILIATES WARRANT THAT THE FUNCTIONS OR INFORMATION CONTAINED IN THE SOFTWARE OR THE DOCUMENTATION WILL MEET ANY REQUIREMENTS OR NEEDS YOU MAY HAVE, OR THAT THE SOFTWARE OR DOCUMENTATION WILL OPERATE ERROR FREE, OR THAT THE SOFTWARE OR DOCUMENTATION IS COMPATIBLE WITH ANY PARTICULAR OPERATING SYSTEM. + 3.2 Limitation of Liability. IN NO EVENT SHALL AUTHORIZE.NET AND ITS AFFILIATES BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR PUNITIVE DAMAGES, OR DAMAGES FOR LOSS OF PROFITS, REVENUE, BUSINESS, SAVINGS, DATA, USE OR COST OF SUBSTITUTE PROCUREMENT, INCURRED BY YOU OR ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF AUTHORIZE.NET HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES OR IF SUCH DAMAGES ARE FORESEEABLE. IN NO EVENT SHALL THE ENTIRE LIABILITY OF AUTHORIZE.NET AND AFFILIATES ARISING FROM OR RELATING TO THIS AGREEMENT OR THE SUBJECT MATTER HEREOF EXCEED ONE HUNDRED U.S. DOLLARS ($100). THE PARTIES ACKNOWLEDGE THAT THE LIMITATIONS OF LIABILITY IN THIS SECTION 3.2 AND IN THE OTHER PROVISIONS OF THIS AGREEMENT AND THE ALLOCATION OF RISK HEREIN ARE AN ESSENTIAL ELEMENT OF THE BARGAIN BETWEEN THE PARTIES, WITHOUT WHICH AUTHORIZE.NET WOULD NOT HAVE ENTERED INTO THIS AGREEMENT. + 4. INDEMNIFICATION. You shall indemnify, hold harmless and, at Authorize.Net’s request, defend Authorize.Net and its affiliates and their officers, directors, employees, and agents from and against any claim, suit or proceeding, and any associated liabilities, costs, damages and expenses, including reasonable attorneys’ fees, that arise out of relate to: (i) Your Applications or the use or distribution thereof and Your use or distribution of the Software or the Documentation (or any portion thereof including Open Source Software), including, but not limited to, any allegation that any such Application or any such use or distribution infringes, misappropriates or otherwise violates any intellectual property (including, without limitation, copyright, patent, and trademark), privacy, publicity or other rights of any third party, or has caused the death or injury of any person or damage to any property; (ii) Your alleged or actual breach of this Agreement; (iii) the alleged or actual breach of this Agreement by any party to whom you have provided Your Applications, the Software or the Documentation or (iii) Your alleged or actual violation of or non-compliance with any applicable laws, legislation, policies, rules, regulations or governmental requirements (including, without limitation, any laws, legislation, policies, rules, regulations or governmental requirements related to privacy and data collection). + 5. TERMINATION. This Agreement and the licenses granted to you herein are effective until terminated. Authorize.Net may terminate this Agreement and the licenses granted to You at any time. Upon termination of this Agreement, You shall cease all use of the Software and the Documentation, return to Authorize.Net or destroy all copies of the Software and Documentation and related materials in Your possession, and so certify to Authorize.Net. Except for the license to You granted herein, the terms of this Agreement shall survive termination. + 6. CONFIDENTIAL INFORMATION + a. You hereby agree (i) to hold Authorize.Net’s Confidential Information in strict confidence and to take reasonable precautions to protect such Confidential Information (including, without limitation, all precautions You employ with respect to Your own confidential materials), (ii) not to divulge any such Confidential Information to any third person; (iii) not to make any use whatsoever at any time of such Confidential Information except as strictly licensed hereunder, (iv) not to remove or export from the United States or re-export any such Confidential Information or any direct product thereof, except in compliance with, and with all licenses and approvals required under applicable U.S. and foreign export laws and regulations, including, without limitation, those of the U.S. Department of Commerce. + b. “Confidential Information” shall mean any data or information, oral or written, treated as confidential that relates to Authorize.Net’s past, present, or future research, development or business activities, including without limitation any unannounced products and services, any information relating to services, developments, inventions, processes, plans, financial information, customer data, revenue, transaction volume, forecasts, projections, application programming interfaces, Software and Documentation. + 7. General Terms + 7.1 Law. This Agreement and all matters arising out of or relating to this Agreement shall be governed by the internal laws of the State of California without giving effect to any choice of law rule. This Agreement shall not be governed by the United Nations Convention on Contracts for the International Sales of Goods, the application of which is expressly excluded. In the event of any controversy, claim or dispute between the parties arising out of or relating to this Agreement, such controversy, claim or dispute shall be resolved in the state or federal courts in Santa Clara County, California, and the parties hereby irrevocably consent to the jurisdiction and venue of such courts. + 7.2 Logo License. Authorize.Net hereby grants to You the right to use, reproduce, publish, perform and display Authorize.Net logo solely in accordance with the current Authorize.Net brand guidelines. + 7.3 Severability and Waiver. If any provision of this Agreement is held to be illegal, invalid or otherwise unenforceable, such provision shall be enforced to the extent possible consistent with the stated intention of the parties, or, if incapable of such enforcement, shall be deemed to be severed and deleted from this Agreement, while the remainder of this Agreement shall continue in full force and effect. The waiver by either party of any default or breach of this Agreement shall not constitute a waiver of any other or subsequent default or breach. + 7.4 No Assignment. You may not assign, sell, transfer, delegate or otherwise dispose of, whether voluntarily or involuntarily, by operation of law or otherwise, this Agreement or any rights or obligations under this Agreement without the prior written consent of Authorize.Net, which may be withheld in Authorize.Net’s sole discretion. Any purported assignment, transfer or delegation by You shall be null and void. Subject to the foregoing, this Agreement shall be binding upon and shall inure to the benefit of the parties and their respective successors and assigns. + 7.5 Government Rights. If You (or any person or entity to whom you provide the Software or Documentation) are an agency or instrumentality of the United States Government, the Software and Documentation are “commercial computer software” and “commercial computer software documentation,” and pursuant to FAR 12.212 or DFARS 227.7202, and their successors, as applicable, use, reproduction and disclosure of the Software and Documentation are governed by the terms of this Agreement. + 7.6 Export Administration. You shall comply fully with all relevant export laws and regulations of the United States, including, without limitation, the U.S. Export Administration Regulations (collectively “Export Controls”). Without limiting the generality of the foregoing, You shall not, and You shall require Your representatives not to, export, direct or transfer the Software or the Documentation, or any direct product thereof, to any destination, person or entity restricted or prohibited by the Export Controls. + 7.7 Privacy. In order to continually innovate and improve the Software, Licensee understands and agrees that Authorize.Net may collect certain usage statistics including but not limited to a unique identifier, associated IP address, version number of software, and information on which tools and/or services in the Software are being used and how they are being used. + 7.8 Entire Agreement; Amendments. This Agreement constitutes the entire agreement between the parties and supersedes all prior or contemporaneous agreements or representations, written or oral, concerning the subject matter of this Agreement. Authorize.Net may make changes to this Agreement, Software or Documentation in its sole discretion. When these changes are made, Authorize.Net will make a new version of the Agreement, Software or Documentation available on the website where the Software is available. This Agreement may not be modified or amended by You except in a writing signed by a duly authorized representative of each party. You acknowledge and agree that +Authorize.Net has not made any representations, warranties or agreements of any kind, except as expressly set forth herein. + + +Authorize.Net Software Development Kit (SDK) License Agreement +v. February 1, 2017 +1 diff --git a/licenses/dependency_licenses.csv b/licenses/dependency_licenses.csv new file mode 100644 index 000000000..d21a9e703 --- /dev/null +++ b/licenses/dependency_licenses.csv @@ -0,0 +1,194 @@ +Package Name,Version,Language,License,Package URL,Repo URL,Location +tslib,2.8.0,NodeJS,0BSD,https://www.npmjs.com/package/tslib,https://github.com/Microsoft/tslib,./backend/compact-connect/lambdas/nodejs +@aws-amplify/auth,6.5.1,NodeJS,Apache-2.0,https://www.npmjs.com/package/@aws-amplify/auth,https://github.com/aws-amplify/amplify-js,./owasp-zap/authenticator +@aws-sdk/client-dynamodb,3.682.0,NodeJS,Apache-2.0,https://www.npmjs.com/package/@aws-sdk/client-dynamodb,https://github.com/aws/aws-sdk-js-v3,./backend/compact-connect/lambdas/nodejs +@aws-sdk/client-s3,3.682.0,NodeJS,Apache-2.0,https://www.npmjs.com/package/@aws-sdk/client-s3,https://github.com/aws/aws-sdk-js-v3,./backend/compact-connect/lambdas/nodejs +@aws-sdk/client-ses,3.682.0,NodeJS,Apache-2.0,https://www.npmjs.com/package/@aws-sdk/client-ses,https://github.com/aws/aws-sdk-js-v3,./backend/compact-connect/lambdas/nodejs +@aws-sdk/util-dynamodb,3.682.0,NodeJS,Apache-2.0,https://www.npmjs.com/package/@aws-sdk/util-dynamodb,https://github.com/aws/aws-sdk-js-v3,./backend/compact-connect/lambdas/nodejs +aws-amplify,6.6.4,NodeJS,Apache-2.0,https://www.npmjs.com/package/aws-amplify,https://github.com/aws-amplify/amplify-js,./owasp-zap/authenticator +less,3.0.4,NodeJS,Apache-2.0,https://www.npmjs.com/package/less,https://github.com/less/less.js,./webroot +sharp,0.33.3,NodeJS,Apache-2.0,https://www.npmjs.com/package/sharp,git://github.com/lovell/sharp,./webroot +stylelint-config-rational-order,0.1.2,NodeJS,Apache-2.0,https://www.npmjs.com/package/stylelint-config-rational-order,https://github.com/constverum/stylelint-config-rational-order,./webroot +typescript,4.5.5,NodeJS,Apache-2.0,https://www.npmjs.com/package/typescript,https://github.com/Microsoft/TypeScript,./backend/compact-connect/lambdas/nodejs:./webroot +@typescript-eslint/parser,5.4.0,NodeJS,BSD-2-Clause,https://www.npmjs.com/package/@typescript-eslint/parser,https://github.com/typescript-eslint/typescript-eslint,./backend/compact-connect/lambdas/nodejs:./webroot +dotenv,16.4.5,NodeJS,BSD-2-Clause,https://www.npmjs.com/package/dotenv,git://github.com/motdotla/dotenv,./owasp-zap/authenticator +babel-plugin-istanbul,6.1.1,NodeJS,BSD-3-Clause,https://www.npmjs.com/package/babel-plugin-istanbul,https://github.com/istanbuljs/babel-plugin-istanbul,./webroot +joi,17.13.0,NodeJS,BSD-3-Clause,https://www.npmjs.com/package/joi,git://github.com/hapijs/joi,./webroot +sinon,9.0.2,NodeJS,BSD-3-Clause,https://www.npmjs.com/package/sinon,https://github.com/sinonjs/sinon,./webroot +@istanbuljs/nyc-config-typescript,1.0.2,NodeJS,ISC,https://www.npmjs.com/package/@istanbuljs/nyc-config-typescript,https://github.com/istanbuljs/istanbuljs,./webroot +joi-password,4.2.0,NodeJS,ISC,https://www.npmjs.com/package/joi-password,https://github.com/Heaty566/joi-password,./webroot +nyc,15.1.0,NodeJS,ISC,https://www.npmjs.com/package/nyc,https://github.com/istanbuljs/nyc,./webroot +@babel/core,7.13.10,NodeJS,MIT,https://www.npmjs.com/package/@babel/core,https://github.com/babel/babel,./webroot +@babel/polyfill,7.11.5,NodeJS,MIT,https://www.npmjs.com/package/@babel/polyfill,https://github.com/babel/babel,./webroot +@babel/preset-env,7.13.10,NodeJS,MIT,https://www.npmjs.com/package/@babel/preset-env,https://github.com/babel/babel,./webroot +@intlify/unplugin-vue-i18n,0.6.2,NodeJS,MIT,https://www.npmjs.com/package/@intlify/unplugin-vue-i18n,https://github.com/intlify/bundle-tools,./webroot +@types/aws-lambda,8.10.145,NodeJS,MIT,https://www.npmjs.com/package/@types/aws-lambda,https://github.com/DefinitelyTyped/DefinitelyTyped,./backend/compact-connect/lambdas/nodejs +@types/chai,4.2.11,NodeJS,MIT,https://www.npmjs.com/package/@types/chai,https://github.com/DefinitelyTyped/DefinitelyTyped,./webroot +@types/jest,29.5.12,NodeJS,MIT,https://www.npmjs.com/package/@types/jest,https://github.com/DefinitelyTyped/DefinitelyTyped,./backend/compact-connect/lambdas/nodejs +@types/mocha,5.2.4,NodeJS,MIT,https://www.npmjs.com/package/@types/mocha,https://github.com/DefinitelyTyped/DefinitelyTyped,./webroot +@types/node,22.5.4,NodeJS,MIT,https://www.npmjs.com/package/@types/node,https://github.com/DefinitelyTyped/DefinitelyTyped,./backend/compact-connect/lambdas/nodejs +@types/nodemailer,6.4.14,NodeJS,MIT,https://www.npmjs.com/package/@types/nodemailer,https://github.com/DefinitelyTyped/DefinitelyTyped,./backend/compact-connect/lambdas/nodejs +@types/react,18.3.12,NodeJS,MIT,https://www.npmjs.com/package/@types/react,https://github.com/DefinitelyTyped/DefinitelyTyped,./backend/compact-connect/lambdas/nodejs +@typescript-eslint/eslint-plugin,5.4.0,NodeJS,MIT,https://www.npmjs.com/package/@typescript-eslint/eslint-plugin,https://github.com/typescript-eslint/typescript-eslint,./backend/compact-connect/lambdas/nodejs:./webroot +@usewaypoint/email-builder,0.0.6,NodeJS,MIT,https://www.npmjs.com/package/@usewaypoint/email-builder,https://www.npmjs.com/package/@usewaypoint/email-builder,./backend/compact-connect/lambdas/nodejs +@vue/cli-plugin-babel,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-babel,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-e2e-cypress,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-e2e-cypress,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-eslint,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-eslint,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-pwa,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-pwa,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-router,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-router,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-typescript,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-typescript,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-unit-mocha,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-unit-mocha,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-plugin-vuex,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-plugin-vuex,https://github.com/vuejs/vue-cli,./webroot +@vue/cli-service,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/@vue/cli-service,https://github.com/vuejs/vue-cli,./webroot +@vue/compat,3.4.21,NodeJS,MIT,https://www.npmjs.com/package/@vue/compat,https://github.com/vuejs/core,./webroot +@vue/compiler-sfc,3.1.0,NodeJS,MIT,https://www.npmjs.com/package/@vue/compiler-sfc,https://github.com/vuejs/vue-next,./webroot +@vue/eslint-config-airbnb,6.0.0,NodeJS,MIT,https://www.npmjs.com/package/@vue/eslint-config-airbnb,https://github.com/vuejs/eslint-config-airbnb,./webroot +@vue/eslint-config-typescript,9.1.0,NodeJS,MIT,https://www.npmjs.com/package/@vue/eslint-config-typescript,https://github.com/vuejs/eslint-config-typescript,./webroot +@vue/test-utils,2.4.5,NodeJS,MIT,https://www.npmjs.com/package/@vue/test-utils,https://github.com/vuejs/test-utils,./webroot +@vuepic/vue-datepicker,8.7.0,NodeJS,MIT,https://www.npmjs.com/package/@vuepic/vue-datepicker,https://github.com/Vuepic/vue-datepicker,./webroot +aws-lambda,1.0.7,NodeJS,MIT,https://www.npmjs.com/package/aws-lambda,https://github.com/awspilot/cli-lambda-deploy,./backend/compact-connect/lambdas/nodejs +aws-sdk-client-mock,4.1.0,NodeJS,MIT,https://www.npmjs.com/package/aws-sdk-client-mock,https://github.com/m-radzikowski/aws-sdk-client-mock,./backend/compact-connect/lambdas/nodejs +aws-sdk-client-mock-jest,4.1.0,NodeJS,MIT,https://www.npmjs.com/package/aws-sdk-client-mock-jest,https://github.com/m-radzikowski/aws-sdk-client-mock,./backend/compact-connect/lambdas/nodejs +axios,0.28.1,NodeJS,MIT,https://www.npmjs.com/package/axios,https://github.com/axios/axios,./webroot +babel-loader,8.2.2,NodeJS,MIT,https://www.npmjs.com/package/babel-loader,https://github.com/babel/babel-loader,./webroot +chai,4.1.2,NodeJS,MIT,https://www.npmjs.com/package/chai,https://github.com/chaijs/chai,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs:./webroot +chai-match-pattern,1.1.0,NodeJS,MIT,https://www.npmjs.com/package/chai-match-pattern,https://github.com/originate/chai-match-pattern,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs:./webroot +chalk,4.0.0,NodeJS,MIT,https://www.npmjs.com/package/chalk,https://github.com/chalk/chalk,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs:./webroot +click-outside-vue3,4.0.1,NodeJS,MIT,https://www.npmjs.com/package/click-outside-vue3,https://github.com/andymark-by/click-outside-vue3,./webroot +core-js,3.23.0,NodeJS,MIT,https://www.npmjs.com/package/core-js,https://github.com/zloirock/core-js,./webroot +country-codes-flags-phone-codes,1.0.4,NodeJS,MIT,https://www.npmjs.com/package/country-codes-flags-phone-codes,https://github.com/mehmetcanfarsak/country-codes-flags-phone-codes,./webroot +cypress,13.11.0,NodeJS,MIT,https://www.npmjs.com/package/cypress,https://github.com/cypress-io/cypress,./webroot +cypress-axe,1.5.0,NodeJS,MIT,https://www.npmjs.com/package/cypress-axe,https://github.com/component-driven/cypress-axe,./webroot +cypress-file-upload,5.0.8,NodeJS,MIT,https://www.npmjs.com/package/cypress-file-upload,https://github.com/abramenal/cypress-file-upload,./webroot +cypress-localstorage-commands,2.2.6,NodeJS,MIT,https://www.npmjs.com/package/cypress-localstorage-commands,https://github.com/javierbrea/cypress-localstorage-commands,./webroot +esbuild,0.24.0,NodeJS,MIT,https://www.npmjs.com/package/esbuild,https://github.com/evanw/esbuild,./backend/compact-connect/lambdas/nodejs +eslint,7.32.0,NodeJS,MIT,https://www.npmjs.com/package/eslint,https://github.com/eslint/eslint,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs:./webroot +eslint-config-airbnb-base,15.0.0,NodeJS,MIT,https://www.npmjs.com/package/eslint-config-airbnb-base,https://github.com/airbnb/javascript,./owasp-zap/authenticator +eslint-plugin-import,2.25.3,NodeJS,MIT,https://www.npmjs.com/package/eslint-plugin-import,https://github.com/import-js/eslint-plugin-import,./owasp-zap/authenticator:./webroot +eslint-plugin-json,3.1.0,NodeJS,MIT,https://www.npmjs.com/package/eslint-plugin-json,https://github.com/azeemba/eslint-plugin-json,./webroot +eslint-plugin-vue,8.0.3,NodeJS,MIT,https://www.npmjs.com/package/eslint-plugin-vue,https://github.com/vuejs/eslint-plugin-vue,./webroot +eslint-plugin-vue-a11y,0.0.31,NodeJS,MIT,https://www.npmjs.com/package/eslint-plugin-vue-a11y,https://github.com/maranran/eslint-plugin-vue-a11y,./webroot +eslint-plugin-vuejs-accessibility,1.1.0,NodeJS,MIT,https://www.npmjs.com/package/eslint-plugin-vuejs-accessibility,https://github.com/vue-a11y/eslint-plugin-vuejs-accessibility,./webroot +favicons,7.2.0,NodeJS,MIT,https://www.npmjs.com/package/favicons,https://github.com/itgalaxy/favicons,./webroot +favicons-webpack-plugin,6.0.1,NodeJS,MIT,https://www.npmjs.com/package/favicons-webpack-plugin,https://github.com/jantimon/favicons-webpack-plugin,./webroot +flush-promises,1.0.2,NodeJS,MIT,https://www.npmjs.com/package/flush-promises,https://github.com/kentor/flush-promises,./webroot +grunt,1.6.1,NodeJS,MIT,https://www.npmjs.com/package/grunt,https://github.com/gruntjs/grunt,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +grunt-contrib-watch,1.1.0,NodeJS,MIT,https://www.npmjs.com/package/grunt-contrib-watch,https://github.com/gruntjs/grunt-contrib-watch,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +grunt-eslint,25.0.0,NodeJS,MIT,https://www.npmjs.com/package/grunt-eslint,https://github.com/sindresorhus/grunt-eslint,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +happy-dom,15.10.2,NodeJS,MIT,https://www.npmjs.com/package/happy-dom,https://github.com/capricorn86/happy-dom,./webroot +inquirer,7.1.0,NodeJS,MIT,https://www.npmjs.com/package/inquirer,https://github.com/SBoudrias/Inquirer.js,./webroot +jest,29.7.0,NodeJS,MIT,https://www.npmjs.com/package/jest,https://github.com/jestjs/jest,./backend/compact-connect/lambdas/nodejs +jit-grunt,0.10.0,NodeJS,MIT,https://www.npmjs.com/package/jit-grunt,git://github.com/shootaroo/jit-grunt,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +lambda-local,2.2.0,NodeJS,MIT,https://www.npmjs.com/package/lambda-local,https://github.com/ashiina/lambda-local,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +less-loader,5.0.0,NodeJS,MIT,https://www.npmjs.com/package/less-loader,https://github.com/webpack-contrib/less-loader,./webroot +libphonenumber-js,1.11.1,NodeJS,MIT,https://www.npmjs.com/package/libphonenumber-js,git+https://gitlab.com/catamphetamine/libphonenumber-js.git,./webroot +lint-staged,15.0.0,NodeJS,MIT,https://www.npmjs.com/package/lint-staged,https://github.com/okonet/lint-staged,./webroot +lodash.clonedeep,4.5.0,NodeJS,MIT,https://www.npmjs.com/package/lodash.clonedeep,https://github.com/lodash/lodash,./webroot +lodash.uniqueid,4.0.1,NodeJS,MIT,https://www.npmjs.com/package/lodash.uniqueid,https://github.com/lodash/lodash,./webroot +mocha,11.0.0,NodeJS,MIT,https://www.npmjs.com/package/mocha,https://github.com/mochajs/mocha,./owasp-zap/authenticator:./backend/compact-connect/lambdas/nodejs +moment,2.30.1,NodeJS,MIT,https://www.npmjs.com/package/moment,https://github.com/moment/moment,./webroot +moment-timezone,0.5.31,NodeJS,MIT,https://www.npmjs.com/package/moment-timezone,https://github.com/moment/moment-timezone,./webroot +numeral,2.0.6,NodeJS,MIT,https://www.npmjs.com/package/numeral,https://github.com/adamwdraper/Numeral-js,./webroot +object.fromentries,2.0.2,NodeJS,MIT,https://www.npmjs.com/package/object.fromentries,git://github.com/es-shims/Object.fromEntries,./webroot +react,18.3.1,NodeJS,MIT,https://www.npmjs.com/package/react,https://github.com/facebook/react,./backend/compact-connect/lambdas/nodejs +react-dom,18.3.1,NodeJS,MIT,https://www.npmjs.com/package/react-dom,https://github.com/facebook/react,./backend/compact-connect/lambdas/nodejs +register-service-worker,1.7.1,NodeJS,MIT,https://www.npmjs.com/package/register-service-worker,https://github.com/yyx990803/register-service-worker,./webroot +replace-in-file,5.0.2,NodeJS,MIT,https://www.npmjs.com/package/replace-in-file,https://github.com/adamreisnz/replace-in-file,./webroot +style-resources-loader,1.3.3,NodeJS,MIT,https://www.npmjs.com/package/style-resources-loader,https://github.com/yenshih/style-resources-loader,./webroot +stylelint,13.3.0,NodeJS,MIT,https://www.npmjs.com/package/stylelint,https://github.com/stylelint/stylelint,./webroot +stylelint-config-standard,20.0.0,NodeJS,MIT,https://www.npmjs.com/package/stylelint-config-standard,https://github.com/stylelint/stylelint-config-standard,./webroot +stylelint-webpack-plugin,1.2.3,NodeJS,MIT,https://www.npmjs.com/package/stylelint-webpack-plugin,https://github.com/webpack-contrib/stylelint-webpack-plugin,./webroot +text-encoding-shim,1.0.5,NodeJS,MIT,https://www.npmjs.com/package/text-encoding-shim,git+https://gitlab.com/PseudoPsycho/text-encoding-shim.git,./webroot +ts-jest,29.2.5,NodeJS,MIT,https://www.npmjs.com/package/ts-jest,https://github.com/kulshekhar/ts-jest,./backend/compact-connect/lambdas/nodejs +ts-node,10.9.2,NodeJS,MIT,https://www.npmjs.com/package/ts-node,git://github.com/TypeStrong/ts-node,./backend/compact-connect/lambdas/nodejs +tsx,4.19.2,NodeJS,MIT,https://www.npmjs.com/package/tsx,https://github.com/privatenumber/tsx,./backend/compact-connect/lambdas/nodejs +uuid,8.3.2,NodeJS,MIT,https://www.npmjs.com/package/uuid,https://github.com/uuidjs/uuid,./webroot +vue,3.1.0,NodeJS,MIT,https://www.npmjs.com/package/vue,https://github.com/vuejs/vue-next,./webroot +vue-facing-decorator,3.0.4,NodeJS,MIT,https://www.npmjs.com/package/vue-facing-decorator,https://github.com/facing-dev/vue-facing-decorator,./webroot +vue-i18n,10.0.5,NodeJS,MIT,https://www.npmjs.com/package/vue-i18n,https://github.com/intlify/vue-i18n,./webroot +vue-responsiveness,0.2.0,NodeJS,MIT,https://www.npmjs.com/package/vue-responsiveness,https://github.com/codemonk-digital/vue-responsiveness,./webroot +vue-router,4.3.0,NodeJS,MIT,https://www.npmjs.com/package/vue-router,https://github.com/vuejs/router,./webroot +vue3-lazyload,0.3.8,NodeJS,MIT,https://www.npmjs.com/package/vue3-lazyload,https://github.com/murongg/vue3-lazyload,./webroot +vuex,4.1.0,NodeJS,MIT,https://www.npmjs.com/package/vuex,https://github.com/vuejs/vuex,./webroot +vuex-extensions,4.1.0,NodeJS,MIT,https://www.npmjs.com/package/vuex-extensions,https://github.com/huybuidac/vuex-extensions,./webroot +zod,3.23.8,NodeJS,MIT,https://www.npmjs.com/package/zod,https://github.com/colinhacks/zod,./backend/compact-connect/lambdas/nodejs +@aws-lambda-powertools/logger,2.10.0,NodeJS,MIT-0,https://www.npmjs.com/package/@aws-lambda-powertools/logger,https://github.com/aws-powertools/powertools-lambda-typescript,./backend/compact-connect/lambdas/nodejs +nodemailer,6.9.12,NodeJS,MIT-0,https://www.npmjs.com/package/nodemailer,https://github.com/nodemailer/nodemailer,./backend/compact-connect/lambdas/nodejs +axe-core,4.9.1,NodeJS,MPL-2.0,https://www.npmjs.com/package/axe-core,https://github.com/dequelabs/axe-core,./webroot +aws-cdk-asset-awscli-v1,2.2.223,Python,Apache-2.0,https://pypi.org/project/aws-cdk-asset-awscli-v1,https://github.com/cdklabs/awscdk-asset-awscli#readme,./backend/compact-connect:./backend/multi-account +aws-cdk-asset-kubectl-v20,2.1.4,Python,Apache-2.0,https://pypi.org/project/aws-cdk-asset-kubectl-v20,https://github.com/cdklabs/awscdk-asset-kubectl#readme,./backend/compact-connect:./backend/multi-account +aws-cdk-asset-node-proxy-agent-v6,2.1.0,Python,Apache-2.0,https://pypi.org/project/aws-cdk-asset-node-proxy-agent-v6,https://github.com/cdklabs/awscdk-asset-node-proxy-agent#readme,./backend/compact-connect:./backend/multi-account +aws-cdk-aws-lambda-python-alpha,2.178.2,Python,Apache-2.0,https://pypi.org/project/aws-cdk-aws-lambda-python-alpha,https://github.com/aws/aws-cdk,./backend/compact-connect +aws-cdk-cloud-assembly-schema,39.2.20,Python,Apache-2.0,https://pypi.org/project/aws-cdk-cloud-assembly-schema,https://github.com/cdklabs/cloud-assembly-schema,./backend/compact-connect:./backend/multi-account +aws-cdk-lib,2.178.2,Python,Apache-2.0,https://pypi.org/project/aws-cdk-lib,https://github.com/aws/aws-cdk,./backend/compact-connect:./backend/multi-account +boto3,1.36.19,Python,Apache-2.0,https://pypi.org/project/boto3,https://github.com/boto/boto3,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +botocore,1.36.19,Python,Apache-2.0,https://pypi.org/project/botocore,https://github.com/boto/botocore,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +cdk-nag,2.35.17,Python,Apache-2.0,https://pypi.org/project/cdk-nag,https://github.com/cdklabs/cdk-nag.git,./backend/compact-connect +constructs,10.4.2,Python,Apache-2.0,https://pypi.org/project/constructs,https://github.com/aws/constructs,./backend/compact-connect:./backend/multi-account +coverage,7.6.12,Python,Apache-2.0,https://pypi.org/project/coverage,https://github.com/nedbat/coveragepy,./backend/compact-connect +cyclonedx-python-lib,8.8.0,Python,Apache-2.0,https://pypi.org/project/cyclonedx-python-lib,https://github.com/CycloneDX/cyclonedx-python-lib,./backend/compact-connect +docker,7.1.0,Python,Apache-2.0,https://pypi.org/project/docker,https://github.com/docker/docker-py,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +importlib-resources,6.5.2,Python,Apache-2.0,https://pypi.org/project/importlib-resources,https://github.com/python/importlib_resources,./backend/compact-connect:./backend/multi-account +jsii,1.106.0,Python,Apache-2.0,https://pypi.org/project/jsii,https://github.com/aws/jsii,./backend/compact-connect:./backend/multi-account +license-expression,30.4.1,Python,Apache-2.0,https://pypi.org/project/license-expression,https://github.com/aboutcode-org/license-expression,./backend/compact-connect +moto,5.0.28,Python,Apache-2.0,https://pypi.org/project/moto,https://github.com/getmoto/moto,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +msgpack,1.1.0,Python,Apache-2.0,https://pypi.org/project/msgpack,https://github.com/msgpack/msgpack-python/,./backend/compact-connect +pip-api,0.0.34,Python,Apache-2.0,https://pypi.org/project/pip-api,http://github.com/di/pip-api,./backend/compact-connect +pip-audit,2.8.0,Python,Apache-2.0,https://pypi.org/project/pip-audit,https://github.com/pypa/pip-audit,./backend/compact-connect +py-serializable,1.1.2,Python,Apache-2.0,https://pypi.org/project/py-serializable,https://github.com/madpah/serializable#readme,./backend/compact-connect +pyxb-x,1.2.6.3,Python,Apache-2.0,https://pypi.org/project/pyxb-x,http://pyxb.sourceforge.net,./backend/compact-connect/lambdas/python/purchases +requests,2.32.3,Python,Apache-2.0,https://pypi.org/project/requests,https://requests.readthedocs.io,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +responses,0.25.6,Python,Apache-2.0,https://pypi.org/project/responses,https://github.com/getsentry/responses,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +s3transfer,0.11.2,Python,Apache-2.0,https://pypi.org/project/s3transfer,https://github.com/boto/s3transfer,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +sortedcontainers,2.4.0,Python,Apache-2.0,https://pypi.org/project/sortedcontainers,http://www.grantjenks.com/docs/sortedcontainers/,./backend/compact-connect +cryptography,44.0.1,Python,Apache-2.0 OR BSD-3-Clause,https://pypi.org/project/cryptography,https://github.com/pyca/cryptography/,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +pip-tools,7.4.1,Python,BSD,https://pypi.org/project/pip-tools,https://github.com/jazzband/pip-tools,./backend/compact-connect +boolean-py,4.0,Python,BSD-2-Clause,https://pypi.org/project/boolean-py,https://github.com/bastikr/boolean.py,./backend/compact-connect +pygments,2.19.1,Python,BSD-2-Clause,https://pypi.org/project/pygments,https://github.com/pygments/pygments,./backend/compact-connect +click,8.1.8,Python,BSD-3-Clause,https://pypi.org/project/click,https://github.com/pallets/click/,./backend/compact-connect +idna,3.10,Python,BSD-3-Clause,https://pypi.org/project/idna,https://github.com/kjd/idna,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +jinja2,3.1.5,Python,BSD-3-Clause,https://pypi.org/project/jinja2,https://github.com/pallets/jinja/,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +joserfc,1.0.3,Python,BSD-3-Clause,https://pypi.org/project/joserfc,https://github.com/authlib/joserfc,./backend/compact-connect/lambdas/python/staff-users +lxml,4.9.4,Python,BSD-3-Clause,https://pypi.org/project/lxml,https://lxml.de/,./backend/compact-connect/lambdas/python/purchases +pycparser,2.22,Python,BSD-3-Clause,https://pypi.org/project/pycparser,https://github.com/eliben/pycparser,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +werkzeug,3.1.3,Python,BSD-3-Clause,https://pypi.org/project/werkzeug,https://github.com/pallets/werkzeug/,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +markupsafe,3.0.2,Python,"Copyright 2010 Pallets Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ",https://pypi.org/project/markupsafe,https://github.com/pallets/markupsafe/,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +python-dateutil,2.9.0.,Python,Dual License,https://pypi.org/project/python-dateutil,https://github.com/dateutil/dateutil,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/multi-account:./backend/compact-connect +attrs,24.3.0,Python,MIT,https://pypi.org/project/attrs,https://github.com/python-attrs/attrs,./backend/compact-connect:./backend/multi-account +aws-lambda-powertools,3.6.0,Python,MIT,https://pypi.org/project/aws-lambda-powertools,https://github.com/aws-powertools/powertools-lambda-python,./backend/compact-connect/lambdas/python/common +build,1.2.2.,Python,MIT,https://pypi.org/project/build,https://github.com/pypa/build,./backend/compact-connect +cattrs,24.1.2,Python,MIT,https://pypi.org/project/cattrs,https://github.com/python-attrs/cattrs,./backend/compact-connect:./backend/multi-account +cffi,1.17.1,Python,MIT,https://pypi.org/project/cffi,http://cffi.readthedocs.org,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +charset-normalizer,3.4.1,Python,MIT,https://pypi.org/project/charset-normalizer,https://github.com/jawah/charset_normalizer,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +faker,28.4.1,Python,MIT,https://pypi.org/project/faker,https://github.com/joke2k/faker,./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect:./backend/compact-connect/lambdas/python/provider-data-v1 +iniconfig,2.0.0,Python,MIT,https://pypi.org/project/iniconfig,https://github.com/pytest-dev/iniconfig,./backend/compact-connect:./backend/multi-account +jmespath,1.0.1,Python,MIT,https://pypi.org/project/jmespath,https://github.com/jmespath/jmespath.py,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +markdown-it-py,3.0.0,Python,MIT,https://pypi.org/project/markdown-it-py,https://github.com/executablebooks/markdown-it-py,./backend/compact-connect +marshmallow,3.26.1,Python,MIT,https://pypi.org/project/marshmallow,https://github.com/marshmallow-code/marshmallow,./backend/compact-connect/lambdas/python/common +packageurl-python,0.16.0,Python,MIT,https://pypi.org/project/packageurl-python,https://github.com/package-url/packageurl-python,./backend/compact-connect +pip-requirements-parser,32.0.1,Python,MIT,https://pypi.org/project/pip-requirements-parser,https://github.com/nexB/pip-requirements-parser,./backend/compact-connect +platformdirs,4.3.6,Python,MIT,https://pypi.org/project/platformdirs,https://github.com/tox-dev/platformdirs,./backend/compact-connect +pluggy,1.5.0,Python,MIT,https://pypi.org/project/pluggy,https://github.com/pytest-dev/pluggy,./backend/compact-connect:./backend/multi-account +publication,0.0.3,Python,MIT,https://pypi.org/project/publication,https://github.com/glyph/publication,./backend/compact-connect:./backend/multi-account +py-partiql-parser,0.6.1,Python,MIT,https://pypi.org/project/py-partiql-parser,https://github.com/getmoto/py-partiql-parser,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +pyparsing,3.2.1,Python,MIT,https://pypi.org/project/pyparsing,https://github.com/pyparsing/pyparsing/,./backend/compact-connect +pyproject-hooks,1.2.0,Python,MIT,https://pypi.org/project/pyproject-hooks,https://github.com/pypa/pyproject-hooks,./backend/compact-connect +pytest,8.3.4,Python,MIT,https://pypi.org/project/pytest,https://github.com/pytest-dev/pytest,./backend/compact-connect:./backend/multi-account +pytest-cov,6.0.0,Python,MIT,https://pypi.org/project/pytest-cov,https://github.com/pytest-dev/pytest-cov,./backend/compact-connect +pyyaml,6.0.2,Python,MIT,https://pypi.org/project/pyyaml,https://pyyaml.org/,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +rich,13.9.4,Python,MIT,https://pypi.org/project/rich,https://github.com/Textualize/rich,./backend/compact-connect +ruff,0.9.6,Python,MIT,https://pypi.org/project/ruff,https://docs.astral.sh/ruff,./backend/compact-connect +six,1.17.0,Python,MIT,https://pypi.org/project/six,https://github.com/benjaminp/six,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/multi-account:./backend/compact-connect +toml,0.10.2,Python,MIT,https://pypi.org/project/toml,https://github.com/uiri/toml,./backend/compact-connect +typeguard,2.13.3,Python,MIT,https://pypi.org/project/typeguard,UNKNOWN,./backend/compact-connect:./backend/multi-account +urllib3,2.3.0,Python,MIT,https://pypi.org/project/urllib3,https://github.com/urllib3/urllib3,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +wheel,0.45.1,Python,MIT,https://pypi.org/project/wheel,https://github.com/pypa/wheel,./backend/compact-connect +xmltodict,0.14.2,Python,MIT,https://pypi.org/project/xmltodict,https://github.com/martinblech/xmltodict,./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations +certifi,2025.1.31,Python,MPL-2.0,https://pypi.org/project/certifi,https://github.com/certifi/python-certifi,./backend/compact-connect/lambdas/python/purchases:./backend/compact-connect/lambdas/python/staff-users:./backend/compact-connect/lambdas/python/common:./backend/compact-connect/lambdas/python/data-events:./backend/compact-connect/lambdas/python/staff-user-pre-token:./backend/compact-connect/lambdas/python/attestations:./backend/compact-connect/lambdas/python/custom-resources:./backend/compact-connect/lambdas/python/provider-data-v1:./backend/compact-connect +cachecontrol,0.14.2,Python,Apache-2.0,https://pypi.org/project/cachecontrol,https://github.com/psf/cachecontrol,./backend/compact-connect +mdurl,0.1.2,Python,MIT,https://pypi.org/project/mdurl,https://github.com/executablebooks/mdurl,./backend/compact-connect +packaging,24.2,Python,Apache-2.0 OR BSD-2-Clause,https://pypi.org/project/packaging,https://github.com/pypa/packaging,./backend/compact-connect/lambdas/python/common:./backend/compact-connect:./backend/multi-account +typing-extensions,4.12.2,Python,PSF-2.0,https://pypi.org/project/typing-extensions,https://github.com/python/typing_extensions,./backend/compact-connect/lambdas/python/common:./backend/compact-connect:./backend/multi-account +defusedxml,0.7.1,Python,PSFL,https://pypi.org/project/defusedxml,https://github.com/tiran/defusedxml,./backend/compact-connect +filelock,3.17.0,Python,Unlicense,https://pypi.org/project/filelock,https://github.com/tox-dev/py-filelock,./backend/compact-connect +authorizenet,1.1.5,Python,proprietary,https://pypi.org/project/authorizenet,https://github.com/AuthorizeNet/sdk-python,./backend/compact-connect/lambdas/python/purchases