diff --git a/README.md b/README.md index 268d81e9bf..1e6ba6ccee 100644 --- a/README.md +++ b/README.md @@ -87,12 +87,14 @@ And many more! ## License -Most files are published using [the standard MIT Expat -license](https://www.gnu.org/licenses/license-list.html#Expat). One file, -however, is provided under a slightly modified version of that license. The -so-called [JSON license](https://www.gnu.org/licenses/license-list.html#JSON) -is a non-free license, and unfortunately, we can't change it due to historical -reasons. This license is included as an in-line within the file it concerns. +JSHint is licensed under [the MIT Expat +license](https://www.gnu.org/licenses/license-list.html#Expat). + +Prior to version 2.12.0 (release in August 2020), JSHint was partially licensed +under the non-free [JSON +license](https://www.gnu.org/licenses/license-list.html#JSON). [The 2020 +Relicensing document](http://jshint.com/relicensing-2020/) details the process +maintainers followed to change the license. ## The JSHint Team diff --git a/docs/relicensing-2020-commits-lacking-signatures.csv b/docs/relicensing-2020-commits-lacking-signatures.csv new file mode 100644 index 0000000000..ddde3931c7 --- /dev/null +++ b/docs/relicensing-2020-commits-lacking-signatures.csv @@ -0,0 +1,86 @@ +8accbaed,LMLB@users.noreply.github.com,DOCS-Replace-Private-Use-Area-character,Non-substantive +862f00b0,artem@artnez.com,Do-not-assume-JSON-block-when-mapping-array,"(signed, just erroneously switched e-mail address and name in form)" +e8137dfa,oleg.grenrus@iki.fi,Issue-350-Make-shadow-check-for-outer-scopes-as-well,granted permission via a GPG-signed e-mail sent to project maintainers +e2c876d5,oleg.grenrus@iki.fi,Fixed-1243-Detect-comparisons-with-typeof-x-and-check-the-other-operand,granted permission via a GPG-signed e-mail sent to project maintainers +6038e4e2,artem@artnez.com,Fixed-1253-Limit-parseInt-radix-check-to-ES3-only,"(signed, just erroneously switched e-mail address and name in form)" +dd0effc7,will.lawrence@gmail.com,Fixed-1221-Add-globals-to-the-valOptions-list,Non-substantive +a17ae9ed,lapo@lapo.it,Fixed-1189-Support-spaces-in-global,Rewritten via e542f67722430318e9d4804d9f4089b84507b45a +537dcbd4,code@frantsev.ru,Fixed-1164-Add-codes-to-errors-generated-by-quit,Rewritten via 94d7f239da4b2ae300b2342af0b777a489f63765 +87e3e6cc,timruffles@googlemail.com,Fixed-1138-Count-ternary-and-or-operators-for-complexity,Rewritten via 7a5948c64b5b3937e422843c0234f7a4685bba68 and 8a205a808582579592d5301bba587894e3a824c8 +66f3e4c1,smath23@gmail.com,Fixed-1133-Make-shelljs-imply-node,Non-substantive +88c862df,usrbincc@yahoo.com,Fixed-1109-Parse-yield-expressions,Rewritten via 6fdb4f60586fce156d62633845ca5a19417379c3 +b3d054e0,usrbincc@yahoo.com,Fixed-1105-two-unrelated-bugs-with-a-parser.-See-1106-for-more-info,Rewritten via 691dbdc1970bc1f1406a0d0ab68e184a0f20ece2 +88644e3d,smath23@gmail.com,Fixes-1124-Add-shelljs-option,Non-substantive +813de6cb,usrbincc@yahoo.com,Don-t-try-to-parse-expression-closure-bodies-as-comma-expressions,Non-substantive +807db5e3,usrbincc@yahoo.com,Try-directly-setting-x.paren-from-nud-of-prefix,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +72f5f371,usrbincc@yahoo.com,An-attempt-to-ignore-assigns-in-conditionals-when-in-parens,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +6de20a3b,usrbincc@yahoo.com,Break-out-of-comma-expression-parsing-when-a-reserved-word-is-seen,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +21b77a5e,usrbincc@yahoo.com,Update-precedence-for-expression-calls-that-cannot-include-commas,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +48a0ae6a,usrbincc@yahoo.com,Use-the-new-comma-parsing-code-in-if-conditions,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +2865994b,usrbincc@yahoo.com,Make-comma-an-infix-operator,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +2ea9d842,usrbincc@yahoo.com,Handle-assignments-in-switch-conditions,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc +abbbad5e,usrbincc@yahoo.com,Slightly-cleaner-solution,Non-substantive +8ccd8275,usrbincc@yahoo.com,Fix-read-of-property-use-strict-of-undefined,Non-substantive +cd03a564,usrbincc@yahoo.com,Always-do-the-unstack-and-after-the-last-advance-for-good-measure,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce +b4e146e2,usrbincc@yahoo.com,Add-spec-comment-for-strictness-of-ClassBody,Non-substantive +6b99d1d0,usrbincc@yahoo.com,Remove-explicit-check-for-class-names-eval-or-arguments,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +dfeaebec,usrbincc@yahoo.com,Code-cleanup-reduce-diff-with-master,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +19aa8a10,usrbincc@yahoo.com,expression-should-only-warn-about-future-reserved-words-in-labels,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +9d3abc80,usrbincc@yahoo.com,Remove-unnecessary-esnextReserved-meta-tag,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +9b992412,usrbincc@yahoo.com,Mark-interface-as-an-es5-strictOnly-keyword,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +4d6f9540,usrbincc@yahoo.com,Make-only-class-bodies-strict-by-default-not-the-entire-declaration,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +75b06d7e,usrbincc@yahoo.com,Accept-class-C-extends-AssignmentExpression,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +b6190c8e,usrbincc@yahoo.com,Use-function-param-isclassdef-not-function-classdef-in-conditional,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +bbfa15d1,usrbincc@yahoo.com,Simpler-to-do-one-unstack-here-blockscope-already-has-one-stack,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce +5ac92c2f,usrbincc@yahoo.com,Recognize-unused-let-at-the-global-scope,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce +181f1c80,usrbincc@yahoo.com,Update-class-getter-setter-naming-error-messages-to-be-more-specific,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +c658a4c0,usrbincc@yahoo.com,Fix-error-message-calls,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +ab3a40ba,usrbincc@yahoo.com,Fix-indentation,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +955da17d,usrbincc@yahoo.com,Comments-reformat-and-add-some-more-relevant-quotes-from-the-ES6-spec,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +0235f38d,usrbincc@yahoo.com,Limit-constructor-getter-setter-checks-to-class-definitions,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +cd04ea7b,usrbincc@yahoo.com,Check-for-methods-named-prototype,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +adc4ffe6,usrbincc@yahoo.com,Require-that-constructors-be-regular-methods,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +3c5acdc7,usrbincc@yahoo.com,Treat-methods-and-static-methods-separately-in-checking-for-duplicates,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +df6e0337,usrbincc@yahoo.com,Formatting-only-add-newline,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +0ffccb97,usrbincc@yahoo.com,Remove-unused-vars,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +eacc3bd9,usrbincc@yahoo.com,Extend-strictness-to-cover-the-entire-class-definition,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +8dfa1b64,usrbincc@yahoo.com,Factor-out-common-code-for-class-statements-and-class-expressions,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +93a5120e,usrbincc@yahoo.com,Rename-function-param-classdef-to-isclassdef,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +f8869f14,usrbincc@yahoo.com,Forgot-to-make-class-bodies-strict,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +2fb046e5,usrbincc@yahoo.com,Add-classexpression-handling,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +db6bcc9d,usrbincc@yahoo.com,Handle-class-statements.-Reuses-the-code-for-handling-object-literals,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +fec1bf88,usrbincc@yahoo.com,Treat-class-extends-import-export-as-reserved-when-inESNext,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3 +ebe8156a,code@frantsev.ru,Don-t-warn-about-uncapitalized-global-functions-used-as-constructors,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce +b0f3198b,Jason.More@gmail.com,Added-broken-test-for-Node-and-NodeFilter,Non-substantive +e82c83b4,code@frantsev.ru,Add-DOMParser-global-to-browser,Non-substantive +56b998a9,code@frantsev.ru,Add-XMLSerializer-global-to-browser,Non-substantive +2a2c9461,code@frantsev.ru,Add-atob-and-btoa-globals-to-browser,Non-substantive +e2dc30a6,dominic@dbarnes.info,adding-provides-to-couch-env,Non-substantive +fc83cf97,hello@rondevera.com,Add-missing-comma-in-members-list,Non-substantive +6dd6052f,dionyziz@kamibu.com,Adding-HTML-canvas-and-video-tags-for-HTML5,Non-substantive +09c1982c,dionyziz@kamibu.com,Added-predefined-browser-classes-for-various-HTML-object-types,Non-substantive +f9a2dfee,dionyziz@kamibu.com,Added-predefined-browser-classes-for-various-HTML-object-types,Non-substantive +b30bfa89,tom@rixth.org,Separate-check-for-trailing-whitespace-in-to-its-own-function-along-with-tests,removed via 0c0e19319b276b019d285bdfd2cfc49126abd814 +38ccb0fb,cmcculloh@gmail.com,Corrected-misspelled-specigic,Non-substantive +6c238084,sky@skyb.us,new-Array-expression-is-valid,Rewritten via 9c07e4c5764a564073433265edcaa3b823fbf41d +7c327bf6,douglas@crockford.com,Tolerate-stupid-blockless-blocks,relicensed via Eclipse +5675d2c6,douglas@crockford.com,http-tech.groups.yahoo.com-group-jslint_com-message-1730,relicensed via Eclipse +73c2fe36,douglas@crockford.com,indent,relicensed via Eclipse +d7896b2c,douglas@crockford.com,step_in-step_out,relicensed via Eclipse +85c95acb,douglas@crockford.com,for-var,relicensed via Eclipse +caa8885a,douglas@crockford.com,use-strict,relicensed via Eclipse +1da55dd6,douglas@crockford.com,http-www.yuiblog.com-blog-2010-12-14-strict-mode-is-coming-to-town,relicensed via Eclipse +b6d8b251,douglas@crockford.com,use-strict,relicensed via Eclipse +dc4a0133,douglas@crockford.com,JSON-escape-v,relicensed via Eclipse +80a22526,douglas@crockford.com,JSON-escape-single-quote,relicensed via Eclipse +bdd35767,douglas@crockford.com,k,relicensed via Eclipse +6735394d,douglas@crockford.com,Cleanup,relicensed via Eclipse +6af839a6,douglas@crockford.com,option.predef,relicensed via Eclipse +c9332068,douglas@crockford.com,Warn-on-new-Array-NUMBER,relicensed via Eclipse +523956b6,douglas@crockford.com,Removing-rhino.js-and-wsh.js.-Other-projects-are-providing-better-alternatives,relicensed via Eclipse +d98f7530,douglas@crockford.com,dangerous-comments,relicensed via Eclipse +35ec4a53,douglas@crockford.com,groove,relicensed via Eclipse +d4a0702b,douglas@crockford.com,More-css-colors,relicensed via Eclipse +eb939e7f,douglas@crockford.com,Use-charAt-instead-of-in-line-1786,relicensed via Eclipse +af040fb1,douglas@crockford.com,Use-.charAt-instead-of-in-line-1786,relicensed via Eclipse +ca120a73,douglas@crockford.com,first-commit,relicensed via Eclipse diff --git a/docs/relicensing-2020.md b/docs/relicensing-2020.md new file mode 100644 index 0000000000..faa9c7d539 --- /dev/null +++ b/docs/relicensing-2020.md @@ -0,0 +1,111 @@ +# 2020 Relicensing + +In August of 2020, the JSHint project maintainers relicensed the project. This +was the culmination of a years-long effort where great care was taken to +respect the practice of software licensing and the intent of all contributors. +By summarizing the process followed by the maintainers, this document +demonstrates the legitimacy of the change. + +## Origin: JSLint + +The JSLint project was first made publicly available in 2002. It was +distributed free-of-charge, but it was licensed with the so-called "JSON +License" [1]. Code published under this license is not recognized as "free +software" by the Free Software Foundation [2], nor is it recognized as "open +source" by the Open Source Initiative [3] due to the following clause: + +> The Software shall be used for Good, not Evil. + +After the initial release, JSLint's creator iteratively improved it through a +series of patches to its one-and-only source code file. Throughout this time, +the owner was the sole contributor to the project. + +## The fork + +In 2011, another developer made improvements of their own and published the +result as a new project named "JSHint" [4]. This was permissible under the +terms of JSLint's license provided that the new project used the same license +for the code it inherited. + +The second developer continued to modify JSHint and also accepted contributions +from others. To promote the maintainability of the source code, new features +were occasionally introduced in distinct files that were designed to be +included at runtime. Referred to as "modules," these files were made available +under the terms of the MIT "Expat" license [5]. As automated tests were written +and included in the project, they too were licensed under MIT "Expat." + +In the years that followed, the JSHint project accepted direct code +contributions from hundreds of developers. Many of these patches modified the +original JSON-licensed file. Meanwhile, the author of JSLint permitted the +Eclipse Foundation to relicense a version of JSLint using the MIT Expat license +so that it could be included in their project named Orion [6]. + +## Injecting a FOSS starting point + +In 2013, a user of JSHint requested that the project be relicensed [7]. The +JSHint maintainers obliged via the following procedure: + +1. Using the git version control software, they reverted all of the changes + that were submitted to JSHint. (The resulting code was identical to JSLint + at the moment JSHint was created.) +2. They replaced the JSON-licensed version of the code with the MIT-licensed + version published by the Eclipse Foundation. (The resulting code differed + from JSLint only in the license header.) +3. They re-applied all of the changes that were submitted to JSHint. + +While this operation created an "alternate history" which demonstrated how +JSHint could have been created as a free software project, it did not +necessarily reflect the intentions of the contributors. JSHint did not at that +time maintain a Contributors Licensing Agreement, so the maintainers did not +have the authority to modify the terms under which the JSHint-specific patches +were submitted. + +To address this, the maintainers first introduced a Contributors Licensing +Agreement ("CLA"). They ensured all subsequent contributors agreed to the terms +of the agreement prior to accepting their patches. They contacted every +contributor who had modified the JSON-licensed `jshint.js` file and requested +they they sign the agreement. Although most responded by signing the agreement, +a few refused and still others did not respond. + +## Rewriting + +A full listing of the patches whose authors have not signed the CLA is +available alongside this document in the JSHint project source code repository. + +The maintainers reviewed each patch which could not be relicensed. Many +involved non-substantive changes such as code comment amendments, spelling +corrections, or the introduction of references to standardized APIs. Because +these contributions did not meaningfully alter the behavior of the software, +there could be no claim to ownership, so explicit permission to relicense was +not necessary. + +However, a total of six patches included non-trivial changes to `jshint.js`. +The maintainers arranged for each of these to be re-written. + +Three contributions were rewritten by four volunteers who never reviewed the +implementation they were rewriting. The project maintainers prepared an +alternate version of the project for each volunteer--one that omitted each +patch that needed to be reimplemented. + +Three additional contributions were rewritten by a JSHint project maintainer. +The uniqueness of his work was verified by the other maintainers. + +In all cases, correctness of the new implementation was verified by the +project's existing automated tests (because as described above, their licensing +was not subject to change). + +## Finalization + +With this work complete, every line of code in the JSHint project has been +permitted by its contributor to be licensed using the MIT "Expat" license. The +"alternate history" is available in a Git tag named `relicensing-2020`. + +As of version 2.12.0, JSHint is a free software project. + +[1] https://www.gnu.org/licenses/license-list.en.html#JSON +[2] *Ibid.* +[3] https://opensource.org/licenses/alphabetical +[4] https://web.archive.org/web/20110224022052/http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to-jshint/ +[5] https://www.gnu.org/licenses/license-list.en.html#Expat +[6] http://git.eclipse.org/c/orion/org.eclipse.orion.client.git/tree/lib/jslint/jslint-2011-01-09.js +[7] https://github.com/jshint/jshint/issues/1234 diff --git a/package.json b/package.json index 5a019a1938..0d25e80afb 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "unicode-5.2.0": "^0.7.5", "unicode-11.0.0": "0.7.x" }, - "license": "(MIT AND JSON)", + "license": "MIT", "preferGlobal": true, "files": [ "bin", diff --git a/src/jshint.js b/src/jshint.js index 78f826eaf7..08f8d8f039 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -1,8 +1,9 @@ /*! * JSHint, by JSHint Community. * - * This file (and this file only) is licensed under the same slightly modified - * MIT license that JSLint is. It stops evil-doers everywhere: + * Licensed under the MIT license. + * + * JSHint is a derivative work of JSLint: * * Copyright (c) 2002 Douglas Crockford (www.JSLint.com) * @@ -16,8 +17,6 @@ * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * - * The Software shall be used for Good, not Evil. - * * 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