All files / src/utils validate-mit-license.ts

100% Statements 69/69
100% Branches 14/14
100% Functions 1/1
100% Lines 69/69

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 701x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 1x 1x 1x 5x 6x 1x 1x 1x 4x 6x 11x 3x 3x 3x 1x 1x 1x 11x 8x 8x 8x 2x 2x 2x 8x 11x 1x 1x 1x  
/**
 * Returns an error string for license issues, or null if no issues found
 * @param license
 * @returns
 */
export function validateMITLicense(license: string) {
  // NOTE: this function returns error messages which will not be easily
  // localizable. Given this is only for use with the keyboards and
  // lexical-models repositories, suggest we don't worry about this
 
  // split input text into paragraphs, trimming whitespace
  const text = license.trim().split('\n').map(line => line.trim()).join('\n').split(/\n\s*\n/);
 
  // MIT license, cleanup whitespace
  const clauses = [
    `The MIT License (MIT)`,
 
    `Copyright ...`, // Copyright is tested separately below
 
    `Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:`,
 
    `The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.`,
 
    `THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.`
  ]
  .map(clause => clause.split('\n').map(line => line.trim()).join(' '));
 
  if(text.length < clauses.length) {
    // not enough clauses in the file
    return 'License is missing clauses from MIT license';
  }
 
  if(text.length > clauses.length) {
    // too many clauses in the file
    return 'License contains extra text';
  }
 
  for(let i = 0; i < clauses.length; i++) {
    if(i == 1) {
      // Clause 1 is the only one that can differ, and just with
      // a copyright holder
      if(!text[i].match(/^Copyright/)) {
        // No Copyright clause
        return `Clause 2 does not start with 'Copyright'`;
      }
    } else {
      const t0 = text[i].replaceAll(/\s+/g, ' ').trim();
      const c0 = clauses[i].replaceAll(/\s+/g, ' ').trim();
      if(t0 != c0) {
        // Clause does not match
        return `Clause ${i+1} differs from MIT license`;
      }
    }
  }
 
  return null;
}