Browse Source

Run Angular tests in CI, add React Native tests and lint Vue, Svelte and Astro files (#1625)

pull/1627/head
Paweł Kuna 6 days ago
committed by GitHub
parent
commit
96593940f6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 156
      .build/iconfont.html
  2. 54
      .build/iconfont.scss
  3. 2
      .build/vitest-setup.mjs
  4. 10
      .github/workflows/build.yml
  5. 13
      eslint.config.mjs
  6. 5
      package.json
  7. 7
      packages/icons-angular/karma.conf.js
  8. 2
      packages/icons-angular/package.json
  9. 10
      packages/icons-astro/tsconfig.json
  10. 5
      packages/icons-preact/setupVitest.js
  11. 19
      packages/icons-preact/tsconfig.json
  12. 2
      packages/icons-preact/vitest.config.ts
  13. 26
      packages/icons-react-native/__mocks__/react-native-svg.ts
  14. 1
      packages/icons-react-native/package.json
  15. 88
      packages/icons-react-native/test.spec.tsx
  16. 20
      packages/icons-react-native/tsconfig.json
  17. 19
      packages/icons-react-native/vitest.config.ts
  18. 19
      packages/icons-react/tsconfig.json
  19. 2
      packages/icons-react/vitest.config.ts
  20. 5
      packages/icons-solidjs/setupVitest.js
  21. 12
      packages/icons-solidjs/tsconfig.json
  22. 2
      packages/icons-solidjs/vitest.config.ts
  23. 9
      packages/icons-svelte-runes/setupVitest.ts
  24. 2
      packages/icons-svelte-runes/src/Icon.svelte
  25. 2
      packages/icons-svelte-runes/vitest.config.ts
  26. 5
      packages/icons-svelte/setupVitest.ts
  27. 2
      packages/icons-svelte/src/Icon.svelte
  28. 2
      packages/icons-svelte/vitest.config.ts
  29. 3
      packages/icons-vue/package.json
  30. 1
      packages/icons-vue/setupVitest.js
  31. 49
      packages/icons-vue/test.spec.js
  32. 16
      packages/icons-vue/tsconfig.json
  33. 2
      packages/icons-vue/vitest.config.ts
  34. 312
      pnpm-lock.yaml
  35. 15
      tsconfig.base.json
  36. 13
      turbo.json

156
.build/iconfont.html

@ -1,156 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Tabler Icons - version <%= v %></title>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600" rel="stylesheet">
<link rel="stylesheet" href="./<%= fileName %>.css">
<style>
* { margin: 0; border: 0; outline: 0; box-sizing: border-box; }
body {
font-family: 'Open Sans', sans-serif;
background: #fafbfc;
font-size: 1rem;
padding: 1rem;
}
code {
font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
background: #fafafa;
border: 1px solid #f0f0f0;
color: #666;
padding: 2px 4px;
margin-bottom: 2px;
}
.container {
max-width: 73rem;
margin: 0 auto;
}
.box {
padding: 1rem;
background: #fff;
box-shadow: 0 0 0 1px rgba(0, 0, 0, .05), 0 1px 1px rgba(0, 0, 0, .1);
border-radius: 3px;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.tabler-icons {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.tabler-icon {
width: 10rem;
font-size: 12px;
text-align: center;
padding: .5rem .25rem 2rem;
}
.tabler-icon i {
display: block;
align-items: center;
font-size: 32px;
height: 1em;
margin-bottom: 1rem;
}
.tabler-icon code {
font-size: 10px;
}
.tabler-icon strong {
display: block;
margin-bottom: .5rem;
}
.tabler-icon-codes {
line-height: 2em;
}
.text-muted {
color: #999;
}
.header {
text-align: center;
margin: 2rem 0 3rem;
}
.search-bar {
padding: 0.75rem 1.5rem;
background: #fff;
box-shadow: 0 0 0 1px rgba(0, 0, 0, .05), 0 1px 1px rgba(0, 0, 0, .1);
border-radius: 3px;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
.search-bar input[name=search]{
padding:0.5rem;
background: #fafbfc;
box-shadow: 0 0 0 1px rgba(0, 0, 0, .05), 0 1px 1px rgba(0, 0, 0, .1);
width:100%;
}
</style>
</head>
<body>
<div class="container">
<header class="header">
<h1>
Tabler Icons
</h1>
<p class="text-muted">version <%= v %></p>
</header>
<div class="search-bar">
<input type="text" name="search" placeholder="type to search"/>
</div>
<div class="box">
<div class="tabler-icons">
<% glyphs.forEach(function(glyph) { %>
<div class="tabler-icon">
<i class="ti ti-<%= glyph.name %>"></i>
<strong><%= glyph.name %></strong>
<div class="tabler-icon-codes">
<code>ti ti-<%= glyph.name %></code><br>
<code>\<%= glyph.unicode[0].codePointAt(0).toString(16) %></code>
</div>
</div>
<% }) %>
</div>
</div>
</div>
<script type="text/javascript">
const input = document.querySelector("div.search-bar input");
const iconContainer = document.querySelector("div.box div.tabler-icons");
let icons = [];
document.querySelectorAll("div.tabler-icon").forEach(icon => icons.push({
el : icon,
name : icon.querySelector('strong').innerHTML,
}));
input.addEventListener('input', search);
function search(evt){
let searchValue = evt.target.value;
let iconsToShow = searchValue.length ? icons.filter(icon => icon.name.includes(searchValue)) : icons;
iconContainer.innerHTML = "";
iconsToShow.forEach(icon => iconContainer.appendChild(icon.el));
}
</script>
</body>
</html>

54
.build/iconfont.scss

@ -1,54 +0,0 @@
@charset "UTF-8";
/*!
* Tabler Icons <%= v %> by tabler - https://tabler.io
* License - https://github.com/tabler/tabler-icons/blob/main/LICENSE
*/
@use "sass:string";
$ti-font-family: '<%= fileName %>' !default;
$ti-font-path: 'fonts' !default;
$ti-font-display: null !default;
$ti-prefix: 'ti' !default;
@font-face {
font-family: $ti-font-family;
font-style: normal;
font-weight: 400;
font-display: $ti-font-display;
src: url('#{$ti-font-path}/<%= fileName %>.eot');
src: url('#{$ti-font-path}/<%= fileName %>.eot?#iefix') format('embedded-opentype'),
url('#{$ti-font-path}/<%= fileName %>.woff2') format('woff2'),
url('#{$ti-font-path}/<%= fileName %>.woff') format('woff'),
url('#{$ti-font-path}/<%= fileName %>.ttf') format('truetype'),
url("#{$ti-font-path}/<%= fileName %>.svg\##{$ti-font-family}") format("svg");
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: $ti-font-family;
src: url("#{$ti-font-path}/<%= fileName %>.svg\##{$ti-font-family}") format("svg");
}
}
.#{$ti-prefix} {
font-family: $ti-font-family !important;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@function unicode($str) {
@return string.unquote("\"")+string.unquote(string.insert($str, "\\", 1))+string.unquote("\"")
}
<% glyphs.forEach(function(glyph) { %>
$ti-icon-<%= glyph.name %>: unicode('<%= glyph.unicode[0].codePointAt(0).toString(16) %>');<% }); %>
<% glyphs.forEach(function(glyph) { %>
.#{$ti-prefix}-<%= glyph.name %>:before { content: $ti-icon-<%= glyph.name %>; }<% }); %>

2
packages/icons-react/setupVitest.js → .build/vitest-setup.mjs

@ -1,3 +1,5 @@
// Shared vitest setup for the framework packages: jest-dom matchers and
// pretty-printed HTML in snapshots.
import { expect } from 'vitest';
import '@testing-library/jest-dom/vitest';
import htmlSerializer from 'jest-serializer-html';

10
.github/workflows/build.yml

@ -66,11 +66,10 @@ jobs:
ICONS_LIMIT: 100
run: pnpm run build
# @tabler/icons-angular is excluded: its suite runs in a real Chrome via
# Karma and needs a browser setup this job does not have yet. Every other
# package runs on vitest or node:test. The demo apps in test/test-* have no
# test script and import icons outside the ICONS_LIMIT subset, so only the
# packages and the two guard suites are selected.
# The demo apps in test/test-* have no test script and import icons outside
# the ICONS_LIMIT subset, so only the packages and the two guard suites are
# selected. @tabler/icons-angular runs in headless Chrome via Karma, which
# is preinstalled on the runner.
- name: Test
env:
ICONS_LIMIT: 100
@ -79,4 +78,3 @@ jobs:
--filter='./packages/*'
--filter=test-react-rsc
--filter=test-react-types
--filter='!@tabler/icons-angular'

13
eslint.config.mjs

@ -1,6 +1,9 @@
import js from '@eslint/js';
import globals from 'globals';
import tseslint from 'typescript-eslint';
import vue from 'eslint-plugin-vue';
import svelte from 'eslint-plugin-svelte';
import astro from 'eslint-plugin-astro';
import prettier from 'eslint-config-prettier';
export default tseslint.config(
@ -30,6 +33,16 @@ export default tseslint.config(
},
js.configs.recommended,
...tseslint.configs.recommended,
...vue.configs['flat/recommended'],
...svelte.configs.recommended,
...astro.configs.recommended,
{
// TypeScript inside single-file components
files: ['**/*.vue', '**/*.svelte'],
languageOptions: {
parserOptions: { parser: tseslint.parser },
},
},
{
languageOptions: {
globals: { ...globals.node, ...globals.browser },

5
package.json

@ -35,7 +35,7 @@
"generate-preview-stroke": "node ./.build/preview-stroke.mjs",
"validate": "node ./.build/validate-icons.mjs",
"release": "git pull && GITHUB_TOKEN=${GITHUB_TOKEN:-$(gh auth token)} release-it --verbose",
"build:packages": "pnpm --filter './packages/*' --workspace-concurrency=8 run build",
"build:packages": "turbo run build --filter='./packages/*'",
"build:icons": "pnpm --filter @tabler/icons build",
"build:angular": "pnpm --filter @tabler/icons-angular build",
"build:react": "pnpm --filter @tabler/icons-react build",
@ -65,6 +65,9 @@
"esbuild": "^0.28.2",
"eslint": "^10.11.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-astro": "^3.2.1",
"eslint-plugin-svelte": "^3.23.0",
"eslint-plugin-vue": "^10.11.1",
"fs-extra": "^11.4.1",
"glob": "13.0.6",
"globals": "^17.12.0",

7
packages/icons-angular/karma.conf.js

@ -31,6 +31,13 @@ module.exports = function (config) {
},
reporters: ['progress', 'kjhtml'],
browsers: ['Chrome'],
customLaunchers: {
// used by `pnpm test`; the sandbox is not available on CI runners
ChromeHeadlessTest: {
base: 'ChromeHeadless',
flags: process.env.CI ? ['--no-sandbox'] : [],
},
},
restartOnFileChange: true,
});
};

2
packages/icons-angular/package.json

@ -40,7 +40,7 @@
"copy:license": "cp ../../LICENSE ./LICENSE",
"clean": "rm -rf dist && find src/icons -mindepth 1 ! -name '.gitkeep' -delete",
"typecheck": "tsc",
"test": "ng test --no-watch --no-progress",
"test": "ng test --no-watch --no-progress --browsers=ChromeHeadlessTest",
"test:watch": "ng test"
},
"main": "./dist/fesm2022/tabler-icons-angular.mjs",

10
packages/icons-astro/tsconfig.json

@ -1,14 +1,6 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"strict": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "Bundler",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"skipLibCheck": true,
"noEmit": true,
"isolatedModules": true,
"types": ["astro/client"]
},
"include": ["src", "test.spec.ts"]

5
packages/icons-preact/setupVitest.js

@ -1,5 +0,0 @@
import { expect } from 'vitest';
import '@testing-library/jest-dom';
import htmlSerializer from 'jest-serializer-html';
expect.addSnapshotSerializer(htmlSerializer);

19
packages/icons-preact/tsconfig.json

@ -1,27 +1,10 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"strict": true,
"declaration": false,
"noEmitOnError": true,
"noEmit": true,
"noFallthroughCasesInSwitch": true,
"moduleResolution": "node",
"module": "ESNext",
"target": "ESNext",
"esModuleInterop": true,
"isolatedModules": true,
"lib": ["esnext", "dom"],
"skipLibCheck": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"allowImportingTsExtensions": true,
"downlevelIteration": true,
"sourceMap": true,
"outDir": "./dist",
"jsx": "react-jsx",
"jsxImportSource": "preact",
"types": ["@testing-library/jest-dom"]
},
"exclude": ["**/node_modules"],
"include": ["src"]
}

2
packages/icons-preact/vitest.config.mts → packages/icons-preact/vitest.config.ts

@ -6,7 +6,7 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.js',
setupFiles: '../../.build/vitest-setup.mjs',
},
resolve: {
mainFields: ['module'],

26
packages/icons-react-native/__mocks__/react-native-svg.ts

@ -0,0 +1,26 @@
import { createElement, forwardRef } from 'react';
import type { ReactNode } from 'react';
// `react-native-svg` only renders inside a React Native runtime. For tests the
// components are replaced with the DOM elements of the same name, so icons can
// be rendered and inspected with jsdom.
const createMock = (tag: string) => {
const Mock = forwardRef<SVGElement, { children?: ReactNode }>((props, ref) =>
createElement(tag, { ...props, ref }),
);
Mock.displayName = tag;
return Mock;
};
export const Svg = createMock('svg');
export const Circle = createMock('circle');
export const Ellipse = createMock('ellipse');
export const G = createMock('g');
export const Line = createMock('line');
export const Path = createMock('path');
export const Polygon = createMock('polygon');
export const Polyline = createMock('polyline');
export const Rect = createMock('rect');
export default Svg;

1
packages/icons-react-native/package.json

@ -58,6 +58,7 @@
"build:bundles": "rollup -c ./rollup.config.mjs",
"copy:license": "cp ../../LICENSE ./LICENSE",
"clean": "find dist -mindepth 1 -delete 2>/dev/null; rm -rf dist && find . ! -name '.gitkeep' -path '*/src/icons/*' -exec rm -rf {} +",
"test": "vitest run",
"typecheck": "tsc",
"imports-check": "attw $(npm pack)"
},

