diff --git a/acceptance/apps/validate-package-manager/bin/npm b/acceptance/apps/validate-package-manager/bin/npm new file mode 100755 index 00000000000..d452c009e29 --- /dev/null +++ b/acceptance/apps/validate-package-manager/bin/npm @@ -0,0 +1,7 @@ +#!/bin/sh +printf '%s %s\n' "${0##*/}" "$*" >> commands.log +if [ "$*" = "${VALIDATION_TEST_FAIL:-}" ]; then + echo "validation stdout" + echo "validation stderr" >&2 + exit 17 +fi diff --git a/acceptance/apps/validate-package-manager/bin/npm.cmd b/acceptance/apps/validate-package-manager/bin/npm.cmd new file mode 100644 index 00000000000..1e7de72f5dd --- /dev/null +++ b/acceptance/apps/validate-package-manager/bin/npm.cmd @@ -0,0 +1,7 @@ +@echo off +echo %~n0 %*>>commands.log +if "%*"=="%VALIDATION_TEST_FAIL%" ( + echo validation stdout + echo validation stderr 1>&2 + exit /b 17 +) diff --git a/acceptance/apps/validate-package-manager/bin/pnpm b/acceptance/apps/validate-package-manager/bin/pnpm new file mode 100755 index 00000000000..d452c009e29 --- /dev/null +++ b/acceptance/apps/validate-package-manager/bin/pnpm @@ -0,0 +1,7 @@ +#!/bin/sh +printf '%s %s\n' "${0##*/}" "$*" >> commands.log +if [ "$*" = "${VALIDATION_TEST_FAIL:-}" ]; then + echo "validation stdout" + echo "validation stderr" >&2 + exit 17 +fi diff --git a/acceptance/apps/validate-package-manager/bin/pnpm.cmd b/acceptance/apps/validate-package-manager/bin/pnpm.cmd new file mode 100644 index 00000000000..1e7de72f5dd --- /dev/null +++ b/acceptance/apps/validate-package-manager/bin/pnpm.cmd @@ -0,0 +1,7 @@ +@echo off +echo %~n0 %*>>commands.log +if "%*"=="%VALIDATION_TEST_FAIL%" ( + echo validation stdout + echo validation stderr 1>&2 + exit /b 17 +) diff --git a/acceptance/apps/validate/conflicting/package-lock.json b/acceptance/apps/validate-package-manager/conflicting/package-lock.json similarity index 100% rename from acceptance/apps/validate/conflicting/package-lock.json rename to acceptance/apps/validate-package-manager/conflicting/package-lock.json diff --git a/acceptance/apps/validate/conflicting/package.json b/acceptance/apps/validate-package-manager/conflicting/package.json similarity index 100% rename from acceptance/apps/validate/conflicting/package.json rename to acceptance/apps/validate-package-manager/conflicting/package.json diff --git a/acceptance/apps/validate/conflicting/pnpm-lock.yaml b/acceptance/apps/validate-package-manager/conflicting/pnpm-lock.yaml similarity index 100% rename from acceptance/apps/validate/conflicting/pnpm-lock.yaml rename to acceptance/apps/validate-package-manager/conflicting/pnpm-lock.yaml diff --git a/acceptance/apps/validate-package-manager/metadata-npm/package.json b/acceptance/apps/validate-package-manager/metadata-npm/package.json new file mode 100644 index 00000000000..f7baa297652 --- /dev/null +++ b/acceptance/apps/validate-package-manager/metadata-npm/package.json @@ -0,0 +1,3 @@ +{ + "packageManager": "npm@10.9.2" +} diff --git a/acceptance/apps/validate/metadata-npm/pnpm-lock.yaml b/acceptance/apps/validate-package-manager/metadata-npm/pnpm-lock.yaml similarity index 100% rename from acceptance/apps/validate/metadata-npm/pnpm-lock.yaml rename to acceptance/apps/validate-package-manager/metadata-npm/pnpm-lock.yaml diff --git a/acceptance/apps/validate-package-manager/out.test.toml b/acceptance/apps/validate-package-manager/out.test.toml new file mode 100644 index 00000000000..0938e678987 --- /dev/null +++ b/acceptance/apps/validate-package-manager/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] diff --git a/acceptance/apps/validate-package-manager/output.txt b/acceptance/apps/validate-package-manager/output.txt new file mode 100644 index 00000000000..f4ed7abf012 --- /dev/null +++ b/acceptance/apps/validate-package-manager/output.txt @@ -0,0 +1,36 @@ + +=== Warn but continue on conflicting lockfiles +>>> [CLI] apps validate --path conflicting +Warn: found conflicting package managers; using npm from package-lock.json and ignoring pnpm-lock.yaml +Validating project using npm... +✅ Installing dependencies ([DURATION]) +✅ Generating types ([DURATION]) +✅ Running AST-grep lint ([DURATION]) +✅ Type checking ([DURATION]) +✅ Building ([DURATION]) +✅ Running tests ([DURATION]) +✅ All validation checks passed ([DURATION]) + +=== Warn but continue on unsupported lockfiles +>>> [CLI] apps validate --path unsupported +Warn: ignoring unsupported lockfile yarn.lock; apps validation uses npm or pnpm +Validating project using npm... +✅ Installing dependencies ([DURATION]) +✅ Generating types ([DURATION]) +✅ Running AST-grep lint ([DURATION]) +✅ Type checking ([DURATION]) +✅ Building ([DURATION]) +✅ Running tests ([DURATION]) +✅ All validation checks passed ([DURATION]) + +=== Declared package manager wins over a pnpm lockfile +>>> [CLI] apps validate --path metadata-npm +Warn: found conflicting package managers; using npm from package.json and ignoring pnpm-lock.yaml +Validating project using npm... +✅ Installing dependencies ([DURATION]) +✅ Generating types ([DURATION]) +✅ Running AST-grep lint ([DURATION]) +✅ Type checking ([DURATION]) +✅ Building ([DURATION]) +✅ Running tests ([DURATION]) +✅ All validation checks passed ([DURATION]) diff --git a/acceptance/apps/validate-package-manager/script b/acceptance/apps/validate-package-manager/script new file mode 100644 index 00000000000..e647253dade --- /dev/null +++ b/acceptance/apps/validate-package-manager/script @@ -0,0 +1,10 @@ +export PATH="$PWD/bin:$PATH" + +title "Warn but continue on conflicting lockfiles" +trace $CLI apps validate --path conflicting + +title "Warn but continue on unsupported lockfiles" +trace $CLI apps validate --path unsupported + +title "Declared package manager wins over a pnpm lockfile" +trace $CLI apps validate --path metadata-npm diff --git a/acceptance/apps/validate-package-manager/test.toml b/acceptance/apps/validate-package-manager/test.toml new file mode 100644 index 00000000000..0d42c72ca66 --- /dev/null +++ b/acceptance/apps/validate-package-manager/test.toml @@ -0,0 +1,6 @@ +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] +Ignore = ["commands.log"] + +[[Repls]] +Old = '\d+\.\d+s' +New = '[DURATION]' diff --git a/acceptance/apps/validate/unsupported/package.json b/acceptance/apps/validate-package-manager/unsupported/package.json similarity index 100% rename from acceptance/apps/validate/unsupported/package.json rename to acceptance/apps/validate-package-manager/unsupported/package.json diff --git a/acceptance/apps/validate/unsupported/yarn.lock b/acceptance/apps/validate-package-manager/unsupported/yarn.lock similarity index 100% rename from acceptance/apps/validate/unsupported/yarn.lock rename to acceptance/apps/validate-package-manager/unsupported/yarn.lock diff --git a/acceptance/apps/validate/bom/package.json b/acceptance/apps/validate/bom/package.json deleted file mode 100644 index f54d4a2c495..00000000000 --- a/acceptance/apps/validate/bom/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "scripts": { - "build": "node -e \"console.log('BOM build ran'); process.exit(17)\"" - } -} diff --git a/acceptance/apps/validate/invalid/package.json b/acceptance/apps/validate/invalid/package.json deleted file mode 100644 index 98232c64fce..00000000000 --- a/acceptance/apps/validate/invalid/package.json +++ /dev/null @@ -1 +0,0 @@ -{ diff --git a/acceptance/apps/validate/lifecycle/add-build/package.json b/acceptance/apps/validate/lifecycle/add-build/package.json deleted file mode 100644 index a350619357d..00000000000 --- a/acceptance/apps/validate/lifecycle/add-build/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "validation-add-build", - "version": "1.0.0", - "scripts": { - "install": "node ../update-manifest.cjs", - "typegen": "node ../update-manifest.cjs" - } -} diff --git a/acceptance/apps/validate/lifecycle/invalidated/package.json b/acceptance/apps/validate/lifecycle/invalidated/package.json deleted file mode 100644 index 0d35bc1fafd..00000000000 --- a/acceptance/apps/validate/lifecycle/invalidated/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "validation-invalidated-manifest", - "version": "1.0.0", - "scripts": { - "install": "node ../update-manifest.cjs", - "typegen": "node ../update-manifest.cjs" - } -} diff --git a/acceptance/apps/validate/lifecycle/remove-build/package.json b/acceptance/apps/validate/lifecycle/remove-build/package.json deleted file mode 100644 index 615c53f9bad..00000000000 --- a/acceptance/apps/validate/lifecycle/remove-build/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "validation-remove-build", - "version": "1.0.0", - "scripts": { - "install": "node ../update-manifest.cjs", - "typegen": "node ../update-manifest.cjs", - "build": "node -e \"process.exit(17)\"" - } -} diff --git a/acceptance/apps/validate/lifecycle/update-manifest.cjs b/acceptance/apps/validate/lifecycle/update-manifest.cjs deleted file mode 100644 index 9a5f12da591..00000000000 --- a/acceptance/apps/validate/lifecycle/update-manifest.cjs +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require("node:fs"); - -if (process.env.npm_lifecycle_event === process.env.VALIDATION_UPDATE_STEP) { - const manifest = JSON.parse(fs.readFileSync("package.json", "utf8")); - switch (process.env.VALIDATION_UPDATE_ACTION) { - case "add": - manifest.scripts.build = "node -e \"console.log('added build ran'); process.exit(17)\""; - break; - case "remove": - delete manifest.scripts.build; - break; - case "invalidate": - fs.writeFileSync("package.json", "{"); - return; - } - fs.writeFileSync("package.json", JSON.stringify(manifest)); -} diff --git a/acceptance/apps/validate/metadata-npm/databricks.yml b/acceptance/apps/validate/metadata-npm/databricks.yml deleted file mode 100644 index 738d8400c6a..00000000000 --- a/acceptance/apps/validate/metadata-npm/databricks.yml +++ /dev/null @@ -1,2 +0,0 @@ -bundle: - name: validation-metadata-npm diff --git a/acceptance/apps/validate/metadata-npm/package.json b/acceptance/apps/validate/metadata-npm/package.json deleted file mode 100644 index 6620a23a240..00000000000 --- a/acceptance/apps/validate/metadata-npm/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "validation-metadata-npm", - "version": "1.0.0", - "packageManager": "npm@10.9.2", - "scripts": { - "build": "node -e \"console.log('declared npm build ran'); process.exit(17)\"" - } -} diff --git a/acceptance/apps/validate/non-runnable/package.json b/acceptance/apps/validate/non-runnable/package.json deleted file mode 100644 index cfcacb6fe6d..00000000000 --- a/acceptance/apps/validate/non-runnable/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "scripts": { - "typegen": "", - "typecheck": null, - "test": "", - "//": ["a comment"], - "build": "node -e \"console.log('non-runnable entries ignored'); process.exit(17)\"" - } -} diff --git a/acceptance/apps/validate/null/package.json b/acceptance/apps/validate/null/package.json deleted file mode 100644 index 19765bd501b..00000000000 --- a/acceptance/apps/validate/null/package.json +++ /dev/null @@ -1 +0,0 @@ -null diff --git a/acceptance/apps/validate/output.txt b/acceptance/apps/validate/output.txt index cfabc47f0f1..bbcd46b0c91 100644 --- a/acceptance/apps/validate/output.txt +++ b/acceptance/apps/validate/output.txt @@ -82,115 +82,3 @@ pnpm run --if-present typegen pnpm run --if-present lint:ast-grep pnpm run --if-present typecheck pnpm run --if-present build - -=== Warn but continue on conflicting lockfiles ->>> [CLI] apps validate --path conflicting -Warn: found conflicting package managers; using npm from package-lock.json and ignoring pnpm-lock.yaml -Validating project using npm... -✅ Installing dependencies ([DURATION]) -✅ Generating types ([DURATION]) -✅ Running AST-grep lint ([DURATION]) -✅ Type checking ([DURATION]) -✅ Building ([DURATION]) -✅ Running tests ([DURATION]) -✅ All validation checks passed ([DURATION]) - -=== Warn but continue on unsupported lockfiles ->>> [CLI] apps validate --path unsupported -Warn: ignoring unsupported lockfile yarn.lock; apps validation uses npm or pnpm -Validating project using npm... -✅ Installing dependencies ([DURATION]) -✅ Generating types ([DURATION]) -✅ Running AST-grep lint ([DURATION]) -✅ Type checking ([DURATION]) -✅ Building ([DURATION]) -✅ Running tests ([DURATION]) -✅ All validation checks passed ([DURATION]) - -=== Validate npm workspace scripts without root scripts ->>> grep -x workspace build ran LOG.workspaces -workspace build ran - ->>> grep -F validation failed (exit code 17) LOG.workspaces -validation failed (exit code 17) - -=== Deploy rejects a failing npm workspace build ->>> grep -x workspace build ran LOG.workspaces-deploy -workspace build ran - ->>> grep -F validation failed - fix errors before deploying LOG.workspaces-deploy -Error: validation failed - fix errors before deploying - -=== Use declared npm despite a pnpm lockfile ->>> grep -x declared npm build ran LOG.metadata-npm -declared npm build ran - ->>> grep -F validation failed (exit code 17) LOG.metadata-npm -validation failed (exit code 17) - -=== Deploy honors the declared package manager ->>> grep -x declared npm build ran LOG.metadata-npm-deploy -declared npm build ran - ->>> grep -F validation failed - fix errors before deploying LOG.metadata-npm-deploy -Error: validation failed - fix errors before deploying - -=== Reject a missing package.json ->>> musterr [CLI] apps validate --path missing -Error: no supported project type detected (looking for package.json) - -=== Report native manifest errors with dependencies absent ->>> grep -x Error: validation failed LOG.invalid-absent -Error: validation failed - -=== Report native manifest errors with dependencies present ->>> grep -x Error: validation failed LOG.invalid-present -Error: validation failed - -=== Reject a null manifest through the package manager ->>> grep -x Error: validation failed LOG.null -Error: validation failed - -=== Run scripts from a manifest with a UTF-8 BOM ->>> grep -x BOM build ran LOG.bom -BOM build ran - ->>> grep -F validation failed (exit code 17) LOG.bom -validation failed (exit code 17) - -=== Let the package manager ignore non-runnable script entries ->>> grep -x non-runnable entries ignored LOG.non-runnable -non-runnable entries ignored - ->>> grep -F validation failed (exit code 17) LOG.non-runnable -validation failed (exit code 17) - -=== Run a build added by install ->>> grep -x added build ran LOG.add-build-install -added build ran - ->>> grep -F validation failed (exit code 17) LOG.add-build-install -validation failed (exit code 17) - -=== Skip a build removed by install ->>> grep -F All validation checks passed LOG.remove-build-install -✅ All validation checks passed ([DURATION]) - -=== Report native errors after install invalidates the manifest ->>> grep -x Error: validation failed LOG.invalidated-install -Error: validation failed - -=== Run a build added by typegen ->>> grep -x added build ran LOG.add-build-typegen -added build ran - ->>> grep -F validation failed (exit code 17) LOG.add-build-typegen -validation failed (exit code 17) - -=== Skip a build removed by typegen ->>> grep -F All validation checks passed LOG.remove-build-typegen -✅ All validation checks passed ([DURATION]) - -=== Report native errors after typegen invalidates the manifest ->>> grep -x Error: validation failed LOG.invalidated-typegen -Error: validation failed diff --git a/acceptance/apps/validate/script b/acceptance/apps/validate/script index 4c59e76e046..3f079d8af64 100644 --- a/acceptance/apps/validate/script +++ b/acceptance/apps/validate/script @@ -1,4 +1,3 @@ -validation_path="$PATH" export PATH="$PWD/bin:$PATH" title "Validate the directory selected by --path" @@ -15,82 +14,3 @@ trace VALIDATION_TEST_FAIL="run --if-present build" musterr $CLI apps deploy title "Commands executed in the project directory" trace cat commands.log - -title "Warn but continue on conflicting lockfiles" -trace $CLI apps validate --path conflicting - -title "Warn but continue on unsupported lockfiles" -trace $CLI apps validate --path unsupported - -title "Validate npm workspace scripts without root scripts" -export PATH="$validation_path" -mkdir -p workspaces/node_modules -trace musterr $CLI apps validate --path workspaces &> LOG.workspaces -trace grep -x "workspace build ran" LOG.workspaces -trace grep -F "validation failed (exit code 17)" LOG.workspaces - -title "Deploy rejects a failing npm workspace build" -trace withdir workspaces musterr $CLI apps deploy &> LOG.workspaces-deploy -trace grep -x "workspace build ran" LOG.workspaces-deploy -trace grep -F "validation failed - fix errors before deploying" LOG.workspaces-deploy - -title "Use declared npm despite a pnpm lockfile" -mkdir -p metadata-npm/node_modules -trace musterr $CLI apps validate --path metadata-npm &> LOG.metadata-npm -trace grep -x "declared npm build ran" LOG.metadata-npm -trace grep -F "validation failed (exit code 17)" LOG.metadata-npm - -title "Deploy honors the declared package manager" -trace withdir metadata-npm musterr $CLI apps deploy &> LOG.metadata-npm-deploy -trace grep -x "declared npm build ran" LOG.metadata-npm-deploy -trace grep -F "validation failed - fix errors before deploying" LOG.metadata-npm-deploy - -title "Reject a missing package.json" -mkdir missing -trace musterr $CLI apps validate --path missing - -for dependencies in absent present; do - title "Report native manifest errors with dependencies $dependencies" - trace musterr $CLI apps validate --path invalid &> LOG.invalid-$dependencies - contains.py "EJSONPARSE" < LOG.invalid-$dependencies > LOG.check-invalid-$dependencies - trace grep -x "Error: validation failed" LOG.invalid-$dependencies - mkdir -p invalid/node_modules -done - -title "Reject a null manifest through the package manager" -mkdir -p null/node_modules -trace musterr $CLI apps validate --path null &> LOG.null -trace grep -x "Error: validation failed" LOG.null - -title "Run scripts from a manifest with a UTF-8 BOM" -mkdir -p bom/node_modules -trace musterr $CLI apps validate --path bom &> LOG.bom -trace grep -x "BOM build ran" LOG.bom -trace grep -F "validation failed (exit code 17)" LOG.bom - -title "Let the package manager ignore non-runnable script entries" -mkdir -p non-runnable/node_modules -trace musterr $CLI apps validate --path non-runnable &> LOG.non-runnable -trace grep -x "non-runnable entries ignored" LOG.non-runnable -trace grep -F "validation failed (exit code 17)" LOG.non-runnable - -for step in install typegen; do - cp -R lifecycle lifecycle-$step - if [ "$step" = typegen ]; then - mkdir -p lifecycle-$step/{add-build,remove-build,invalidated}/node_modules - fi - - title "Run a build added by $step" - trace VALIDATION_UPDATE_STEP=$step VALIDATION_UPDATE_ACTION=add musterr $CLI apps validate --path lifecycle-$step/add-build &> LOG.add-build-$step - trace grep -x "added build ran" LOG.add-build-$step - trace grep -F "validation failed (exit code 17)" LOG.add-build-$step - - title "Skip a build removed by $step" - trace VALIDATION_UPDATE_STEP=$step VALIDATION_UPDATE_ACTION=remove $CLI apps validate --path lifecycle-$step/remove-build &> LOG.remove-build-$step - trace grep -F "All validation checks passed" LOG.remove-build-$step - - title "Report native errors after $step invalidates the manifest" - trace VALIDATION_UPDATE_STEP=$step VALIDATION_UPDATE_ACTION=invalidate musterr $CLI apps validate --path lifecycle-$step/invalidated &> LOG.invalidated-$step - contains.py "EJSONPARSE" < LOG.invalidated-$step > LOG.check-invalidated-$step - trace grep -x "Error: validation failed" LOG.invalidated-$step -done diff --git a/acceptance/apps/validate/test.toml b/acceptance/apps/validate/test.toml index 76667680b83..aef8c31494f 100644 --- a/acceptance/apps/validate/test.toml +++ b/acceptance/apps/validate/test.toml @@ -1,10 +1,6 @@ EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] Env.VALIDATION_TEST_FAIL = "" -Env.npm_config_audit = "false" -Env.npm_config_fund = "false" -Env.npm_config_offline = "true" -Env.npm_config_update_notifier = "false" -Ignore = ["commands.log", "node_modules", "missing", "lifecycle-install", "lifecycle-typegen"] +Ignore = ["commands.log"] [[Repls]] Old = '\d+\.\d+s' diff --git a/acceptance/apps/validate/workspaces/.npmrc b/acceptance/apps/validate/workspaces/.npmrc deleted file mode 100644 index 76511e68b54..00000000000 --- a/acceptance/apps/validate/workspaces/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -workspaces=true -update-notifier=false diff --git a/acceptance/apps/validate/workspaces/databricks.yml b/acceptance/apps/validate/workspaces/databricks.yml deleted file mode 100644 index 2aecdb5c928..00000000000 --- a/acceptance/apps/validate/workspaces/databricks.yml +++ /dev/null @@ -1,2 +0,0 @@ -bundle: - name: validation-workspaces diff --git a/acceptance/apps/validate/workspaces/package.json b/acceptance/apps/validate/workspaces/package.json deleted file mode 100644 index 87d12a4b24e..00000000000 --- a/acceptance/apps/validate/workspaces/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "validation-workspaces", - "private": true, - "workspaces": ["packages/*"] -} diff --git a/acceptance/apps/validate/workspaces/packages/app/package.json b/acceptance/apps/validate/workspaces/packages/app/package.json deleted file mode 100644 index ab8149856d5..00000000000 --- a/acceptance/apps/validate/workspaces/packages/app/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "validation-workspace-app", - "version": "1.0.0", - "scripts": { - "build": "node -e \"console.log('workspace build ran'); process.exit(17)\"" - } -}