diff --git a/.github/workflows/compat-tests.yml b/.github/workflows/compat-tests.yml index 4109f4bb655..14c70e830e8 100644 --- a/.github/workflows/compat-tests.yml +++ b/.github/workflows/compat-tests.yml @@ -83,3 +83,26 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Basic Tests run: pnpm test + + packageManagers: + name: Smoke test w/ ${{ matrix.packageManager }} & ${{ matrix.kind }} + timeout-minutes: 10 + runs-on: ubuntu-latest + strategy: + matrix: + packageManager: [npm, yarn, pnpm] + kind: [alpha, beta, stable, false] + + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: ./.github/actions/setup + with: + restore-broccoli-cache: true + install: true + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: "Run a basic smoke test with ${{ matrix.packageManager }} and ${{ matrix.kind }} tagging" + run: | + bun ./scripts/test-package-manager.mjs \ + "${{ matrix.packageManager }}" "${{ matrix.kind}}" + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3c6d316493..59ebdb25114 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3086,7 +3086,7 @@ importers: version: file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/optional-features': specifier: ^2.1.0 version: 2.1.0 @@ -3230,7 +3230,7 @@ importers: version: file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/optional-features': specifier: ^2.1.0 version: 2.1.0 @@ -3406,7 +3406,7 @@ importers: version: file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/edition-utils': specifier: ^1.2.0 version: 1.2.0 @@ -3563,7 +3563,7 @@ importers: dependencies: '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) ember-auto-import: specifier: ^2.10.0 version: 2.10.0(@glint/template@1.5.0) @@ -3827,7 +3827,7 @@ importers: version: file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/edition-utils': specifier: ^1.2.0 version: 1.2.0 @@ -4158,7 +4158,7 @@ importers: version: file:packages/tracking(@babel/core@7.26.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.26.0)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.26.0)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/optional-features': specifier: ^2.1.0 version: 2.1.0 @@ -4192,6 +4192,9 @@ importers: '@glimmer/tracking': specifier: ^1.1.2 version: 1.1.2 + '@glint/core': + specifier: 1.5.0 + version: 1.5.0(typescript@5.6.3) '@rollup/plugin-babel': specifier: ^6.0.4 version: 6.0.4(@babel/core@7.26.0) @@ -4291,6 +4294,9 @@ importers: eslint-plugin-qunit: specifier: ^8.1.2 version: 8.1.2(eslint@9.14.0) + expect-type: + specifier: ^0.20.0 + version: 0.20.0 globals: specifier: ^15.12.0 version: 15.12.0 @@ -4776,7 +4782,7 @@ importers: version: file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) '@ember-data/unpublished-test-infra': specifier: workspace:5.4.0-alpha.122 - version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0) + version: file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4) '@ember/edition-utils': specifier: ^1.2.0 version: 1.2.0 @@ -9501,7 +9507,7 @@ packages: resolution: {integrity: sha512-Fap52smLp8RkCgvozrZG7RysNJ2T6mk1SPoknMzmukbabFVBAzxl5iyY4OXUbmR09j6t2pupjF6sPabnLtL4vw==} dependencies: '@glimmer/env': 0.1.7 - '@glimmer/interfaces': 0.92.0 + '@glimmer/interfaces': 0.92.3 dev: false /@glimmer/util@0.92.3: @@ -9544,8 +9550,8 @@ packages: /@glimmer/wire-format@0.92.0: resolution: {integrity: sha512-yKhfU7b3PN86iqbfKksB+F9PB/RqbVkZlcRpZWRpEL3HnZ0bJUKC9bsOJynOg77PDXuYQXkbDMfL8ngTuxk+rg==} dependencies: - '@glimmer/interfaces': 0.92.0 - '@glimmer/util': 0.92.0 + '@glimmer/interfaces': 0.92.3 + '@glimmer/util': 0.92.3 dev: false /@glimmer/wire-format@0.92.3: @@ -9574,6 +9580,26 @@ packages: - supports-color dev: true + /@glint/core@1.5.0(typescript@5.6.3): + resolution: {integrity: sha512-oo6ZDwX2S0Qqjai/CJH72LHg1U6rvzH1IyiFlWofaFiu/nSg04CDWZuJNPC3r47jz1+SaSI+mVMUaKJznzxzzQ==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@glimmer/syntax': 0.84.3 + escape-string-regexp: 4.0.0 + semver: 7.6.3 + silent-error: 1.1.1 + typescript: 5.6.3 + uuid: 8.3.2 + vscode-languageserver: 8.1.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@glint/environment-ember-loose@1.5.0(@glimmer/component@1.1.2)(@glint/template@1.5.0)(ember-cli-htmlbars@6.3.0): resolution: {integrity: sha512-QCP4pVupq8zGcBmMDcEq9XI5lfrnklwNOIuzdXb8OnbcY6qpuwz5Y6VOsA1WNGRcip/5wwOsmI6gsAEUTlbvPQ==} peerDependencies: @@ -15677,10 +15703,6 @@ packages: '@esbuild/win32-x64': 0.21.5 dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - /escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -23354,7 +23376,7 @@ packages: engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -24788,10 +24810,13 @@ packages: '@warp-drive/core-types': workspace:0.0.0-alpha.108 '@warp-drive/diagnostic': workspace:0.0.0-alpha.108 ember-source: '*' + qunit: 2.19.4 testem: ~3.11.0 peerDependenciesMeta: '@warp-drive/diagnostic': optional: true + qunit: + optional: true testem: optional: true dependencies: @@ -24813,6 +24838,46 @@ packages: - supports-color dev: true + file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4): + resolution: {directory: packages/unpublished-test-infra, type: directory} + id: file:packages/unpublished-test-infra + name: '@ember-data/unpublished-test-infra' + engines: {node: '>= 18.20.4'} + peerDependencies: + '@ember-data/request': workspace:5.4.0-alpha.122 + '@ember-data/store': workspace:5.4.0-alpha.122 + '@ember-data/tracking': workspace:5.4.0-alpha.122 + '@ember/test-helpers': 3.3.0 || ^4.0.4 + '@warp-drive/core-types': workspace:0.0.0-alpha.108 + '@warp-drive/diagnostic': workspace:0.0.0-alpha.108 + ember-source: '*' + qunit: 2.19.4 + testem: ~3.11.0 + peerDependenciesMeta: + '@warp-drive/diagnostic': + optional: true + qunit: + optional: true + testem: + optional: true + dependencies: + '@ember-data/request': file:packages/request(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108) + '@ember-data/store': file:packages/store(@babel/core@7.24.5)(@ember-data/request-utils@5.4.0-alpha.122)(@ember-data/request@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) + '@ember-data/tracking': file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) + '@ember/test-helpers': 4.0.4(patch_hash=zignhd6n3rugkiuawsmbuxfdka)(@babel/core@7.24.5)(@glint/template@1.5.0)(ember-source@5.12.0) + '@embroider/macros': 1.16.9(@babel/core@7.24.5)(@glint/template@1.5.0) + '@warp-drive/build-config': file:packages/build-config(@babel/core@7.24.5)(@glint/template@1.5.0) + '@warp-drive/core-types': file:packages/core-types(@babel/core@7.24.5)(@glint/template@1.5.0) + chalk: 4.1.2 + ember-source: 5.12.0(@glimmer/component@1.1.2)(@glint/template@1.5.0) + qunit: 2.19.4(patch_hash=2jwk2nz4gqke2k5hv6ptj42llu) + semver: 7.6.3 + transitivePeerDependencies: + - '@babel/core' + - '@glint/template' + - supports-color + dev: true + file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(@warp-drive/diagnostic@0.0.0-alpha.108)(ember-source@5.12.0): resolution: {directory: packages/unpublished-test-infra, type: directory} id: file:packages/unpublished-test-infra @@ -24826,10 +24891,13 @@ packages: '@warp-drive/core-types': workspace:0.0.0-alpha.108 '@warp-drive/diagnostic': workspace:0.0.0-alpha.108 ember-source: '*' + qunit: 2.19.4 testem: ~3.11.0 peerDependenciesMeta: '@warp-drive/diagnostic': optional: true + qunit: + optional: true testem: optional: true dependencies: @@ -24850,7 +24918,46 @@ packages: - '@glint/template' - supports-color - file:packages/unpublished-test-infra(@babel/core@7.26.0)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0): + file:packages/unpublished-test-infra(@babel/core@7.24.5)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4): + resolution: {directory: packages/unpublished-test-infra, type: directory} + id: file:packages/unpublished-test-infra + name: '@ember-data/unpublished-test-infra' + engines: {node: '>= 18.20.4'} + peerDependencies: + '@ember-data/request': workspace:5.4.0-alpha.122 + '@ember-data/store': workspace:5.4.0-alpha.122 + '@ember-data/tracking': workspace:5.4.0-alpha.122 + '@ember/test-helpers': 3.3.0 || ^4.0.4 + '@warp-drive/core-types': workspace:0.0.0-alpha.108 + '@warp-drive/diagnostic': workspace:0.0.0-alpha.108 + ember-source: '*' + qunit: 2.19.4 + testem: ~3.11.0 + peerDependenciesMeta: + '@warp-drive/diagnostic': + optional: true + qunit: + optional: true + testem: + optional: true + dependencies: + '@ember-data/request': file:packages/request(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108) + '@ember-data/store': file:packages/store(@babel/core@7.24.5)(@ember-data/request-utils@5.4.0-alpha.122)(@ember-data/request@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) + '@ember-data/tracking': file:packages/tracking(@babel/core@7.24.5)(@glint/template@1.5.0)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0) + '@ember/test-helpers': 4.0.4(patch_hash=zignhd6n3rugkiuawsmbuxfdka)(@babel/core@7.24.5)(@glint/template@1.5.0)(ember-source@5.12.0) + '@embroider/macros': 1.16.9(@babel/core@7.24.5)(@glint/template@1.5.0) + '@warp-drive/build-config': file:packages/build-config(@babel/core@7.24.5)(@glint/template@1.5.0) + '@warp-drive/core-types': file:packages/core-types(@babel/core@7.24.5)(@glint/template@1.5.0) + chalk: 4.1.2 + ember-source: 5.12.0(@glimmer/component@1.1.2)(@glint/template@1.5.0) + qunit: 2.19.4(patch_hash=2jwk2nz4gqke2k5hv6ptj42llu) + semver: 7.6.3 + transitivePeerDependencies: + - '@babel/core' + - '@glint/template' + - supports-color + + file:packages/unpublished-test-infra(@babel/core@7.26.0)(@ember-data/request@5.4.0-alpha.122)(@ember-data/store@5.4.0-alpha.122)(@ember-data/tracking@5.4.0-alpha.122)(@ember/test-helpers@4.0.4)(@warp-drive/core-types@0.0.0-alpha.108)(ember-source@5.12.0)(qunit@2.19.4): resolution: {directory: packages/unpublished-test-infra, type: directory} id: file:packages/unpublished-test-infra name: '@ember-data/unpublished-test-infra' @@ -24863,10 +24970,13 @@ packages: '@warp-drive/core-types': workspace:0.0.0-alpha.108 '@warp-drive/diagnostic': workspace:0.0.0-alpha.108 ember-source: '*' + qunit: 2.19.4 testem: ~3.11.0 peerDependenciesMeta: '@warp-drive/diagnostic': optional: true + qunit: + optional: true testem: optional: true dependencies: diff --git a/release/core/publish/index.ts b/release/core/publish/index.ts index d98917f30a3..6a89b08fb5b 100644 --- a/release/core/publish/index.ts +++ b/release/core/publish/index.ts @@ -35,6 +35,9 @@ export async function executePublish(args: string[]) { // get packages present on our current branch const packages = await gatherPackages(strategy.config); + console.log(packages); + console.log(strategy.config); + // get packages present in the git tag version const fromVersion = config.full.get('from') as SEMVER_VERSION | undefined; const fromTag = `v${fromVersion}` as GIT_TAG; diff --git a/release/core/publish/steps/generate-tarballs.ts b/release/core/publish/steps/generate-tarballs.ts index 529d4535a09..2894dbaf931 100644 --- a/release/core/publish/steps/generate-tarballs.ts +++ b/release/core/publish/steps/generate-tarballs.ts @@ -134,26 +134,6 @@ function scrubTypesFromExports(pkg: Package) { delete pkg.pkgData.exports; return; } - - // scrub the package.json of any types fields in exports - if (pkg.pkgData.exports) { - // level 1 - for (const [key, value] of Object.entries(pkg.pkgData.exports)) { - if (key === 'types') { - delete pkg.pkgData.exports[key]; - } else if (typeof value === 'object') { - // level 2 - delete value.types; - - for (const [k, v] of Object.entries(value)) { - if (typeof v === 'object') { - // level 3 - delete v.types; - } - } - } - } - } } async function makeTypesPrivate(pkg: Package) { diff --git a/scripts/test-package-manager.mjs b/scripts/test-package-manager.mjs new file mode 100644 index 00000000000..372daac9a5e --- /dev/null +++ b/scripts/test-package-manager.mjs @@ -0,0 +1,286 @@ +import assert from 'node:assert'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { mkdtemp, copyFile, cp, rm } from 'node:fs/promises'; +import { join, basename } from 'node:path'; +import { $ } from 'execa'; +import { globby } from 'globby'; + +import { gatherPackages, loadStrategy } from '../release/utils/package.ts'; +import { generatePackageTarballs } from '../release/core/publish/steps/generate-tarballs.ts'; +import { applyStrategy } from '../release/core/publish/steps/generate-strategy.ts'; + +const CWD = process.cwd(); + +const PROJECT_TO_USE = join(import.meta.dirname, '../tests/vite-basic-compat'); + +async function createTempFolder(prefix = 'tmp-') { + const tempDir = tmpdir(); + const folderPath = await mkdtemp(join(tempDir, prefix)); + return folderPath; +} + +async function publicPackages() { + let { stdout } = await $({ preferLocal: true, shell: true })`pnpm ls --depth -1 -r --parseable`; + + let paths = stdout + .split('\n') + .map((x) => x.trim()) + .filter(Boolean); + + let publicPaths = paths.filter((path) => { + let manifestPath = join(path, 'package.json'); + let contents = readFileSync(manifestPath).toString(); + let isPrivate = contents.includes(`"private": true`); + return !isPrivate; + }); + + return publicPaths; +} + +async function buildAll(tag) { + let publicPaths = await publicPackages(); + + if (!tag) { + /** + * Simulates normal pnpm releasing + */ + return await Promise.all( + publicPaths.map((pkgPath) => { + return $({ preferLocal: true, shell: true, cwd: pkgPath })(`pnpm pack`); + }) + ); + } + + /** + * Simulates part of an actual release + * The version increment doesn't matter, as we aren't actually going to change the versions + */ + const config = { + channel: tag, + increment: 'patch', + get(key) { + return this[key]; + }, + }; + const strategy = await loadStrategy(); + const packages = await gatherPackages(strategy.config); + const applied = await applyStrategy(config, strategy, packages, packages); + + /** + * The applied stategy is mostly based off release/strategy.json + * We want to change it dynamically for our test using the "tag" + * + * It's lies, as we're not changing the versions, but the release / build + * code has different behavior based on channel + */ + for (let [pkgName, config] of Object.entries(applied.public_pks)) { + applied.public_pks[pkgName] = { + ...config, + stage: tag, + types: tag, + }; + } + + await generatePackageTarballs(config, packages, applied.public_pks); +} + +async function deleteTars() { + let tars = await globby('{tmp,packages}/**/*.tgz', { ignore: ['**/node_modules', '**/dist'] }); + + await Promise.all( + tars.map((tar) => { + return rm(tar); + }) + ); +} + +async function copyTars(toDir) { + let tars = await globby('{tmp/tarballs/,packages}/**/*.tgz', { ignore: ['**/node_modules', '**/dist'] }); + + await Promise.all( + tars.map((tar) => { + let fileName = basename(tar); + let fullSource = join(CWD, tar); + let fullDestination = join(toDir, fileName); + + return copyFile(fullSource, fullDestination); + }) + ); +} +async function copyProject(toDir) { + /** + * Copies contents "into" toDir, rather than making a subfolder + * of basename(PROJECT_TO_USE) + */ + await cp(PROJECT_TO_USE, toDir, { + recursive: true, + filter: (source) => { + let ignore = source.includes('node_modules') || source.includes('dist'); + + return !ignore; + }, + }); + + return toDir; +} + +async function fixManifest(projectDir) { + let tars = await globby('*.tgz', { cwd: projectDir }); + + let manifestPath = join(projectDir, 'package.json'); + let contents = readFileSync(manifestPath).toString(); + let json = JSON.parse(contents); + + delete json.dependenciesMeta; + delete json.volta; + + json.resolutions ||= {}; + json.pnpm ||= {}; + json.pnpm.overrides ||= {}; + + function tarByPrefix(hyphenated) { + return tars.find((name) => name.startsWith(hyphenated)); + } + + for (let [depName, version] of Object.entries(json.devDependencies)) { + if (!version.includes('workspace')) { + continue; + } + + let local = tarByPrefix(depName.replace('@', '').replace('/', '-')); + + if (!local) { + console.warn(` +Could not find ${depName} in list of tarballs: +${tars.map((x) => `\t${x}\n`).join('')} + + ${depName} will be omitted from this test project. + `); + delete json.devDependencies[depName]; + continue; + } + + let fileProtocol = `file:./${local}`; + json.devDependencies[depName] = fileProtocol; + json.resolutions[depName] = fileProtocol; + json.pnpm.overrides[depName] = fileProtocol; + } + + writeFileSync(manifestPath, JSON.stringify(json, null, 2)); +} + +async function fixTSConfig(projectDir) { + let tsconfigPath = join(projectDir, 'tsconfig.json'); + let contents = readFileSync(tsconfigPath).toString(); + let json = JSON.parse(contents); + + delete json.references; + + json.glint = { + environment: [], + }; + json.compilerOptions.paths = { + 'vite-basic-compat/*': ['./app/*'], + 'vite-basic-compat/tests/*': ['./tess/*'], + }; + json.compilerOptions.types = [ + 'ember-source/types', + '@embroider/core/virtual', + // 'ember-data/unstable-preview-types', + // '@ember-data/request/unstable-preview-types', + // TODO: etc + ]; + + writeFileSync(tsconfigPath, JSON.stringify(json, null, 2)); +} + +async function runNoThrow(cwd, cmd) { + try { + return await $({ preferLocal: true, shell: true, cwd, stdio: 'inherit' })(cmd); + } catch (e) { + return e; + } +} + +async function install(packageManager, cwd) { + // All package managers have an install command + await $({ preferLocal: true, shell: true, cwd, stdio: 'inherit' })`${packageManager} install`; +} + +async function typecheck(packageManager, cwd) { + switch (packageManager) { + case 'npm': + return runNoThrow(cwd, `npm exec glint`); + case 'yarn': + return runNoThrow(cwd, `yarn glint`); + case 'pnpm': + return runNoThrow(cwd, `pnpm glint`); + } +} +async function build(packageManager, cwd) { + return runNoThrow(cwd, `${packageManager} run build`); +} + +async function test(packageManager, cwd) { + return runNoThrow(cwd, `${packageManager} run test:vite`); +} + +function banner(text) { + console.info(` +-------------------------------- + + ${text} + +-------------------------------- + `); +} + +const SUPPORTED = new Set(['npm', 'yarn', 'pnpm']); +const TAGS = new Set(['alpha', 'beta', 'stable']); + +async function main() { + const [, , packageManager, tag] = process.argv; + + assert( + SUPPORTED.has(packageManager), + `Expected passed arg, the packageManager (${packageManager}), to be one of ${[...SUPPORTED.values()].join(', ')}` + ); + + if (tag) { + assert(TAGS.has(tag), `Expected passed arg, the tag (${tag}), to be one of ${[...TAGS.values()].join(', ')}`); + } + + await deleteTars(); + await buildAll(tag); + + let tmpDir = await createTempFolder(); + let projectDir = await copyProject(tmpDir); + + console.debug(`To debug this test run, the project is located at ${projectDir}`); + + await copyTars(projectDir); + await fixManifest(projectDir); + await fixTSConfig(projectDir); + + banner('typecheck'); + await install(packageManager, projectDir); + let typesResult = await typecheck(packageManager, projectDir); + banner('build'); + let buildResult = await build(packageManager, projectDir); + banner('test'); + let testResult = await test(packageManager, projectDir); + + console.info(` + Using: ${packageManager}; + In: ${projectDir} + + types: ${typesResult.exitCode === 0 ? 'Success' : 'Failure'} + build: ${buildResult.exitCode === 0 ? 'Success' : 'Failure'} + test: ${testResult.exitCode === 0 ? 'Success' : 'Failure'} + `); + + process.exit(typesResult.exitCode || buildResult.exitCode || testResult.exitCode); +} + +await main(); diff --git a/tests/vite-basic-compat/app/type-tests.ts b/tests/vite-basic-compat/app/type-tests.ts new file mode 100644 index 00000000000..059f62d5837 --- /dev/null +++ b/tests/vite-basic-compat/app/type-tests.ts @@ -0,0 +1,34 @@ +/** + * These tests are more fro the out-of-monorepo tests, + * as we'll sever the references links to the source of each of these packages + * + * Just need to make sure each module has types at publish. + */ +import { expectTypeOf } from 'expect-type'; + +import Debug from '@ember-data/debug'; +import Store from '@ember-data/store'; +import Graph from '@ember-data/store'; +import RequestManager from '@ember-data/request'; +import { BuildURLMixin } from '@ember-data/adapter'; +import jsonapi from '@ember-data/json-api'; +import { adapterFor } from '@ember-data/legacy-compat'; +import Model from '@ember-data/model'; +import { setBuildURLConfig } from '@ember-data/request-utils'; +import Serializer from '@ember-data/serializer'; +import { createCache } from '@ember-data/tracking'; + +// Most of this is to assure thet above imports don't get optimized away +expectTypeOf().not.toBeAny(); +expectTypeOf().toHaveProperty('reopen'); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); +expectTypeOf().not.toBeAny(); diff --git a/tests/vite-basic-compat/package.json b/tests/vite-basic-compat/package.json index 7b5c86ee477..ae873acfbf4 100644 --- a/tests/vite-basic-compat/package.json +++ b/tests/vite-basic-compat/package.json @@ -98,6 +98,7 @@ "@embroider/vite": "0.2.2-unstable.4070ba7", "@glimmer/component": "^1.1.2", "@glimmer/tracking": "^1.1.2", + "@glint/core": "1.5.0", "@rollup/plugin-babel": "^6.0.4", "@tsconfig/ember": "^3.0.8", "@types/eslint__js": "^8.42.3", @@ -131,6 +132,7 @@ "eslint-plugin-n": "^17.13.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-qunit": "^8.1.2", + "expect-type": "^0.20.0", "globals": "^15.12.0", "loader.js": "^4.7.0", "pnpm-sync-dependencies-meta-injected": "0.0.14", diff --git a/tests/vite-basic-compat/tests/acceptance/visit-test.js b/tests/vite-basic-compat/tests/application/visit-test.ts similarity index 80% rename from tests/vite-basic-compat/tests/acceptance/visit-test.js rename to tests/vite-basic-compat/tests/application/visit-test.ts index f09ab7273ed..948f67b3d43 100644 --- a/tests/vite-basic-compat/tests/acceptance/visit-test.js +++ b/tests/vite-basic-compat/tests/application/visit-test.ts @@ -1,7 +1,5 @@ -import { visit } from '@ember/test-helpers'; - import { module, test } from 'qunit'; - +import { visit } from '@ember/test-helpers'; import { setupApplicationTest } from 'ember-qunit'; module('it works', function (hooks) { @@ -13,6 +11,8 @@ module('it works', function (hooks) { }); test('we can use the store', async function (assert) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore this repo loads the declarations for qunit in the wrong order const { owner } = this; const store = owner.lookup('service:store'); diff --git a/tests/vite-basic-compat/tests/helpers/index.ts b/tests/vite-basic-compat/tests/helpers/index.ts deleted file mode 100644 index e190f567eda..00000000000 --- a/tests/vite-basic-compat/tests/helpers/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - setupApplicationTest as upstreamSetupApplicationTest, - setupRenderingTest as upstreamSetupRenderingTest, - setupTest as upstreamSetupTest, - type SetupTestOptions, -} from 'ember-qunit'; - -// This file exists to provide wrappers around ember-qunit's -// test setup functions. This way, you can easily extend the setup that is -// needed per test type. - -function setupApplicationTest(hooks: NestedHooks, options?: SetupTestOptions) { - upstreamSetupApplicationTest(hooks, options); - - // Additional setup for application tests can be done here. - // - // For example, if you need an authenticated session for each - // application test, you could do: - // - // hooks.beforeEach(async function () { - // await authenticateSession(); // ember-simple-auth - // }); - // - // This is also a good place to call test setup functions coming - // from other addons: - // - // setupIntl(hooks, 'en-us'); // ember-intl - // setupMirage(hooks); // ember-cli-mirage -} - -function setupRenderingTest(hooks: NestedHooks, options?: SetupTestOptions) { - upstreamSetupRenderingTest(hooks, options); - - // Additional setup for rendering tests can be done here. -} - -function setupTest(hooks: NestedHooks, options?: SetupTestOptions) { - upstreamSetupTest(hooks, options); - - // Additional setup for unit tests can be done here. -} - -export { setupApplicationTest, setupRenderingTest, setupTest }; diff --git a/tests/vite-basic-compat/tests/integration/.gitkeep b/tests/vite-basic-compat/tests/integration/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/vite-basic-compat/tests/unit/.gitkeep b/tests/vite-basic-compat/tests/unit/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000