88
packages/icons-react-native/test.spec.tsx

@ -0,0 +1,88 @@
import { describe, it, expect, afterEach } from 'vitest';
import { render, cleanup } from '@testing-library/react';
import { Path } from 'react-native-svg';
import {
IconAccessible,
IconAccessibleFilled,
createReactComponent,
} from './src/tabler-icons-react-native';
describe('React Native Icon component', () => {
afterEach(() => {
cleanup();
});
it('should render icon component', () => {
const { container } = render(<IconAccessible />);
expect(container.getElementsByTagName('svg').length).toBeGreaterThan(0);
});
it('should render every node of the icon', () => {
const { container } = render(<IconAccessible />);
const paths = container.getElementsByTagName('path');
expect(paths.length).toBe(3);
expect(paths[0].getAttribute('d')).toBe('M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0');
});
it('should update svg attributes when there are props passed to the component', () => {
const { container } = render(<IconAccessible size={48} color={'red'} strokeWidth={4} />);
const svg = container.getElementsByTagName('svg')[0];
expect(svg.getAttribute('width')).toBe('48');
expect(svg.getAttribute('height')).toBe('48');
expect(svg.getAttribute('stroke')).toBe('red');
expect(svg.getAttribute('stroke-width')).toBe('4');
expect(svg.getAttribute('fill')).toBe('none');
});
it('should pass color and stroke width down to the icon nodes', () => {
const { container } = render(<IconAccessible color={'red'} strokeWidth={4} />);
const path = container.getElementsByTagName('path')[0];
expect(path.getAttribute('stroke')).toBe('red');
expect(path.getAttribute('stroke-width')).toBe('4');
expect(path.getAttribute('fill')).toBe('none');
});
it('should update svg attributes when there are props passed to the filled version of component', () => {
const { container } = render(<IconAccessibleFilled size={48} color={'red'} />);
const svg = container.getElementsByTagName('svg')[0];
expect(svg.getAttribute('width')).toBe('48');
expect(svg.getAttribute('fill')).toBe('red');
expect(svg.getAttribute('stroke')).toBe('none');
});
it('should forward other props to the svg element', () => {
const { container } = render(<IconAccessible opacity={0.5} />);
const svg = container.getElementsByTagName('svg')[0];
expect(svg.getAttribute('opacity')).toBe('0.5');
});
it('should render children after the icon nodes', () => {
const { container } = render(
<IconAccessible>
<Path d="M0 0h24" />
</IconAccessible>,
);
const paths = container.getElementsByTagName('path');
expect(paths.length).toBe(4);
expect(paths[3].getAttribute('d')).toBe('M0 0h24');
});
it('should add title child element to svg when title prop is passed', () => {
const { container } = render(<IconAccessible title="Accessible Icon" />);
const svg = container.getElementsByTagName('svg')[0];
const title = svg.getElementsByTagName('title')[0];
expect(title).toHaveTextContent('Accessible Icon');
});
it('should set display name of the component', () => {
expect(IconAccessible.displayName).toBe('Accessible');
expect(createReactComponent('outline', 'test', 'Test', []).displayName).toBe('Test');
});
});

