diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 01b4a03..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.224.3/containers/javascript-node/.devcontainer/base.Dockerfile - -# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster -ARG VARIANT="16-bullseye" -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT} - -# [Optional] Uncomment this section to install additional OS packages. -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment if you want to install an additional version of node using nvm -# ARG EXTRA_NODE_VERSION=10 -# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" - -# [Optional] Uncomment if you want to install more global node modules -# RUN su node -c "npm install -g " diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 1d7686d..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Debian", - "image": "mcr.microsoft.com/devcontainers/base:bullseye", - "features": { - "ghcr.io/devcontainers/features/node:1": {} - }, - "customizations": { - "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "svelte.svelte-vscode", - "ardenivanov.svelte-intellisense" - ] - } - } -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3897265..0000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 922749b..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,31 +0,0 @@ -/** @type { import("eslint").Linter.FlatConfig } */ -module.exports = { - root: true, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:svelte/recommended', - 'prettier', - ], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020, - extraFileExtensions: ['.svelte'], - }, - env: { - browser: true, - es2017: true, - node: true, - }, - overrides: [ - { - files: ['*.svelte'], - parser: 'svelte-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser', - }, - }, - ], -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe0770..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c0c80ba --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=false diff --git a/.prettierrc b/.prettierrc index c3fca3d..bd2741b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,13 +1,7 @@ { - "singleQuote": true, "semi": false, + "singleQuote": true, + "printWidth": 100, "plugins": ["prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] } diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2f86c50..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "svelte.enable-ts-plugin": true -} diff --git a/LICENSE b/LICENSE index 61d6146..74a38f4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,222 @@ -MIT License - -Copyright (c) 2022 bherbruck - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + + +======================================================================== +Apache ECharts Subcomponents: + +The Apache ECharts project contains subcomponents with separate copyright +notices and license terms. Your use of the source code for these +subcomponents is also subject to the terms and conditions of the following +licenses. + +BSD 3-Clause (d3.js): +The following files embed [d3.js](https://github.com/d3/d3) BSD 3-Clause: + `/src/chart/treemap/treemapLayout.ts`, + `/src/chart/tree/layoutHelper.ts`, + `/src/chart/graph/forceHelper.ts`, + `/src/util/number.ts` +See `/licenses/LICENSE-d3` for details of the license. \ No newline at end of file diff --git a/README.md b/README.md index 004d75c..b55dc2c 100644 --- a/README.md +++ b/README.md @@ -11,28 +11,40 @@ npm i -D svelte-echarts echarts ## ⌨️ Usage [demo](https://bherbruck.github.io/svelte-echarts/) ```html -
- +
diff --git a/src/lib/components/Chart.svelte b/src/lib/components/Chart.svelte new file mode 100644 index 0000000..2433118 --- /dev/null +++ b/src/lib/components/Chart.svelte @@ -0,0 +1,45 @@ + + + +
diff --git a/src/lib/constants/events.ts b/src/lib/constants/events.ts new file mode 100644 index 0000000..647ce60 --- /dev/null +++ b/src/lib/constants/events.ts @@ -0,0 +1,91 @@ +import type { CallbackDataParams } from 'echarts/types/dist/shared.js' + +// ref: https://echarts.apache.org/en/api.html#events +export const MOUSE_EVENT_NAMES = [ + 'click', + 'dblclick', + 'mousedown', + 'mousemove', + 'mouseover', + 'mouseout', + 'globalout', + 'contextmenu', +] as const + +export const INTERACTION_EVENT_NAMES = [ + 'highlight', + 'downplay', + 'selectchanged', + 'legendselectchanged', + 'legendselected', + 'legendunselected', + 'legendinverseselect', + 'legendscroll', + 'datazoom', + 'datarangeselected', + 'timelinechanged', + 'timelineplaychanged', + 'restore', + 'dataviewchanged', + 'magictypechanged', + 'geoselectchanged', + 'geoselected', + 'geounselected', + 'axisareaselected', + 'brush', + 'brushend', + 'brushselected', + 'globalcursortaken', + 'rendered', + 'finished', +] as const + +export const EVENT_NAMES = [...MOUSE_EVENT_NAMES, ...INTERACTION_EVENT_NAMES] + +export type ECMouseEvent = CallbackDataParams & { + event: MouseEvent +} + +export type ECInteractionEvent = CallbackDataParams + +// event dispatch types don't work unless I manually do this??? +export type MouseEventHandlers = { + click: ECMouseEvent + dblclick: ECMouseEvent + mousedown: ECMouseEvent + mousemove: ECMouseEvent + mouseover: ECMouseEvent + mouseout: ECMouseEvent + globalout: ECMouseEvent + contextmenu: ECMouseEvent +} + +export type InteractionEventHandlers = { + highlight: ECInteractionEvent + downplay: ECInteractionEvent + selectchanged: ECInteractionEvent + legendselectchanged: ECInteractionEvent + legendselected: ECInteractionEvent + legendunselected: ECInteractionEvent + legendinverseselect: ECInteractionEvent + legendscroll: ECInteractionEvent + datazoom: ECInteractionEvent + datarangeselected: ECInteractionEvent + timelinechanged: ECInteractionEvent + timelineplaychanged: ECInteractionEvent + restore: ECInteractionEvent + dataviewchanged: ECInteractionEvent + magictypechanged: ECInteractionEvent + geoselectchanged: ECInteractionEvent + geoselected: ECInteractionEvent + geounselected: ECInteractionEvent + axisareaselected: ECInteractionEvent + brush: ECInteractionEvent + brushend: ECInteractionEvent + brushselected: ECInteractionEvent + globalcursortaken: ECInteractionEvent + rendered: ECInteractionEvent + finished: ECInteractionEvent +} + +export type EventHandlers = MouseEventHandlers & InteractionEventHandlers diff --git a/src/lib/index.ts b/src/lib/index.ts index 5da0b0c..f09a8be 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,8 +1,2 @@ -export { default as Chart } from './Chart.svelte' -export { chartable } from './Chart.svelte' -export type { - EChartsOptions, - EChartsTheme, - EChartsRenderer, - ChartOptions, -} from './Chart.svelte' +export { default as Chart } from '$lib/components/Chart.svelte' +export type { ECMouseEvent, ECInteractionEvent } from '$lib/constants/events' diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index af60cfc..9592ed2 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,5 +1,47 @@ - +
+ {#await getTransferSize()} + Loading... + {:then bytes} + Transfer Size: {formatBytes(bytes)} + Refresh without cache to see real size (CTRL+F5) + {:catch error} + Error: {error.message} + {/await} + + +
+ + diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 698e955..8ec3150 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -1,3 +1,2 @@ -// export const ssr = false -export const prerender = true export const ssr = true +export const prerender = true diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 62e7544..db8a7ee 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,30 +1,72 @@ -
- -
+ let interval: number - + + onMount(() => { + interval = setInterval(updateData, 10000) + return () => clearInterval(interval) + }) + + + + Examples - svelte-echarts + + + diff --git a/src/routes/examples/classic/+page.svelte b/src/routes/examples/classic/+page.svelte new file mode 100644 index 0000000..20eba03 --- /dev/null +++ b/src/routes/examples/classic/+page.svelte @@ -0,0 +1,53 @@ + + + + Classic Example - svelte-echarts + + + diff --git a/src/routes/examples/tree-shaking/+page.svelte b/src/routes/examples/tree-shaking/+page.svelte new file mode 100644 index 0000000..89d163c --- /dev/null +++ b/src/routes/examples/tree-shaking/+page.svelte @@ -0,0 +1,72 @@ + + + + Tree-shaking | svelte-echarts + + + diff --git a/svelte.config.js b/svelte.config.js index 2c9b93c..ed7dad8 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,5 +1,5 @@ import adapter from '@sveltejs/adapter-static' -import { vitePreprocess } from '@sveltejs/kit/vite' +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' /** @type {import('@sveltejs/kit').Config} */ const config = { diff --git a/test/Chart.test.ts b/test/Chart.test.ts index 04b16aa..725fd2e 100644 --- a/test/Chart.test.ts +++ b/test/Chart.test.ts @@ -1,20 +1,26 @@ -import { describe, it, expect, vi } from 'vitest' -import { render } from '@testing-library/svelte' -import Chart, { - type EChartsTheme, - type EChartsOptions, -} from '../src/lib/Chart.svelte' -import * as echarts from 'echarts' +import { describe, it, expect, vi, beforeAll } from 'vitest' +import { render, screen } from '@testing-library/svelte' +import { queryHelpers } from '@testing-library/dom' +import { Chart } from '../src/lib' +import * as echarts from 'echarts/core' +import type { EChartsOption } from 'echarts' +import { BarChart } from 'echarts/charts' +import { + DatasetComponent, + GridComponent, + TitleComponent, + TooltipComponent, + TransformComponent, +} from 'echarts/components' +import { SVGRenderer } from 'echarts/renderers' -vi.mock('echarts', () => ({ - init: vi.fn().mockReturnValue({ - setOption: vi.fn(), - resize: vi.fn(), - dispose: vi.fn(), - }), -})) +const initOptions: Parameters[2] = { + renderer: 'svg', + height: 400, + width: 600, +} -const options: EChartsOptions = { +const options: EChartsOption = { title: { text: 'Test Line Chart', }, @@ -30,13 +36,13 @@ const options: EChartsOptions = { }, series: [ { + type: 'bar', data: [820, 932, 901, 934, 1290, 1330, 1320], - type: 'line', }, ], } -const newOptions: EChartsOptions = { +const newOptions: EChartsOption = { title: { text: 'Updated Line Chart', }, @@ -52,13 +58,13 @@ const newOptions: EChartsOptions = { }, series: [ { + type: 'bar', data: [430, 762, 690, 803, 1010, 1170, 1220], // New data points - type: 'line', }, ], } -const customTheme: EChartsTheme = { +const customTheme = { color: ['#70c1b3', '#fcbf49', '#ff1654', '#247ba0'], // Custom color palette textStyle: { fontFamily: 'Arial, sans-serif', // Custom font @@ -86,40 +92,36 @@ const customTheme: EChartsTheme = { }, } -describe('Chart Component', () => { - it('initializes with provided options', () => { - render(Chart, { options }) - expect(echarts.init).toHaveBeenCalled() - expect(echarts.init().setOption).toHaveBeenCalledWith(options) - }) - - it('updates chart options', async () => { - const { component } = render(Chart, { options }) - await component.$set({ options: newOptions }) - expect(echarts.init().setOption).toHaveBeenCalledWith(newOptions) - }) +// Mock the ResizeObserver +const ResizeObserverMock = vi.fn(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), +})) - it('responds to window resize', () => { - render(Chart, { options }) - window.dispatchEvent(new Event('resize')) - expect(echarts.init().resize).toHaveBeenCalled() - }) +// Stub the global ResizeObserver +vi.stubGlobal('ResizeObserver', ResizeObserverMock) - it('cleans up on destruction', () => { - const { component } = render(Chart, { options }) - component.$destroy() - expect(echarts.init().dispose).toHaveBeenCalled() - }) +describe('Chart Component', () => { + echarts.use([ + BarChart, + DatasetComponent, + GridComponent, + TransformComponent, + SVGRenderer, + TitleComponent, + TooltipComponent, + ]) - it('handles custom props', () => { - const customRenderer = 'svg' - render(Chart, { - options, - theme: customTheme, - renderer: customRenderer, - }) - expect(echarts.init).toHaveBeenCalledWith(expect.anything(), customTheme, { - renderer: customRenderer, + it('initializes with provided options', () => { + const { debug, baseElement } = render(Chart, { + props: { init: echarts.init, options, initOptions }, }) + debug() + expect( + baseElement.querySelector('div[_echarts_instance_]'), + 'echarts instance not found', + ).toBeTruthy() + expect(baseElement.querySelector('svg'), 'chart svg not found').toBeTruthy() }) }) diff --git a/tsconfig.json b/tsconfig.json index 8ed3dd7..5c56cee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,8 +8,6 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true, - "module": "NodeNext", - "moduleResolution": "NodeNext" + "strict": true } } diff --git a/vite.config.ts b/vite.config.ts index dd1b8b7..7808fb1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,9 @@ import { sveltekit } from '@sveltejs/kit/vite' -import { defineConfig } from 'vite' +import { defineConfig } from 'vitest/config' export default defineConfig({ plugins: [sveltekit()], + test: { + include: ['src/**/*.{test,spec}.{js,ts}'], + }, }) diff --git a/vitest.config.ts b/vitest.config.ts index c2d496e..2c475b9 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,9 +2,14 @@ import { defineConfig } from 'vitest/config' import { svelte } from '@sveltejs/vite-plugin-svelte' export default defineConfig({ - plugins: [svelte({ hot: !process.env.VITEST })], + plugins: [svelte()], test: { globals: true, environment: 'jsdom', }, + resolve: { + alias: { + $lib: '/src/lib', + }, + }, })