From 5ef0863a2e984d47e077ada300e87d8d3adbfabf Mon Sep 17 00:00:00 2001
From: Tim Deschryver <28659384+timdeschryver@users.noreply.github.com>
Date: Sat, 21 Dec 2024 18:58:26 +0100
Subject: [PATCH 1/7] docs: add Angular 19 to Version compatibility table
(#509)
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index c98936d..5ecd39e 100644
--- a/README.md
+++ b/README.md
@@ -179,6 +179,7 @@ You may also be interested in installing `jest-dom` so you can use
| Angular | Angular Testing Library |
| ------- | ---------------------------- |
+| 19.x | 17.x, 16.x, 15.x, 14.x, 13.x |
| 18.x | 17.x, 16.x, 15.x, 14.x, 13.x |
| 17.x | 17.x, 16.x, 15.x, 14.x, 13.x |
| 16.x | 14.x, 13.x |
From 33af2876d3dca98e52b6633b70cf088f7354071a Mon Sep 17 00:00:00 2001
From: Tim Deschryver <28659384+timdeschryver@users.noreply.github.com>
Date: Fri, 3 Jan 2025 20:20:39 +0100
Subject: [PATCH 2/7] chore: update deps (#510)
---
.devcontainer/devcontainer.json | 2 +-
.github/workflows/ci.yml | 2 +-
.node-version | 2 +-
package.json | 34 ++++++++++++++++-----------------
4 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index db976dc..72780fc 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,7 +1,7 @@
// For format details, see https://aka.ms/devcontainer.json.
{
"name": "angular-testing-library",
- "image": "mcr.microsoft.com/devcontainers/typescript-node:0-20-bullseye",
+ "image": "mcr.microsoft.com/devcontainers/typescript-node:0-22-bullseye",
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5820814..9955c0d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -22,7 +22,7 @@ jobs:
strategy:
matrix:
- node-version: ${{ fromJSON((github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta') && '[20]' || '[18, 20]') }}
+ node-version: ${{ fromJSON((github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta') && '[22]' || '[18, 20, 22]') }}
os: ${{ fromJSON((github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta') && '["ubuntu-latest"]' || '["ubuntu-latest", "windows-latest"]') }}
runs-on: ${{ matrix.os }}
diff --git a/.node-version b/.node-version
index 914d1a7..8fdd954 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-20.9
\ No newline at end of file
+22
\ No newline at end of file
diff --git a/package.json b/package.json
index 0f8aad8..16ac142 100644
--- a/package.json
+++ b/package.json
@@ -36,8 +36,8 @@
"@angular/platform-browser": "19.0.1",
"@angular/platform-browser-dynamic": "19.0.1",
"@angular/router": "19.0.1",
- "@ngrx/store": "19.0.0-beta.0",
- "@nx/angular": "20.1.3",
+ "@ngrx/store": "19.0.0",
+ "@nx/angular": "20.3.0",
"@testing-library/dom": "^10.4.0",
"rxjs": "7.8.0",
"tslib": "~2.3.1",
@@ -47,21 +47,21 @@
"@angular-devkit/build-angular": "19.0.1",
"@angular-devkit/core": "19.0.1",
"@angular-devkit/schematics": "19.0.1",
- "@angular-eslint/builder": "18.3.0",
- "@angular-eslint/eslint-plugin": "18.0.1",
- "@angular-eslint/eslint-plugin-template": "18.0.1",
- "@angular-eslint/schematics": "18.3.0",
- "@angular-eslint/template-parser": "18.0.1",
- "@angular/cli": "19.0.1",
+ "@angular-eslint/builder": "19.0.2",
+ "@angular-eslint/eslint-plugin": "19.0.2",
+ "@angular-eslint/eslint-plugin-template": "19.0.2",
+ "@angular-eslint/schematics": "19.0.2",
+ "@angular-eslint/template-parser": "19.0.2",
+ "@angular/cli": "~19.0.0",
"@angular/compiler-cli": "19.0.1",
"@angular/forms": "19.0.1",
"@angular/language-service": "19.0.1",
- "@nx/eslint": "20.1.3",
- "@nx/eslint-plugin": "20.1.3",
- "@nx/jest": "20.1.3",
- "@nx/node": "20.1.3",
- "@nx/plugin": "20.1.3",
- "@nx/workspace": "20.1.3",
+ "@nx/eslint": "20.3.0",
+ "@nx/eslint-plugin": "20.3.0",
+ "@nx/jest": "20.3.0",
+ "@nx/node": "20.3.0",
+ "@nx/plugin": "20.3.0",
+ "@nx/workspace": "20.3.0",
"@schematics/angular": "18.2.9",
"@testing-library/jasmine-dom": "^1.2.0",
"@testing-library/jest-dom": "^5.16.5",
@@ -86,16 +86,16 @@
"jasmine-spec-reporter": "7.0.0",
"jest": "29.7.0",
"jest-environment-jsdom": "29.7.0",
- "jest-preset-angular": "14.4.1",
+ "jest-preset-angular": "14.4.2",
"karma": "6.4.0",
"karma-chrome-launcher": "^3.1.0",
"karma-coverage": "^2.2.1",
"karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "2.0.0",
"lint-staged": "^12.1.6",
- "ng-mocks": "^14.11.0",
+ "ng-mocks": "^14.13.1",
"ng-packagr": "19.0.1",
- "nx": "20.1.3",
+ "nx": "20.3.0",
"postcss": "^8.4.5",
"postcss-import": "14.1.0",
"postcss-preset-env": "7.5.0",
From e0cd81e6a881dafe92cad10d19ecef26be977f88 Mon Sep 17 00:00:00 2001
From: Tim Deschryver <28659384+timdeschryver@users.noreply.github.com>
Date: Sat, 4 Jan 2025 13:51:48 +0100
Subject: [PATCH 3/7] chore: migrate to eslint flat config
---
.eslintignore | 1 -
.eslintrc.json | 127 ------------------
.github/workflows/ci.yml | 2 +
README.md | 2 +-
apps/example-app-karma/.eslintrc.json | 44 ------
apps/example-app-karma/eslint.config.cjs | 7 +
apps/example-app-karma/eslint.config.mjs | 8 ++
apps/example-app-karma/jasmine-dom.d.ts | 1 -
.../src/app/examples/login-form.spec.ts | 4 +-
.../src/app/issues/rerender.spec.ts | 4 +-
apps/example-app/.eslintrc.json | 47 -------
apps/example-app/eslint.config.cjs | 7 +
apps/example-app/eslint.config.mjs | 8 ++
apps/example-app/jest.config.ts | 1 -
.../src/app/examples/00-single-component.ts | 2 +-
.../src/app/examples/01-nested-component.ts | 12 +-
.../src/app/examples/02-input-output.spec.ts | 4 +-
.../src/app/examples/02-input-output.ts | 2 +-
apps/example-app/src/app/examples/03-forms.ts | 2 +-
.../app/examples/04-forms-with-material.ts | 2 +-
.../src/app/examples/05-component-provider.ts | 2 +-
.../src/app/examples/06-with-ngrx-store.ts | 2 +-
.../app/examples/07-with-ngrx-mock-store.ts | 6 +-
.../src/app/examples/08-directive.spec.ts | 8 +-
.../src/app/examples/08-directive.ts | 2 +-
.../example-app/src/app/examples/09-router.ts | 6 +-
.../examples/10-inject-token-dependency.ts | 2 +-
.../src/app/examples/11-ng-content.spec.ts | 2 +-
.../src/app/examples/11-ng-content.ts | 2 +-
.../src/app/examples/12-service-component.ts | 2 +-
.../app/examples/13-scrolling.component.ts | 2 +-
.../app/examples/14-async-component.spec.ts | 1 -
.../src/app/examples/14-async-component.ts | 2 +-
.../app/examples/15-dialog.component.spec.ts | 2 +-
.../src/app/examples/15-dialog.component.ts | 4 +-
.../app/examples/16-input-getter-setter.ts | 2 +-
...-component-with-attribute-selector.spec.ts | 2 +-
.../17-component-with-attribute-selector.ts | 2 +-
.../app/examples/19-standalone-component.ts | 6 +-
.../src/app/examples/20-test-harness.spec.ts | 4 +-
.../src/app/examples/20-test-harness.ts | 2 +-
.../examples/21-deferable-view.component.ts | 4 +-
.../22-signal-inputs.component.spec.ts | 2 +-
.../examples/22-signal-inputs.component.ts | 6 +-
apps/example-app/src/test-setup.ts | 4 +-
eslint.config.cjs | 7 +
eslint.config.mjs | 66 +++++++++
nx.json | 4 +-
package.json | 48 ++++---
projects/testing-library/.eslintrc.json | 62 ---------
projects/testing-library/eslint.config.cjs | 7 +
projects/testing-library/eslint.config.mjs | 8 ++
projects/testing-library/jest.config.ts | 1 -
.../dtl-as-dev-dependency/index.spec.ts | 2 -
.../schematics/ng-add/schema.ts | 1 -
projects/testing-library/src/lib/models.ts | 4 +-
.../src/lib/testing-library.ts | 2 +-
projects/testing-library/test-setup.ts | 1 -
projects/testing-library/tests/debug.spec.ts | 8 +-
.../tests/issues/issue-280.spec.ts | 4 +-
.../tests/issues/issue-389.spec.ts | 1 -
.../issue-396-standalone-stub-child.spec.ts | 1 -
...ssue-398-component-without-host-id.spec.ts | 2 -
.../issue-422-view-already-destroyed.spec.ts | 1 +
.../tests/issues/issue-437.spec.ts | 2 -
.../tests/issues/issue-493.spec.ts | 2 +-
projects/testing-library/tests/render.spec.ts | 19 ++-
67 files changed, 222 insertions(+), 397 deletions(-)
delete mode 100644 .eslintignore
delete mode 100644 .eslintrc.json
delete mode 100644 apps/example-app-karma/.eslintrc.json
create mode 100644 apps/example-app-karma/eslint.config.cjs
create mode 100644 apps/example-app-karma/eslint.config.mjs
delete mode 100644 apps/example-app/.eslintrc.json
create mode 100644 apps/example-app/eslint.config.cjs
create mode 100644 apps/example-app/eslint.config.mjs
create mode 100644 eslint.config.cjs
create mode 100644 eslint.config.mjs
delete mode 100644 projects/testing-library/.eslintrc.json
create mode 100644 projects/testing-library/eslint.config.cjs
create mode 100644 projects/testing-library/eslint.config.mjs
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 3c3629e..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 0a96094..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
- "root": true,
- "ignorePatterns": ["**/*"],
- "plugins": ["@nx", "testing-library"],
- "overrides": [
- {
- "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
- "rules": {
- "@nx/enforce-module-boundaries": [
- "error",
- {
- "enforceBuildableLibDependency": true,
- "allow": [],
- "depConstraints": [
- {
- "sourceTag": "*",
- "onlyDependOnLibsWithTags": ["*"]
- }
- ]
- }
- ]
- }
- },
- {
- "files": ["*.ts", "*.tsx"],
- "extends": ["plugin:@nx/typescript"],
- "rules": {
- "@typescript-eslint/no-extra-semi": "error",
- "no-extra-semi": "off"
- }
- },
- {
- "files": ["*.js", "*.jsx"],
- "extends": ["plugin:@nx/javascript"],
- "rules": {
- "@typescript-eslint/no-extra-semi": "error",
- "no-extra-semi": "off"
- }
- },
- {
- "files": ["*.ts"],
- "plugins": ["eslint-plugin-import", "@angular-eslint/eslint-plugin", "@typescript-eslint"],
- "rules": {
- "@typescript-eslint/consistent-type-definitions": "error",
- "@typescript-eslint/dot-notation": "off",
- "@typescript-eslint/naming-convention": "error",
- "@typescript-eslint/no-shadow": [
- "error",
- {
- "hoist": "all"
- }
- ],
- "@typescript-eslint/no-unused-expressions": "error",
- "@typescript-eslint/prefer-function-type": "error",
- "@typescript-eslint/quotes": "off",
- "@typescript-eslint/type-annotation-spacing": "error",
- "@typescript-eslint/no-explicit-any": "off",
- "arrow-body-style": "off",
- "brace-style": ["error", "1tbs"],
- "curly": "error",
- "eol-last": "error",
- "eqeqeq": ["error", "smart"],
- "guard-for-in": "error",
- "id-blacklist": "off",
- "id-match": "off",
- "import/no-deprecated": "warn",
- "no-bitwise": "error",
- "no-caller": "error",
- "no-console": [
- "error",
- {
- "allow": [
- "log",
- "warn",
- "dir",
- "timeLog",
- "assert",
- "clear",
- "count",
- "countReset",
- "group",
- "groupEnd",
- "table",
- "dirxml",
- "error",
- "groupCollapsed",
- "Console",
- "profile",
- "profileEnd",
- "timeStamp",
- "context"
- ]
- }
- ],
- "no-empty": "off",
- "no-eval": "error",
- "no-new-wrappers": "error",
- "no-throw-literal": "error",
- "no-undef-init": "error",
- "no-underscore-dangle": "off",
- "radix": "error",
- "spaced-comment": [
- "error",
- "always",
- {
- "markers": ["/"]
- }
- ]
- }
- },
- {
- "files": ["*.html"],
- "rules": {}
- },
- {
- "files": ["*.ts", "*.js"],
- "extends": ["prettier"]
- },
- {
- "files": ["*.spec.ts"],
- "extends": ["plugin:testing-library/angular"],
- "rules": {
- "testing-library/prefer-explicit-assert": "error"
- }
- }
- ]
-}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9955c0d..215ef7d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,6 +38,8 @@ jobs:
run: npm run build -- --skip-nx-cache
- name: test
run: npm run test
+ - name: lint
+ run: npm run lint
- name: Release
if: github.repository == 'testing-library/angular-testing-library' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta')
run: npx semantic-release
diff --git a/README.md b/README.md
index 5ecd39e..e03ce68 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,7 @@ counter.component.ts
```ts
@Component({
- selector: 'app-counter',
+ selector: 'atl-counter',
template: `
{{ hello() }}
diff --git a/apps/example-app-karma/.eslintrc.json b/apps/example-app-karma/.eslintrc.json
deleted file mode 100644
index 404aa66..0000000
--- a/apps/example-app-karma/.eslintrc.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "extends": "../../.eslintrc.json",
- "ignorePatterns": ["!**/*"],
- "overrides": [
- {
- "files": ["*.ts"],
- "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
- "parserOptions": {
- "project": ["apps/example-app-karma/tsconfig.*?.json"]
- },
- "rules": {
- "@angular-eslint/directive-selector": [
- "error",
- {
- "type": "attribute",
- "prefix": "app",
- "style": "camelCase"
- }
- ],
- "@angular-eslint/component-selector": [
- "error",
- {
- "type": "element",
- "prefix": "app",
- "style": "kebab-case"
- }
- ]
- }
- },
- {
- "files": ["*.spec.ts"],
- "env": {
- "jasmine": true
- },
- "plugins": ["jasmine"],
- "extends": ["plugin:jasmine/recommended"]
- },
- {
- "files": ["*.html"],
- "extends": ["plugin:@nx/angular-template"],
- "rules": {}
- }
- ]
-}
diff --git a/apps/example-app-karma/eslint.config.cjs b/apps/example-app-karma/eslint.config.cjs
new file mode 100644
index 0000000..9e951e7
--- /dev/null
+++ b/apps/example-app-karma/eslint.config.cjs
@@ -0,0 +1,7 @@
+// @ts-check
+
+// TODO - https://github.com/nrwl/nx/issues/22576
+
+/** @type {import('@typescript-eslint/utils/ts-eslint').FlatConfig.ConfigPromise} */
+const config = (async () => (await import('./eslint.config.mjs')).default)();
+module.exports = config;
diff --git a/apps/example-app-karma/eslint.config.mjs b/apps/example-app-karma/eslint.config.mjs
new file mode 100644
index 0000000..8f627db
--- /dev/null
+++ b/apps/example-app-karma/eslint.config.mjs
@@ -0,0 +1,8 @@
+// @ts-check
+
+import tseslint from "typescript-eslint";
+import rootConfig from "../../eslint.config.mjs";
+
+export default tseslint.config(
+ ...rootConfig,
+);
diff --git a/apps/example-app-karma/jasmine-dom.d.ts b/apps/example-app-karma/jasmine-dom.d.ts
index f8fa4a7..54d7903 100644
--- a/apps/example-app-karma/jasmine-dom.d.ts
+++ b/apps/example-app-karma/jasmine-dom.d.ts
@@ -1,5 +1,4 @@
declare module '@testing-library/jasmine-dom' {
- // eslint-disable-next-line @typescript-eslint/naming-convention
const JasmineDOM: any;
export default JasmineDOM;
}
diff --git a/apps/example-app-karma/src/app/examples/login-form.spec.ts b/apps/example-app-karma/src/app/examples/login-form.spec.ts
index 9c51065..a028234 100644
--- a/apps/example-app-karma/src/app/examples/login-form.spec.ts
+++ b/apps/example-app-karma/src/app/examples/login-form.spec.ts
@@ -29,7 +29,7 @@ it('should display invalid message and submit button must be disabled', async ()
});
@Component({
- selector: 'app-login',
+ selector: 'atl-login',
standalone: true,
imports: [ReactiveFormsModule, NgIf],
template: `
@@ -51,7 +51,7 @@ class LoginComponent {
});
constructor(private fb: FormBuilder) {}
-
+
get email(): FormControl {
return this.form.get('email') as FormControl;
}
diff --git a/apps/example-app-karma/src/app/issues/rerender.spec.ts b/apps/example-app-karma/src/app/issues/rerender.spec.ts
index 9b044d1..324e8a1 100644
--- a/apps/example-app-karma/src/app/issues/rerender.spec.ts
+++ b/apps/example-app-karma/src/app/issues/rerender.spec.ts
@@ -7,9 +7,9 @@ it('can rerender component', async () => {
},
});
- expect(screen.getByText('Hello Sarah')).toBeTruthy();
+ expect(screen.getByText('Hello Sarah')).toBeInTheDocument();
await rerender({ componentProperties: { name: 'Mark' } });
- expect(screen.getByText('Hello Mark')).toBeTruthy();
+ expect(screen.getByText('Hello Mark')).toBeInTheDocument();
});
diff --git a/apps/example-app/.eslintrc.json b/apps/example-app/.eslintrc.json
deleted file mode 100644
index ed5e4d1..0000000
--- a/apps/example-app/.eslintrc.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "extends": "../../.eslintrc.json",
- "ignorePatterns": ["!**/*"],
- "overrides": [
- {
- "files": ["*.ts"],
- "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
- "parserOptions": {
- "project": ["apps/example-app/tsconfig.*?.json"]
- },
- "rules": {
- "@angular-eslint/directive-selector": [
- "error",
- {
- "type": "attribute",
- "prefix": "app",
- "style": "camelCase"
- }
- ],
- "@angular-eslint/component-selector": [
- "error",
- {
- "type": "element",
- "prefix": "app",
- "style": "kebab-case"
- }
- ]
- }
- },
- {
- "files": ["*.spec.ts"],
- "env": {
- "jest": true
- },
- "extends": ["plugin:jest/recommended", "plugin:jest/style", "plugin:jest-dom/recommended"],
- "rules": {
- "jest/consistent-test-it": ["error"],
- "jest/expect-expect": "off"
- }
- },
- {
- "files": ["*.html"],
- "extends": ["plugin:@nx/angular-template"],
- "rules": {}
- }
- ]
-}
diff --git a/apps/example-app/eslint.config.cjs b/apps/example-app/eslint.config.cjs
new file mode 100644
index 0000000..9e951e7
--- /dev/null
+++ b/apps/example-app/eslint.config.cjs
@@ -0,0 +1,7 @@
+// @ts-check
+
+// TODO - https://github.com/nrwl/nx/issues/22576
+
+/** @type {import('@typescript-eslint/utils/ts-eslint').FlatConfig.ConfigPromise} */
+const config = (async () => (await import('./eslint.config.mjs')).default)();
+module.exports = config;
diff --git a/apps/example-app/eslint.config.mjs b/apps/example-app/eslint.config.mjs
new file mode 100644
index 0000000..0162584
--- /dev/null
+++ b/apps/example-app/eslint.config.mjs
@@ -0,0 +1,8 @@
+// @ts-check
+
+import tseslint from "typescript-eslint";
+import rootConfig from "../../eslint.config.mjs";
+
+export default tseslint.config(
+ ...rootConfig,
+);
\ No newline at end of file
diff --git a/apps/example-app/jest.config.ts b/apps/example-app/jest.config.ts
index 4b0c248..e0ea9c2 100644
--- a/apps/example-app/jest.config.ts
+++ b/apps/example-app/jest.config.ts
@@ -1,4 +1,3 @@
-/* eslint-disable */
export default {
displayName: {
name: 'Example App',
diff --git a/apps/example-app/src/app/examples/00-single-component.ts b/apps/example-app/src/app/examples/00-single-component.ts
index 7c132c2..4a09239 100644
--- a/apps/example-app/src/app/examples/00-single-component.ts
+++ b/apps/example-app/src/app/examples/00-single-component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
@Component({
- selector: 'app-fixture',
+ selector: 'atl-fixture',
standalone: true,
template: `
diff --git a/apps/example-app/src/app/examples/01-nested-component.ts b/apps/example-app/src/app/examples/01-nested-component.ts
index 645ce96..fd0d0c0 100644
--- a/apps/example-app/src/app/examples/01-nested-component.ts
+++ b/apps/example-app/src/app/examples/01-nested-component.ts
@@ -2,7 +2,7 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
standalone: true,
- selector: 'app-button',
+ selector: 'atl-button',
template: ' ',
})
export class NestedButtonComponent {
@@ -12,7 +12,7 @@ export class NestedButtonComponent {
@Component({
standalone: true,
- selector: 'app-value',
+ selector: 'atl-value',
template: ' {{ value }} ',
})
export class NestedValueComponent {
@@ -21,11 +21,11 @@ export class NestedValueComponent {
@Component({
standalone: true,
- selector: 'app-fixture',
+ selector: 'atl-fixture',
template: `
-