20
packages/icons-react-native/tsconfig.json

@ -1,23 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"strict": true,
"declaration": false,
"noEmitOnError": true,
"noEmit": true,
"noFallthroughCasesInSwitch": true,
"moduleResolution": "node",
"module": "ESNext",
"target": "ESNext",
"esModuleInterop": true,
"isolatedModules": true,
"lib": ["esnext", "dom"],
"skipLibCheck": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"downlevelIteration": true,
"sourceMap": true,
"outDir": "./dist",
"jsx": "react-jsx"
},
"exclude": ["**/node_modules"]
"include": ["src"]
}

19
packages/icons-react-native/vitest.config.ts

@ -0,0 +1,19 @@
import { fileURLToPath } from 'node:url';
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'react-native-svg': fileURLToPath(
new URL('./__mocks__/react-native-svg.ts', import.meta.url),
),
},
},
test: {
globals: true,
environment: 'jsdom',
setupFiles: '../../.build/vitest-setup.mjs',
},
});

19
packages/icons-react/tsconfig.json

@ -1,26 +1,9 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"strict": true,
"declaration": false,
"noEmitOnError": true,
"noEmit": true,
"noFallthroughCasesInSwitch": true,
"moduleResolution": "node",
"module": "ESNext",
"target": "ESNext",
"esModuleInterop": true,
"isolatedModules": true,
"lib": ["esnext", "dom"],
"skipLibCheck": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"allowImportingTsExtensions": true,
"downlevelIteration": true,
"sourceMap": true,
"outDir": "./dist",
"jsx": "react-jsx",
"types": ["@testing-library/jest-dom"]
},
"exclude": ["**/node_modules"],
"include": ["src"]
}

