Skip to main content

A library for checking and updating copyright/license headers in a project.

This package works with Deno
This package works with Deno
JSR Score
82%
Published
8 months ago (1.2.2)

ci

copyright-license-checker

A Deno based utility to check and/or update the copyright/license file headers of source code files.

A copyright and license header is typically found at the top of each source file in a project. It might look like this:

// Copyright 2019-2023 The Company authors. All rights reserved. MIT license.

where The Company is either the organisation (or individual) owning the code.

Including a copyright and license header in source files is important for a number of reasons:

  • Protecting intellectual property rights: The copyright header serves as a notice that the source code is protected by copyright law. It informs others viewing individual files that they cannot use or distribute the code except under the terms of the license.

  • Clarifying the terms of use: Users can see the license for that source file and understand the terms under which the code may be used, modified, and distributed.

  • Establishing ownership and origin: The copyright and license headers identify the author or organization that created the code and the date it was created. This can be important for establishing ownership and tracking the history of the code, for example if the source code file is copied to another project.

  • Meeting legal requirements: Many software licenses require that the copyright and license information be included in each source file.

Usage

This project offers two command line utilities, checker.ts and updater.ts. These take a single argument, an options JSON file.

Options

This is a JSON file which looks like this:

{
  "extensions": [
    ".ts",
    ".js"
  ],
  "exclusions": [
    "node_modules",
    "dist",
    "**/testdata"
  ],
  "headerText": "// Copyright {TIMEFRAME} The Company authors. All rights reserved. MIT license.",
  "rootDir": ".",
  "firstYear": 2019,
  "quiet": false
}

The firstYear element is optional.

With regards to dynamic timeframes in your header, you specify in the header text a {TIMEFRAME} token placeholder. This token will be replaced with the timespan of first year to current year (e.g. "2019-2023") OR just the current year (e.g. "2023") if the first year is either left out of the options or is the same as the current year.

You can check your files via the following:

deno run --allow-read=. jsr:@cknight/copyright-checker/checker options.json

Implementing a header check in your CI pipeline

The simplest way to implement a copyright/license header check in your CI pipeline to ensure all necessary files have a copyright/license header which is also up to date is to add a test in your project. An example test would be:

import { assert } from "jsr:@std/assert@0.215";
import {
  checkCopyrightHeaders,
  Options,
} from "jsr:@cknight/copyright_checker@1";

// Run with allow write and allow read permissions on the relevant directories
// e.g. deno test --allow-read=.
Deno.test({
  name: "Copyright and license headers are present and up to date",
  async fn() {
    const options: Options = {
      extensions: [".ts", ".tsx"],
      exclusions: ["testdata", "node_modules"],
      headerText:
        `// Copyright {TIMEFRAME} the Org authors. All rights reserved. MIT license.`,
      rootDir: ".",
      firstYear: 2019,
      quiet: false,
    };
    assert(await checkCopyrightHeaders(options));
  },
});

To update the headers you can run the following:

deno run --allow-write=. --allow-read=. jsr:@cknight/copyright-checker/updater options.json

Add Package

deno add jsr:@cknight/copyright-checker

Import symbol

import * as mod from "@cknight/copyright-checker";

---- OR ----

Import directly with a jsr specifier

import * as mod from "jsr:@cknight/copyright-checker";