diff --git a/.github/actions/prepare-install/action.yml b/.github/actions/prepare-install/action.yml
index b437dce91363..c5976f9a0966 100644
--- a/.github/actions/prepare-install/action.yml
+++ b/.github/actions/prepare-install/action.yml
@@ -55,6 +55,6 @@ runs:
shell: bash
working-directory: ${{ inputs.working-directory }}
run: |
- yarn --ignore-engines --frozen-lockfile --ignore-scripts
+ yarn --ignore-engines --ignore-scripts
yarn check-clean-workspace-after-install
yarn patch-package
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3e62a6055620..ef01b05a00b4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -56,88 +56,36 @@ jobs:
- name: Build
uses: ./.github/actions/prepare-build
- lint_without_build:
- name: Lint
- needs: [install]
- runs-on: ubuntu-latest
- strategy:
- matrix:
- lint-task: ['check-spelling', 'check-format', 'lint-markdown']
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
-
- - name: Run Check
- run: yarn ${{ matrix.lint-task }}
-
- lint_with_build:
- name: Lint
- # because we lint with our own tooling, we need to build
- needs: [build]
- runs-on: ubuntu-latest
- strategy:
- matrix:
- lint-task: ['lint', 'typecheck']
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
- - name: Build
- uses: ./.github/actions/prepare-build
-
- - name: Run Check
- run: yarn ${{ matrix.lint-task }}
-
- integration_tests:
- name: Run integration tests on primary Node.js version
- needs: [build]
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
- - name: Build
- uses: ./.github/actions/prepare-build
-
- - name: Run integrations tests
- run: yarn test-integration
- env:
- CI: true
-
unit_tests:
- name: Run Unit Tests
+ name: Run Specific Unit Tests
needs: [build]
runs-on: ubuntu-latest
strategy:
+ fail-fast: false
matrix:
- # just run on the oldest and latest supported versions and assume the intermediate versions are good
- node-version: [14, 18]
- package:
+ commit:
[
- 'ast-spec',
- 'eslint-plugin',
- 'eslint-plugin-internal',
- 'eslint-plugin-tslint',
- 'parser',
- 'scope-manager',
- 'type-utils',
- 'typescript-estree',
- 'utils',
- 'visitor-keys',
+ 'HEAD',
+ '0e34f187c82ec725aa7dd5588c249ca3c32d999c',
+ '6dbec02a88156121c24a152d1e8e5e82d52fdc1d',
+ '43cc362cef72e5fa1372f59736a9c4b55d85def0',
+ '4b6fb95f040c5c81743e19a56df8fa99bf3d139f',
+ '7bee9c55b1b90a7711c8a635dfc6de102ab069fe',
+ '1da6d87a053746901a7eca6395a4bd15190b13c4',
+ '8b87de17503b15b08be40adcf3255d5d67aa2427',
+ '4c7e3279810318b389aa2af843ee1df897efd479',
+ '958487bedac2f9990387ca0f65f977a7f7c18297',
+ '211a60dc7931326eaaa02d3b7e2c1c20b1e6dfa3',
+ 'fc756ebc17295c3cb5eed18cde87835641099440',
+ 'dcc766f2b25796bea41e7118830326e8639eb7c8',
+ '941b30c975e6a58fbe535bbe9319412942b028f5',
+ 'e2283e99b47942b863d016c65a3e430dca1549b9',
+ '835fff8106e0cdf2e53028cd0e2c9759b426ebb4',
]
+ package: ['typescript-estree']
env:
# Added the - at the end to function as a separator to improve readability in the PR comment from the Nx cloud app
- NX_CLOUD_ENV_NAME: 'Node ${{ matrix.node-version }} -'
+ NX_CLOUD_ENV_NAME: 'Node 18 Testing -'
COLLECT_COVERAGE: false
steps:
- name: Checkout
@@ -147,148 +95,16 @@ jobs:
- name: Install
uses: ./.github/actions/prepare-install
with:
- node-version: ${{ matrix.node-version }}
+ node-version: 18
- name: Build
uses: ./.github/actions/prepare-build
-
- # collect coverage on the primary node version
- # we don't collect coverage on other node versions so they run faster
- # note that we don't do this as a single `run` with a flag because some
- # packages don't collect coverage on purpose, so forcing `--coverage=true`
- # would override the config
- - name: Run unit tests with coverage for ${{ matrix.package }}
- if: env.PRIMARY_NODE_VERSION == matrix.node-version
- run: npx nx test ${{ matrix.package }}
+ - name: Use Local TypeScript Version
+ run: |
+ node ./use-local-typescript-version.mjs ${{ matrix.commit }}
+ cat typescript-local/package.json
+ node typescript-local/lib/tsc.js --version
+ - name: Run unit tests for Node 18
+ if: always()
+ run: npx nx test ${{ matrix.package }} --coverage=false default-program-success.test.ts
env:
CI: true
- - name: Run unit tests for ${{ matrix.package }}
- if: env.PRIMARY_NODE_VERSION != matrix.node-version
- run: npx nx test ${{ matrix.package }} --coverage=false
- env:
- CI: true
-
- - name: Store coverage for uploading
- if: env.PRIMARY_NODE_VERSION == matrix.node-version
- uses: actions/upload-artifact@v3
- with:
- name: ${{ matrix.package }}-coverage
- path: packages/${{ matrix.package }}/coverage/lcov.info
- # Sadly 1 day is the minimum
- retention-days: 1
-
- website_tests:
- permissions:
- contents: read # to fetch code (actions/checkout)
-
- name: Website tests
- # We technically do not need to wait for build within the pipeline any more because the build we care about is happening within Netlify, however,
- # it is highly likely that if the CI one fails, the Netlify one will as well, so in order to not waste unncessary Github Actions minutes/resources,
- # we do still keep this requirement here.
- needs: [build]
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- with:
- fetch-depth: 2
-
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
-
- - name: Install Playwright Browsers
- run: npx playwright install --with-deps
-
- - name: Wait for Netlify deployment
- uses: ./.github/actions/wait-for-netlify
- id: waitForDeployment
- with:
- netlify_token: ${{ secrets.NETLIFY_TOKEN }}
-
- - name: Run Playwright tests against the Netlify deployment
- run: yarn playwright test --reporter=list
- working-directory: packages/website
- env:
- PLAYWRIGHT_TEST_BASE_URL: ${{ steps.waitForDeployment.outputs.url }}
-
- - if: always()
- uses: actions/upload-artifact@v3
- with:
- name: playwright-report
- path: packages/website/playwright-report
-
- upload_coverage:
- name: Upload Codecov Coverage
- needs: [unit_tests]
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Download coverage reports
- uses: actions/download-artifact@v3
- with:
- path: coverage
-
- - name: Publish code coverage report
- uses: codecov/codecov-action@v3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- files: coverage/**/lcov.info
- flags: unittest
- name: codecov
-
- publish_canary_version:
- name: Publish the latest code as a canary version
- runs-on: ubuntu-latest
- permissions:
- id-token: write
- needs: [integration_tests, lint_with_build, lint_without_build, unit_tests]
- if: github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main'
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
- registry-url: 'https://registry.npmjs.org'
- - name: Build
- uses: ./.github/actions/prepare-build
-
- # Fetch all history for all tags and branches in this job because lerna needs it
- - run: |
- git fetch --prune --unshallow
-
- - name: Publish all packages to npm
- run: npx lerna publish --loglevel=verbose --canary --exact --force-publish --yes
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- publish_canary_version_v6:
- name: Publish the next major version code as a canary version
- runs-on: ubuntu-latest
- permissions:
- id-token: write
- needs: [integration_tests, lint_with_build, lint_without_build, unit_tests]
- if: github.ref == 'refs/heads/v6'
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install
- uses: ./.github/actions/prepare-install
- with:
- node-version: ${{ env.PRIMARY_NODE_VERSION }}
- registry-url: 'https://registry.npmjs.org'
- - name: Build
- uses: ./.github/actions/prepare-build
-
- # Fetch all history for all tags and branches in this job because lerna needs it
- - run: |
- git fetch --prune --unshallow
-
- - name: Publish all packages to npm
- run: npx lerna publish premajor --loglevel=verbose --canary --exact --force-publish --yes --dist-tag rc-v6
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.prettierignore b/.prettierignore
index 548792bb901b..e75691bd4a2c 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -17,6 +17,10 @@ packages/ast-spec/src/element/AccessorProperty/fixtures
# prettier doesn't yet support `const` modifiers for type parameters
packages/ast-spec/src/special/TSTypeParameter/fixtures
+# prettier doesn't yet support JSX namespaced attributes
+packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/fixture.tsx
+packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx
+
# Ignore CHANGELOG.md files to avoid issues with automated release job
CHANGELOG.md
diff --git a/docs/maintenance/Versioning.mdx b/docs/maintenance/Versioning.mdx
index 4cd92c6c8577..092606111f1b 100644
--- a/docs/maintenance/Versioning.mdx
+++ b/docs/maintenance/Versioning.mdx
@@ -52,7 +52,7 @@ Support for specific Current status releases are considered periodically.
### TypeScript
-> The version range of TypeScript currently supported is `>=3.3.1 <5.1.0`.
+> The version range of TypeScript currently supported is `>=3.3.1 <5.2.0`.
These versions are what we test against.
diff --git a/package.json b/package.json
index 3f881e0dc75c..5a72d4a2c75b 100644
--- a/package.json
+++ b/package.json
@@ -68,7 +68,6 @@
"@types/is-glob": "^4.0.2",
"@types/jest": "29.4.4",
"@types/jest-specific-snapshot": "^0.5.5",
- "@types/lodash": "^4.14.182",
"@types/marked": "^4.0.3",
"@types/ncp": "^2.0.5",
"@types/node": "^18.11.9",
@@ -112,10 +111,10 @@
"ts-node": "10.7.0",
"tslint": "^6.1.3",
"tsx": "^3.12.1",
- "typescript": ">=3.3.1 <5.1.0"
+ "typescript": ">=3.3.1 <5.2.0"
},
"resolutions": {
- "typescript": "~5.0.2",
+ "typescript": "5.1.0-dev.20230301",
"@types/node": "^18.11.9",
"@jest/create-cache-key-function": "^29",
"@jest/reporters": "^29",
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/fixture.tsx b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/fixture.tsx
new file mode 100644
index 000000000000..ae10e30c0b1a
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/fixture.tsx
@@ -0,0 +1,7 @@
+namespace JSX {
+ export interface IntrinsicElements {
+ 'foo-bar:baz-bam': any;
+ }
+}
+
+const componentDashed = ;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/1-TSESTree-AST.shot
new file mode 100644
index 000000000000..89265a3c778b
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/1-TSESTree-AST.shot
@@ -0,0 +1,211 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed TSESTree - AST 1`] = `
+Program {
+ type: "Program",
+ body: [
+ TSModuleDeclaration {
+ type: "TSModuleDeclaration",
+ body: TSModuleBlock {
+ type: "TSModuleBlock",
+ body: [
+ ExportNamedDeclaration {
+ type: "ExportNamedDeclaration",
+ assertions: [],
+ declaration: TSInterfaceDeclaration {
+ type: "TSInterfaceDeclaration",
+ body: TSInterfaceBody {
+ type: "TSInterfaceBody",
+ body: [
+ TSPropertySignature {
+ type: "TSPropertySignature",
+ computed: false,
+ key: Literal {
+ type: "Literal",
+ raw: "'foo-bar:baz-bam'",
+ value: "foo-bar:baz-bam",
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSAnyKeyword {
+ type: "TSAnyKeyword",
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [76, 81],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [59, 82],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ ],
+
+ range: [53, 86],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "IntrinsicElements",
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+
+ range: [25, 86],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ exportKind: "type",
+ source: null,
+ specifiers: [],
+
+ range: [18, 86],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ ],
+
+ range: [14, 88],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "JSX",
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+ kind: "namespace",
+
+ range: [0, 88],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "componentDashed",
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [],
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "baz-bam",
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "foo-bar",
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+
+ range: [115, 130],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ selfClosing: true,
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [96, 133],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [90, 134],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+ ],
+ sourceType: "script",
+
+ range: [0, 135],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 0, line: 8 },
+ },
+}
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/2-TSESTree-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/2-TSESTree-Tokens.shot
new file mode 100644
index 000000000000..c416578b7093
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/2-TSESTree-Tokens.shot
@@ -0,0 +1,236 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed TSESTree - Tokens 1`] = `
+[
+ Identifier {
+ type: "Identifier",
+ value: "namespace",
+
+ range: [0, 9],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "JSX",
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [14, 15],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 15, line: 1 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "export",
+
+ range: [18, 24],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 8, line: 2 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "interface",
+
+ range: [25, 34],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 18, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "IntrinsicElements",
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [53, 54],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 38, line: 2 },
+ },
+ },
+ String {
+ type: "String",
+ value: "'foo-bar:baz-bam'",
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [76, 77],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 22, line: 3 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "any",
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [81, 82],
+ loc: {
+ start: { column: 26, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [85, 86],
+ loc: {
+ start: { column: 2, line: 4 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [87, 88],
+ loc: {
+ start: { column: 0, line: 5 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [90, 95],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 5, line: 7 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "componentDashed",
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [112, 113],
+ loc: {
+ start: { column: 22, line: 7 },
+ end: { column: 23, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [114, 115],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 25, line: 7 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "foo-bar",
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [122, 123],
+ loc: {
+ start: { column: 32, line: 7 },
+ end: { column: 33, line: 7 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "baz-bam",
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [131, 132],
+ loc: {
+ start: { column: 41, line: 7 },
+ end: { column: 42, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [132, 133],
+ loc: {
+ start: { column: 42, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [133, 134],
+ loc: {
+ start: { column: 43, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+]
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/3-Babel-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/3-Babel-AST.shot
new file mode 100644
index 000000000000..0425d143c1b1
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/3-Babel-AST.shot
@@ -0,0 +1,210 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed Babel - AST 1`] = `
+Program {
+ type: "Program",
+ body: [
+ TSModuleDeclaration {
+ type: "TSModuleDeclaration",
+ body: TSModuleBlock {
+ type: "TSModuleBlock",
+ body: [
+ ExportNamedDeclaration {
+ type: "ExportNamedDeclaration",
+ assertions: [],
+ declaration: TSInterfaceDeclaration {
+ type: "TSInterfaceDeclaration",
+ body: TSInterfaceBody {
+ type: "TSInterfaceBody",
+ body: [
+ TSPropertySignature {
+ type: "TSPropertySignature",
+ computed: false,
+ key: Literal {
+ type: "Literal",
+ raw: "'foo-bar:baz-bam'",
+ value: "foo-bar:baz-bam",
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSAnyKeyword {
+ type: "TSAnyKeyword",
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [76, 81],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [59, 82],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ ],
+
+ range: [53, 86],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "IntrinsicElements",
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+
+ range: [25, 86],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ exportKind: "type",
+ source: null,
+ specifiers: [],
+
+ range: [18, 86],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ ],
+
+ range: [14, 88],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "JSX",
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+
+ range: [0, 88],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "componentDashed",
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [],
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "baz-bam",
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "foo-bar",
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+
+ range: [115, 130],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ selfClosing: true,
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [96, 133],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [90, 134],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+ ],
+ sourceType: "script",
+
+ range: [0, 135],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 0, line: 8 },
+ },
+}
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/4-Babel-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/4-Babel-Tokens.shot
new file mode 100644
index 000000000000..fba5e9f5f99f
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/4-Babel-Tokens.shot
@@ -0,0 +1,236 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed Babel - Tokens 1`] = `
+[
+ Identifier {
+ type: "Identifier",
+ value: "namespace",
+
+ range: [0, 9],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "JSX",
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [14, 15],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 15, line: 1 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "export",
+
+ range: [18, 24],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 8, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "interface",
+
+ range: [25, 34],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 18, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "IntrinsicElements",
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [53, 54],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 38, line: 2 },
+ },
+ },
+ String {
+ type: "String",
+ value: "'foo-bar:baz-bam'",
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [76, 77],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 22, line: 3 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "any",
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [81, 82],
+ loc: {
+ start: { column: 26, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [85, 86],
+ loc: {
+ start: { column: 2, line: 4 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [87, 88],
+ loc: {
+ start: { column: 0, line: 5 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [90, 95],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 5, line: 7 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "componentDashed",
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [112, 113],
+ loc: {
+ start: { column: 22, line: 7 },
+ end: { column: 23, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [114, 115],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 25, line: 7 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "foo-bar",
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [122, 123],
+ loc: {
+ start: { column: 32, line: 7 },
+ end: { column: 33, line: 7 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "baz-bam",
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [131, 132],
+ loc: {
+ start: { column: 41, line: 7 },
+ end: { column: 42, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [132, 133],
+ loc: {
+ start: { column: 42, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [133, 134],
+ loc: {
+ start: { column: 43, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+]
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/5-AST-Alignment-AST.shot
new file mode 100644
index 000000000000..9283b97b78d3
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/5-AST-Alignment-AST.shot
@@ -0,0 +1,215 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed AST Alignment - AST 1`] = `
+"Snapshot Diff:
+- TSESTree
++ Babel
+
+ Program {
+ type: 'Program',
+ body: Array [
+ TSModuleDeclaration {
+ type: 'TSModuleDeclaration',
+ body: TSModuleBlock {
+ type: 'TSModuleBlock',
+ body: Array [
+ ExportNamedDeclaration {
+ type: 'ExportNamedDeclaration',
+ assertions: Array [],
+ declaration: TSInterfaceDeclaration {
+ type: 'TSInterfaceDeclaration',
+ body: TSInterfaceBody {
+ type: 'TSInterfaceBody',
+ body: Array [
+ TSPropertySignature {
+ type: 'TSPropertySignature',
+ computed: false,
+ key: Literal {
+ type: 'Literal',
+ raw: '\\'foo-bar:baz-bam\\'',
+ value: 'foo-bar:baz-bam',
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ typeAnnotation: TSTypeAnnotation {
+ type: 'TSTypeAnnotation',
+ typeAnnotation: TSAnyKeyword {
+ type: 'TSAnyKeyword',
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [76, 81],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+
+ range: [59, 82],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ ],
+
+ range: [53, 86],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ id: Identifier {
+ type: 'Identifier',
+ name: 'IntrinsicElements',
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+
+ range: [25, 86],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ exportKind: 'type',
+ source: null,
+ specifiers: Array [],
+
+ range: [18, 86],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ ],
+
+ range: [14, 88],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ id: Identifier {
+ type: 'Identifier',
+ name: 'JSX',
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+- kind: 'namespace',
+
+ range: [0, 88],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ VariableDeclaration {
+ type: 'VariableDeclaration',
+ declarations: Array [
+ VariableDeclarator {
+ type: 'VariableDeclarator',
+ id: Identifier {
+ type: 'Identifier',
+ name: 'componentDashed',
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ init: JSXElement {
+ type: 'JSXElement',
+ children: Array [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: 'JSXOpeningElement',
+ attributes: Array [],
+ name: JSXNamespacedName {
+ type: 'JSXNamespacedName',
+ name: JSXIdentifier {
+ type: 'JSXIdentifier',
+ name: 'baz-bam',
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: 'JSXIdentifier',
+ name: 'foo-bar',
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+
+ range: [115, 130],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ selfClosing: true,
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [114, 133],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+
+ range: [96, 133],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ ],
+ kind: 'const',
+
+ range: [90, 134],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+ ],
+ sourceType: 'script',
+
+ range: [0, 135],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 0, line: 8 },
+ },
+ }"
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/6-AST-Alignment-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/6-AST-Alignment-Tokens.shot
new file mode 100644
index 000000000000..dcc68e747bcc
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component-dashed/snapshots/6-AST-Alignment-Tokens.shot
@@ -0,0 +1,246 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component-dashed AST Alignment - Token 1`] = `
+"Snapshot Diff:
+- TSESTree
++ Babel
+
+ Array [
+ Identifier {
+ type: 'Identifier',
+ value: 'namespace',
+
+ range: [0, 9],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'JSX',
+
+ range: [10, 13],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 13, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '{',
+
+ range: [14, 15],
+ loc: {
+ start: { column: 14, line: 1 },
+ end: { column: 15, line: 1 },
+ },
+ },
+ Keyword {
+ type: 'Keyword',
+ value: 'export',
+
+ range: [18, 24],
+ loc: {
+ start: { column: 2, line: 2 },
+ end: { column: 8, line: 2 },
+ },
+ },
+- Keyword {
+- type: 'Keyword',
++ Identifier {
++ type: 'Identifier',
+ value: 'interface',
+
+ range: [25, 34],
+ loc: {
+ start: { column: 9, line: 2 },
+ end: { column: 18, line: 2 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'IntrinsicElements',
+
+ range: [35, 52],
+ loc: {
+ start: { column: 19, line: 2 },
+ end: { column: 36, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '{',
+
+ range: [53, 54],
+ loc: {
+ start: { column: 37, line: 2 },
+ end: { column: 38, line: 2 },
+ },
+ },
+ String {
+ type: 'String',
+ value: '\\'foo-bar:baz-bam\\'',
+
+ range: [59, 76],
+ loc: {
+ start: { column: 4, line: 3 },
+ end: { column: 21, line: 3 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [76, 77],
+ loc: {
+ start: { column: 21, line: 3 },
+ end: { column: 22, line: 3 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'any',
+
+ range: [78, 81],
+ loc: {
+ start: { column: 23, line: 3 },
+ end: { column: 26, line: 3 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [81, 82],
+ loc: {
+ start: { column: 26, line: 3 },
+ end: { column: 27, line: 3 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '}',
+
+ range: [85, 86],
+ loc: {
+ start: { column: 2, line: 4 },
+ end: { column: 3, line: 4 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '}',
+
+ range: [87, 88],
+ loc: {
+ start: { column: 0, line: 5 },
+ end: { column: 1, line: 5 },
+ },
+ },
+ Keyword {
+ type: 'Keyword',
+ value: 'const',
+
+ range: [90, 95],
+ loc: {
+ start: { column: 0, line: 7 },
+ end: { column: 5, line: 7 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'componentDashed',
+
+ range: [96, 111],
+ loc: {
+ start: { column: 6, line: 7 },
+ end: { column: 21, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '=',
+
+ range: [112, 113],
+ loc: {
+ start: { column: 22, line: 7 },
+ end: { column: 23, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '<',
+
+ range: [114, 115],
+ loc: {
+ start: { column: 24, line: 7 },
+ end: { column: 25, line: 7 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'foo-bar',
+
+ range: [115, 122],
+ loc: {
+ start: { column: 25, line: 7 },
+ end: { column: 32, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [122, 123],
+ loc: {
+ start: { column: 32, line: 7 },
+ end: { column: 33, line: 7 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'baz-bam',
+
+ range: [123, 130],
+ loc: {
+ start: { column: 33, line: 7 },
+ end: { column: 40, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '/',
+
+ range: [131, 132],
+ loc: {
+ start: { column: 41, line: 7 },
+ end: { column: 42, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '>',
+
+ range: [132, 133],
+ loc: {
+ start: { column: 42, line: 7 },
+ end: { column: 43, line: 7 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [133, 134],
+ loc: {
+ start: { column: 43, line: 7 },
+ end: { column: 44, line: 7 },
+ },
+ },
+ ]"
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/fixture.tsx b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/fixture.tsx
new file mode 100644
index 000000000000..04117403f023
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/fixture.tsx
@@ -0,0 +1,10 @@
+const x = ;
+const y = ;
+
+interface NamespacePropComponentProps {
+ "a:b": string;
+}
+
+function NamespacePropComponent(props: NamespacePropComponentProps) {
+ return
{props["a:b"]}
;
+}
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/1-TSESTree-AST.shot
new file mode 100644
index 000000000000..592cbb5dc1af
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/1-TSESTree-AST.shot
@@ -0,0 +1,485 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component TSESTree - AST 1`] = `
+Program {
+ type: "Program",
+ body: [
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "x",
+
+ range: [6, 7],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 7, line: 1 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [
+ JSXAttribute {
+ type: "JSXAttribute",
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "b",
+
+ range: [36, 37],
+ loc: {
+ start: { column: 36, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "a",
+
+ range: [34, 35],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 35, line: 1 },
+ },
+ },
+
+ range: [34, 37],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ value: Literal {
+ type: "Literal",
+ raw: ""tight spacing"",
+ value: "tight spacing",
+
+ range: [38, 53],
+ loc: {
+ start: { column: 38, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+
+ range: [34, 53],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+ ],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "NamespacePropComponent",
+
+ range: [11, 33],
+ loc: {
+ start: { column: 11, line: 1 },
+ end: { column: 33, line: 1 },
+ },
+ },
+ selfClosing: true,
+
+ range: [10, 56],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+
+ range: [10, 56],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+
+ range: [6, 56],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [0, 57],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 57, line: 1 },
+ },
+ },
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "y",
+
+ range: [64, 65],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 7, line: 2 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [
+ JSXAttribute {
+ type: "JSXAttribute",
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "b",
+
+ range: [96, 97],
+ loc: {
+ start: { column: 38, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "a",
+
+ range: [92, 93],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 35, line: 2 },
+ },
+ },
+
+ range: [92, 97],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ value: Literal {
+ type: "Literal",
+ raw: ""loose spacing"",
+ value: "loose spacing",
+
+ range: [98, 113],
+ loc: {
+ start: { column: 40, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+
+ range: [92, 113],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+ ],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "NamespacePropComponent",
+
+ range: [69, 91],
+ loc: {
+ start: { column: 11, line: 2 },
+ end: { column: 33, line: 2 },
+ },
+ },
+ selfClosing: true,
+
+ range: [68, 116],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+
+ range: [68, 116],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+
+ range: [64, 116],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [58, 117],
+ loc: {
+ start: { column: 0, line: 2 },
+ end: { column: 59, line: 2 },
+ },
+ },
+ TSInterfaceDeclaration {
+ type: "TSInterfaceDeclaration",
+ body: TSInterfaceBody {
+ type: "TSInterfaceBody",
+ body: [
+ TSPropertySignature {
+ type: "TSPropertySignature",
+ computed: false,
+ key: Literal {
+ type: "Literal",
+ raw: ""a:b"",
+ value: "a:b",
+
+ range: [163, 168],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 9, line: 5 },
+ },
+ },
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSStringKeyword {
+ type: "TSStringKeyword",
+
+ range: [170, 176],
+ loc: {
+ start: { column: 11, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+
+ range: [168, 176],
+ loc: {
+ start: { column: 9, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+
+ range: [163, 177],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 18, line: 5 },
+ },
+ },
+ ],
+
+ range: [157, 179],
+ loc: {
+ start: { column: 38, line: 4 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponentProps",
+
+ range: [129, 156],
+ loc: {
+ start: { column: 10, line: 4 },
+ end: { column: 37, line: 4 },
+ },
+ },
+
+ range: [119, 179],
+ loc: {
+ start: { column: 0, line: 4 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ FunctionDeclaration {
+ type: "FunctionDeclaration",
+ async: false,
+ body: BlockStatement {
+ type: "BlockStatement",
+ body: [
+ ReturnStatement {
+ type: "ReturnStatement",
+ argument: JSXElement {
+ type: "JSXElement",
+ children: [
+ JSXExpressionContainer {
+ type: "JSXExpressionContainer",
+ expression: MemberExpression {
+ type: "MemberExpression",
+ computed: true,
+ object: Identifier {
+ type: "Identifier",
+ name: "props",
+
+ range: [268, 273],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 22, line: 9 },
+ },
+ },
+ optional: false,
+ property: Literal {
+ type: "Literal",
+ raw: ""a:b"",
+ value: "a:b",
+
+ range: [274, 279],
+ loc: {
+ start: { column: 23, line: 9 },
+ end: { column: 28, line: 9 },
+ },
+ },
+
+ range: [268, 280],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 29, line: 9 },
+ },
+ },
+
+ range: [267, 281],
+ loc: {
+ start: { column: 16, line: 9 },
+ end: { column: 30, line: 9 },
+ },
+ },
+ ],
+ closingElement: JSXClosingElement {
+ type: "JSXClosingElement",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "div",
+
+ range: [283, 286],
+ loc: {
+ start: { column: 32, line: 9 },
+ end: { column: 35, line: 9 },
+ },
+ },
+
+ range: [281, 287],
+ loc: {
+ start: { column: 30, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "div",
+
+ range: [263, 266],
+ loc: {
+ start: { column: 12, line: 9 },
+ end: { column: 15, line: 9 },
+ },
+ },
+ selfClosing: false,
+
+ range: [262, 267],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 16, line: 9 },
+ },
+ },
+
+ range: [262, 287],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+
+ range: [255, 288],
+ loc: {
+ start: { column: 4, line: 9 },
+ end: { column: 37, line: 9 },
+ },
+ },
+ ],
+
+ range: [249, 290],
+ loc: {
+ start: { column: 68, line: 8 },
+ end: { column: 1, line: 10 },
+ },
+ },
+ expression: false,
+ generator: false,
+ id: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponent",
+
+ range: [190, 212],
+ loc: {
+ start: { column: 9, line: 8 },
+ end: { column: 31, line: 8 },
+ },
+ },
+ params: [
+ Identifier {
+ type: "Identifier",
+ name: "props",
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSTypeReference {
+ type: "TSTypeReference",
+ typeName: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponentProps",
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [218, 247],
+ loc: {
+ start: { column: 37, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [213, 247],
+ loc: {
+ start: { column: 32, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+ ],
+
+ range: [181, 290],
+ loc: {
+ start: { column: 0, line: 8 },
+ end: { column: 1, line: 10 },
+ },
+ },
+ ],
+ sourceType: "script",
+
+ range: [0, 291],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 0, line: 11 },
+ },
+}
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/2-TSESTree-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/2-TSESTree-Tokens.shot
new file mode 100644
index 000000000000..9352a620aac9
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/2-TSESTree-Tokens.shot
@@ -0,0 +1,586 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component TSESTree - Tokens 1`] = `
+[
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [0, 5],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 5, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "x",
+
+ range: [6, 7],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 7, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [8, 9],
+ loc: {
+ start: { column: 8, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [10, 11],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 11, line: 1 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "NamespacePropComponent",
+
+ range: [11, 33],
+ loc: {
+ start: { column: 11, line: 1 },
+ end: { column: 33, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "a",
+
+ range: [34, 35],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 35, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [35, 36],
+ loc: {
+ start: { column: 35, line: 1 },
+ end: { column: 36, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "b",
+
+ range: [36, 37],
+ loc: {
+ start: { column: 36, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [37, 38],
+ loc: {
+ start: { column: 37, line: 1 },
+ end: { column: 38, line: 1 },
+ },
+ },
+ JSXText {
+ type: "JSXText",
+ value: ""tight spacing"",
+
+ range: [38, 53],
+ loc: {
+ start: { column: 38, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [54, 55],
+ loc: {
+ start: { column: 54, line: 1 },
+ end: { column: 55, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [55, 56],
+ loc: {
+ start: { column: 55, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [56, 57],
+ loc: {
+ start: { column: 56, line: 1 },
+ end: { column: 57, line: 1 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [58, 63],
+ loc: {
+ start: { column: 0, line: 2 },
+ end: { column: 5, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "y",
+
+ range: [64, 65],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 7, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [66, 67],
+ loc: {
+ start: { column: 8, line: 2 },
+ end: { column: 9, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [68, 69],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 11, line: 2 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "NamespacePropComponent",
+
+ range: [69, 91],
+ loc: {
+ start: { column: 11, line: 2 },
+ end: { column: 33, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "a",
+
+ range: [92, 93],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 35, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [94, 95],
+ loc: {
+ start: { column: 36, line: 2 },
+ end: { column: 37, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "b",
+
+ range: [96, 97],
+ loc: {
+ start: { column: 38, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [97, 98],
+ loc: {
+ start: { column: 39, line: 2 },
+ end: { column: 40, line: 2 },
+ },
+ },
+ JSXText {
+ type: "JSXText",
+ value: ""loose spacing"",
+
+ range: [98, 113],
+ loc: {
+ start: { column: 40, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [114, 115],
+ loc: {
+ start: { column: 56, line: 2 },
+ end: { column: 57, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [115, 116],
+ loc: {
+ start: { column: 57, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [116, 117],
+ loc: {
+ start: { column: 58, line: 2 },
+ end: { column: 59, line: 2 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "interface",
+
+ range: [119, 128],
+ loc: {
+ start: { column: 0, line: 4 },
+ end: { column: 9, line: 4 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponentProps",
+
+ range: [129, 156],
+ loc: {
+ start: { column: 10, line: 4 },
+ end: { column: 37, line: 4 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [157, 158],
+ loc: {
+ start: { column: 38, line: 4 },
+ end: { column: 39, line: 4 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""a:b"",
+
+ range: [163, 168],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 9, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [168, 169],
+ loc: {
+ start: { column: 9, line: 5 },
+ end: { column: 10, line: 5 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "string",
+
+ range: [170, 176],
+ loc: {
+ start: { column: 11, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [176, 177],
+ loc: {
+ start: { column: 17, line: 5 },
+ end: { column: 18, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [178, 179],
+ loc: {
+ start: { column: 0, line: 6 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "function",
+
+ range: [181, 189],
+ loc: {
+ start: { column: 0, line: 8 },
+ end: { column: 8, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponent",
+
+ range: [190, 212],
+ loc: {
+ start: { column: 9, line: 8 },
+ end: { column: 31, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "(",
+
+ range: [212, 213],
+ loc: {
+ start: { column: 31, line: 8 },
+ end: { column: 32, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "props",
+
+ range: [213, 218],
+ loc: {
+ start: { column: 32, line: 8 },
+ end: { column: 37, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [218, 219],
+ loc: {
+ start: { column: 37, line: 8 },
+ end: { column: 38, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponentProps",
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ")",
+
+ range: [247, 248],
+ loc: {
+ start: { column: 66, line: 8 },
+ end: { column: 67, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [249, 250],
+ loc: {
+ start: { column: 68, line: 8 },
+ end: { column: 69, line: 8 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "return",
+
+ range: [255, 261],
+ loc: {
+ start: { column: 4, line: 9 },
+ end: { column: 10, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [262, 263],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 12, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "div",
+
+ range: [263, 266],
+ loc: {
+ start: { column: 12, line: 9 },
+ end: { column: 15, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [266, 267],
+ loc: {
+ start: { column: 15, line: 9 },
+ end: { column: 16, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [267, 268],
+ loc: {
+ start: { column: 16, line: 9 },
+ end: { column: 17, line: 9 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "props",
+
+ range: [268, 273],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 22, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "[",
+
+ range: [273, 274],
+ loc: {
+ start: { column: 22, line: 9 },
+ end: { column: 23, line: 9 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""a:b"",
+
+ range: [274, 279],
+ loc: {
+ start: { column: 23, line: 9 },
+ end: { column: 28, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "]",
+
+ range: [279, 280],
+ loc: {
+ start: { column: 28, line: 9 },
+ end: { column: 29, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [280, 281],
+ loc: {
+ start: { column: 29, line: 9 },
+ end: { column: 30, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [281, 282],
+ loc: {
+ start: { column: 30, line: 9 },
+ end: { column: 31, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [282, 283],
+ loc: {
+ start: { column: 31, line: 9 },
+ end: { column: 32, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "div",
+
+ range: [283, 286],
+ loc: {
+ start: { column: 32, line: 9 },
+ end: { column: 35, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [286, 287],
+ loc: {
+ start: { column: 35, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [287, 288],
+ loc: {
+ start: { column: 36, line: 9 },
+ end: { column: 37, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [289, 290],
+ loc: {
+ start: { column: 0, line: 10 },
+ end: { column: 1, line: 10 },
+ },
+ },
+]
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/3-Babel-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/3-Babel-AST.shot
new file mode 100644
index 000000000000..7582f7301e58
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/3-Babel-AST.shot
@@ -0,0 +1,485 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component Babel - AST 1`] = `
+Program {
+ type: "Program",
+ body: [
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "x",
+
+ range: [6, 7],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 7, line: 1 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [
+ JSXAttribute {
+ type: "JSXAttribute",
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "b",
+
+ range: [36, 37],
+ loc: {
+ start: { column: 36, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "a",
+
+ range: [34, 35],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 35, line: 1 },
+ },
+ },
+
+ range: [34, 37],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ value: Literal {
+ type: "Literal",
+ raw: ""tight spacing"",
+ value: "tight spacing",
+
+ range: [38, 53],
+ loc: {
+ start: { column: 38, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+
+ range: [34, 53],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+ ],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "NamespacePropComponent",
+
+ range: [11, 33],
+ loc: {
+ start: { column: 11, line: 1 },
+ end: { column: 33, line: 1 },
+ },
+ },
+ selfClosing: true,
+
+ range: [10, 56],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+
+ range: [10, 56],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+
+ range: [6, 56],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [0, 57],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 57, line: 1 },
+ },
+ },
+ VariableDeclaration {
+ type: "VariableDeclaration",
+ declarations: [
+ VariableDeclarator {
+ type: "VariableDeclarator",
+ id: Identifier {
+ type: "Identifier",
+ name: "y",
+
+ range: [64, 65],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 7, line: 2 },
+ },
+ },
+ init: JSXElement {
+ type: "JSXElement",
+ children: [],
+ closingElement: null,
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [
+ JSXAttribute {
+ type: "JSXAttribute",
+ name: JSXNamespacedName {
+ type: "JSXNamespacedName",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "b",
+
+ range: [96, 97],
+ loc: {
+ start: { column: 38, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ namespace: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "a",
+
+ range: [92, 93],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 35, line: 2 },
+ },
+ },
+
+ range: [92, 97],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ value: Literal {
+ type: "Literal",
+ raw: ""loose spacing"",
+ value: "loose spacing",
+
+ range: [98, 113],
+ loc: {
+ start: { column: 40, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+
+ range: [92, 113],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+ ],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "NamespacePropComponent",
+
+ range: [69, 91],
+ loc: {
+ start: { column: 11, line: 2 },
+ end: { column: 33, line: 2 },
+ },
+ },
+ selfClosing: true,
+
+ range: [68, 116],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+
+ range: [68, 116],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+
+ range: [64, 116],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+ ],
+ kind: "const",
+
+ range: [58, 117],
+ loc: {
+ start: { column: 0, line: 2 },
+ end: { column: 59, line: 2 },
+ },
+ },
+ TSInterfaceDeclaration {
+ type: "TSInterfaceDeclaration",
+ body: TSInterfaceBody {
+ type: "TSInterfaceBody",
+ body: [
+ TSPropertySignature {
+ type: "TSPropertySignature",
+ computed: false,
+ key: Literal {
+ type: "Literal",
+ raw: ""a:b"",
+ value: "a:b",
+
+ range: [163, 168],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 9, line: 5 },
+ },
+ },
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSStringKeyword {
+ type: "TSStringKeyword",
+
+ range: [170, 176],
+ loc: {
+ start: { column: 11, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+
+ range: [168, 176],
+ loc: {
+ start: { column: 9, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+
+ range: [163, 177],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 18, line: 5 },
+ },
+ },
+ ],
+
+ range: [157, 179],
+ loc: {
+ start: { column: 38, line: 4 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ id: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponentProps",
+
+ range: [129, 156],
+ loc: {
+ start: { column: 10, line: 4 },
+ end: { column: 37, line: 4 },
+ },
+ },
+
+ range: [119, 179],
+ loc: {
+ start: { column: 0, line: 4 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ FunctionDeclaration {
+ type: "FunctionDeclaration",
+ async: false,
+ body: BlockStatement {
+ type: "BlockStatement",
+ body: [
+ ReturnStatement {
+ type: "ReturnStatement",
+ argument: JSXElement {
+ type: "JSXElement",
+ children: [
+ JSXExpressionContainer {
+ type: "JSXExpressionContainer",
+ expression: MemberExpression {
+ type: "MemberExpression",
+ computed: true,
+ object: Identifier {
+ type: "Identifier",
+ name: "props",
+
+ range: [268, 273],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 22, line: 9 },
+ },
+ },
+ optional: false,
+ property: Literal {
+ type: "Literal",
+ raw: ""a:b"",
+ value: "a:b",
+
+ range: [274, 279],
+ loc: {
+ start: { column: 23, line: 9 },
+ end: { column: 28, line: 9 },
+ },
+ },
+
+ range: [268, 280],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 29, line: 9 },
+ },
+ },
+
+ range: [267, 281],
+ loc: {
+ start: { column: 16, line: 9 },
+ end: { column: 30, line: 9 },
+ },
+ },
+ ],
+ closingElement: JSXClosingElement {
+ type: "JSXClosingElement",
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "div",
+
+ range: [283, 286],
+ loc: {
+ start: { column: 32, line: 9 },
+ end: { column: 35, line: 9 },
+ },
+ },
+
+ range: [281, 287],
+ loc: {
+ start: { column: 30, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+ openingElement: JSXOpeningElement {
+ type: "JSXOpeningElement",
+ attributes: [],
+ name: JSXIdentifier {
+ type: "JSXIdentifier",
+ name: "div",
+
+ range: [263, 266],
+ loc: {
+ start: { column: 12, line: 9 },
+ end: { column: 15, line: 9 },
+ },
+ },
+ selfClosing: false,
+
+ range: [262, 267],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 16, line: 9 },
+ },
+ },
+
+ range: [262, 287],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+
+ range: [255, 288],
+ loc: {
+ start: { column: 4, line: 9 },
+ end: { column: 37, line: 9 },
+ },
+ },
+ ],
+
+ range: [249, 290],
+ loc: {
+ start: { column: 68, line: 8 },
+ end: { column: 1, line: 10 },
+ },
+ },
+ expression: false,
+ generator: false,
+ id: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponent",
+
+ range: [190, 212],
+ loc: {
+ start: { column: 9, line: 8 },
+ end: { column: 31, line: 8 },
+ },
+ },
+ params: [
+ Identifier {
+ type: "Identifier",
+ name: "props",
+ typeAnnotation: TSTypeAnnotation {
+ type: "TSTypeAnnotation",
+ typeAnnotation: TSTypeReference {
+ type: "TSTypeReference",
+ typeName: Identifier {
+ type: "Identifier",
+ name: "NamespacePropComponentProps",
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [218, 247],
+ loc: {
+ start: { column: 37, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+
+ range: [213, 247],
+ loc: {
+ start: { column: 32, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+ ],
+
+ range: [181, 290],
+ loc: {
+ start: { column: 0, line: 8 },
+ end: { column: 1, line: 10 },
+ },
+ },
+ ],
+ sourceType: "script",
+
+ range: [0, 291],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 0, line: 11 },
+ },
+}
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/4-Babel-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/4-Babel-Tokens.shot
new file mode 100644
index 000000000000..afdd8792c205
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/4-Babel-Tokens.shot
@@ -0,0 +1,586 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component Babel - Tokens 1`] = `
+[
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [0, 5],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 5, line: 1 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "x",
+
+ range: [6, 7],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 7, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [8, 9],
+ loc: {
+ start: { column: 8, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [10, 11],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 11, line: 1 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "NamespacePropComponent",
+
+ range: [11, 33],
+ loc: {
+ start: { column: 11, line: 1 },
+ end: { column: 33, line: 1 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "a",
+
+ range: [34, 35],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 35, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [35, 36],
+ loc: {
+ start: { column: 35, line: 1 },
+ end: { column: 36, line: 1 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "b",
+
+ range: [36, 37],
+ loc: {
+ start: { column: 36, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [37, 38],
+ loc: {
+ start: { column: 37, line: 1 },
+ end: { column: 38, line: 1 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""tight spacing"",
+
+ range: [38, 53],
+ loc: {
+ start: { column: 38, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [54, 55],
+ loc: {
+ start: { column: 54, line: 1 },
+ end: { column: 55, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [55, 56],
+ loc: {
+ start: { column: 55, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [56, 57],
+ loc: {
+ start: { column: 56, line: 1 },
+ end: { column: 57, line: 1 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "const",
+
+ range: [58, 63],
+ loc: {
+ start: { column: 0, line: 2 },
+ end: { column: 5, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "y",
+
+ range: [64, 65],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 7, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [66, 67],
+ loc: {
+ start: { column: 8, line: 2 },
+ end: { column: 9, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [68, 69],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 11, line: 2 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "NamespacePropComponent",
+
+ range: [69, 91],
+ loc: {
+ start: { column: 11, line: 2 },
+ end: { column: 33, line: 2 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "a",
+
+ range: [92, 93],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 35, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [94, 95],
+ loc: {
+ start: { column: 36, line: 2 },
+ end: { column: 37, line: 2 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "b",
+
+ range: [96, 97],
+ loc: {
+ start: { column: 38, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "=",
+
+ range: [97, 98],
+ loc: {
+ start: { column: 39, line: 2 },
+ end: { column: 40, line: 2 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""loose spacing"",
+
+ range: [98, 113],
+ loc: {
+ start: { column: 40, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [114, 115],
+ loc: {
+ start: { column: 56, line: 2 },
+ end: { column: 57, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [115, 116],
+ loc: {
+ start: { column: 57, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [116, 117],
+ loc: {
+ start: { column: 58, line: 2 },
+ end: { column: 59, line: 2 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "interface",
+
+ range: [119, 128],
+ loc: {
+ start: { column: 0, line: 4 },
+ end: { column: 9, line: 4 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponentProps",
+
+ range: [129, 156],
+ loc: {
+ start: { column: 10, line: 4 },
+ end: { column: 37, line: 4 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [157, 158],
+ loc: {
+ start: { column: 38, line: 4 },
+ end: { column: 39, line: 4 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""a:b"",
+
+ range: [163, 168],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 9, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [168, 169],
+ loc: {
+ start: { column: 9, line: 5 },
+ end: { column: 10, line: 5 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "string",
+
+ range: [170, 176],
+ loc: {
+ start: { column: 11, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [176, 177],
+ loc: {
+ start: { column: 17, line: 5 },
+ end: { column: 18, line: 5 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [178, 179],
+ loc: {
+ start: { column: 0, line: 6 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "function",
+
+ range: [181, 189],
+ loc: {
+ start: { column: 0, line: 8 },
+ end: { column: 8, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponent",
+
+ range: [190, 212],
+ loc: {
+ start: { column: 9, line: 8 },
+ end: { column: 31, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "(",
+
+ range: [212, 213],
+ loc: {
+ start: { column: 31, line: 8 },
+ end: { column: 32, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "props",
+
+ range: [213, 218],
+ loc: {
+ start: { column: 32, line: 8 },
+ end: { column: 37, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ":",
+
+ range: [218, 219],
+ loc: {
+ start: { column: 37, line: 8 },
+ end: { column: 38, line: 8 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "NamespacePropComponentProps",
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ")",
+
+ range: [247, 248],
+ loc: {
+ start: { column: 66, line: 8 },
+ end: { column: 67, line: 8 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [249, 250],
+ loc: {
+ start: { column: 68, line: 8 },
+ end: { column: 69, line: 8 },
+ },
+ },
+ Keyword {
+ type: "Keyword",
+ value: "return",
+
+ range: [255, 261],
+ loc: {
+ start: { column: 4, line: 9 },
+ end: { column: 10, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [262, 263],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 12, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "div",
+
+ range: [263, 266],
+ loc: {
+ start: { column: 12, line: 9 },
+ end: { column: 15, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [266, 267],
+ loc: {
+ start: { column: 15, line: 9 },
+ end: { column: 16, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "{",
+
+ range: [267, 268],
+ loc: {
+ start: { column: 16, line: 9 },
+ end: { column: 17, line: 9 },
+ },
+ },
+ Identifier {
+ type: "Identifier",
+ value: "props",
+
+ range: [268, 273],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 22, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "[",
+
+ range: [273, 274],
+ loc: {
+ start: { column: 22, line: 9 },
+ end: { column: 23, line: 9 },
+ },
+ },
+ String {
+ type: "String",
+ value: ""a:b"",
+
+ range: [274, 279],
+ loc: {
+ start: { column: 23, line: 9 },
+ end: { column: 28, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "]",
+
+ range: [279, 280],
+ loc: {
+ start: { column: 28, line: 9 },
+ end: { column: 29, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [280, 281],
+ loc: {
+ start: { column: 29, line: 9 },
+ end: { column: 30, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "<",
+
+ range: [281, 282],
+ loc: {
+ start: { column: 30, line: 9 },
+ end: { column: 31, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "/",
+
+ range: [282, 283],
+ loc: {
+ start: { column: 31, line: 9 },
+ end: { column: 32, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: "JSXIdentifier",
+ value: "div",
+
+ range: [283, 286],
+ loc: {
+ start: { column: 32, line: 9 },
+ end: { column: 35, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ">",
+
+ range: [286, 287],
+ loc: {
+ start: { column: 35, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: ";",
+
+ range: [287, 288],
+ loc: {
+ start: { column: 36, line: 9 },
+ end: { column: 37, line: 9 },
+ },
+ },
+ Punctuator {
+ type: "Punctuator",
+ value: "}",
+
+ range: [289, 290],
+ loc: {
+ start: { column: 0, line: 10 },
+ end: { column: 1, line: 10 },
+ },
+ },
+]
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/5-AST-Alignment-AST.shot
new file mode 100644
index 000000000000..805eaa54c240
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/5-AST-Alignment-AST.shot
@@ -0,0 +1,6 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component AST Alignment - AST 1`] = `
+"Snapshot Diff:
+Compared values have no visual difference."
+`;
diff --git a/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/6-AST-Alignment-Tokens.shot b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/6-AST-Alignment-Tokens.shot
new file mode 100644
index 000000000000..2a72ccaf2fef
--- /dev/null
+++ b/packages/ast-spec/src/jsx/JSXNamespacedName/fixtures/component/snapshots/6-AST-Alignment-Tokens.shot
@@ -0,0 +1,604 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AST Fixtures jsx JSXNamespacedName component AST Alignment - Token 1`] = `
+"Snapshot Diff:
+- TSESTree
++ Babel
+
+ Array [
+ Keyword {
+ type: 'Keyword',
+ value: 'const',
+
+ range: [0, 5],
+ loc: {
+ start: { column: 0, line: 1 },
+ end: { column: 5, line: 1 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'x',
+
+ range: [6, 7],
+ loc: {
+ start: { column: 6, line: 1 },
+ end: { column: 7, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '=',
+
+ range: [8, 9],
+ loc: {
+ start: { column: 8, line: 1 },
+ end: { column: 9, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '<',
+
+ range: [10, 11],
+ loc: {
+ start: { column: 10, line: 1 },
+ end: { column: 11, line: 1 },
+ },
+ },
+ JSXIdentifier {
+ type: 'JSXIdentifier',
+ value: 'NamespacePropComponent',
+
+ range: [11, 33],
+ loc: {
+ start: { column: 11, line: 1 },
+ end: { column: 33, line: 1 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'a',
+
+ range: [34, 35],
+ loc: {
+ start: { column: 34, line: 1 },
+ end: { column: 35, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [35, 36],
+ loc: {
+ start: { column: 35, line: 1 },
+ end: { column: 36, line: 1 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'b',
+
+ range: [36, 37],
+ loc: {
+ start: { column: 36, line: 1 },
+ end: { column: 37, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '=',
+
+ range: [37, 38],
+ loc: {
+ start: { column: 37, line: 1 },
+ end: { column: 38, line: 1 },
+ },
+ },
+- JSXText {
+- type: 'JSXText',
++ String {
++ type: 'String',
+ value: '"tight spacing"',
+
+ range: [38, 53],
+ loc: {
+ start: { column: 38, line: 1 },
+ end: { column: 53, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '/',
+
+ range: [54, 55],
+ loc: {
+ start: { column: 54, line: 1 },
+ end: { column: 55, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '>',
+
+ range: [55, 56],
+ loc: {
+ start: { column: 55, line: 1 },
+ end: { column: 56, line: 1 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [56, 57],
+ loc: {
+ start: { column: 56, line: 1 },
+ end: { column: 57, line: 1 },
+ },
+ },
+ Keyword {
+ type: 'Keyword',
+ value: 'const',
+
+ range: [58, 63],
+ loc: {
+ start: { column: 0, line: 2 },
+ end: { column: 5, line: 2 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'y',
+
+ range: [64, 65],
+ loc: {
+ start: { column: 6, line: 2 },
+ end: { column: 7, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '=',
+
+ range: [66, 67],
+ loc: {
+ start: { column: 8, line: 2 },
+ end: { column: 9, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '<',
+
+ range: [68, 69],
+ loc: {
+ start: { column: 10, line: 2 },
+ end: { column: 11, line: 2 },
+ },
+ },
+ JSXIdentifier {
+ type: 'JSXIdentifier',
+ value: 'NamespacePropComponent',
+
+ range: [69, 91],
+ loc: {
+ start: { column: 11, line: 2 },
+ end: { column: 33, line: 2 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'a',
+
+ range: [92, 93],
+ loc: {
+ start: { column: 34, line: 2 },
+ end: { column: 35, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [94, 95],
+ loc: {
+ start: { column: 36, line: 2 },
+ end: { column: 37, line: 2 },
+ },
+ },
+- Identifier {
+- type: 'Identifier',
++ JSXIdentifier {
++ type: 'JSXIdentifier',
+ value: 'b',
+
+ range: [96, 97],
+ loc: {
+ start: { column: 38, line: 2 },
+ end: { column: 39, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '=',
+
+ range: [97, 98],
+ loc: {
+ start: { column: 39, line: 2 },
+ end: { column: 40, line: 2 },
+ },
+ },
+- JSXText {
+- type: 'JSXText',
++ String {
++ type: 'String',
+ value: '"loose spacing"',
+
+ range: [98, 113],
+ loc: {
+ start: { column: 40, line: 2 },
+ end: { column: 55, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '/',
+
+ range: [114, 115],
+ loc: {
+ start: { column: 56, line: 2 },
+ end: { column: 57, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '>',
+
+ range: [115, 116],
+ loc: {
+ start: { column: 57, line: 2 },
+ end: { column: 58, line: 2 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [116, 117],
+ loc: {
+ start: { column: 58, line: 2 },
+ end: { column: 59, line: 2 },
+ },
+ },
+- Keyword {
+- type: 'Keyword',
++ Identifier {
++ type: 'Identifier',
+ value: 'interface',
+
+ range: [119, 128],
+ loc: {
+ start: { column: 0, line: 4 },
+ end: { column: 9, line: 4 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'NamespacePropComponentProps',
+
+ range: [129, 156],
+ loc: {
+ start: { column: 10, line: 4 },
+ end: { column: 37, line: 4 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '{',
+
+ range: [157, 158],
+ loc: {
+ start: { column: 38, line: 4 },
+ end: { column: 39, line: 4 },
+ },
+ },
+ String {
+ type: 'String',
+ value: '"a:b"',
+
+ range: [163, 168],
+ loc: {
+ start: { column: 4, line: 5 },
+ end: { column: 9, line: 5 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [168, 169],
+ loc: {
+ start: { column: 9, line: 5 },
+ end: { column: 10, line: 5 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'string',
+
+ range: [170, 176],
+ loc: {
+ start: { column: 11, line: 5 },
+ end: { column: 17, line: 5 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [176, 177],
+ loc: {
+ start: { column: 17, line: 5 },
+ end: { column: 18, line: 5 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '}',
+
+ range: [178, 179],
+ loc: {
+ start: { column: 0, line: 6 },
+ end: { column: 1, line: 6 },
+ },
+ },
+ Keyword {
+ type: 'Keyword',
+ value: 'function',
+
+ range: [181, 189],
+ loc: {
+ start: { column: 0, line: 8 },
+ end: { column: 8, line: 8 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'NamespacePropComponent',
+
+ range: [190, 212],
+ loc: {
+ start: { column: 9, line: 8 },
+ end: { column: 31, line: 8 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '(',
+
+ range: [212, 213],
+ loc: {
+ start: { column: 31, line: 8 },
+ end: { column: 32, line: 8 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'props',
+
+ range: [213, 218],
+ loc: {
+ start: { column: 32, line: 8 },
+ end: { column: 37, line: 8 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ':',
+
+ range: [218, 219],
+ loc: {
+ start: { column: 37, line: 8 },
+ end: { column: 38, line: 8 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'NamespacePropComponentProps',
+
+ range: [220, 247],
+ loc: {
+ start: { column: 39, line: 8 },
+ end: { column: 66, line: 8 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ')',
+
+ range: [247, 248],
+ loc: {
+ start: { column: 66, line: 8 },
+ end: { column: 67, line: 8 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '{',
+
+ range: [249, 250],
+ loc: {
+ start: { column: 68, line: 8 },
+ end: { column: 69, line: 8 },
+ },
+ },
+ Keyword {
+ type: 'Keyword',
+ value: 'return',
+
+ range: [255, 261],
+ loc: {
+ start: { column: 4, line: 9 },
+ end: { column: 10, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '<',
+
+ range: [262, 263],
+ loc: {
+ start: { column: 11, line: 9 },
+ end: { column: 12, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: 'JSXIdentifier',
+ value: 'div',
+
+ range: [263, 266],
+ loc: {
+ start: { column: 12, line: 9 },
+ end: { column: 15, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '>',
+
+ range: [266, 267],
+ loc: {
+ start: { column: 15, line: 9 },
+ end: { column: 16, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '{',
+
+ range: [267, 268],
+ loc: {
+ start: { column: 16, line: 9 },
+ end: { column: 17, line: 9 },
+ },
+ },
+ Identifier {
+ type: 'Identifier',
+ value: 'props',
+
+ range: [268, 273],
+ loc: {
+ start: { column: 17, line: 9 },
+ end: { column: 22, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '[',
+
+ range: [273, 274],
+ loc: {
+ start: { column: 22, line: 9 },
+ end: { column: 23, line: 9 },
+ },
+ },
+ String {
+ type: 'String',
+ value: '"a:b"',
+
+ range: [274, 279],
+ loc: {
+ start: { column: 23, line: 9 },
+ end: { column: 28, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ']',
+
+ range: [279, 280],
+ loc: {
+ start: { column: 28, line: 9 },
+ end: { column: 29, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '}',
+
+ range: [280, 281],
+ loc: {
+ start: { column: 29, line: 9 },
+ end: { column: 30, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '<',
+
+ range: [281, 282],
+ loc: {
+ start: { column: 30, line: 9 },
+ end: { column: 31, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '/',
+
+ range: [282, 283],
+ loc: {
+ start: { column: 31, line: 9 },
+ end: { column: 32, line: 9 },
+ },
+ },
+ JSXIdentifier {
+ type: 'JSXIdentifier',
+ value: 'div',
+
+ range: [283, 286],
+ loc: {
+ start: { column: 32, line: 9 },
+ end: { column: 35, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '>',
+
+ range: [286, 287],
+ loc: {
+ start: { column: 35, line: 9 },
+ end: { column: 36, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: ';',
+
+ range: [287, 288],
+ loc: {
+ start: { column: 36, line: 9 },
+ end: { column: 37, line: 9 },
+ },
+ },
+ Punctuator {
+ type: 'Punctuator',
+ value: '}',
+
+ range: [289, 290],
+ loc: {
+ start: { column: 0, line: 10 },
+ end: { column: 1, line: 10 },
+ },
+ },
+ ]"
+`;
diff --git a/packages/ast-spec/tests/fixtures-with-differences-ast.shot b/packages/ast-spec/tests/fixtures-with-differences-ast.shot
index c02044d615af..87667f4b5dbc 100644
--- a/packages/ast-spec/tests/fixtures-with-differences-ast.shot
+++ b/packages/ast-spec/tests/fixtures-with-differences-ast.shot
@@ -55,6 +55,7 @@ exports[`AST Fixtures List fixtures with AST differences 1`] = `
"element/AccessorProperty/fixtures/with-annotation-no-value/fixture.ts",
"element/AccessorProperty/fixtures/with-annotation-with-value/fixture.ts",
"expression/TSSatisfiesExpression/fixtures/arrow-func-with-parentheses/fixture.ts",
+ "jsx/JSXNamespacedName/fixtures/component-dashed/fixture.tsx",
"legacy-fixtures/accessor-decorators/fixtures/accessor-decorator-factory-instance-member/fixture.ts",
"legacy-fixtures/accessor-decorators/fixtures/accessor-decorator-factory-static-member/fixture.ts",
"legacy-fixtures/accessor-decorators/fixtures/accessor-decorator-instance-member/fixture.ts",
diff --git a/packages/ast-spec/tests/fixtures-with-differences-tokens.shot b/packages/ast-spec/tests/fixtures-with-differences-tokens.shot
index 5ee1a88d62e2..b15734b809f0 100644
--- a/packages/ast-spec/tests/fixtures-with-differences-tokens.shot
+++ b/packages/ast-spec/tests/fixtures-with-differences-tokens.shot
@@ -26,6 +26,8 @@ exports[`AST Fixtures List fixtures with Token differences 1`] = `
"element/AccessorProperty/fixtures/modifier-private/fixture.ts",
"element/AccessorProperty/fixtures/modifier-protected/fixture.ts",
"element/AccessorProperty/fixtures/modifier-public/fixture.ts",
+ "jsx/JSXNamespacedName/fixtures/component-dashed/fixture.tsx",
+ "jsx/JSXNamespacedName/fixtures/component/fixture.tsx",
"legacy-fixtures/basics/fixtures/abstract-class-with-abstract-readonly-property/fixture.ts",
"legacy-fixtures/basics/fixtures/abstract-class-with-declare-properties/fixture.ts",
"legacy-fixtures/basics/fixtures/async-function-with-var-declaration/fixture.ts",
diff --git a/packages/ast-spec/tsconfig.build.json b/packages/ast-spec/tsconfig.build.json
index 89b0284199a6..2812814bb30d 100644
--- a/packages/ast-spec/tsconfig.build.json
+++ b/packages/ast-spec/tsconfig.build.json
@@ -2,6 +2,7 @@
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"composite": true,
+ "jsx": "preserve",
"outDir": "./dist",
"rootDir": "./src",
"resolveJsonModule": true
diff --git a/packages/eslint-plugin-tslint/package.json b/packages/eslint-plugin-tslint/package.json
index 4a72224bb504..8e8552cba486 100644
--- a/packages/eslint-plugin-tslint/package.json
+++ b/packages/eslint-plugin-tslint/package.json
@@ -46,7 +46,6 @@
"typescript": "*"
},
"devDependencies": {
- "@types/lodash": "*",
"@typescript-eslint/parser": "5.59.9"
}
}
diff --git a/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx b/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx
new file mode 100644
index 000000000000..b42f48eaefdb
--- /dev/null
+++ b/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx
@@ -0,0 +1,13 @@
+import * as React from "react";
+
+// Both of these are equivalent:
+const x = ;
+const y = ;
+
+interface FooProps {
+ "a:b": string;
+}
+
+function Foo(props: FooProps) {
+ return {props["a:b"]}
;
+}
diff --git a/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx.shot b/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx.shot
new file mode 100644
index 000000000000..045b34b7964e
--- /dev/null
+++ b/packages/scope-manager/tests/fixtures/jsx/namespaced-attribute.tsx.shot
@@ -0,0 +1,203 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`jsx namespaced-attribute 1`] = `
+ScopeManager {
+ variables: [
+ ImplicitGlobalConstTypeVariable,
+ Variable$2 {
+ defs: [
+ ImportBindingDefinition$1 {
+ name: Identifier<"React">,
+ node: ImportNamespaceSpecifier$1,
+ },
+ ],
+ name: "React",
+ references: [
+ Reference$2 {
+ identifier: Identifier<"React">,
+ isRead: true,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: false,
+ resolved: Variable$2,
+ },
+ ],
+ isValueVariable: true,
+ isTypeVariable: true,
+ },
+ Variable$3 {
+ defs: [
+ VariableDefinition$2 {
+ name: Identifier<"x">,
+ node: VariableDeclarator$2,
+ },
+ ],
+ name: "x",
+ references: [
+ Reference$1 {
+ identifier: Identifier<"x">,
+ init: true,
+ isRead: false,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: true,
+ resolved: Variable$3,
+ writeExpr: JSXElement$3,
+ },
+ ],
+ isValueVariable: true,
+ isTypeVariable: false,
+ },
+ Variable$4 {
+ defs: [
+ VariableDefinition$3 {
+ name: Identifier<"y">,
+ node: VariableDeclarator$4,
+ },
+ ],
+ name: "y",
+ references: [
+ Reference$4 {
+ identifier: Identifier<"y">,
+ init: true,
+ isRead: false,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: true,
+ resolved: Variable$4,
+ writeExpr: JSXElement$5,
+ },
+ ],
+ isValueVariable: true,
+ isTypeVariable: false,
+ },
+ Variable$5 {
+ defs: [
+ TypeDefinition$4 {
+ name: Identifier<"FooProps">,
+ node: TSInterfaceDeclaration$6,
+ },
+ ],
+ name: "FooProps",
+ references: [
+ Reference$6 {
+ identifier: Identifier<"FooProps">,
+ isRead: true,
+ isTypeReference: true,
+ isValueReference: false,
+ isWrite: false,
+ resolved: Variable$5,
+ },
+ ],
+ isValueVariable: false,
+ isTypeVariable: true,
+ },
+ Variable$6 {
+ defs: [
+ FunctionNameDefinition$5 {
+ name: Identifier<"Foo">,
+ node: FunctionDeclaration$7,
+ },
+ ],
+ name: "Foo",
+ references: [
+ Reference$3 {
+ identifier: JSXIdentifier$8,
+ isRead: true,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: false,
+ resolved: Variable$6,
+ },
+ Reference$5 {
+ identifier: JSXIdentifier$9,
+ isRead: true,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: false,
+ resolved: Variable$6,
+ },
+ ],
+ isValueVariable: true,
+ isTypeVariable: false,
+ },
+ Variable$7 {
+ defs: [],
+ name: "arguments",
+ references: [],
+ isValueVariable: true,
+ isTypeVariable: true,
+ },
+ Variable$8 {
+ defs: [
+ ParameterDefinition$6 {
+ name: Identifier<"props">,
+ node: FunctionDeclaration$7,
+ },
+ ],
+ name: "props",
+ references: [
+ Reference$7 {
+ identifier: Identifier<"props">,
+ isRead: true,
+ isTypeReference: false,
+ isValueReference: true,
+ isWrite: false,
+ resolved: Variable$8,
+ },
+ ],
+ isValueVariable: true,
+ isTypeVariable: false,
+ },
+ ],
+ scopes: [
+ GlobalScope$1 {
+ block: Program$10,
+ isStrict: false,
+ references: [
+ Reference$1,
+ Reference$2,
+ Reference$3,
+ Reference$4,
+ Reference$5,
+ ],
+ set: Map {
+ "const" => ImplicitGlobalConstTypeVariable,
+ "React" => Variable$2,
+ "x" => Variable$3,
+ "y" => Variable$4,
+ "FooProps" => Variable$5,
+ "Foo" => Variable$6,
+ },
+ type: "global",
+ upper: null,
+ variables: [
+ ImplicitGlobalConstTypeVariable,
+ Variable$2,
+ Variable$3,
+ Variable$4,
+ Variable$5,
+ Variable$6,
+ ],
+ },
+ FunctionScope$2 {
+ block: FunctionDeclaration$7,
+ isStrict: false,
+ references: [
+ Reference$6,
+ Reference$7,
+ ],
+ set: Map {
+ "arguments" => Variable$7,
+ "props" => Variable$8,
+ },
+ type: "function",
+ upper: GlobalScope$1,
+ variables: [
+ Variable$7,
+ Variable$8,
+ ],
+ },
+ ],
+}
+`;
diff --git a/packages/typescript-estree/jest.config.js b/packages/typescript-estree/jest.config.js
index 43f847a6fbfe..bc89e516afa2 100644
--- a/packages/typescript-estree/jest.config.js
+++ b/packages/typescript-estree/jest.config.js
@@ -1,6 +1,9 @@
'use strict';
-
// @ts-check
+
+const ts = require('typescript');
+console.log('Running with TypeScript version:', ts.version);
+
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
...require('../../jest.config.base.js'),
diff --git a/packages/typescript-estree/package.json b/packages/typescript-estree/package.json
index 56b93f5ee8e9..4aaeb85a565a 100644
--- a/packages/typescript-estree/package.json
+++ b/packages/typescript-estree/package.json
@@ -38,7 +38,7 @@
"postclean": "rimraf dist && rimraf _ts3.4 && rimraf coverage",
"format": "prettier --write \"./**/*.{ts,mts,cts,tsx,js,mjs,cjs,jsx,json,md,css}\" --ignore-path ../../.prettierignore",
"lint": "nx lint",
- "test": "jest --coverage",
+ "test": "jest --coverage --runInBand --verbose",
"typecheck": "tsc -p tsconfig.json --noEmit"
},
"dependencies": {
diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts
index e9c3e39d7a92..aad4848190e1 100644
--- a/packages/typescript-estree/src/convert.ts
+++ b/packages/typescript-estree/src/convert.ts
@@ -564,13 +564,33 @@ export class Converter {
}
private convertJSXNamespaceOrIdentifier(
- node: ts.Identifier | ts.ThisExpression,
+ node: ts.JsxNamespacedName | ts.Identifier | ts.ThisExpression,
): TSESTree.JSXIdentifier | TSESTree.JSXNamespacedName {
+ // TypeScript@5.1 added in ts.JsxNamespacedName directly
+ // We prefer using that if it's relevant for this node type
+ if (node.kind === ts.SyntaxKind.JsxNamespacedName) {
+ const result = this.createNode(node, {
+ type: AST_NODE_TYPES.JSXNamespacedName,
+ namespace: this.createNode(node.namespace, {
+ type: AST_NODE_TYPES.JSXIdentifier,
+ name: node.namespace.text,
+ }),
+ name: this.createNode(node.name, {
+ type: AST_NODE_TYPES.JSXIdentifier,
+ name: node.name.text,
+ }),
+ });
+ this.registerTSNodeInNodeMap(node, result);
+ return result;
+ }
+
+ // TypeScript@<5.1 has to manually parse the JSX attributes
const text = node.getText();
const colonIndex = text.indexOf(':');
// this is intentional we can ignore conversion if `:` is in first character
if (colonIndex > 0) {
const range = getRange(node, this.ast);
+ // @ts-ignore -- -- TypeScript@<5.1 doesn't have ts.JsxNamespacedName
const result = this.createNode(node, {
type: AST_NODE_TYPES.JSXNamespacedName,
namespace: this.createNode(node, {
@@ -2554,7 +2574,7 @@ export class Converter {
: undefined,
initializer:
this.convertChild(
- // @ts-expect-error TODO breaking change remove this from the AST
+ // @ts-ignore -- TODO breaking change remove this from the AST
node.initializer as ts.Node,
) || undefined,
readonly: hasModifier(SyntaxKind.ReadonlyKeyword, node) || undefined,
diff --git a/packages/typescript-estree/src/node-utils.ts b/packages/typescript-estree/src/node-utils.ts
index 4be3ae8e3739..b405aa0d2ecd 100644
--- a/packages/typescript-estree/src/node-utils.ts
+++ b/packages/typescript-estree/src/node-utils.ts
@@ -4,9 +4,8 @@ import { getModifiers } from './getModifiers';
import { xhtmlEntities } from './jsx/xhtml-entities';
import type { TSESTree } from './ts-estree';
import { AST_NODE_TYPES, AST_TOKEN_TYPES } from './ts-estree';
-import { typescriptVersionIsAtLeast } from './version-check';
-const isAtLeast50 = typescriptVersionIsAtLeast['5.0'];
+const isAtLeast50 = false; // typescriptVersionIsAtLeast['5.0'];
const SyntaxKind = ts.SyntaxKind;
diff --git a/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts b/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts
index 5d0069ed1606..a2a32a927c25 100644
--- a/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts
+++ b/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts
@@ -3,16 +3,16 @@ import * as ts from 'typescript';
import type { ParseSettings } from './index';
/**
- * This needs to be kept in sync with /docs/maintenance/Versioning.md
+ * This needs to be kept in sync with /docs/maintenance/Versioning.mdx
* in the typescript-eslint monorepo
*/
-const SUPPORTED_TYPESCRIPT_VERSIONS = '>=3.3.1 <5.1.0';
+const SUPPORTED_TYPESCRIPT_VERSIONS = '>=3.3.1 <5.2.0';
/*
* The semver package will ignore prerelease ranges, and we don't want to explicitly document every one
* List them all separately here, so we can automatically create the full string
*/
-const SUPPORTED_PRERELEASE_RANGES: string[] = ['5.0.1-rc'];
+const SUPPORTED_PRERELEASE_RANGES: string[] = [];
const ACTIVE_TYPESCRIPT_VERSION = ts.version;
const isRunningSupportedTypeScriptVersion = semver.satisfies(
ACTIVE_TYPESCRIPT_VERSION,
diff --git a/packages/typescript-estree/src/ts-estree/estree-to-ts-node-types.ts b/packages/typescript-estree/src/ts-estree/estree-to-ts-node-types.ts
index c080a83559ba..e6e07addb4a4 100644
--- a/packages/typescript-estree/src/ts-estree/estree-to-ts-node-types.ts
+++ b/packages/typescript-estree/src/ts-estree/estree-to-ts-node-types.ts
@@ -97,7 +97,7 @@ export interface EstreeToTsNodeTypes {
[AST_NODE_TYPES.JSXSpreadAttribute]: ts.JsxSpreadAttribute;
[AST_NODE_TYPES.JSXSpreadChild]: ts.JsxExpression;
[AST_NODE_TYPES.JSXMemberExpression]: ts.PropertyAccessExpression;
- [AST_NODE_TYPES.JSXNamespacedName]: ts.Identifier | ts.ThisExpression;
+ [AST_NODE_TYPES.JSXNamespacedName]: ts.JsxNamespacedName;
[AST_NODE_TYPES.JSXText]: ts.JsxText;
[AST_NODE_TYPES.LabeledStatement]: ts.LabeledStatement;
[AST_NODE_TYPES.Literal]:
diff --git a/packages/typescript-estree/src/ts-estree/ts-nodes.ts b/packages/typescript-estree/src/ts-estree/ts-nodes.ts
index fe1042260d8d..9134c868aefd 100644
--- a/packages/typescript-estree/src/ts-estree/ts-nodes.ts
+++ b/packages/typescript-estree/src/ts-estree/ts-nodes.ts
@@ -16,6 +16,12 @@ declare module 'typescript' {
export interface AssertEntry extends ts.Node {}
// added in TS 4.9
export interface SatisfiesExpression extends ts.Node {}
+ // added in TS 5.1
+ export interface JsxNamespacedName extends ts.Node {
+ readonly kind: ts.SyntaxKind.JsxNamespacedName;
+ readonly name: ts.Identifier;
+ readonly namespace: ts.Identifier;
+ }
/* eslint-enable @typescript-eslint/no-empty-interface */
}
@@ -131,6 +137,7 @@ export type TSNode =
| ts.JsxSpreadAttribute
| ts.JsxClosingElement
| ts.JsxExpression
+ | ts.JsxNamespacedName
| ts.JsxText
| ts.NotEmittedStatement
| ts.CommaListExpression
diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts
index 25557a24ef51..1ee7400798bd 100644
--- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts
+++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts
@@ -2,11 +2,19 @@ import * as parser from '../../src';
import type { TSESTreeOptions } from '../../src/parser-options';
import { createAndPrepareParseConfig } from '../../tools/test-utils';
+console.log(
+ 'Start of file: parse.moduleResolver.default-program-error.test.ts',
+);
+
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseAndGenerateServices', () => {
+ console.log(
+ 'Start of describe: parse.moduleResolver.default-program-error.test.ts',
+ );
+
describe('moduleResolver', () => {
const { code, config } = createAndPrepareParseConfig();
diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts
index 9bebf21de1ae..cd614177b252 100644
--- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts
+++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts
@@ -4,11 +4,19 @@ import * as parser from '../../src';
import type { TSESTreeOptions } from '../../src/parser-options';
import { createAndPrepareParseConfig } from '../../tools/test-utils';
+console.log(
+ 'Start of file: parse.moduleResolver.default-program-success.test.ts',
+);
+
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseAndGenerateServices', () => {
+ console.log(
+ 'Start of describe: parse.moduleResolver.default-program-success.test.ts',
+ );
+
describe('moduleResolver', () => {
const { code, config, projectDirectory } = createAndPrepareParseConfig();
diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-found.test.ts
similarity index 71%
rename from packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts
rename to packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-found.test.ts
index 699c88f0f235..b917bf7afc84 100644
--- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts
+++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-found.test.ts
@@ -3,26 +3,23 @@ import { resolve } from 'path';
import * as parser from '../../src';
import { createAndPrepareParseConfig } from '../../tools/test-utils';
+console.log(
+ 'Start of file: parse.moduleResolver.placeholder-error-not-found.test.ts',
+);
+
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseAndGenerateServices', () => {
+ console.log(
+ 'Start of describe: parse.moduleResolver.placeholder-error-not-found.test.ts',
+ );
+
describe('moduleResolver', () => {
const { code, config, projectDirectory } = createAndPrepareParseConfig();
describe('when file is in the project', () => {
- it('returns error if __PLACEHOLDER__ can not be resolved', () => {
- expect(
- parser
- .parseAndGenerateServices(code, config)
- .services.program.getSemanticDiagnostics(),
- ).toHaveProperty(
- [0, 'messageText'],
- "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.",
- );
- });
-
it('throws error if moduleResolver can not be found', () => {
expect(() =>
parser.parseAndGenerateServices(code, {
diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-resolved.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-resolved.test.ts
new file mode 100644
index 000000000000..d1c4f60d90e4
--- /dev/null
+++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error-not-resolved.test.ts
@@ -0,0 +1,33 @@
+import * as parser from '../../src';
+import { createAndPrepareParseConfig } from '../../tools/test-utils';
+
+console.log(
+ 'Start of file: parse.moduleResolver.placeholder-error-not-resolved.test.ts',
+);
+
+beforeEach(() => {
+ jest.clearAllMocks();
+});
+
+describe('parseAndGenerateServices', () => {
+ console.log(
+ 'Start of describe: parse.moduleResolver.placeholder-error-not-resolved.test.ts',
+ );
+
+ describe('moduleResolver', () => {
+ const { code, config } = createAndPrepareParseConfig();
+
+ describe('when file is in the project', () => {
+ it('returns error if __PLACEHOLDER__ can not be resolved', () => {
+ expect(
+ parser
+ .parseAndGenerateServices(code, config)
+ .services.program.getSemanticDiagnostics(),
+ ).toHaveProperty(
+ [0, 'messageText'],
+ "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.",
+ );
+ });
+ });
+ });
+});
diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts
index eebc01b9369a..9842f7c52f28 100644
--- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts
+++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts
@@ -3,11 +3,17 @@ import { resolve } from 'path';
import * as parser from '../../src';
import { createAndPrepareParseConfig } from '../../tools/test-utils';
+console.log('Start of file: parse.moduleResolver.placeholder-success.test.ts');
+
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseAndGenerateServices', () => {
+ console.log(
+ 'Start of describe: parse.moduleResolver.placeholder-success.test.ts',
+ );
+
describe('moduleResolver', () => {
const { code, config, projectDirectory } = createAndPrepareParseConfig();
diff --git a/patches/typescript+5.0.2.patch b/patches/typescript+5.0.2.patch
deleted file mode 100644
index 4f4c95641d28..000000000000
--- a/patches/typescript+5.0.2.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff --git a/node_modules/typescript/lib/typescript.d.ts b/node_modules/typescript/lib/typescript.d.ts
-index 374e65a..9d5a88c 100644
---- a/node_modules/typescript/lib/typescript.d.ts
-+++ b/node_modules/typescript/lib/typescript.d.ts
-@@ -368,8 +368,8 @@ declare namespace ts {
- JSDocFunctionType = 320,
- JSDocVariadicType = 321,
- JSDocNamepathType = 322,
-+ /** @deprecated This was only added in 4.7 */
- JSDoc = 323,
-- /** @deprecated Use SyntaxKind.JSDoc */
- JSDocComment = 323,
- JSDocText = 324,
- JSDocTypeLiteral = 325,
-@@ -4522,7 +4522,13 @@ declare namespace ts {
- function symbolName(symbol: Symbol): string;
- function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined;
- function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined;
-+ /**
-+ * @deprecated don't use this directly as it does not exist pre-4.8; instead use getDecorators from `@typescript-eslint/type-utils`.
-+ */
- function getDecorators(node: HasDecorators): readonly Decorator[] | undefined;
-+ /**
-+ * @deprecated don't use this directly as it does not exist pre-4.8; instead use getModifiers from `@typescript-eslint/type-utils`.
-+ */
- function getModifiers(node: HasModifiers): readonly Modifier[] | undefined;
- /**
- * Gets the JSDoc parameter tags for the node if present.
-@@ -5027,7 +5033,13 @@ declare namespace ts {
- function isModuleName(node: Node): node is ModuleName;
- function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken;
- function setTextRange(range: T, location: TextRange | undefined): T;
-+ /**
-+ * @deprecated don't use this directly as it does not exist pre-4.8; instead use getModifiers from `@typescript-eslint/type-utils`.
-+ */
- function canHaveModifiers(node: Node): node is HasModifiers;
-+ /**
-+ * @deprecated don't use this directly as it does not exist pre-4.8; instead use getDecorators from `@typescript-eslint/type-utils`.
-+ */
- function canHaveDecorators(node: Node): node is HasDecorators;
- /**
- * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes
diff --git a/patches/typescript+5.1.0-dev.20230301.patch b/patches/typescript+5.1.0-dev.20230301.patch
new file mode 100644
index 000000000000..221f60527dfe
--- /dev/null
+++ b/patches/typescript+5.1.0-dev.20230301.patch
@@ -0,0 +1,22 @@
+diff --git a/node_modules/typescript/lib/typescript.d.ts b/node_modules/typescript/lib/typescript.d.ts
+index b7a1a45..14362a6 100644
+--- a/node_modules/typescript/lib/typescript.d.ts
++++ b/node_modules/typescript/lib/typescript.d.ts
+@@ -43,6 +43,8 @@ declare namespace ts {
+ readonly end: number;
+ }
+ enum SyntaxKind {
++ JsxNamespacedName = 9001,
++
+ Unknown = 0,
+ EndOfFileToken = 1,
+ SingleLineCommentTrivia = 2,
+@@ -439,7 +441,7 @@ declare namespace ts {
+ FirstJSDocNode = 312,
+ LastJSDocNode = 353,
+ FirstJSDocTagNode = 330,
+- LastJSDocTagNode = 353
++ LastJSDocTagNode = 353,
+ }
+ type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia;
+ type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral;
diff --git a/replace-typescript-resolution.mjs b/replace-typescript-resolution.mjs
new file mode 100644
index 000000000000..458d8b271f39
--- /dev/null
+++ b/replace-typescript-resolution.mjs
@@ -0,0 +1,7 @@
+import fs from 'node:fs/promises';
+
+const existing = JSON.parse((await fs.readFile('./package.json')).toString());
+
+existing.resolutions.typescript = process.argv[2];
+
+await fs.writeFile('./package.json', JSON.stringify(existing, null, 2));
diff --git a/scratch.js b/scratch.js
new file mode 100644
index 000000000000..78bb55e99f91
--- /dev/null
+++ b/scratch.js
@@ -0,0 +1,28 @@
+import * as execa from 'execa';
+import * as child_process from 'node:child_process';
+import * as util from 'node:util';
+
+const commits = await new Promise(resolve => {
+ const spawned = child_process.spawn(
+ 'git',
+ ['rev-list', '74814345ce99e939e21a82e9d311981f80c6de3a..HEAD'],
+ {
+ cwd: 'typescript-local',
+ },
+ );
+ let result = '';
+
+ spawned.stdout.on('data', data => (result += data));
+ spawned.on('exit', () => resolve(result.trim().split(/\n/)));
+});
+
+// Iterate through oldest commits first, checking fo
+// (in theory, this should bisect... in practice, I'm tired)
+for (const commit of commits.reverse()) {
+ console.log('\n\nTrying commit:', commit);
+ await execa.command(`git reset --hard ${commit}`, {
+ cwd: 'typescript-local',
+ stdio: 'inherit',
+ });
+ // ...
+}
diff --git a/tests/performance/fixtures/lint-real-repo/Dockerfile b/tests/performance/fixtures/lint-real-repo/Dockerfile
index f3002796ecbb..9942af20f001 100644
--- a/tests/performance/fixtures/lint-real-repo/Dockerfile
+++ b/tests/performance/fixtures/lint-real-repo/Dockerfile
@@ -8,7 +8,7 @@ WORKDIR /usr/vega-lite
RUN git checkout f1e4c1ebe50fdf3b9131ba5dde915e6efbe4bd87
# Run the equivalent of the project's travis build before linting starts
-RUN yarn install --frozen-lockfile && yarn cache clean
+RUN yarn install && yarn cache clean
RUN yarn build
# Keep the container alive forever
diff --git a/use-local-typescript-version.mjs b/use-local-typescript-version.mjs
new file mode 100644
index 000000000000..bcfdca5ac739
--- /dev/null
+++ b/use-local-typescript-version.mjs
@@ -0,0 +1,50 @@
+import * as execa from 'execa';
+import * as fs from 'node:fs/promises';
+
+const commit = process.argv[2];
+
+// Clear any existing typescript-local, then clone TypeScript into it
+await execa.command(`rm -rf typescript-local`, { stdio: 'inherit' });
+await execa.command(
+ `git clone https://github.com/Microsoft/TypeScript typescript-local --depth=500`,
+ { stdio: 'inherit' },
+);
+
+// All within the typescript-local directory...
+for (const command of [
+ // Reset the TypeScript directory to the desired commit
+ `git reset --hard ${commit}`,
+ // Install and build up through having lib/
+ 'npm ci',
+ 'npx hereby lkg',
+ 'cp -r built/local lib',
+ // Link it globally
+ 'yarn link',
+]) {
+ console.log('\n\nRunning in typescript-local:', command);
+ await execa.command(command, {
+ cwd: 'typescript-local',
+ stdio: 'inherit',
+ });
+}
+
+// Add an informative log to the top of the local file
+const localTypeScript = './typescript-local/lib/typescript.js';
+await fs.writeFile(
+ localTypeScript,
+ [
+ `console.log("Local TypeScript updated for commit: ${commit}");`,
+ (await fs.readFile(localTypeScript)).toString(),
+ ].join('\n\n'),
+);
+
+// Link to the typescript-local version of TypeScript
+for (const command of [
+ 'yarn link typescript',
+ // TODO: Will this need to install/build? I hope not?
+]) {
+ console.log('\n\nRunning:', command);
+ await execa.command(command, {
+ stdio: 'inherit',
+ });
+}
diff --git a/yarn.lock b/yarn.lock
index dabaa778923e..3bb5b41f9085 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4254,7 +4254,7 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
-"@types/lodash@*", "@types/lodash@^4.14.182":
+"@types/lodash@^4.14.182":
version "4.14.194"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76"
integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==
@@ -14723,10 +14723,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-typescript@*, "typescript@>=3 < 6", "typescript@>=3.3.1 <5.1.0", typescript@next, typescript@~4.8.4, typescript@~5.0.2:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
- integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==
+typescript@*, typescript@5.1.0-dev.20230301, "typescript@>=3 < 6", "typescript@>=3.3.1 <5.2.0", typescript@next, typescript@~4.8.4:
+ version "5.1.0-dev.20230301"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.0-dev.20230301.tgz#3250b647dfd19942326bf904211350cdbbfdfe79"
+ integrity sha512-aJ0PIgQ00zlf9npD2tri7MWDAooMoh3iIn4v0hAMSRCSKqJjTzt7fVopvdtbvWPKripipxeXnX5mhkBZcGrEKQ==
ua-parser-js@^0.7.30:
version "0.7.31"