2
packages/icons-react/vitest.config.ts

@ -6,6 +6,6 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.js',
setupFiles: '../../.build/vitest-setup.mjs',
},
});

5
packages/icons-solidjs/setupVitest.js

@ -1,5 +0,0 @@
import { expect } from 'vitest';
import '@testing-library/jest-dom/vitest';
import htmlSerializer from 'jest-serializer-html';
expect.addSnapshotSerializer(htmlSerializer);

12
packages/icons-solidjs/tsconfig.json

@ -1,15 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"strict": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"noEmit": true,
"isolatedModules": true,
"outDir": "dist"
"jsxImportSource": "solid-js"
}
}

2
packages/icons-solidjs/vitest.config.js → packages/icons-solidjs/vitest.config.ts

@ -7,6 +7,6 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.js',
setupFiles: '../../.build/vitest-setup.mjs',
},
});

9
packages/icons-svelte-runes/setupVitest.ts

@ -1,9 +0,0 @@
import { expect } from 'vitest';
import * as matchers from '@testing-library/jest-dom/matchers';
import htmlSerializer from 'jest-serializer-html';
// Extend Vitest's expect with jest-dom matchers
expect.extend(matchers);
// Add HTML serializer for snapshots
expect.addSnapshotSerializer(htmlSerializer);

2
packages/icons-svelte-runes/src/Icon.svelte

@ -44,6 +44,8 @@
class={fullClassName}
{...typeAttributes}
>
<!-- icon nodes are a static list, so the each block does not need a key -->
<!-- eslint-disable-next-line svelte/require-each-key -->
{#each iconNode as [tag, attrs]}
<svelte:element this={tag} {...attrs} />
{/each}

2
packages/icons-svelte-runes/vitest.config.ts

@ -6,7 +6,7 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.ts',
setupFiles: '../../.build/vitest-setup.mjs',
},
resolve: {
conditions: ['browser'],

5
packages/icons-svelte/setupVitest.ts

@ -1,5 +0,0 @@
import { expect } from 'vitest';
import '@testing-library/jest-dom/vitest';
import htmlSerializer from 'jest-serializer-html';
expect.addSnapshotSerializer(htmlSerializer);

2
packages/icons-svelte/src/Icon.svelte

@ -25,6 +25,8 @@
stroke: color,
}}
>
<!-- icon nodes are a static list, so the each block does not need a key -->
<!-- eslint-disable-next-line svelte/require-each-key -->
{#each iconNode as [tag, attrs]}
<svelte:element this={tag} {...attrs} />
{/each}

2
packages/icons-svelte/vitest.config.ts

@ -10,7 +10,7 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.ts',
setupFiles: '../../.build/vitest-setup.mjs',
alias: [{ find: /^svelte$/, replacement: 'svelte/internal' }],
},
});

3
packages/icons-vue/package.json

@ -29,12 +29,13 @@
"dist"
],
"scripts": {
"build": "pnpm run clean && pnpm run copy:license && pnpm run build:icons && pnpm run build:bundles",
"build": "pnpm run clean && pnpm run copy:license && pnpm run build:icons && pnpm typecheck && pnpm run build:bundles",
"build:icons": "node build.mjs",
"build:bundles": "rollup -c ./rollup.config.mjs",
"copy:license": "cp ../../LICENSE ./LICENSE",
"clean": "find dist -mindepth 1 -delete 2>/dev/null; rm -rf dist && find . ! -name '.gitkeep' -path '*/src/icons/*' -exec rm -rf {} +",
"test": "vitest run",
"typecheck": "tsc",
"imports-check": "attw $(npm pack)"
},
"dependencies": {

1
packages/icons-vue/setupVitest.js

@ -1 +0,0 @@
import '@testing-library/jest-dom';

49
packages/icons-vue/test.spec.js

@ -112,14 +112,59 @@ describe('Vue Icon component', () => {
expect(textElement).toBeInTheDocument();
expect(container.innerHTML).toMatchInlineSnapshot(
`"<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-accessible"><path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path><path d="M10 16.5l2 -3l2 3m-2 -3v-2l3 -1m-6 0l3 1"></path><path d="M11.5 7.5a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0" fill="currentColor"></path><text>Hello World</text></svg>"`,
`
<svg xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="tabler-icon tabler-icon-accessible"
>
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0">
</path>
<path d="M10 16.5l2 -3l2 3m-2 -3v-2l3 -1m-6 0l3 1">
</path>
<path d="M11.5 7.5a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0"
fill="currentColor"
>
</path>
<text>
Hello World
</text>
</svg>
`,
);
});
it('should match snapshot', () => {
const { container } = render(IconAccessible);
expect(container.innerHTML).toMatchInlineSnapshot(
`"<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-accessible"><path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path><path d="M10 16.5l2 -3l2 3m-2 -3v-2l3 -1m-6 0l3 1"></path><path d="M11.5 7.5a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0" fill="currentColor"></path></svg>"`,
`
<svg xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="tabler-icon tabler-icon-accessible"
>
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0">
</path>
<path d="M10 16.5l2 -3l2 3m-2 -3v-2l3 -1m-6 0l3 1">
</path>
<path d="M11.5 7.5a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0"
fill="currentColor"
>
</path>
</svg>
`,
);
});
});

