diff --git a/.verdaccio/config.yml b/.verdaccio/config.yml index a007fe82..f74420f2 100644 --- a/.verdaccio/config.yml +++ b/.verdaccio/config.yml @@ -19,7 +19,7 @@ packages: proxy: npmjs # log settings -logs: +log: type: stdout format: pretty level: warn diff --git a/e2e/ngx-deploy-npm-e2e/jest.config.ts b/e2e/ngx-deploy-npm-e2e/jest.config.ts deleted file mode 100644 index 782fc4f8..00000000 --- a/e2e/ngx-deploy-npm-e2e/jest.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -export default { - displayName: 'ngx-deploy-npm-e2e', - preset: '../../jest.preset.js', - transform: { - '^.+\\.[tj]s$': [ - 'ts-jest', - { - tsconfig: '/tsconfig.spec.json', - }, - ], - }, - moduleFileExtensions: ['ts', 'js', 'html'], - coverageDirectory: '../../coverage/e2e/ngx-deploy-npm-e2e', - testPathIgnorePatterns: ['/node_modules/'], -}; diff --git a/e2e/ngx-deploy-npm-e2e/jest.integration.config.ts b/e2e/ngx-deploy-npm-e2e/jest.integration.config.ts deleted file mode 100644 index 5dd2e3d4..00000000 --- a/e2e/ngx-deploy-npm-e2e/jest.integration.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import originalJestConfig from './jest.config'; - -export default { - ...originalJestConfig, - testPathIgnorePatterns: ['/node_modules/', 'tests/.*'], -}; diff --git a/e2e/ngx-deploy-npm-e2e/project.json b/e2e/ngx-deploy-npm-e2e/project.json deleted file mode 100644 index 121fc294..00000000 --- a/e2e/ngx-deploy-npm-e2e/project.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "ngx-deploy-npm-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "projectType": "application", - "sourceRoot": "e2e/ngx-deploy-npm-e2e/src", - "targets": { - "e2e": { - "executor": "@nx/jest:jest", - "options": { - "jestConfig": "e2e/ngx-deploy-npm-e2e/jest.config.ts", - "runInBand": true - }, - "dependsOn": ["ngx-deploy-npm:build"] - } - }, - "tags": [], - "implicitDependencies": ["ngx-deploy-npm"] -} diff --git a/e2e/ngx-deploy-npm-e2e/tests/build.spec.ts b/e2e/ngx-deploy-npm-e2e/tests/build.spec.ts deleted file mode 100644 index ebb09d58..00000000 --- a/e2e/ngx-deploy-npm-e2e/tests/build.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { checkFilesExist, runNxCommand, uniq } from '@nx/plugin/testing'; -import { setup } from '../utils'; - -describe('build', () => { - const buildSetUp = (libName: string) => - setup([{ name: libName, generator: '@nx/node' }]); - - it('should build the lib due to the `dependsOn` option created on the target', async () => { - const [lib] = await buildSetUp(uniq('basic-lib')); - - runNxCommand(`deploy ${lib.name} --dry-run`); - - expect(() => - checkFilesExist(`dist/libs/${lib.name}/package.json`) - ).not.toThrow(); - }, 120000); -}); diff --git a/e2e/ngx-deploy-npm-e2e/tests/minimal.spec.ts b/e2e/ngx-deploy-npm-e2e/tests/minimal.spec.ts deleted file mode 100644 index 7215c74a..00000000 --- a/e2e/ngx-deploy-npm-e2e/tests/minimal.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { runNxCommand, uniq } from '@nx/plugin/testing'; -import { setup } from '../utils'; - -describe('Minimal Project', () => { - it('should publish the lib', async () => { - const [uniqLibName] = await setup([ - { name: uniq('minimal-lib'), generator: 'minimal' }, - ]); - - expect(() => { - runNxCommand(`deploy ${uniqLibName.name} --dry-run`); - }).not.toThrow(); - }, 120000); -}); diff --git a/e2e/ngx-deploy-npm-e2e/tests/publish.spec.ts b/e2e/ngx-deploy-npm-e2e/tests/publish.spec.ts deleted file mode 100644 index 416cba84..00000000 --- a/e2e/ngx-deploy-npm-e2e/tests/publish.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { runNxCommand, uniq } from '@nx/plugin/testing'; -import { setup } from '../utils'; - -describe('Publish', () => { - it('should publish an Angular Lib', async () => { - const [angularLib] = await setup([ - { - name: uniq('angular-lib'), - generator: '@nx/angular', - extraOptions: '--style css', - }, - ]); - - expect(() => { - runNxCommand(`deploy ${angularLib.name} --dry-run`); - }).not.toThrow(); - }, 120000); - - it('should publish an Node Lib', async () => { - const [angularLib] = await setup([ - { - name: uniq('node-lib'), - generator: '@nx/node', - }, - ]); - - expect(() => { - runNxCommand(`deploy ${angularLib.name} --dry-run`); - }).not.toThrow(); - }, 120000); -}); diff --git a/e2e/ngx-deploy-npm-e2e/tsconfig.spec.json b/e2e/ngx-deploy-npm-e2e/tsconfig.spec.json deleted file mode 100644 index bac7831a..00000000 --- a/e2e/ngx-deploy-npm-e2e/tsconfig.spec.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "module": "commonjs", - "types": ["jest", "node"], - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": ["**/*.spec.ts", "**/*.d.ts"] -} diff --git a/e2e/ngx-deploy-npm-e2e/utils/basic-setup.ts b/e2e/ngx-deploy-npm-e2e/utils/basic-setup.ts deleted file mode 100644 index ef8f83f5..00000000 --- a/e2e/ngx-deploy-npm-e2e/utils/basic-setup.ts +++ /dev/null @@ -1,134 +0,0 @@ -import * as fs from 'fs'; -import { ProjectConfiguration } from '@nx/devkit'; -import { readJson } from '@nx/plugin/testing'; - -import { npmAccess } from '../../../packages/ngx-deploy-npm/src/core'; -import { - generateLib, - initNgxDeployNPMProject, - installDependencies, - installNgxDeployNPMProject, -} from '.'; - -export const setup = async ( - libs: { - name: string; - generator: 'minimal' | string; - access?: npmAccess; - skipInstall?: boolean; - extraOptions?: string; - distFolderPath?: string; - }[] -) => { - initNgxDeployNPMProject(); - - // Install dependencies only once - const generators = new Set( - libs - .map(({ generator }) => generator) - .filter(generator => generator !== 'minimal') - ); - generators.forEach(dependency => { - installDependencies(dependency); - }); - - // Init libs - await Promise.all( - libs.map(async ({ name, generator, extraOptions = '' }) => { - if (generator === 'minimal') { - await createMinimalLib(name); - } else { - generateLib({ - nxPlugin: generator, - libName: name, - extraOptions: `--directory="libs/${name}" ${extraOptions}`, - }); - } - }) - ); - - // Install ngx-deploy-npm - libs - .filter(({ skipInstall }) => !!skipInstall === false) - .forEach(({ name, access, generator }) => { - const accessOption = !!access ? `--access ${access}` : ''; - - const distFolderPath = - generator === 'minimal' - ? getMinimalLibRoot(name).libRoot - : `dist/libs/${name}`; - - installNgxDeployNPMProject( - `--project="${name}" --dist-folder-path="${distFolderPath}" ${accessOption}` - ); - }); - - const processedLibs: { name: string; workspace: ProjectConfiguration }[] = - libs.map(({ name }) => ({ - name: name, - workspace: readJson(`libs/${name}/project.json`), - })); - - return processedLibs; -}; - -function getMinimalLibRoot(libName: string) { - const libRoot = `libs/${libName}`; - const libRootAbsolutePath = `./tmp/nx-e2e/proj/${libRoot}`; - - return { libRoot, libRootAbsolutePath }; -} - -async function createMinimalLib(libName: string) { - // Create Lib - const { libRoot, libRootAbsolutePath } = getMinimalLibRoot(libName); - - // Create the lib folder - await fs.promises.mkdir(libRootAbsolutePath, { - recursive: true, - }); - - const createProjectJsonPromise = fs.promises.writeFile( - `${libRootAbsolutePath}/project.json`, - generateProjectJSON(libName, libRoot), - 'utf8' - ); - const createPackageJsonPromise = fs.promises.writeFile( - `${libRootAbsolutePath}/package.json`, - generatePackageJSON(libName), - 'utf8' - ); - const createUniqueFilePromise = fs.promises.writeFile( - `${libRootAbsolutePath}/hello-world.js`, - "console.log('Hello World!');", - 'utf8' - ); - await Promise.all([ - createProjectJsonPromise, - createPackageJsonPromise, - createUniqueFilePromise, - ]); - - return { libRoot }; - - function generateProjectJSON(projectName: string, libRoot: string): string { - const content = { - name: projectName, - $schema: '../../node_modules/nx/schemas/project-schema.json', - projectType: 'library', - sourceRoot: libRoot, - }; - - return JSON.stringify(content, null, 2); - } - - function generatePackageJSON(projectName: string): string { - const content = { - name: `@mock-domain/${projectName}`, - description: 'Minimal LIb', - version: '1.0.0', - }; - - return JSON.stringify(content, null, 2); - } -} diff --git a/e2e/ngx-deploy-npm-e2e/utils/get-nx-current-version.ts b/e2e/ngx-deploy-npm-e2e/utils/get-nx-current-version.ts deleted file mode 100644 index e9d9fb20..00000000 --- a/e2e/ngx-deploy-npm-e2e/utils/get-nx-current-version.ts +++ /dev/null @@ -1,3 +0,0 @@ -import packageJson from '../../../package.json'; // This import style requires "esModuleInterop", see "side notes" - -export const currentNxVersion = packageJson.devDependencies['@nx/workspace']; diff --git a/e2e/ngx-deploy-npm-e2e/utils/install-deps.ts b/e2e/ngx-deploy-npm-e2e/utils/install-deps.ts deleted file mode 100644 index a7fa953b..00000000 --- a/e2e/ngx-deploy-npm-e2e/utils/install-deps.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { runCommand } from '@nx/plugin/testing'; -import { currentNxVersion } from './get-nx-current-version'; - -export function installDependencies(nxPlugin: string) { - const packageToInstall = `${nxPlugin}@${currentNxVersion}`; - - runCommand(`npm add -D ${packageToInstall}`, {}); - runCommand(`npx nx g ${nxPlugin}:init`, {}); -} diff --git a/e2e/ngx-deploy-npm-e2e/utils/utils-ngx-deploy-npm.ts b/e2e/ngx-deploy-npm-e2e/utils/utils-ngx-deploy-npm.ts deleted file mode 100644 index 3adaccc7..00000000 --- a/e2e/ngx-deploy-npm-e2e/utils/utils-ngx-deploy-npm.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - ensureNxProject, - runNxCommand, - runPackageManagerInstall, -} from '@nx/plugin/testing'; - -export function initNgxDeployNPMProject() { - // Init project - ensureNxProject('ngx-deploy-npm', 'dist/packages/ngx-deploy-npm'); - runPackageManagerInstall(); -} - -export function installNgxDeployNPMProject(options: string = '') { - runNxCommand(`generate ngx-deploy-npm:install ${options}`); -} diff --git a/nx.json b/nx.json index 8f1a9fcc..8e42ee09 100644 --- a/nx.json +++ b/nx.json @@ -2,10 +2,6 @@ "targetDependencies": { "build": [{ "target": "build", "projects": "dependencies" }] }, - "workspaceLayout": { - "appsDir": "e2e", - "libsDir": "packages" - }, "namedInputs": { "default": ["{projectRoot}/**/*", "sharedGlobals"], "sharedGlobals": [], diff --git a/package-lock.json b/package-lock.json index 2d95f225..e1335633 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,10 @@ "@nx/js": "20.0.3", "@nx/plugin": "20.0.3", "@nx/workspace": "20.0.3", - "@types/jest": "29.4.1", + "@swc-node/register": "~1.9.1", + "@swc/core": "~1.5.7", + "@swc/helpers": "~0.5.11", + "@types/jest": "^29.5.12", "@types/node": "^20.14.8", "@typescript-eslint/eslint-plugin": "7.17.0", "@typescript-eslint/parser": "7.17.0", @@ -32,8 +35,8 @@ "eslint": "8.57.1", "eslint-config-prettier": "9.0.0", "husky": "8.0.3", - "jest": "29.4.3", - "jest-environment-jsdom": "^29.4.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jsonc-eslint-parser": "^2.1.0", "nx": "20.0.3", "prettier": "2.8.4", @@ -3967,6 +3970,305 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@swc-node/core": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", + "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "@swc/types": ">= 0.1" + } + }, + "node_modules/@swc-node/register": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", + "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc-node/core": "^1.13.1", + "@swc-node/sourcemap-support": "^0.5.0", + "colorette": "^2.0.20", + "debug": "^4.3.4", + "pirates": "^4.0.6", + "tslib": "^2.6.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "typescript": ">= 4.3" + } + }, + "node_modules/@swc-node/sourcemap-support": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", + "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.21", + "tslib": "^2.6.3" + } + }, + "node_modules/@swc-node/sourcemap-support/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@swc/core": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.29.tgz", + "integrity": "sha512-nvTtHJI43DUSOAf3h9XsqYg8YXKc0/N4il9y4j0xAkO0ekgDNo+3+jbw6MInawjKJF9uulyr+f5bAutTsOKVlw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.8" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.29", + "@swc/core-darwin-x64": "1.5.29", + "@swc/core-linux-arm-gnueabihf": "1.5.29", + "@swc/core-linux-arm64-gnu": "1.5.29", + "@swc/core-linux-arm64-musl": "1.5.29", + "@swc/core-linux-x64-gnu": "1.5.29", + "@swc/core-linux-x64-musl": "1.5.29", + "@swc/core-win32-arm64-msvc": "1.5.29", + "@swc/core-win32-ia32-msvc": "1.5.29", + "@swc/core-win32-x64-msvc": "1.5.29" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.29.tgz", + "integrity": "sha512-6F/sSxpHaq3nzg2ADv9FHLi4Fu2A8w8vP8Ich8gIl16D2htStlwnaPmCLjRswO+cFkzgVqy/l01gzNGWd4DFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.29.tgz", + "integrity": "sha512-rF/rXkvUOTdTIfoYbmszbSUGsCyvqACqy1VeP3nXONS+LxFl4bRmRcUTRrblL7IE5RTMCKUuPbqbQSE2hK7bqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.29.tgz", + "integrity": "sha512-2OAPL8iWBsmmwkjGXqvuUhbmmoLxS1xNXiMq87EsnCNMAKohGc7wJkdAOUL6J/YFpean/vwMWg64rJD4pycBeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.29.tgz", + "integrity": "sha512-eH/Q9+8O5qhSxMestZnhuS1xqQMr6M7SolZYxiXJqxArXYILLCF+nq2R9SxuMl0CfjHSpb6+hHPk/HXy54eIRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.29.tgz", + "integrity": "sha512-TERh2OICAJz+SdDIK9+0GyTUwF6r4xDlFmpoiHKHrrD/Hh3u+6Zue0d7jQ/he/i80GDn4tJQkHlZys+RZL5UZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.29.tgz", + "integrity": "sha512-WMDPqU7Ji9dJpA+Llek2p9t7pcy7Bob8ggPUvgsIlv3R/eesF9DIzSbrgl6j3EAEPB9LFdSafsgf6kT/qnvqFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.29.tgz", + "integrity": "sha512-DO14glwpdKY4POSN0201OnGg1+ziaSVr6/RFzuSLggshwXeeyVORiHv3baj7NENhJhWhUy3NZlDsXLnRFkmhHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.29.tgz", + "integrity": "sha512-V3Y1+a1zG1zpYXUMqPIHEMEOd+rHoVnIpO/KTyFwAmKVu8v+/xPEVx/AGoYE67x4vDAAvPQrKI3Aokilqa5yVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.29.tgz", + "integrity": "sha512-OrM6yfXw4wXhnVFosOJzarw0Fdz5Y0okgHfn9oFbTPJhoqxV5Rdmd6kXxWu2RiVKs6kGSJFZXHDeUq2w5rTIMg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.29.tgz", + "integrity": "sha512-eD/gnxqKyZQQR0hR7TMkIlJ+nCF9dzYmVVNbYZWuA1Xy94aBPUsEk3Uw3oG7q6R3ErrEUPP0FNf2ztEnv+I+dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -4107,9 +4409,9 @@ } }, "node_modules/@types/jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.1.tgz", - "integrity": "sha512-zDQSWXG+ZkEvs2zFFMszePhx4euKz+Yt3Gg1P+RHjfJBinTTr6L2DEyovO4V/WrKXuF0Dgn56GWGZPDa6TW9eQ==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10318,16 +10620,16 @@ } }, "node_modules/jest": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", - "integrity": "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.4.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" diff --git a/package.json b/package.json index 0ecb6cf4..37bc991e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,10 @@ "@nx/js": "20.0.3", "@nx/plugin": "20.0.3", "@nx/workspace": "20.0.3", - "@types/jest": "29.4.1", + "@swc-node/register": "~1.9.1", + "@swc/core": "~1.5.7", + "@swc/helpers": "~0.5.11", + "@types/jest": "^29.5.12", "@types/node": "^20.14.8", "@typescript-eslint/eslint-plugin": "7.17.0", "@typescript-eslint/parser": "7.17.0", @@ -33,8 +36,8 @@ "eslint": "8.57.1", "eslint-config-prettier": "9.0.0", "husky": "8.0.3", - "jest": "29.4.3", - "jest-environment-jsdom": "^29.4.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jsonc-eslint-parser": "^2.1.0", "nx": "20.0.3", "prettier": "2.8.4", diff --git a/packages/ngx-deploy-npm-e2e/.eslintrc.json b/packages/ngx-deploy-npm-e2e/.eslintrc.json new file mode 100644 index 00000000..9d9c0db5 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/ngx-deploy-npm-e2e/jest.config.ts b/packages/ngx-deploy-npm-e2e/jest.config.ts new file mode 100644 index 00000000..76557f47 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/jest.config.ts @@ -0,0 +1,11 @@ +export default { + displayName: 'ngx-deploy-npm-e2e', + preset: '../../jest.preset.js', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/ngx-deploy-npm-e2e', + globalSetup: '../../tools/scripts/start-local-registry.ts', + globalTeardown: '../../tools/scripts/stop-local-registry.ts', +}; diff --git a/packages/ngx-deploy-npm-e2e/project.json b/packages/ngx-deploy-npm-e2e/project.json new file mode 100644 index 00000000..10309ee3 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/project.json @@ -0,0 +1,21 @@ +{ + "name": "ngx-deploy-npm-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "packages/ngx-deploy-npm-e2e/src", + "implicitDependencies": ["ngx-deploy-npm"], + "targets": { + "e2e": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/ngx-deploy-npm-e2e/jest.config.ts", + "runInBand": true + }, + "dependsOn": ["^build"] + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/e2e/ngx-deploy-npm-e2e/tests/install.spec.ts b/packages/ngx-deploy-npm-e2e/src/install.spec.ts similarity index 67% rename from e2e/ngx-deploy-npm-e2e/tests/install.spec.ts rename to packages/ngx-deploy-npm-e2e/src/install.spec.ts index 0034ab58..4c2b4fc4 100644 --- a/e2e/ngx-deploy-npm-e2e/tests/install.spec.ts +++ b/packages/ngx-deploy-npm-e2e/src/install.spec.ts @@ -1,9 +1,9 @@ import { TargetConfiguration } from '@nx/devkit'; import { uniq } from '@nx/plugin/testing'; -import { DeployExecutorOptions } from '../../../packages/ngx-deploy-npm/src/executors/deploy/schema'; -import { npmAccess } from '../../../packages/ngx-deploy-npm/src/core'; -import { setup } from '../utils'; +import { DeployExecutorOptions } from 'bikecoders/ngx-deploy-npm'; +import { npmAccess } from 'bikecoders/ngx-deploy-npm'; +import { setup } from './utils'; describe('install', () => { const expectedTarget = ({ @@ -20,7 +20,7 @@ describe('install', () => { const target: TargetConfiguration = { executor: 'ngx-deploy-npm:deploy', options: { - distFolderPath: customDistFolderPath || `dist/libs/${projectName}`, + distFolderPath: customDistFolderPath || `dist/packages/${projectName}`, access, }, }; @@ -33,22 +33,25 @@ describe('install', () => { }; it('should modify the workspace only for the indicated libs', async () => { - const [publicLib, publicLib2, restrictedLib, libNOTSet, smallLib] = - await setup([ - { name: uniq('node-lib1'), generator: '@nx/node' }, - { name: uniq('node-lib2'), generator: '@nx/node' }, - { - name: uniq('node-resctricted'), + const { processedLibs, tearDown } = await setup([ + { name: uniq('node-lib1'), generator: '@nx/node' }, + { name: uniq('node-lib2'), generator: '@nx/node' }, + { + name: uniq('node-resctricted'), + installOptions: { access: npmAccess.restricted, - generator: '@nx/node', - }, - { - name: uniq('node-lib-not-set'), - skipInstall: true, - generator: '@nx/node', }, - { name: uniq('small-lib'), generator: 'minimal' }, - ]); + generator: '@nx/node', + }, + { + name: uniq('node-lib-not-set'), + skipInstall: true, + generator: '@nx/node', + }, + { name: uniq('small-lib'), generator: 'minimal' }, + ]); + const [publicLib, publicLib2, restrictedLib, libNOTSet, smallLib] = + processedLibs; expect(publicLib.workspace.targets?.deploy).toEqual( expectedTarget({ projectName: publicLib.name }) @@ -71,5 +74,7 @@ describe('install', () => { isBuildable: false, }) ); - }, 120000); + + return tearDown(); + }, 180000); }); diff --git a/packages/ngx-deploy-npm-e2e/src/package-installation.spec.ts b/packages/ngx-deploy-npm-e2e/src/package-installation.spec.ts new file mode 100644 index 00000000..88f865ed --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/package-installation.spec.ts @@ -0,0 +1,11 @@ +import { setup } from './utils'; + +describe('ngx-deploy-npm', () => { + it('should be installed', async () => { + const { tearDown, executeCommand } = await setup([]); + + expect(() => executeCommand('npm ls ngx-deploy-npm')).not.toThrow(); + + return tearDown(); + }, 120000); +}); diff --git a/packages/ngx-deploy-npm-e2e/src/publish-minimal-lib.spec.ts b/packages/ngx-deploy-npm-e2e/src/publish-minimal-lib.spec.ts new file mode 100644 index 00000000..b8226762 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/publish-minimal-lib.spec.ts @@ -0,0 +1,22 @@ +import { uniq } from '@nx/plugin/testing'; +import { setup } from './utils'; + +describe('Minimal Project', () => { + it('should publish the lib', async () => { + const { processedLibs, tearDown, executeCommand } = await setup([ + { name: uniq('minimal-lib'), generator: 'minimal' }, + ]); + const [uniqLibName] = processedLibs; + + executeCommand( + `npx nx deploy ${uniqLibName.name} --tag="e2e" --registry=http://localhost:4873 --packageVersion=0.0.0` + ); + + expect(() => { + executeCommand(`npm view ${uniqLibName.npmPackageName}@0.0.0`); + executeCommand(`npm view ${uniqLibName.npmPackageName}@e2e`); + }).not.toThrow(); + + return tearDown(); + }, 120000); +}); diff --git a/packages/ngx-deploy-npm-e2e/src/publish.spec.ts b/packages/ngx-deploy-npm-e2e/src/publish.spec.ts new file mode 100644 index 00000000..aec41208 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/publish.spec.ts @@ -0,0 +1,36 @@ +import { uniq } from '@nx/plugin/testing'; +import { setup } from './utils'; + +describe('Publish', () => { + test.each([ + { + name: uniq('angular-lib'), + generator: '@nx/angular', + extraOptions: '--style css', + }, + { + name: uniq('node-lib'), + generator: '@nx/node', + }, + ])( + 'should publish with $generator lib', + async libConfig => { + const { executeCommand, tearDown, processedLibs } = await setup([ + libConfig, + ]); + const [lib] = processedLibs; + + executeCommand( + `npx nx deploy ${lib.name} --registry=http://localhost:4873 --tag="e2e" --packageVersion=0.0.0` + ); + + expect(() => { + executeCommand(`npm view ${lib.npmPackageName}@0.0.0`); + executeCommand(`npm view ${lib.npmPackageName}@e2e`); + }).not.toThrow(); + + return tearDown(); + }, + 120000 * 2 + ); +}); diff --git a/packages/ngx-deploy-npm-e2e/src/utils/basic-setup.ts b/packages/ngx-deploy-npm-e2e/src/utils/basic-setup.ts new file mode 100644 index 00000000..2e1f4043 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/utils/basic-setup.ts @@ -0,0 +1,218 @@ +import * as fs from 'fs'; +import { dirname, join } from 'path'; +import { execSync } from 'child_process'; + +import { ProjectConfiguration } from '@nx/devkit'; +import { readJson } from '@nx/plugin/testing'; + +import { currentNxVersion } from './get-nx-current-version'; +import { InstallGeneratorOptions } from 'bikecoders/ngx-deploy-npm'; +import { + generateLib, + initNgxDeployNPMProject, + installDependencies, + installNgxDeployNPMProject, +} from '.'; + +export const buildPackageProjectRoot = (libName: string) => + `packages/${libName}`; + +const executeCommandFactory = + (projectDirectory: string) => (command: string) => { + let output: string; + + try { + output = execSync(command, { + stdio: 'inherit', + cwd: projectDirectory, + encoding: 'utf-8', + env: process.env, + }); + } catch (error) { + console.error(`Error executing command: ${command}`); + if (error instanceof Error) { + if ('stderr' in error && error.stderr) { + console.error(`stderr: ${error.stderr}`); + } + if (error.message) { + console.error(`message: ${error.message}`); + } + } else { + console.error(`Unknown error: ${error}`); + } + throw error; + } + + return output; + }; + +export const setup = async ( + libs: { + name: string; + generator: 'minimal' | string; + installOptions?: Omit< + Partial, + 'distFolderPath' | 'project' + >; + skipInstall?: boolean; + extraOptions?: string; + distFolderPath?: string; + }[] +) => { + const projectDirectory = await createTestProject(); + const executeCommand = executeCommandFactory(projectDirectory); + + initNgxDeployNPMProject(executeCommand); + + // Install dependencies only once + const generators = new Set( + libs + .map(({ generator }) => generator) + .filter(generator => generator !== 'minimal') + ); + generators.forEach(dependency => { + installDependencies(executeCommand, dependency); + }); + + // Init libs + await Promise.all( + libs.map(async ({ name, generator, extraOptions = '' }) => { + if (generator === 'minimal') { + await createMinimalLib(projectDirectory, name); + } else { + generateLib({ + nxPlugin: generator, + executeCommand, + libName: name, + extraOptions: `--directory="${buildPackageProjectRoot( + name + )}" ${extraOptions}`, + }); + } + }) + ); + + // Install ngx-deploy-npm + libs + .filter(({ skipInstall }) => !!skipInstall === false) + .forEach(({ name, installOptions, generator }) => { + installNgxDeployNPMProject(executeCommand, { + project: name, + distFolderPath: + generator === 'minimal' + ? buildPackageProjectRoot(name) + : `dist/${buildPackageProjectRoot(name)}`, + access: installOptions?.access || 'public', + ...installOptions, + }); + }); + + const processedLibs: { + name: string; + workspace: ProjectConfiguration; + npmPackageName: string; + }[] = libs.map(({ name }) => ({ + name: name, + workspace: readJson( + `${projectDirectory}/${buildPackageProjectRoot(name)}/project.json` + ), + npmPackageName: readJson( + `${projectDirectory}/${buildPackageProjectRoot(name)}/package.json` + ).name, + })); + + return { + processedLibs, + projectDirectory, + tearDown: async () => { + await fs.promises.rm(projectDirectory, { + recursive: true, + force: true, + }); + + return Promise.resolve(); + }, + executeCommand, + }; +}; + +async function createMinimalLib(projectDirectory: string, libName: string) { + // Create Lib + const libRootAbsolutePath = join( + projectDirectory, + buildPackageProjectRoot(libName) + ); + const libRoot = buildPackageProjectRoot(libName); + + // Create the lib folder + await fs.promises.mkdir(libRootAbsolutePath, { + recursive: true, + }); + + const createProjectJsonPromise = fs.promises.writeFile( + join(libRootAbsolutePath, 'project.json'), + generateProjectJSON(libName, libRoot), + 'utf8' + ); + const createPackageJsonPromise = fs.promises.writeFile( + join(libRootAbsolutePath, 'package.json'), + generatePackageJSON(libName), + 'utf8' + ); + const createUniqueFilePromise = fs.promises.writeFile( + join(libRootAbsolutePath, 'hello-world.js'), + "console.log('Hello World!');", + 'utf8' + ); + await Promise.all([ + createProjectJsonPromise, + createPackageJsonPromise, + createUniqueFilePromise, + ]); + + return { libRoot }; + + function generateProjectJSON(projectName: string, libRoot: string): string { + const content = { + name: projectName, + $schema: '../../node_modules/nx/schemas/project-schema.json', + projectType: 'library', + sourceRoot: libRoot, + }; + + return JSON.stringify(content, null, 2); + } + + function generatePackageJSON(projectName: string): string { + const content = { + name: `@mock-domain/${projectName}`, + description: 'Minimal LIb', + version: '1.0.0', + }; + + return JSON.stringify(content, null, 2); + } +} + +/** + * Creates a test project with create-nx-workspace and installs the plugin + * @returns The directory where the test project was created + */ +async function createTestProject() { + const projectName = 'test-project'; + const projectDirectory = join(process.cwd(), 'tmp', projectName); + + // Ensure projectDirectory is empty + await fs.promises.rm(projectDirectory, { + recursive: true, + force: true, + }); + await fs.promises.mkdir(dirname(projectDirectory), { + recursive: true, + }); + + const command = `npx --yes create-nx-workspace@${currentNxVersion} ${projectName} --preset npm --nxCloud=skip --no-interactive`; + executeCommandFactory(dirname(projectDirectory))(command); + + return projectDirectory; +} diff --git a/e2e/ngx-deploy-npm-e2e/utils/generate-lib.ts b/packages/ngx-deploy-npm-e2e/src/utils/generate-lib.ts similarity index 66% rename from e2e/ngx-deploy-npm-e2e/utils/generate-lib.ts rename to packages/ngx-deploy-npm-e2e/src/utils/generate-lib.ts index 75f95844..46c7d2a8 100644 --- a/e2e/ngx-deploy-npm-e2e/utils/generate-lib.ts +++ b/packages/ngx-deploy-npm-e2e/src/utils/generate-lib.ts @@ -1,8 +1,7 @@ -import { runNxCommand } from '@nx/plugin/testing'; - type Options = { nxPlugin: string; libName: string; + executeCommand: (command: string) => void; extraOptions?: string; generator?: string; setPublishableOption?: boolean; @@ -11,6 +10,7 @@ type Options = { export function generateLib({ nxPlugin, libName, + executeCommand, extraOptions, generator = 'lib', setPublishableOption = true, @@ -18,7 +18,7 @@ export function generateLib({ const publishableOption = setPublishableOption ? '--publishable' : ''; const extraOptionsNormalized = extraOptions ? extraOptions : ''; - runNxCommand( - `generate ${nxPlugin}:${generator} --name ${libName} ${publishableOption} --importPath ${libName} ${extraOptionsNormalized}` + executeCommand( + `npx nx generate ${nxPlugin}:${generator} --name ${libName} ${publishableOption} --importPath ${libName} ${extraOptionsNormalized}` ); } diff --git a/packages/ngx-deploy-npm-e2e/src/utils/get-nx-current-version.ts b/packages/ngx-deploy-npm-e2e/src/utils/get-nx-current-version.ts new file mode 100644 index 00000000..c30571a5 --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/utils/get-nx-current-version.ts @@ -0,0 +1,4 @@ +import { readJson } from '@nx/plugin/testing'; + +export const currentNxVersion = readJson(`${process.cwd()}/package.json`) + .devDependencies['@nx/workspace']; diff --git a/e2e/ngx-deploy-npm-e2e/utils/index.ts b/packages/ngx-deploy-npm-e2e/src/utils/index.ts similarity index 100% rename from e2e/ngx-deploy-npm-e2e/utils/index.ts rename to packages/ngx-deploy-npm-e2e/src/utils/index.ts diff --git a/packages/ngx-deploy-npm-e2e/src/utils/install-deps.ts b/packages/ngx-deploy-npm-e2e/src/utils/install-deps.ts new file mode 100644 index 00000000..f662fccd --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/utils/install-deps.ts @@ -0,0 +1,11 @@ +import { currentNxVersion } from './get-nx-current-version'; + +export function installDependencies( + executeCommand: (command: string) => string, + nxPlugin: string +) { + const packageToInstall = `${nxPlugin}@${currentNxVersion}`; + + executeCommand(`npm add -D ${packageToInstall}`); + executeCommand(`npx nx g ${nxPlugin}:init`); +} diff --git a/packages/ngx-deploy-npm-e2e/src/utils/utils-ngx-deploy-npm.ts b/packages/ngx-deploy-npm-e2e/src/utils/utils-ngx-deploy-npm.ts new file mode 100644 index 00000000..1ec791aa --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/src/utils/utils-ngx-deploy-npm.ts @@ -0,0 +1,25 @@ +import { InstallGeneratorOptions } from 'bikecoders/ngx-deploy-npm'; + +export function initNgxDeployNPMProject( + executeCommand: (command: string) => void +) { + executeCommand(`npm install ngx-deploy-npm@e2e`); +} + +export function installNgxDeployNPMProject( + executeCommand: (command: string) => void, + options: InstallGeneratorOptions +) { + const optionGenerator = ( + optionaName: keyof InstallGeneratorOptions, + value?: T + ) => (value ? `--${optionaName}="${value}"` : ''); + + const optionsParsed = Object.entries(options ?? {}) + .map(([key, value]) => + optionGenerator(key as keyof InstallGeneratorOptions, value) + ) + .join(' '); + + executeCommand(`npx nx generate ngx-deploy-npm:install ${optionsParsed}`); +} diff --git a/e2e/ngx-deploy-npm-e2e/tsconfig.json b/packages/ngx-deploy-npm-e2e/tsconfig.json similarity index 100% rename from e2e/ngx-deploy-npm-e2e/tsconfig.json rename to packages/ngx-deploy-npm-e2e/tsconfig.json diff --git a/packages/ngx-deploy-npm-e2e/tsconfig.spec.json b/packages/ngx-deploy-npm-e2e/tsconfig.spec.json new file mode 100644 index 00000000..a1a7469f --- /dev/null +++ b/packages/ngx-deploy-npm-e2e/tsconfig.spec.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts", + "../../tools/scripts/scripts.d.ts" + ] +} diff --git a/packages/ngx-deploy-npm/src/index.ts b/packages/ngx-deploy-npm/src/index.ts index e69de29b..5e1fcbc0 100644 --- a/packages/ngx-deploy-npm/src/index.ts +++ b/packages/ngx-deploy-npm/src/index.ts @@ -0,0 +1,3 @@ +export type { InstallGeneratorOptions } from './generators/install/schema'; +export type { DeployExecutorOptions } from './executors/deploy/schema'; +export { npmAccess } from './core/npm-access.enum'; diff --git a/packages/ngx-deploy-npm/tsconfig.lib.json b/packages/ngx-deploy-npm/tsconfig.lib.json index 4fd8d311..b54fb0f4 100644 --- a/packages/ngx-deploy-npm/tsconfig.lib.json +++ b/packages/ngx-deploy-npm/tsconfig.lib.json @@ -6,6 +6,6 @@ "declaration": true, "types": ["node"] }, - "exclude": ["**/*.spec.ts", "**/__mocks__/*"], - "include": ["**/*.ts"] + "include": ["**/*.ts"], + "exclude": ["**/*.spec.ts", "**/__mocks__/*"] } diff --git a/sonar-project.properties b/sonar-project.properties index 98016ecb..0600b3a1 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -14,10 +14,11 @@ sonar.exclusions=**/node_modules/** sonar.test.inclusions=**/*.spec.ts,**/__mocks__/** # ------- ngx-deploy-npm e2e ------- -ngx-deploy-npm-e2e.sonar.projectBaseDir=e2e/ngx-deploy-npm-e2e -ngx-deploy-npm-e2e.sonar.tests=./ +ngx-deploy-npm-e2e.sonar.projectBaseDir=packages/ngx-deploy-npm-e2e +ngx-deploy-npm-e2e.sonar.tests=src +ngx-deploy-npm.sonar.typescript.tsconfigPath=tsconfig.spec.json # The coverage report -# ngx-deploy-npm-e2e.sonar.typescript.lcov.reportPaths=../../../../coverage/apps/demo/lcov.info +# ngx-deploy-npm-e2e.sonar.javascript.lcov.reportPaths=/github/workspace/coverage/packages/ngx-deploy-npm-e2e/lcov.info # ------- ngx-deploy-npm e2e off ------- # ------- ngx-deploy-npm ------- diff --git a/tools/scripts/scripts.d.ts b/tools/scripts/scripts.d.ts new file mode 100644 index 00000000..a1826589 --- /dev/null +++ b/tools/scripts/scripts.d.ts @@ -0,0 +1,5 @@ +declare global { + function stopLocalRegistry(): void; +} + +export {}; diff --git a/tools/scripts/start-local-registry.ts b/tools/scripts/start-local-registry.ts new file mode 100644 index 00000000..f55ff530 --- /dev/null +++ b/tools/scripts/start-local-registry.ts @@ -0,0 +1,23 @@ +/** + * This script starts a local registry for e2e testing purposes. + * It is meant to be called in jest's globalSetup. + */ +import { startLocalRegistry } from '@nx/js/plugins/jest/local-registry'; +import { execSync } from 'child_process'; + +export default async () => { + // local registry target to run + const localRegistryTarget = 'bikecoders:local-registry'; + // storage folder for the local registry + const storage = './tmp/local-registry/storage'; + + globalThis.stopLocalRegistry = await startLocalRegistry({ + localRegistryTarget, + storage, + verbose: false, + }); + + execSync( + 'npx nx deploy ngx-deploy-npm --registry=http://localhost:4873 --packageVersion=0.0.0 --tag e2e' + ); +}; diff --git a/tools/scripts/stop-local-registry.ts b/tools/scripts/stop-local-registry.ts new file mode 100644 index 00000000..bcc10461 --- /dev/null +++ b/tools/scripts/stop-local-registry.ts @@ -0,0 +1,10 @@ +/** + * This script stops the local registry for e2e testing purposes. + * It is meant to be called in jest's globalTeardown. + */ + +export default () => { + if (globalThis.stopLocalRegistry) { + globalThis.stopLocalRegistry(); + } +}; diff --git a/tools/tsconfig.tools.json b/tools/tsconfig.tools.json deleted file mode 100644 index 99428e14..00000000 --- a/tools/tsconfig.tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": "../dist/out-tsc/tools", - "rootDir": ".", - "module": "commonjs", - "target": "es5", - "types": ["node"], - "importHelpers": false - }, - "include": ["**/*.ts"] -} diff --git a/tsconfig.base.json b/tsconfig.base.json index eb43662d..ff0c1d3a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -17,7 +17,8 @@ "paths": { "bikecoders/ngx-deploy-npm": ["packages/ngx-deploy-npm/src/index.ts"] }, - "strict": true + "strict": true, + "verbatimModuleSyntax": false }, "exclude": ["node_modules", "tmp"] }