From 84da055d3301f19addc3bccea063f4496f7a47d7 Mon Sep 17 00:00:00 2001 From: GHOST Date: Tue, 17 Sep 2024 16:15:29 +0100 Subject: [PATCH] tests: initial tests --- .github/workflows/publish.yml | 2 +- .github/workflows/tests.yml | 36 +++ package.json | 4 +- pnpm-lock.yaml | 258 +++++++++++++++++- tests/__snapshots__/Events.svelte.doc.json | 19 ++ tests/__snapshots__/Example.svelte.doc.json | 62 +++++ .../IntersectProps.svelte.doc.json | 37 +++ tests/__snapshots__/Script.svelte.doc.json | 10 + tests/__snapshots__/Skeleton.svelte.doc.json | 10 + tests/__snapshots__/Slot.svelte.doc.json | 15 + tests/__snapshots__/Slots.svelte.doc.json | 36 +++ tests/__snapshots__/kitchenSink.ts.doc.json | 99 +++++++ tests/__snapshots__/nested/demo.d.ts.doc.json | 12 + tests/extract.test.ts | 106 +++++++ .../test-files}/Events.svelte | 0 .../test-files}/Example.svelte | 0 .../test-files}/IntersectProps.svelte | 0 .../test-files}/Script.svelte | 0 .../test-files}/Skeleton.svelte | 0 {playground => tests/test-files}/Slot.svelte | 0 {playground => tests/test-files}/Slots.svelte | 0 .../test-files}/kitchenSink.ts | 0 .../test-files}/nested/demo.d.ts | 0 vite.config.ts | 4 + 24 files changed, 705 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/tests.yml create mode 100644 tests/__snapshots__/Events.svelte.doc.json create mode 100644 tests/__snapshots__/Example.svelte.doc.json create mode 100644 tests/__snapshots__/IntersectProps.svelte.doc.json create mode 100644 tests/__snapshots__/Script.svelte.doc.json create mode 100644 tests/__snapshots__/Skeleton.svelte.doc.json create mode 100644 tests/__snapshots__/Slot.svelte.doc.json create mode 100644 tests/__snapshots__/Slots.svelte.doc.json create mode 100644 tests/__snapshots__/kitchenSink.ts.doc.json create mode 100644 tests/__snapshots__/nested/demo.d.ts.doc.json create mode 100644 tests/extract.test.ts rename {playground => tests/test-files}/Events.svelte (100%) rename {playground => tests/test-files}/Example.svelte (100%) rename {playground => tests/test-files}/IntersectProps.svelte (100%) rename {playground => tests/test-files}/Script.svelte (100%) rename {playground => tests/test-files}/Skeleton.svelte (100%) rename {playground => tests/test-files}/Slot.svelte (100%) rename {playground => tests/test-files}/Slots.svelte (100%) rename {playground => tests/test-files}/kitchenSink.ts (100%) rename {playground => tests/test-files}/nested/demo.d.ts (100%) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2cbd12e..c24523a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: - name: Setup PNPM uses: pnpm/action-setup@v3 with: - version: 8.10.2 + version: 8.15.9 - name: Install Dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..c8aa57d --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,36 @@ +name: Tests + +on: + push: + branches: + - main + +jobs: + tests: + name: Tests + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18, 20, 22] + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Setup PNPM + uses: pnpm/action-setup@v3 + with: + version: 8.15.9 + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Tests + run: pnpm test diff --git a/package.json b/package.json index c0ff050..c5cfb7f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "extractinator": "DEBUG=1 vite-node src/exports/cli.ts --", "extractinator:watch": "DEBUG=1 vite-node --watch src/exports/cli.ts --", "playground": "pnpm run extractinator extract playground playground/out", - "playground2": "pnpm run extractinator:watch extract playground2/in playground2/out --log-level=verbose", "build": "tsup-node && publint", "build:watch": "tsup-node --watch", "test": "vitest" @@ -36,7 +35,8 @@ "publint": "^0.2.7", "tsup": "^8.0.1", "vite": "^5.0.10", - "vite-node": "^1.1.0" + "vite-node": "^1.1.0", + "vitest": "^2.1.1" }, "homepage": "https://github.com/ghostdevv/extractinator", "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66321b1..7250100 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,9 @@ devDependencies: vite-node: specifier: ^1.1.0 version: 1.1.0(@types/node@18.19.50) + vitest: + specifier: ^2.1.1 + version: 2.1.1(@types/node@18.19.50) packages: @@ -535,6 +538,10 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.20: resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: @@ -724,7 +731,6 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: false /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -748,6 +754,68 @@ packages: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true + /@vitest/expect@2.1.1: + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + dependencies: + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.0.10): + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + vite: 5.0.10(@types/node@18.19.50) + dev: true + + /@vitest/pretty-format@2.1.1: + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/runner@2.1.1: + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + dependencies: + '@vitest/utils': 2.1.1 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@2.1.1: + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + dependencies: + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 + dev: true + + /@vitest/spy@2.1.1: + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@2.1.1: + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + dev: true + /acorn@8.11.2: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} @@ -861,6 +929,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -941,6 +1014,17 @@ packages: engines: {node: '>=6'} dev: true + /chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -967,6 +1051,11 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1112,6 +1201,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -1129,6 +1230,11 @@ packages: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} dev: false + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -1325,7 +1431,6 @@ packages: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.5 - dev: false /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} @@ -1473,6 +1578,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -1932,6 +2041,12 @@ packages: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true + /loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: @@ -1957,6 +2072,12 @@ packages: yallist: 4.0.0 dev: true + /magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -2066,6 +2187,10 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -2285,6 +2410,15 @@ packages: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -2598,6 +2732,10 @@ packages: object-inspect: 1.13.1 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -2669,6 +2807,14 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: @@ -2838,6 +2984,29 @@ packages: globrex: 0.1.2 dev: false + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + dev: true + + /tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -3049,6 +3218,26 @@ packages: - terser dev: true + /vite-node@2.1.1(@types/node@18.19.50): + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.0.10(@types/node@18.19.50) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite@5.0.10(@types/node@18.19.50): resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3085,6 +3274,62 @@ packages: fsevents: 2.3.3 dev: true + /vitest@2.1.1(@types/node@18.19.50): + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 18.19.50 + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.0.10) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.0.10(@types/node@18.19.50) + vite-node: 2.1.1(@types/node@18.19.50) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -3162,6 +3407,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} diff --git a/tests/__snapshots__/Events.svelte.doc.json b/tests/__snapshots__/Events.svelte.doc.json new file mode 100644 index 0000000..4da3c8b --- /dev/null +++ b/tests/__snapshots__/Events.svelte.doc.json @@ -0,0 +1,19 @@ +{ + "type": "svelte", + "fileName": "Events.svelte", + "filePath": "tests/test-files/Events.svelte", + "componentName": "Events", + "props": [], + "events": [ + { + "comment": { + "raw": "/**\n * Emitted when a click happens\n */", + "summary": "Emitted when a click happens" + }, + "name": "click", + "type": "MouseEvent" + } + ], + "slots": [], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/Example.svelte.doc.json b/tests/__snapshots__/Example.svelte.doc.json new file mode 100644 index 0000000..e6cb178 --- /dev/null +++ b/tests/__snapshots__/Example.svelte.doc.json @@ -0,0 +1,62 @@ +{ + "type": "svelte", + "fileName": "Example.svelte", + "filePath": "tests/test-files/Example.svelte", + "comment": { + "raw": "/**\n * Example Svelte Component\n *\n * @example\n *\n * Simple\n * ```html\n * \n * ```\n *\n * @example\n *\n * Slots ```html
Test
\n */", + "summary": "Example Svelte Component", + "examples": [ + { + "name": "Simple", + "content": "\n```html\n\n```" + }, + { + "name": "Slots", + "content": "\n```html\n\n\t
Test
\n
" + } + ] + }, + "componentName": "Example", + "props": [ + { + "comment": { + "raw": "/**\n * Let the thing know whether it's an example or not.\n */", + "summary": "Let the thing know whether it's an example or not." + }, + "name": "isExample", + "type": "boolean" + } + ], + "events": [ + { + "name": "click", + "type": "HTMLElementEventMap" + } + ], + "slots": [ + { + "name": "default", + "props": [ + { + "name": "isExample", + "type": "boolean" + } + ] + }, + { + "name": "test", + "props": [] + } + ], + "exports": [ + { + "comment": { + "raw": "/**\n * The state the component is in\n *\n * @default\n *\n * true\n */", + "summary": "The state the component is in", + "defaultValue": "true" + }, + "name": "state", + "type": "Writable" + } + ] +} \ No newline at end of file diff --git a/tests/__snapshots__/IntersectProps.svelte.doc.json b/tests/__snapshots__/IntersectProps.svelte.doc.json new file mode 100644 index 0000000..8f4d1a3 --- /dev/null +++ b/tests/__snapshots__/IntersectProps.svelte.doc.json @@ -0,0 +1,37 @@ +{ + "type": "svelte", + "fileName": "IntersectProps.svelte", + "filePath": "tests/test-files/IntersectProps.svelte", + "componentName": "IntersectProps", + "props": [ + { + "name": "foo", + "type": "string" + }, + { + "name": "bar", + "type": "boolean" + }, + { + "name": "baz", + "type": "\"ok buddy\"" + } + ], + "events": [], + "slots": [ + { + "name": "default", + "props": [ + { + "name": "a", + "type": "() => void" + } + ] + }, + { + "name": "test", + "props": [] + } + ], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/Script.svelte.doc.json b/tests/__snapshots__/Script.svelte.doc.json new file mode 100644 index 0000000..4a42b4b --- /dev/null +++ b/tests/__snapshots__/Script.svelte.doc.json @@ -0,0 +1,10 @@ +{ + "type": "svelte", + "fileName": "Script.svelte", + "filePath": "tests/test-files/Script.svelte", + "componentName": "Script", + "props": [], + "events": [], + "slots": [], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/Skeleton.svelte.doc.json b/tests/__snapshots__/Skeleton.svelte.doc.json new file mode 100644 index 0000000..fb6092f --- /dev/null +++ b/tests/__snapshots__/Skeleton.svelte.doc.json @@ -0,0 +1,10 @@ +{ + "type": "svelte", + "fileName": "Skeleton.svelte", + "filePath": "tests/test-files/Skeleton.svelte", + "componentName": "Skeleton", + "props": [], + "events": [], + "slots": [], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/Slot.svelte.doc.json b/tests/__snapshots__/Slot.svelte.doc.json new file mode 100644 index 0000000..512d7b3 --- /dev/null +++ b/tests/__snapshots__/Slot.svelte.doc.json @@ -0,0 +1,15 @@ +{ + "type": "svelte", + "fileName": "Slot.svelte", + "filePath": "tests/test-files/Slot.svelte", + "componentName": "Slot", + "props": [], + "events": [], + "slots": [ + { + "name": "default", + "props": [] + } + ], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/Slots.svelte.doc.json b/tests/__snapshots__/Slots.svelte.doc.json new file mode 100644 index 0000000..e75c7db --- /dev/null +++ b/tests/__snapshots__/Slots.svelte.doc.json @@ -0,0 +1,36 @@ +{ + "type": "svelte", + "fileName": "Slots.svelte", + "filePath": "tests/test-files/Slots.svelte", + "componentName": "Slots", + "props": [], + "events": [], + "slots": [ + { + "comment": { + "raw": "/**\n * Default slot\n */", + "summary": "Default slot" + }, + "name": "default", + "props": [ + { + "comment": { + "raw": "/**\n * Call this function for disappointment\n */", + "summary": "Call this function for disappointment" + }, + "name": "a", + "type": "() => void" + } + ] + }, + { + "comment": { + "raw": "/**\n * The slot where you stuff to test goes\n */", + "summary": "The slot where you stuff to test goes" + }, + "name": "test", + "props": [] + } + ], + "exports": [] +} \ No newline at end of file diff --git a/tests/__snapshots__/kitchenSink.ts.doc.json b/tests/__snapshots__/kitchenSink.ts.doc.json new file mode 100644 index 0000000..2f39ada --- /dev/null +++ b/tests/__snapshots__/kitchenSink.ts.doc.json @@ -0,0 +1,99 @@ +{ + "type": "ts", + "fileName": "kitchenSink.ts", + "filePath": "tests/test-files/kitchenSink.ts", + "exports": [ + { + "name": "findRaxacoricofallapatorius", + "type": "typeof findRaxacoricofallapatorius", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * Function to locate Raxacoricofallapatorius.\n *\n * @param universeId - The Id for the Universe this planet belongs to.\n *\n * @returns The {@link Planet} Raxacoricofallapatorius.\n */", + "links": [ + { + "target": "Planet", + "text": "Planet" + } + ], + "summary": "Function to locate Raxacoricofallapatorius.", + "params": [ + { + "name": "universeId", + "description": "The Id for the Universe this planet belongs to." + } + ], + "returns": "The{@linkPlanet}Raxacoricofallapatorius." + } + }, + { + "name": "Planet", + "type": "Planet", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * Represents a planet\n */", + "summary": "Represents a planet" + } + }, + { + "name": "default", + "type": "\"T.A.R.D.I.S.\"", + "isDefaultExport": true, + "comment": { + "raw": "/**\n * Do I need to say more?\n *\n * @deprecated\n */", + "summary": "Do I need to say more?" + } + }, + { + "name": "a", + "type": "10", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * A number called a\n *\n * @internal\n */", + "summary": "A number called a", + "internal": true + } + }, + { + "name": "c", + "type": "20", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * A number called b @customTag\n */", + "summary": "A number called b\n@customTag" + } + }, + { + "name": "b", + "type": "20", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * A number called b @customTag\n */", + "summary": "A number called b\n@customTag" + } + }, + { + "name": "Universe", + "type": "Universe", + "isDefaultExport": false, + "comment": { + "raw": "/**\n * The universe\n *\n * @remarks\n *\n * The universe is not to be confused with the multiverse.\n *\n * @example\n *\n * Infinite Void\n * ```ts\n * const universe = new Universe()\n * ```\n *\n * @example\n *\n * Big Bang\n * ```ts\n * const universe = new Universe([\n * {\n * \t name: 'Earth',\n * \t\tuniverseId: '42',\n * \t\tlocation: [0, 0, 0],\n * \t\tdelta: 0,\n * \t },\n * // ...\n * ])\n *\n * universe.explode()\n * ```\n *\n * @see\n *\n * https://en.wikipedia.org/wiki/Universe\n *\n * @beta\n */", + "summary": "The universe", + "remarks": "The universe is not to be confused with the multiverse.", + "seeBlocks": [ + "https://en.wikipedia.org/wiki/Universe" + ], + "beta": true, + "examples": [ + { + "name": "Infinite Void", + "content": "\n```ts\nconst universe = new Universe()\n```" + }, + { + "name": "Big Bang", + "content": "\n```ts\nconst universe = new Universe([\n {\n\t name: 'Earth',\n\t\tuniverseId: '42',\n\t\tlocation: [0, 0, 0],\n\t\tdelta: 0,\n\t },\n // ...\n])\n\nuniverse.explode()\n```" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/__snapshots__/nested/demo.d.ts.doc.json b/tests/__snapshots__/nested/demo.d.ts.doc.json new file mode 100644 index 0000000..69025d2 --- /dev/null +++ b/tests/__snapshots__/nested/demo.d.ts.doc.json @@ -0,0 +1,12 @@ +{ + "type": "ts", + "fileName": "demo.d.ts", + "filePath": "tests/test-files/nested/demo.d.ts", + "exports": [ + { + "name": "whoami", + "type": "\"SOME_DTS_FILE\"", + "isDefaultExport": false + } + ] +} \ No newline at end of file diff --git a/tests/extract.test.ts b/tests/extract.test.ts new file mode 100644 index 0000000..ce76216 --- /dev/null +++ b/tests/extract.test.ts @@ -0,0 +1,106 @@ +import { extractinator } from '../src/exports/package' +import { describe, expect, it, vi } from 'vitest' +import { join } from 'node:path' +import { dirname } from 'desm' + +const __dirname = dirname(import.meta.url) +const TEST_FILES_DIR = join(__dirname, './test-files') +const results = await extractinator({ input: TEST_FILES_DIR }) + +function getResult(fileName: string) { + return results.find((result) => result.fileName == fileName) +} + +function snapshot(fileName: string) { + return join(__dirname, `./__snapshots__/${fileName}.doc.json`) +} + +describe('extract', () => { + it('should have extracted', () => { + expect(results).toBeTruthy() + expect(results.length).toBeGreaterThan(1) + }) + + it('Events.svelte', () => { + const result = getResult('Events.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Events.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Events.svelte')) + }) + + it('Example.svelte', () => { + const result = getResult('Example.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Example.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Example.svelte')) + }) + + it('IntersectProps.svelte', () => { + const result = getResult('IntersectProps.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot( + snapshot('IntersectProps.svelte'), + ) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'IntersectProps.svelte')) + }) + + it('Script.svelte', () => { + const result = getResult('Script.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Script.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Script.svelte')) + }) + + it('Skeleton.svelte', () => { + const result = getResult('Skeleton.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Skeleton.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Skeleton.svelte')) + }) + + it('Slot.svelte', () => { + const result = getResult('Slot.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Slot.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Slot.svelte')) + }) + + it('Slots.svelte', () => { + const result = getResult('Slots.svelte') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('Slots.svelte')) + expect(result?.type).toBe('svelte') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'Slots.svelte')) + }) + + it('kitchenSink.ts', () => { + const result = getResult('kitchenSink.ts') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('kitchenSink.ts')) + expect(result?.type).toBe('ts') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'kitchenSink.ts')) + }) + + it('demo.d.ts', () => { + const result = getResult('demo.d.ts') + + expect(result).toBeTruthy() + expect(JSON.stringify(result, null, 2)).toMatchFileSnapshot(snapshot('nested/demo.d.ts')) + expect(result?.type).toBe('ts') + // expect(result?.filePath).toBe(join(TEST_FILES_DIR, 'nested/demo.d.ts')) + }) +}) diff --git a/playground/Events.svelte b/tests/test-files/Events.svelte similarity index 100% rename from playground/Events.svelte rename to tests/test-files/Events.svelte diff --git a/playground/Example.svelte b/tests/test-files/Example.svelte similarity index 100% rename from playground/Example.svelte rename to tests/test-files/Example.svelte diff --git a/playground/IntersectProps.svelte b/tests/test-files/IntersectProps.svelte similarity index 100% rename from playground/IntersectProps.svelte rename to tests/test-files/IntersectProps.svelte diff --git a/playground/Script.svelte b/tests/test-files/Script.svelte similarity index 100% rename from playground/Script.svelte rename to tests/test-files/Script.svelte diff --git a/playground/Skeleton.svelte b/tests/test-files/Skeleton.svelte similarity index 100% rename from playground/Skeleton.svelte rename to tests/test-files/Skeleton.svelte diff --git a/playground/Slot.svelte b/tests/test-files/Slot.svelte similarity index 100% rename from playground/Slot.svelte rename to tests/test-files/Slot.svelte diff --git a/playground/Slots.svelte b/tests/test-files/Slots.svelte similarity index 100% rename from playground/Slots.svelte rename to tests/test-files/Slots.svelte diff --git a/playground/kitchenSink.ts b/tests/test-files/kitchenSink.ts similarity index 100% rename from playground/kitchenSink.ts rename to tests/test-files/kitchenSink.ts diff --git a/playground/nested/demo.d.ts b/tests/test-files/nested/demo.d.ts similarity index 100% rename from playground/nested/demo.d.ts rename to tests/test-files/nested/demo.d.ts diff --git a/vite.config.ts b/vite.config.ts index 93a4ffb..3cae244 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,3 +1,4 @@ +/// import { defineConfig } from 'vite' import pkg from './package.json' @@ -5,4 +6,7 @@ export default defineConfig({ define: { __VERSION__: `'${pkg.version}'`, }, + test: { + mockReset: true, + }, })