diff --git a/.changeset/config.json b/.changeset/config.json
index 7fcf973..a876ed9 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -1,11 +1,18 @@
{
"$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json",
"changelog": "@changesets/cli/changelog",
- "commit": false,
- "fixed": [],
+ "commit": true,
+ "fixed": [
+ [
+ "@atelier-wb/svelte",
+ "@atelier-wb/ui",
+ "@atelier-wb/toolshot",
+ "@atelier-wb/vite-plugin-atelier"
+ ]
+ ],
"linked": [],
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch",
- "ignore": []
+ "ignore": ["@atelier-wb/example-svelte", "@atelier-wb/example-sveltekit"]
}
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 0000000..067777e
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,13 @@
+{
+ "mode": "pre",
+ "tag": "beta",
+ "initialVersions": {
+ "@atelier-wb/example-svelte": "1.0.0",
+ "@atelier-wb/example-sveltekit": "0.0.1",
+ "@atelier-wb/svelte": "0.12.0",
+ "@atelier-wb/toolshot": "0.12.0",
+ "@atelier-wb/ui": "0.12.0",
+ "@atelier-wb/vite-plugin-atelier": "0.12.0"
+ },
+ "changesets": ["wet-ways-film"]
+}
diff --git a/.changeset/wet-ways-film.md b/.changeset/wet-ways-film.md
new file mode 100644
index 0000000..ef4b829
--- /dev/null
+++ b/.changeset/wet-ways-film.md
@@ -0,0 +1,8 @@
+---
+'@atelier-wb/vite-plugin-atelier': minor
+'@atelier-wb/toolshot': minor
+'@atelier-wb/svelte': minor
+'@atelier-wb/ui': minor
+---
+
+update all dependencies, migrate to vitest
diff --git a/.eslintignore b/.eslintignore
index 4636378..c25cd06 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,4 +2,5 @@ coverage/
dist/
node_modules/
fixtures/
-dist-atelier/
\ No newline at end of file
+dist-atelier/
+*.tools.svelte
\ No newline at end of file
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..206effc
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,22 @@
+module.exports = {
+ extends: [
+ 'eslint:recommended',
+ 'plugin:svelte/recommended',
+ 'plugin:vitest/recommended',
+ 'plugin:testing-library/dom'
+ ],
+ env: {
+ browser: true,
+ es2020: true,
+ node: true
+ },
+ plugins: ['simple-import-sort'],
+ parserOptions: {
+ sourceType: 'module'
+ },
+ rules: {
+ 'simple-import-sort/imports': 'error',
+ 'vitest/valid-expect': 'off',
+ 'testing-library/no-node-access': 'off'
+ }
+}
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 7693b13..0000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,34 +0,0 @@
-module.exports = {
- extends: [
- 'eslint:recommended',
- 'plugin:testing-library/dom',
- 'plugin:jest-dom/recommended'
- ],
- env: {
- browser: true,
- es2020: true,
- node: true,
- jest: true
- },
- globals: {
- vi: true
- },
- plugins: ['svelte3'],
- overrides: [
- {
- files: ['*.svelte'],
- processor: 'svelte3/svelte3'
- },
- {
- files: ['*.js'],
- extends: ['prettier']
- }
- ],
- parserOptions: {
- sourceType: 'module'
- },
- settings: {
- // unfortunately, eslint-plugin-svelte can not work with preprocessors, like postcss
- 'svelte3/ignore-styles': () => true
- }
-}
diff --git a/.prettierrc.yml b/.prettierrc.yml
index 5a352f3..2441418 100644
--- a/.prettierrc.yml
+++ b/.prettierrc.yml
@@ -2,3 +2,5 @@ semi: false
singleQuote: true
trailingComma: none
arrowParens: avoid
+plugins:
+ - prettier-plugin-svelte
diff --git a/TODO.md b/TODO.md
index 6c4decb..b0bfb33 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,5 +1,8 @@
# Features
+bug: toolshot name do not include the toolbox's name
+bug: how to inject unocss global styles?
+
## UI
- warn on tool name collisions
diff --git a/docs/releasing.md b/docs/releasing.md
index aa3ed49..c0421a4 100644
--- a/docs/releasing.md
+++ b/docs/releasing.md
@@ -28,16 +28,12 @@ Since the tool is not opinionated, here are the conventions we use.
## How to
-1. At root level, `npm run release:bump`
+1. On every new PR, run `pnpm changeset` to add a change set for your modifications.
- It generates CHANGELOG.md, bumps versions in packages.json files, creates a git tag.
+2. To create a version run `pnpm changeset version && pnpm i`
-2. Includes automatically formatted files: `git add -A`
+3. Review changes and commit.
-3. Push commit and tags: `git push --follow-tags origin main`
-
-4. Using CLI, log into NPM, `npm login`
-
-5. Get your NPM OTP ready, then publish all packages: `npm publish --workspaces ---access public -otp $OTP`
+4. Now publish your packages: `pnpm publish -r`, which will offer to log into NPM and provide your TOTP.
[mono-repo]: https://en.wikipedia.org/wiki/Monorepo
diff --git a/examples/svelte/atelier/Button.tools.svelte b/examples/svelte/atelier/Button.tools.svelte
new file mode 100644
index 0000000..878e1bf
--- /dev/null
+++ b/examples/svelte/atelier/Button.tools.svelte
@@ -0,0 +1,16 @@
+
+
+
{term}
+{/each} diff --git a/examples/sveltekit/src/stores/locale.js b/examples/sveltekit/src/stores/locale.js new file mode 100644 index 0000000..7f6d9be --- /dev/null +++ b/examples/sveltekit/src/stores/locale.js @@ -0,0 +1,10 @@ +import { derived } from 'svelte/store' +import { locale } from 'svelte-intl' + +const defaultLocale = 'fr' +const locale$ = derived(locale, value => value || defaultLocale) + +export const comparator$ = derived( + locale$, + locale => new Intl.Collator(locale, { numeric: true, usage: 'sort' }) +) diff --git a/examples/sveltekit/static/favicon.png b/examples/sveltekit/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/examples/sveltekit/static/favicon.png differ diff --git a/examples/sveltekit/svelte.config.js b/examples/sveltekit/svelte.config.js new file mode 100644 index 0000000..8297840 --- /dev/null +++ b/examples/sveltekit/svelte.config.js @@ -0,0 +1,13 @@ +import adapter from '@sveltejs/adapter-auto' + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. + // If your environment is not supported or you settled on a specific environment, switch out the adapter. + // See https://kit.svelte.dev/docs/adapters for more information about adapters. + adapter: adapter() + } +} + +export default config diff --git a/examples/sveltekit/vite.config.js b/examples/sveltekit/vite.config.js new file mode 100644 index 0000000..a124d65 --- /dev/null +++ b/examples/sveltekit/vite.config.js @@ -0,0 +1,7 @@ +import atelier from '@atelier-wb/vite-plugin-atelier' +import { sveltekit } from '@sveltejs/kit/vite' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [atelier(), sveltekit()] +}) diff --git a/package.json b/package.json index 87ab419..a131936 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "atelier", - "version": "0.9.0", + "version": "0.12.0", + "private": true, "description": "Your vite-powered UI component explorer", "author": { "name": "Damien Simonin Feugas", @@ -12,8 +13,9 @@ }, "packageManager": "pnpm@8.5.1", "scripts": { - "lint": "eslint .", + "changeset": "changeset", "format": "prettier --write . --plugin-search-dir=.", + "lint": "eslint .", "prepare": "husky install", "release": "pnpm --filter !atelier publish --no-git-checks", "test": "pnpm -r --stream t" @@ -21,24 +23,25 @@ "devDependencies": { "@atelier-wb/svelte": "workspace:*", "@atelier-wb/toolshot": "workspace:*", - "@changesets/cli": "^2.26.1", - "@faker-js/faker": "^8.0.2", - "@vitest/coverage-v8": "^0.32.2", + "@changesets/cli": "^2.27.1", + "@faker-js/faker": "^8.3.1", + "@vitest/coverage-v8": "^0.34.6", "changesets": "^1.0.2", - "eslint": "^8.43.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-jest-dom": "^5.0.1", - "eslint-plugin-svelte3": "^4.0.0", - "eslint-plugin-testing-library": "^5.11.0", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-svelte": "^2.35.1", + "eslint-plugin-testing-library": "^6.2.0", + "eslint-plugin-vitest": "^0.3.10", "htm": "^3.1.1", "husky": "^8.0.3", - "lint-staged": "^13.2.2", - "prettier": "^2.8.8", - "prettier-plugin-svelte": "^2.10.1", - "svelte": "^4.0.0", - "typescript": "^5.1.3", - "vite": "^4.3.9", - "vitest": "^0.32.2" + "lint-staged": "^15.1.0", + "prettier": "^3.1.0", + "prettier-plugin-svelte": "^3.1.2", + "svelte": "^4.2.8", + "typescript": "^5.3.2", + "vite": "^5.0.4", + "vitest": "^0.34.6" }, "lint-staged": { "*.{js,svelte}": "eslint --cache --fix", diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index 88192f3..64ad863 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,5 +1,11 @@ # @atelier-wb/svelte +## 0.13.0-beta.0 + +### Minor Changes + +- update all dependencies, migrate to vitest + ## 0.11.0 ### Minor Changes diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 3c9b059..55d649c 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@atelier-wb/svelte", - "version": "0.11.0", + "version": "0.12.0-beta.0", "description": "Svelte bindings to test your svelte components", "main": "src/index.js", "type": "module", @@ -12,13 +12,14 @@ "svelte": ">=3.44.3" }, "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.4.2", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/svelte": "^4.0.1", - "jsdom": "^22.1.0", - "svelte": "^4.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/svelte": "^4.0.5", + "jsdom": "^23.0.1", + "svelte": "^4.2.8", "svelte-htm": "^1.2.0", - "vite": "^4.3.9" + "vite": "^5.0.4", + "vitest-dom": "^0.1.1" }, "files": [ "src/**/*", diff --git a/packages/svelte/src/components/Tool.svelte b/packages/svelte/src/components/Tool.svelte index 5f25a99..375c187 100644 --- a/packages/svelte/src/components/Tool.svelte +++ b/packages/svelte/src/components/Tool.svelte @@ -7,14 +7,15 @@ onMount, tick } from 'svelte' - import * as ToolBox from './ToolBox.svelte' + import { - registerTool, + currentTool, recordError, recordEvent, - currentTool, - recordVisibility + recordVisibility, + registerTool } from '../stores' + import * as ToolBox from './ToolBox.svelte' export let name = '' export let props = {} @@ -141,14 +142,14 @@ {:else if !usesSlot} {:else} {#if visible} @@ -162,7 +163,7 @@ display: none; flex-direction: column; } - .tool.visible { + .tool.current { display: flex; } diff --git a/packages/svelte/src/stores.js b/packages/svelte/src/stores.js index 61abbe4..511620d 100644 --- a/packages/svelte/src/stores.js +++ b/packages/svelte/src/stores.js @@ -1,4 +1,4 @@ -import { writable, derived } from 'svelte/store' +import { derived, writable } from 'svelte/store' const isJsdom = navigator.userAgent?.includes('jsdom') ?? false diff --git a/packages/svelte/tests/components/Tool.test.js b/packages/svelte/tests/components/Tool.test.js index 0f0b03b..4e5bee5 100644 --- a/packages/svelte/tests/components/Tool.test.js +++ b/packages/svelte/tests/components/Tool.test.js @@ -7,9 +7,10 @@ import { waitFor } from '@testing-library/svelte' import { tick } from 'svelte' -import html from 'svelte-htm' import { get, writable } from 'svelte/store' +import html from 'svelte-htm' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + import { Tool, ToolBox } from '../../src' import { currentTool, @@ -32,7 +33,7 @@ vi.mock('../../src/stores', async () => { }) describe('Tool component', () => { - beforeEach(vi.resetAllMocks) + beforeEach(() => vi.resetAllMocks()) afterEach(cleanup) describe('given no toolbox', () => { @@ -285,10 +286,10 @@ describe('Tool component', () => { expect(button).toBeInTheDocument() expect(recordEvent).not.toHaveBeenCalled() - await fireEvent.click(button) + fireEvent.click(button) expect(recordEvent).toHaveBeenCalledWith('click', expect.any(MouseEvent)) - await fireEvent.mouseEnter(button) + fireEvent.mouseEnter(button) expect(recordEvent).toHaveBeenCalledWith('enter', expect.any(CustomEvent)) expect(recordEvent).toHaveBeenCalledTimes(2) }) @@ -557,8 +558,7 @@ describe('Tool component', () => { }) expect(registerTool).toHaveBeenCalledTimes(1) expect(recordEvent).not.toHaveBeenCalled() - const tool = screen.getByRole('button').parentElement - expect(tool).toHaveClass('tool') + expect(screen.getByRole('button').parentElement).toHaveClass('tool') }) it('registers tool and renders nothing', async () => { @@ -769,10 +769,10 @@ describe('Tool component', () => { expect(button).toBeInTheDocument() expect(recordEvent).not.toHaveBeenCalled() - await fireEvent.click(button) + fireEvent.click(button) expect(recordEvent).toHaveBeenCalledWith('click', expect.any(MouseEvent)) - await fireEvent.mouseEnter(button) + fireEvent.mouseEnter(button) expect(recordEvent).toHaveBeenCalledWith('enter', expect.any(CustomEvent)) expect(recordEvent).toHaveBeenCalledTimes(2) }) @@ -807,8 +807,8 @@ describe('Tool component', () => { setup=${setup} > <${Tool} name=${name} props=${{ - disabled: props.disabled - }} setup=${toolSetup} /> + disabled: props.disabled + }} setup=${toolSetup} /> ${ToolBox}>`) await tick() @@ -850,8 +850,8 @@ describe('Tool component', () => { setup=${setup} > <${Tool} name=${name} props=${{ - disabled: props.disabled - }} setup=${toolSetup} /> + disabled: props.disabled + }} setup=${toolSetup} /> ${ToolBox}>`) await waitFor(() => expect(recordVisibility).toHaveBeenCalledWith({ @@ -891,11 +891,11 @@ describe('Tool component', () => { setup=${setup} > <${Tool} name=${name1} props=${{ - disabled: props1.disabled - }} setup=${toolSetup1} /> + disabled: props1.disabled + }} setup=${toolSetup1} /> <${Tool} name=${name2} props=${{ - disabled: props2.disabled - }} setup=${toolSetup2} /> + disabled: props2.disabled + }} setup=${toolSetup2} /> ${ToolBox}>`) await tick() diff --git a/packages/svelte/tests/components/ToolBox.test.js b/packages/svelte/tests/components/ToolBox.test.js index d351abf..d984f12 100644 --- a/packages/svelte/tests/components/ToolBox.test.js +++ b/packages/svelte/tests/components/ToolBox.test.js @@ -2,6 +2,7 @@ import { faker } from '@faker-js/faker' import { cleanup, render } from '@testing-library/svelte' import html from 'svelte-htm' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + import { ToolBox } from '../../src' import { Tool } from '../test-components' diff --git a/packages/svelte/tests/components/Workbench.test.js b/packages/svelte/tests/components/Workbench.test.js index b1dc752..b9757d9 100644 --- a/packages/svelte/tests/components/Workbench.test.js +++ b/packages/svelte/tests/components/Workbench.test.js @@ -1,6 +1,7 @@ import { cleanup, render, screen } from '@testing-library/svelte' import html from 'svelte-htm' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + import { Workbench } from '../../src' import { currentTool } from '../../src/stores' import { Button } from '../test-components' @@ -13,7 +14,7 @@ vi.mock('../../src/stores', async () => { }) describe('Workbench component', () => { - beforeEach(vi.resetAllMocks) + beforeEach(() => vi.resetAllMocks()) afterEach(cleanup) it('can handle no tools', () => { diff --git a/packages/svelte/tests/setup.js b/packages/svelte/tests/setup.js index d263e51..5a36275 100644 --- a/packages/svelte/tests/setup.js +++ b/packages/svelte/tests/setup.js @@ -1,4 +1,6 @@ -import matchers from '@testing-library/jest-dom/matchers' -import { expect } from 'vitest' +import 'vitest-dom/extend-expect' -expect.extend(matchers) +import { cleanup } from '@testing-library/svelte' +import { afterEach } from 'vitest' + +afterEach(() => cleanup()) diff --git a/packages/svelte/tests/stores.test.js b/packages/svelte/tests/stores.test.js index a577392..ce06445 100644 --- a/packages/svelte/tests/stores.test.js +++ b/packages/svelte/tests/stores.test.js @@ -1,6 +1,7 @@ import { faker } from '@faker-js/faker' import { get } from 'svelte/store' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + import { currentTool, recordError, @@ -19,7 +20,7 @@ describe('stores', () => { const postMessage = vi.spyOn(window.parent, 'postMessage') const origin = new URL(window.parent.location.href).origin - beforeEach(vi.resetAllMocks) + beforeEach(() => vi.resetAllMocks()) describe('recordVisibility()', () => { it('records visibility change through postMessage', () => { @@ -446,12 +447,12 @@ describe('stores', () => { describe('currentTool', () => { it('is empty by default', () => { - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() }) it('ignores message from a different origin', () => { const data = faker.string.uuid() - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() window.dispatchEvent( new MessageEvent('message', { @@ -459,12 +460,12 @@ describe('stores', () => { data: { type: 'selectTool', data } }) ) - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() }) it('ignores message with unsupported types', () => { const data = faker.string.uuid() - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() window.dispatchEvent( new MessageEvent('message', { @@ -472,12 +473,12 @@ describe('stores', () => { data: { type: faker.lorem.word(), data } }) ) - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() }) it('updates when receiving selectTool message', () => { const data = faker.string.uuid() - expect(get(currentTool)).not.toBeDefined() + expect(get(currentTool)).toBeUndefined() window.dispatchEvent( new MessageEvent('message', { diff --git a/packages/svelte/tests/test-components/Tool.svelte b/packages/svelte/tests/test-components/Tool.svelte index f706a79..8b6e11b 100644 --- a/packages/svelte/tests/test-components/Tool.svelte +++ b/packages/svelte/tests/test-components/Tool.svelte @@ -1,5 +1,6 @@ - - - - - -