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"