16
packages/icons-vue/tsconfig.json

@ -1,16 +1,8 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"jsx": "preserve",
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"lib": ["ESNext", "DOM"],
"skipLibCheck": true,
"noEmit": true
}
"jsx": "preserve"
},
"include": ["src"]
}

2
packages/icons-vue/vitest.config.mts → packages/icons-vue/vitest.config.ts

@ -6,6 +6,6 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './setupVitest.js',
setupFiles: '../../.build/vitest-setup.mjs',
},
});

312
pnpm-lock.yaml

@ -12,6 +12,18 @@ catalogs:
'@testing-library/jest-dom':
specifier: 7.0.1
version: 7.0.1
'@testing-library/react':
specifier: 16.3.3
version: 16.3.3
'@types/react':
specifier: 18.3.27
version: 18.3.27
'@types/react-dom':
specifier: 18.3.1
version: 18.3.1
'@vitejs/plugin-react':
specifier: 6.1.1
version: 6.1.1
astro:
specifier: ^7.3.5
version: 7.3.5
@ -21,6 +33,15 @@ catalogs:
jsdom:
specifier: 30.1.1
version: 30.1.1
react:
specifier: 18.3.1
version: 18.3.1
react-dom:
specifier: 18.3.1
version: 18.3.1
react-test-renderer:
specifier: 18.3.1
version: 18.3.1
rollup:
specifier: 4.63.5
version: 4.63.5
@ -86,6 +107,15 @@ importers:
eslint-config-prettier:
specifier: ^10.1.8
version: 10.1.8(eslint@10.11.0(jiti@2.7.0))
eslint-plugin-astro:
specifier: ^3.2.1
version: 3.2.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.11.0(jiti@2.7.0))(typescript-eslint@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3))
eslint-plugin-svelte:
specifier: ^3.23.0
version: 3.23.0(eslint@10.11.0(jiti@2.7.0))(svelte@5.57.1(@typescript-eslint/types@8.70.1))
eslint-plugin-vue:
specifier: ^10.11.1
version: 10.11.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.11.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.11.0(jiti@2.7.0)))
fs-extra:
specifier: ^11.4.1
version: 11.4.1
@ -391,10 +421,10 @@ importers:
version: 4.2.20
svelte-check:
specifier: ^3.6.5
version: 3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)
version: 3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)
svelte-preprocess:
specifier: ^5.1.3
version: 5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3)
version: 5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3)
vite:
specifier: 'catalog:'
version: 8.3.1(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(less@4.9.1)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.1)
@ -615,7 +645,7 @@ importers:
version: 19.3.0(react@19.3.0)
react-server-dom-webpack:
specifier: ^19.2.0
version: 19.3.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(webpack@5.105.2(esbuild@0.28.2))
version: 19.3.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(webpack@5.105.2(esbuild@0.28.2)(postcss@8.5.28))
test/test-react-types:
dependencies:
@ -656,7 +686,7 @@ importers:
version: 4.2.20
svelte-check:
specifier: ^3.6.5
version: 3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)
version: 3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)
tslib:
specifier: ^2.6.2
version: 2.8.1
@ -3377,6 +3407,10 @@ packages:
resolution: {integrity: sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==}
engines: {node: ^20.9.0 || >=22.0.0, npm: '>=10.8.2'}
'@pkgr/core@0.3.6':
resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==}
engines: {node: ^14.18.0 || >=16.0.0}
'@preact/preset-vite@2.10.6':
resolution: {integrity: sha512-ZZ5RIT2ZVXg8UxRA8VZpoT8CdpDG7RFIqOT4bELqNBp85+HKvQBbgmh3gsoW1UOQXx26TLe+ZRNKI7q281Kckw==}
peerDependencies:
@ -4908,6 +4942,10 @@ packages:
resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==}
engines: {node: '>=4'}
astro-eslint-parser@3.2.0:
resolution: {integrity: sha512-WavQUarfgwSbpCq4xsdcIBdX5KArfI2d6DD8EIloJIMthnB1508iNpx4C77EhUyMd03LpEt8HAPzwF/cG0V39g==}
engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0}
astro@7.3.5:
resolution: {integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==}
engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
@ -5878,10 +5916,57 @@ packages:
peerDependencies:
eslint: '>=7.0.0'
eslint-plugin-astro@3.2.1:
resolution: {integrity: sha512-IgU7LIkpEg0r6bQGwc3Ck5jHgkUk3rOrEfRhUxDtMx/M0GD3SG/turMtvwj989KRR12Wt1l89faZ5ynjvVL7hg==}
engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0}
peerDependencies:
'@typescript-eslint/parser': '>=8.61.0'
eslint: '>=10.0.0'
eslint-plugin-jsx-a11y: '>=6.10.2'
eslint-plugin-jsx-a11y-x: '>=0.2.0'
typescript-eslint: '>=8.61.0'
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
eslint-plugin-jsx-a11y:
optional: true
eslint-plugin-jsx-a11y-x:
optional: true
typescript-eslint:
optional: true
eslint-plugin-svelte@3.23.0:
resolution: {integrity: sha512-n9jRklDqy0+W834568a4ZIZTK7DHXxvvHHxxGP8nNq7N//pOZMubttskHOquyGgfTR4Z05q2NdGNlsTpIEA48w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.1 || ^9.0.0 || ^10.0.0
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
svelte:
optional: true
eslint-plugin-vue@10.11.1:
resolution: {integrity: sha512-pasVXhl7wUmIvhujoqs/m0mJ9r59QW1IR9XXYKGR0FETzSM+Hhlf4qKIYgWiDDP+9YKv4YfbwskD7LqIdVcgQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
'@typescript-eslint/parser': ^7.0.0 || ^8.0.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
vue-eslint-parser: ^10.3.0
peerDependenciesMeta:
'@stylistic/eslint-plugin':
optional: true
'@typescript-eslint/parser':
optional: true
eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
eslint-scope@8.4.0:
resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-scope@9.1.2:
resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
@ -5890,6 +5975,10 @@ packages:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@4.2.1:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@5.0.1:
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
@ -5907,6 +5996,10 @@ packages:
esm-env@1.2.2:
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
espree@10.4.0:
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@11.2.0:
resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
@ -6261,6 +6354,10 @@ packages:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
globals@16.5.0:
resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'}
globals@17.12.0:
resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==}
engines: {node: '>=18'}
@ -6979,6 +7076,9 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
known-css-properties@0.37.0:
resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==}
kolorist@1.8.0:
resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
@ -7101,6 +7201,10 @@ packages:
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
engines: {node: '>= 12.0.0'}
lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
@ -7994,6 +8098,18 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
postcss-load-config@3.1.4:
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
engines: {node: '>= 10'}
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
postcss-loader@8.2.0:
resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==}
engines: {node: '>= 18.12.0'}
@ -8040,6 +8156,12 @@ packages:
peerDependencies:
postcss: ^8.4.31
postcss-scss@4.0.9:
resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.4.29
postcss-selector-parser@7.1.6:
resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
engines: {node: '>=4'}
@ -9024,6 +9146,15 @@ packages:
svelte: ^4.0.0 || ^5.0.0-next.0
typescript: ^5.0.0 || ^6.0.0
svelte-eslint-parser@1.8.1:
resolution: {integrity: sha512-5zgKBqAf6V8Jyrmr1jViksyG4NKT8NheYwkdxRaMRDAqpGWi9wR8ktcGrAZbfMn/PHUp1BWzAp0cYQECkWuAMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.34.5}
peerDependencies:
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
svelte:
optional: true
svelte-hmr@0.16.0:
resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==}
engines: {node: ^12.20 || ^14.13.1 || >= 16}
@ -9105,6 +9236,10 @@ packages:
svgson@5.3.1:
resolution: {integrity: sha512-qdPgvUNWb40gWktBJnbJRelWcPzkLed/ShhnRsjbayXz8OtdPOzbil9jtiZdrYvSDumAz/VNQr6JaNfPx/gvPA==}
synckit@0.11.13:
resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
engines: {node: ^14.18.0 || >=16.0.0}
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
@ -9765,6 +9900,12 @@ packages:
vue-component-type-helpers@3.3.11:
resolution: {integrity: sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==}
vue-eslint-parser@10.4.1:
resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
vue-tsc@3.3.11:
resolution: {integrity: sha512-gOb0B9rtU2+f1dszwPqSH5kAieIF9ReeLhD3kSRNHv5WZZUQz/JdVXW0RTdqhNTMlQkqKzrTTviqKr/4FYZraQ==}
hasBin: true
@ -10049,6 +10190,10 @@ packages:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
engines: {node: '>=18'}
yaml@1.10.3:
resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==}
engines: {node: '>= 6'}
yaml@2.9.1:
resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==}
engines: {node: '>= 14.6'}
@ -13266,6 +13411,8 @@ snapshots:
'@phun-ky/typeof@2.0.3': {}
'@pkgr/core@0.3.6': {}
'@preact/preset-vite@2.10.6(@babel/core@7.29.7)(preact@10.29.8)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(less@4.9.1)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.1))':
dependencies:
'@babel/core': 7.29.7
@ -14347,7 +14494,7 @@ snapshots:
'@types/react-dom@18.3.1':
dependencies:
'@types/react': 18.3.27
'@types/react': 19.3.0
'@types/react-dom@18.3.7(@types/react@18.3.27)':
dependencies:
@ -14974,6 +15121,20 @@ snapshots:
astral-regex@1.0.0: {}
astro-eslint-parser@3.2.0:
dependencies:
'@astrojs/compiler-rs': 0.5.1
'@typescript-eslint/scope-manager': 8.70.1
'@typescript-eslint/types': 8.70.1
debug: 4.4.3
eslint-scope: 9.1.2
eslint-visitor-keys: 5.0.1
espree: 11.2.0
semver: 7.8.5
tinyglobby: 0.2.17
transitivePeerDependencies:
- supports-color
astro@7.3.5(@types/node@26.6.2)(jiti@2.7.0)(less@4.9.1)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.1):
dependencies:
'@astrojs/compiler-rs': 0.5.1
@ -15655,7 +15816,7 @@ snapshots:
postcss-modules-scope: 3.2.1(postcss@8.5.28)
postcss-modules-values: 4.0.0(postcss@8.5.28)
postcss-value-parser: 4.2.0
semver: 7.7.4
semver: 7.8.5
optionalDependencies:
webpack: 5.105.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.23)
@ -16109,11 +16270,65 @@ snapshots:
dependencies:
eslint: 10.11.0(jiti@2.7.0)
eslint-plugin-astro@3.2.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.11.0(jiti@2.7.0))(typescript-eslint@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3)):
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0))
'@jridgewell/sourcemap-codec': 1.6.0
'@typescript-eslint/types': 8.70.1
astro-eslint-parser: 3.2.0
eslint: 10.11.0(jiti@2.7.0)
espree: 11.2.0
globals: 17.12.0
postcss: 8.5.28
postcss-selector-parser: 7.1.6
synckit: 0.11.13
optionalDependencies:
'@typescript-eslint/parser': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3)
typescript-eslint: 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3)
transitivePeerDependencies:
- supports-color
eslint-plugin-svelte@3.23.0(eslint@10.11.0(jiti@2.7.0))(svelte@5.57.1(@typescript-eslint/types@8.70.1)):
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0))
'@jridgewell/sourcemap-codec': 1.6.0
eslint: 10.11.0(jiti@2.7.0)
esutils: 2.0.3
globals: 16.5.0
known-css-properties: 0.37.0
postcss: 8.5.28
postcss-load-config: 3.1.4(postcss@8.5.28)
postcss-safe-parser: 7.1.0(postcss@8.5.28)
semver: 7.8.5
svelte-eslint-parser: 1.8.1(svelte@5.57.1(@typescript-eslint/types@8.70.1))
optionalDependencies:
svelte: 5.57.1(@typescript-eslint/types@8.70.1)
transitivePeerDependencies:
- ts-node
eslint-plugin-vue@10.11.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.11.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.11.0(jiti@2.7.0))):
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0))
eslint: 10.11.0(jiti@2.7.0)
natural-compare: 1.4.0
nth-check: 2.1.1
postcss-selector-parser: 7.1.6
semver: 7.8.5
vue-eslint-parser: 10.4.1(eslint@10.11.0(jiti@2.7.0))
xml-name-validator: 5.0.0
optionalDependencies:
'@typescript-eslint/parser': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@5.9.3)
eslint-scope@5.1.1:
dependencies:
esrecurse: 4.3.0
estraverse: 4.3.0
eslint-scope@8.4.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
eslint-scope@9.1.2:
dependencies:
'@types/esrecurse': 4.3.1
@ -16123,6 +16338,8 @@ snapshots:
eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.2.1: {}
eslint-visitor-keys@5.0.1: {}
eslint@10.11.0(jiti@2.7.0):
@ -16164,6 +16381,12 @@ snapshots:
esm-env@1.2.2: {}
espree@10.4.0:
dependencies:
acorn: 8.18.0
acorn-jsx: 5.3.2(acorn@8.18.0)
eslint-visitor-keys: 4.2.1
espree@11.2.0:
dependencies:
acorn: 8.18.0
@ -16574,6 +16797,8 @@ snapshots:
once: 1.4.0
path-is-absolute: 1.0.1
globals@16.5.0: {}
globals@17.12.0: {}
gopd@1.2.0: {}
@ -17076,7 +17301,7 @@ snapshots:
'@babel/parser': 7.29.9
'@istanbuljs/schema': 0.1.6
istanbul-lib-coverage: 3.2.2
semver: 7.7.4
semver: 7.8.5
transitivePeerDependencies:
- supports-color
@ -17376,6 +17601,8 @@ snapshots:
kleur@4.1.5: {}
known-css-properties@0.37.0: {}
kolorist@1.8.0: {}
launch-editor@2.14.1:
@ -17488,6 +17715,8 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.33.0
lightningcss-win32-x64-msvc: 1.33.0
lilconfig@2.1.0: {}
lines-and-columns@1.2.4: {}
listr2@9.0.5:
@ -18185,7 +18414,7 @@ snapshots:
dependencies:
hosted-git-info: 9.0.3
proc-log: 6.1.0
semver: 7.7.4
semver: 7.8.5
validate-npm-package-name: 7.0.2
npm-packlist@10.0.4:
@ -18590,12 +18819,19 @@ snapshots:
possible-typed-array-names@1.1.0: {}
postcss-load-config@3.1.4(postcss@8.5.28):
dependencies:
lilconfig: 2.1.0
yaml: 1.10.3
optionalDependencies:
postcss: 8.5.28
postcss-loader@8.2.0(postcss@8.5.23)(typescript@5.9.3)(webpack@5.105.2(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)):
dependencies:
cosmiconfig: 9.0.2(typescript@5.9.3)
jiti: 2.7.0
postcss: 8.5.23
semver: 7.7.4
semver: 7.8.5
optionalDependencies:
webpack: 5.105.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.23)
transitivePeerDependencies:
@ -18628,6 +18864,10 @@ snapshots:
dependencies:
postcss: 8.5.28
postcss-scss@4.0.9(postcss@8.5.28):
dependencies:
postcss: 8.5.28
postcss-selector-parser@7.1.6:
dependencies:
cssesc: 3.0.0
@ -18955,13 +19195,13 @@ snapshots:
react-refresh@0.14.2: {}
react-server-dom-webpack@19.3.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(webpack@5.105.2(esbuild@0.28.2)):
react-server-dom-webpack@19.3.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(webpack@5.105.2(esbuild@0.28.2)(postcss@8.5.28)):
dependencies:
acorn-loose: 8.5.2
neo-async: 2.6.2
react: 19.3.0
react-dom: 19.3.0(react@19.3.0)
webpack: 5.105.2(esbuild@0.28.2)
webpack: 5.105.2(esbuild@0.28.2)(postcss@8.5.28)
webpack-sources: 3.5.1
react-shallow-renderer@16.15.0(react@18.3.1):
@ -19969,14 +20209,14 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
svelte-check@3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20):
svelte-check@3.8.6(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
chokidar: 3.6.0
picocolors: 1.1.1
sade: 1.8.1
svelte: 4.2.20
svelte-preprocess: 5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3)
svelte-preprocess: 5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- '@babel/core'
@ -20002,11 +20242,23 @@ snapshots:
transitivePeerDependencies:
- picomatch
svelte-eslint-parser@1.8.1(svelte@5.57.1(@typescript-eslint/types@8.70.1)):
dependencies:
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
espree: 10.4.0
postcss: 8.5.28
postcss-scss: 4.0.9(postcss@8.5.28)
postcss-selector-parser: 7.1.6
semver: 7.8.5
optionalDependencies:
svelte: 5.57.1(@typescript-eslint/types@8.70.1)
svelte-hmr@0.16.0(svelte@4.2.20):
dependencies:
svelte: 4.2.20
svelte-preprocess@5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3):
svelte-preprocess@5.1.4(@babel/core@7.29.7)(less@4.9.1)(postcss-load-config@3.1.4(postcss@8.5.28))(postcss@8.5.28)(pug@3.0.3)(sass@1.105.0)(svelte@4.2.20)(typescript@5.9.3):
dependencies:
'@types/pug': 2.0.10
detect-indent: 6.1.0
@ -20018,6 +20270,7 @@ snapshots:
'@babel/core': 7.29.7
less: 4.9.1
postcss: 8.5.28
postcss-load-config: 3.1.4(postcss@8.5.28)
pug: 3.0.3
sass: 1.105.0
typescript: 5.9.3
@ -20114,6 +20367,10 @@ snapshots:
deep-rename-keys: 0.2.1
xml-reader: 2.4.3
synckit@0.11.13:
dependencies:
'@pkgr/core': 0.3.6
tapable@2.3.3: {}
tar@7.5.22:
@ -20142,15 +20399,16 @@ snapshots:
lightningcss: 1.33.0
postcss: 8.5.23
terser-webpack-plugin@5.6.1(esbuild@0.28.2)(webpack@5.105.2(esbuild@0.28.2)):
terser-webpack-plugin@5.6.1(esbuild@0.28.2)(postcss@8.5.28)(webpack@5.105.2(esbuild@0.28.2)(postcss@8.5.28)):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1
schema-utils: 4.5.0
terser: 5.51.2
webpack: 5.105.2(esbuild@0.28.2)
webpack: 5.105.2(esbuild@0.28.2)(postcss@8.5.28)
optionalDependencies:
esbuild: 0.28.2
postcss: 8.5.28
terser@5.46.0:
dependencies:
@ -20645,6 +20903,18 @@ snapshots:
vue-component-type-helpers@3.3.11: {}
vue-eslint-parser@10.4.1(eslint@10.11.0(jiti@2.7.0)):
dependencies:
debug: 4.4.3
eslint: 10.11.0(jiti@2.7.0)
eslint-scope: 9.1.2
eslint-visitor-keys: 5.0.1
espree: 11.2.0
esquery: 1.7.0
semver: 7.8.5
transitivePeerDependencies:
- supports-color
vue-tsc@3.3.11(typescript@5.9.3):
dependencies:
'@volar/typescript': 2.4.28
@ -20759,7 +21029,7 @@ snapshots:
typed-assert: 1.0.9
webpack: 5.105.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.23)
webpack@5.105.2(esbuild@0.28.2):
webpack@5.105.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.23):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.9
@ -20783,7 +21053,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 4.5.0
tapable: 2.3.3
terser-webpack-plugin: 5.6.1(esbuild@0.28.2)(webpack@5.105.2(esbuild@0.28.2))
terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)(webpack@5.105.2(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23))
watchpack: 2.5.2
webpack-sources: 3.5.1
transitivePeerDependencies:
@ -20800,7 +21070,7 @@ snapshots:
- postcss
- uglify-js
webpack@5.105.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.23):
webpack@5.105.2(esbuild@0.28.2)(postcss@8.5.28):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.9
@ -20824,7 +21094,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 4.5.0
tapable: 2.3.3
terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23)(webpack@5.105.2(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.23))
terser-webpack-plugin: 5.6.1(esbuild@0.28.2)(postcss@8.5.28)(webpack@5.105.2(esbuild@0.28.2)(postcss@8.5.28))
watchpack: 2.5.2
webpack-sources: 3.5.1
transitivePeerDependencies:
@ -21014,6 +21284,8 @@ snapshots:
yallist@5.0.0: {}
yaml@1.10.3: {}
yaml@2.9.1: {}
yargs-parser@18.1.3:

