diff --git a/.ci.sh b/.ci.sh index 366939825..11fdec961 100644 --- a/.ci.sh +++ b/.ci.sh @@ -441,7 +441,7 @@ import moduleFs from "fs"; "type": "git", "url": "https://github.com/jslint-org/jslint.git" }, - "version": "2024.3.26" + "version": "2024.6.1" }, undefined, 4) } ].map(async function ({ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 314bcb6df..00d16ba9d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,15 +22,14 @@ jobs: - x64 # - x86 node_version: - - 18 - 20 - # - 22 - python_version: - - "3.10" + - 22 os: - macos-latest - ubuntu-latest - windows-latest + python_version: + - "3.10" # base - .github/workflows/ci.yml - beg env: CI_MATRIX_NAME: > @@ -55,7 +54,7 @@ jobs: steps: # disable autocrlf in windows - run: | - sh -c uname + sh -c "uname -a" echo "$(date -u +"%Y-%m-%d %TZ") - ${{ env.CI_WORKFLOW_NAME }}" # " git config --global core.autocrlf false # https://github.com/actions/checkout @@ -70,7 +69,6 @@ jobs: # https://github.com/actions/setup-node - uses: actions/setup-node@v4 with: - architecture: ${{ matrix.architecture }} node-version: ${{ matrix.node_version }} # https://github.com/actions/setup-python - uses: actions/setup-python@v5 diff --git a/.github/workflows/on_pull_request.yml b/.github/workflows/on_pull_request.yml index d43fdd64c..d9feec7c7 100644 --- a/.github/workflows/on_pull_request.yml +++ b/.github/workflows/on_pull_request.yml @@ -14,9 +14,8 @@ jobs: - x64 # - x86 node_version: - - 18 - 20 - # - 22 + - 22 os: - macos-latest - ubuntu-latest @@ -43,20 +42,21 @@ jobs: ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: - - run: echo "$(date -u +"%Y-%m-%d %TZ") - ${{ env.CI_WORKFLOW_NAME }}" # " # disable autocrlf in windows - - run: git config --global core.autocrlf false + - run: | + sh -c "uname -a" + echo "$(date -u +"%Y-%m-%d %TZ") - ${{ env.CI_WORKFLOW_NAME }}" # " + git config --global core.autocrlf false # https://github.com/actions/checkout - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # fetch jslint_ci.sh from trusted source - run: | git fetch origin alpha --depth=1 sh -c 'for FILE in .ci.sh .ci2.sh jslint_ci.sh myci2.sh; do if [ -f "$FILE" ]; then git checkout origin/alpha "$FILE"; fi; done' # https://github.com/actions/setup-node - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - architecture: ${{ matrix.architecture }} node-version: ${{ matrix.node_version }} # run nodejs coverages and tests - run: sh jslint_ci.sh shCiBase diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 31995a89a..80cf34292 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,7 +17,6 @@ jobs: - x64 # - x86 node_version: - # - 18 - 20 # - 22 os: diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e2e77e70..bdbfbfc0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ - jslint - add new warning requiring paren around plus-separated concatenations. - jslint - try to improve parser to be able to parse jquery.js without stopping. +# v2024.6.1-beta +- coverage - Fix coverage-function v8CoverageReportCreate() throwing error EINVAL in latest nodejs-security-patch, when running win32-coverage with npm.cmd. + # v2024.3.26 - ci - Add shell-functions shGitPullrequestCleanup(), shGitPullrequest() to automatically cleanup or create-and-push github-pull-commit to origin/alpha. - jslint - Allow destructuring-assignment after function-definition. diff --git a/README.md b/README.md index 7125ffe5d..83f07a771 100644 --- a/README.md +++ b/README.md @@ -917,13 +917,13 @@ eval("1"); //jslint-ignore-line

### pull-request merge - find highest issue-number at https://github.com/jslint-org/jslint/issues/, https://github.com/jslint-org/jslint/pulls/, and add +1 to it for PR-xxx -- $ `shGitPullrequest beta beta` +- `shGitPullrequest beta beta` - verify ci-success for origin-branch-alpha - - https://github.com/kaizhu256/jslint/actions/workflows/ci.yml -- $ `git push upstream alpha -f` + - https://github.com/kaizhu256/jslint/actions +- `git push upstream alpha -f` - verify ci-success for upstream-branch-alpha - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml -- goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p2024.3.21 + - https://github.com/jslint-org/jslint/actions +- goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p2024.6.23 - click `Create pull request` - input `Add your description here...` with: ``` @@ -945,24 +945,24 @@ this PR will additionally: - wait awhile before continuing ... - click `Rebase and merge` - verify ci-success for upstream-branch-beta - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml -- $ `shGitPullrequestCleanup` + - https://github.com/jslint-org/jslint/actions +- `shGitPullrequestCleanup` - verify ci-success for origin-branch-alpha - - https://github.com/kaizhu256/jslint/actions/workflows/ci.yml -- $ `git push upstream alpha -f` + - https://github.com/kaizhu256/jslint/actions +- `git push upstream alpha -f` - verify ci-success for upstream-branch-alpha - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions - click `Delete branch`

### branch-master commit -- $ `shGitPullrequest master beta` +- `shGitPullrequest master beta` - verify ci-success for origin-branch-alpha - - https://github.com/kaizhu256/jslint/actions/workflows/ci.yml -- $ `git push upstream alpha -f` + - https://github.com/kaizhu256/jslint/actions +- `git push upstream alpha -f` - verify ci-success for upstream-branch-alpha - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions - goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-v2024.3.26 - click `Create pull request` - input `Add a title` with: `# v20yy.mm.dd` @@ -978,27 +978,27 @@ this PR will additionally: - wait awhile before continuing ... - click `Rebase and merge` - verify ci-success for upstream-branch-beta - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml -- $ `shGitPullrequestCleanup` + - https://github.com/jslint-org/jslint/actions +- `shGitPullrequestCleanup` - verify ci-success for origin-branch-alpha - - https://github.com/kaizhu256/jslint/actions/workflows/ci.yml -- $ `git push upstream alpha -f` + - https://github.com/kaizhu256/jslint/actions +- `git push upstream alpha -f` - verify ci-success for upstream-branch-alpha - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions - click `Delete branch` -- $ `git push origin beta:master` +- `git push origin beta:master` - verify ci-success for origin-branch-master - - https://github.com/kaizhu256/jslint/actions/workflows/ci.yml -- $ `git push upstream beta:master` + - https://github.com/kaizhu256/jslint/actions +- `git push upstream beta:master` - verify ci-success for upstream-branch-master - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions

### branch-master publish -- $ `git push upstream beta:master` +- `git push upstream beta:master` - verify ci-success for upstream-branch-master - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions - goto https://github.com/jslint-org/jslint/releases/new - input `Choose a tag` with: `v20yy.mm.dd` - click `Create new tag: v20yy.mm.dd on publish` @@ -1016,7 +1016,7 @@ this PR will additionally: - click `Preview` and review - click `Publish release` - verify ci-success for upstream-branch-publish - - https://github.com/jslint-org/jslint/actions/workflows/ci.yml + - https://github.com/jslint-org/jslint/actions - verify email-notification `Successfully published @jslint-org/jslint@20yy.mm.dd` @@ -1024,10 +1024,10 @@ this PR will additionally: ### vscode-jslint publish - goto https://github.com/jslint-org/jslint/tree/gh-pages/branch-beta/.artifact/jslint_wrapper_vscode - click `vscode-jslint-20yy.mm.dd.vsix` -- click `Download` +- click `Raw` to download - goto https://marketplace.visualstudio.com/manage/publishers/jslint - right-click `Update` -- drag-and-drop downloaded `vscode-jslint-20yy.mm.dd.vsix` +- upload downloaded file `vscode-jslint-20yy.mm.dd.vsix` - click 'Upload' - verify email-notification `[Succeeded] Extension publish on Visual Studio Marketplace - vscode-jslint` diff --git a/jslint.mjs b/jslint.mjs index b8dd1d950..1cc3d1796 100644 --- a/jslint.mjs +++ b/jslint.mjs @@ -125,8 +125,8 @@ process_env, process_exit, promises, property, property_dict, push, quote, ranges, readFile, readdir, readonly, recursive, reduce, repeat, replace, resolve, result, reverse, role, round, scriptId, search, set, shebang, - shift, signature, single, slice, some, sort, source, spawn, splice, split, - stack, stack_trace, start, startOffset, startsWith, statement, + shell, shift, signature, single, slice, some, sort, source, spawn, splice, + split, stack, stack_trace, start, startOffset, startsWith, statement, statement_prv, stdio, stop, stop_at, stringify, subscript, switch, syntax_dict, tenure, test, test_cause, test_internal_error, this, thru, toLocaleString, toString, token, token_global, token_list, token_nxt, @@ -163,7 +163,7 @@ let jslint_charset_ascii = ( + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f" ); -let jslint_edition = "v2024.3.26"; +let jslint_edition = "v2024.6.1-beta"; let jslint_export; // The jslint object to be exported. let jslint_fudge = 1; // Fudge starting line and starting // ... column to 1. @@ -11285,24 +11285,37 @@ function sentinel() {} } })); exitCode = await new Promise(function (resolve) { - moduleChildProcess.spawn( - ( - processArgv[0] === "npm" + let processArgv0 = processArgv[0]; // If win32 environment, then replace program npm with npm.cmd. // Coverage-hack - Ugly-hack to get test-coverage under both win32 and linux. - ? process.platform.replace("win32", "npm.cmd").replace( - process.platform, - "npm" - ) - : processArgv[0] - ), + if (processArgv0 === "npm") { + processArgv0 = process.platform.replace( + "win32", + "npm.cmd" + ).replace( + process.platform, + "npm" + ); + } + moduleChildProcess.spawn( + processArgv0, processArgv.slice(1), { env: Object.assign({}, process.env, { NODE_V8_COVERAGE: coverageDir }), + +// PR-465 +// https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2 +// Node.js will now error with EINVAL if a .bat or .cmd file is passed to +// child_process.spawn and child_process.spawnSync without the shell option set. + + shell: ( + processArgv0.endsWith(".bat") + || processArgv0.endsWith(".cmd") + ), stdio: ["ignore", 1, 2] } ).on("exit", resolve); diff --git a/jslint_ci.sh b/jslint_ci.sh index 6bef270fb..2f5490808 100644 --- a/jslint_ci.sh +++ b/jslint_ci.sh @@ -922,7 +922,7 @@ shGitInitBase() {(set -e shGitLsTree() {(set -e # this function will "git ls-tree" all files committed in HEAD -# example use: +# example usage: # shGitLsTree | sort -rk3 # sort by date # shGitLsTree | sort -rk4 # sort by size node --input-type=module --eval ' @@ -1062,7 +1062,7 @@ import moduleFs from "fs"; default: version = `p${version}`; commitMessage = ( - /\n\n# v\d\d\d\d\.\d\d?\.\d\d?(?:-.*?)?\n(- [\S\s]+?)\n- / + /\n\n# v\d\d\d\d\.\d\d?\.\d\d?(?:-.*?)?\n(- [\S\s]+?)(?:\n- |\n\n)/ ).exec(data)[1]; } branchPull = `branch-${version}`; @@ -1171,7 +1171,7 @@ shGithubCheckoutRemote() {(set -e shGithubFileDownload() {(set -e # this function will download file $1 from github repo/branch # https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents -# example use: +# example usage: # shGithubFileDownload octocat/hello-world/master/hello.txt shGithubFileDownloadUpload download "$1" "$2" )} @@ -1179,7 +1179,7 @@ shGithubFileDownload() {(set -e shGithubFileDownloadUpload() {(set -e # this function will upload file $2 to github repo/branch $1 # https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents -# example use: +# example usage: # shGithubFileUpload octocat/hello-world/master/hello.txt hello.txt shGithubTokenExport node --input-type=module --eval ' @@ -1272,7 +1272,7 @@ import modulePath from "path"; shGithubFileUpload() {(set -e # this function will upload file $2 to github repo/branch $1 # https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents -# example use: +# example usage: # shGithubFileUpload octocat/hello-world/master/hello.txt hello.txt shGithubFileDownloadUpload upload "$1" "$2" )} @@ -1287,7 +1287,7 @@ shGithubTokenExport() { shGithubWorkflowDispatch() {(set -e # this function will trigger github-workflow on given $REPO and $BRANCH -# example use: +# example usage: # shGithubWorkflowDispatch octocat/hello-world master shGithubTokenExport REPO="$1" @@ -2068,7 +2068,7 @@ function replaceListReplace(replaceList, data) { if (dataUriType) { return; } - if (dateCommitted) { + if (dateCommitted && dateCommitted.toString()) { result += ( "\n\n\n/*\n" + "repo " + prefix.replace("/blob/", "/tree/") + "\n" @@ -3329,20 +3329,27 @@ function sentinel() {} } })); exitCode = await new Promise(function (resolve) { + let processArgv0 = processArgv[0]; + if (processArgv0 === "npm") { + processArgv0 = process.platform.replace( + "win32", + "npm.cmd" + ).replace( + process.platform, + "npm" + ); + } moduleChildProcess.spawn( - ( - processArgv[0] === "npm" - ? process.platform.replace("win32", "npm.cmd").replace( - process.platform, - "npm" - ) - : processArgv[0] - ), + processArgv0, processArgv.slice(1), { env: Object.assign({}, process.env, { NODE_V8_COVERAGE: coverageDir }), + shell: ( + processArgv0.endsWith(".bat") + || processArgv0.endsWith(".cmd") + ), stdio: ["ignore", 1, 2] } ).on("exit", resolve); diff --git a/package.json b/package.json index 27dc431ea..a1aed18f5 100644 --- a/package.json +++ b/package.json @@ -35,5 +35,5 @@ "shCiArtifactUpload": 1, "shCiPublishNpm": 1, "type": "module", - "version": "2024.3.26" + "version": "2024.6.1-beta" }