15
tsconfig.base.json

@ -0,0 +1,15 @@
{
"compilerOptions": {
"strict": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["esnext", "dom"],
"esModuleInterop": true,
"isolatedModules": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"noFallthroughCasesInSwitch": true,
"noEmit": true
}
}

13
turbo.json

@ -1,16 +1,21 @@
{
"$schema": "https://v2-10-7.turborepo.dev/schema.json",
"globalEnv": ["ICONS_LIMIT"],
"globalEnv": ["ICONS_LIMIT", "SOURCE_DATE_EPOCH"],
"tasks": {
"build": {
"outputs": [
"dist/**",
"src/icons/**",
"src/icons-dts/**",
"src/aliases.ts",
"src/icons-list.ts",
"src/dynamic-imports.ts",
"icons/**",
"icons.json",
"tabler-nodes-*.json",
"categories/**",
"docs/**"
"docs/**",
"LICENSE"
],
"dependsOn": ["^build"],
"inputs": [
@ -19,10 +24,10 @@
"../../aliases.json",
"../../.build/**",
"!../../.build/**/*.test.mjs",
"../../LICENSE"
"../../LICENSE",
"../../tsconfig.base.json"
]
},
"lint": {},
"dev": {
"cache": false,
"persistent": true

Loading…
Cancel
Save