slim-select 2.12.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -61,7 +61,8 @@ npm install slim-select
61
61
 
62
62
  ```javascript
63
63
  import SlimSelect from 'slim-select'
64
- import 'slim-select/styles' // optional import method
64
+ import 'slim-select/styles' // optional css import method
65
+ import 'slim-select/scss' // optional scss import method
65
66
 
66
67
  new SlimSelect({
67
68
  select: '#selectElement',
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import CssClasses from './classes';
2
2
  import Render from './render';
3
3
  import Select from './select';
4
- import Settings, { SettingsPartial } from './settings';
5
- import Store, { DataArray, DataArrayPartial, Option, OptionOptional } from './store';
4
+ import Settings from './settings';
5
+ import type { SettingsPartial } from './settings';
6
+ import Store from './store';
7
+ import type { DataArray, DataArrayPartial, Option, OptionOptional } from './store';
8
+ export { DataArray, DataArrayPartial, Option, OptionOptional, SettingsPartial };
6
9
  export interface Config {
7
10
  select: string | Element;
8
11
  data?: DataArrayPartial;
package/jest.config.js CHANGED
@@ -1,14 +1,14 @@
1
1
  /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
2
+ export default {
3
3
  verbose: true,
4
4
  preset: 'ts-jest',
5
5
  testEnvironment: 'jsdom',
6
6
  testMatch: ['**/*.test.ts'],
7
7
  roots: ['./src/slim-select'],
8
- reporters: process.env.CI ? [['github-actions', {silent: false}], 'summary'] : ['default'],
8
+ reporters: process.env.CI ? [['github-actions', { silent: false }], 'summary'] : ['default'],
9
9
  coverageThreshold: {
10
10
  global: {
11
- lines: 75,
12
- },
13
- },
11
+ lines: 75
12
+ }
13
+ }
14
14
  }
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "slim-select",
3
3
  "description": "Slim advanced select dropdown",
4
- "version": "2.12.0",
4
+ "version": "2.13.0",
5
+ "type": "module",
5
6
  "author": "Brian Voelker <brian@webiswhatido.com> (http://webiswhatido.com)",
6
7
  "homepage": "https://slimselectjs.com",
7
8
  "license": "MIT",
@@ -35,7 +36,8 @@
35
36
  "./*": {
36
37
  "types": "./dist/*.d.ts"
37
38
  },
38
- "./styles": "./dist/slimselect.css"
39
+ "./styles": "./dist/slimselect.css",
40
+ "./scss": "./src/slim-select/slimselect.scss"
39
41
  },
40
42
  "scripts": {
41
43
  "dev": "vite --port=1111",
@@ -48,48 +50,49 @@
48
50
  "build:library:css": "cd src/slim-select && sass ./slimselect.scss ../../dist/slimselect.css --style=compressed && cd ../../",
49
51
  "lint": "prettier --write ./src/**/*",
50
52
  "test": "jest",
51
- "test:coverage": "jest --coverage"
53
+ "test:coverage": "jest --coverage",
54
+ "release": "node release.js"
52
55
  },
53
56
  "devDependencies": {
54
- "@jest/globals": "^30.0.2",
57
+ "@jest/globals": "^30.1.2",
55
58
  "@rollup/plugin-babel": "^6.0.4",
56
59
  "@rollup/plugin-commonjs": "^28.0.6",
57
60
  "@rollup/plugin-node-resolve": "^16.0.1",
58
61
  "@rollup/plugin-replace": "^6.0.2",
59
62
  "@rollup/plugin-terser": "^0.4.4",
60
- "@rollup/plugin-typescript": "^12.1.3",
61
- "@testing-library/jest-dom": "^6.6.3",
63
+ "@rollup/plugin-typescript": "^12.1.4",
64
+ "@testing-library/jest-dom": "^6.8.0",
62
65
  "@testing-library/user-event": "^14.6.1",
63
66
  "@types/downloadjs": "^1.4.6",
64
67
  "@types/jest": "^30.0.0",
65
- "@typescript-eslint/eslint-plugin": "^8.34.1",
66
- "@typescript-eslint/parser": "^8.34.1",
67
- "@vitejs/plugin-vue": "^5.2.4",
68
+ "@typescript-eslint/eslint-plugin": "^8.44.1",
69
+ "@typescript-eslint/parser": "^8.44.1",
70
+ "@vitejs/plugin-vue": "^6.0.1",
68
71
  "clipboard": "^2.0.11",
69
72
  "downloadjs": "^1.4.7",
70
- "eslint": "^9.29.0",
71
- "eslint-config-prettier": "^10.1.5",
72
- "eslint-plugin-prettier": "^5.5.0",
73
+ "eslint": "^9.36.0",
74
+ "eslint-config-prettier": "^10.1.8",
75
+ "eslint-plugin-prettier": "^5.5.4",
73
76
  "identity-obj-proxy": "^3.0.0",
74
- "jest": "^30.0.2",
77
+ "jest": "^30.1.3",
75
78
  "jest-canvas-mock": "^2.5.0",
76
- "jest-environment-jsdom": "^30.0.2",
77
- "prettier": "^3.5.3",
79
+ "jest-environment-jsdom": "^30.1.2",
80
+ "prettier": "^3.6.2",
78
81
  "prismjs": "^1.30.0",
79
82
  "rimraf": "^6.0.1",
80
- "rollup": "^4.44.0",
83
+ "rollup": "^4.52.2",
81
84
  "rollup-plugin-peer-deps-external": "^2.2.4",
82
85
  "rollup-plugin-typescript2": "^0.36.0",
83
86
  "rollup-plugin-vue": "^6.0.0",
84
- "sass": "^1.89.2",
85
- "ts-jest": "^29.4.0",
87
+ "sass": "^1.93.2",
88
+ "ts-jest": "^29.4.4",
86
89
  "tslib": "^2.8.1",
87
- "typescript": "^5.8.3",
88
- "vite": "^6.3.5",
90
+ "typescript": "^5.9.2",
91
+ "vite": "^7.1.7",
89
92
  "vite-plugin-dts": "^4.5.4",
90
- "vue": "^3.5.17",
93
+ "vue": "^3.5.22",
91
94
  "vue-router": "^4.5.1",
92
- "vue-tsc": "^2.2.10",
95
+ "vue-tsc": "^3.0.8",
93
96
  "vuex": "^4.0.2"
94
97
  }
95
- }
98
+ }
package/release.js ADDED
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execSync } from 'child_process'
4
+ import { readFileSync, writeFileSync } from 'fs'
5
+ import { fileURLToPath } from 'url'
6
+ import { dirname, join } from 'path'
7
+ import readline from 'readline'
8
+ import process from 'process'
9
+
10
+ const __filename = fileURLToPath(import.meta.url)
11
+ const __dirname = dirname(__filename)
12
+ const rootDir = __dirname
13
+
14
+ // Colors for console output
15
+ const colors = {
16
+ reset: '\x1b[0m',
17
+ bright: '\x1b[1m',
18
+ red: '\x1b[31m',
19
+ green: '\x1b[32m',
20
+ yellow: '\x1b[33m',
21
+ blue: '\x1b[34m',
22
+ magenta: '\x1b[35m',
23
+ cyan: '\x1b[36m'
24
+ }
25
+
26
+ function log(message, color = 'reset') {
27
+ console.log(`${colors[color]}${message}${colors.reset}`)
28
+ }
29
+
30
+ function exec(command, options = {}) {
31
+ try {
32
+ log(`Running: ${command}`, 'cyan')
33
+ execSync(command, {
34
+ stdio: 'inherit',
35
+ cwd: rootDir,
36
+ ...options
37
+ })
38
+ return true
39
+ } catch (error) {
40
+ log(`Command failed: ${command}`, 'red')
41
+ log(`Exit code: ${error.status}`, 'red')
42
+ return false
43
+ }
44
+ }
45
+
46
+ function readPackageJson() {
47
+ const packagePath = join(rootDir, 'package.json')
48
+ return JSON.parse(readFileSync(packagePath, 'utf8'))
49
+ }
50
+
51
+ function writePackageJson(packageJson) {
52
+ const packagePath = join(rootDir, 'package.json')
53
+ writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n')
54
+ }
55
+
56
+ function askQuestion(question) {
57
+ const rl = readline.createInterface({
58
+ input: process.stdin,
59
+ output: process.stdout
60
+ })
61
+
62
+ return new Promise((resolve) => {
63
+ rl.question(question, (answer) => {
64
+ rl.close()
65
+ resolve(answer)
66
+ })
67
+ })
68
+ }
69
+
70
+ function validateVersion(currentVersion, newVersion) {
71
+ // Check if version format is valid (x.y.z)
72
+ const versionRegex = /^\d+\.\d+\.\d+$/
73
+ if (!versionRegex.test(newVersion)) {
74
+ log('āŒ Invalid version format. Please use format: x.y.z (e.g., 1.0.1)', 'red')
75
+ return null
76
+ }
77
+
78
+ const [major1, minor1, patch1] = currentVersion.split('.').map(Number)
79
+ const [major2, minor2, patch2] = newVersion.split('.').map(Number)
80
+
81
+ // Check if new version is greater than current
82
+ if (major2 > major1) return 'major'
83
+ if (major2 === major1 && minor2 > minor1) return 'minor'
84
+ if (major2 === major1 && minor2 === minor1 && patch2 > patch1) return 'patch'
85
+
86
+ log('āŒ New version must be greater than current version', 'red')
87
+ log(` Current: ${currentVersion}`, 'yellow')
88
+ log(` New: ${newVersion}`, 'yellow')
89
+ return null
90
+ }
91
+
92
+ async function main() {
93
+ log('šŸš€ Starting release process...', 'bright')
94
+
95
+ // Step 1: Run tests
96
+ log('\nšŸ“‹ Step 1: Running tests...', 'yellow')
97
+ if (!exec('npm test')) {
98
+ log('āŒ Tests failed. Aborting release.', 'red')
99
+ process.exit(1)
100
+ }
101
+ log('āœ… Tests passed!', 'green')
102
+
103
+ // Step 2: Build the project
104
+ log('\nšŸ”Ø Step 2: Building project...', 'yellow')
105
+
106
+ // First run type check to catch TypeScript errors
107
+ log('Running type check...', 'cyan')
108
+ if (!exec('npx tsc --noEmit')) {
109
+ log('āŒ Type check failed. Aborting release.', 'red')
110
+ process.exit(1)
111
+ }
112
+
113
+ // Then build
114
+ if (!exec('npm run build')) {
115
+ log('āŒ Build failed. Aborting release.', 'red')
116
+ process.exit(1)
117
+ }
118
+ log('āœ… Build successful!', 'green')
119
+
120
+ // Step 3: Confirm documentation update
121
+ log('\nšŸ“š Step 3: Documentation update confirmation...', 'yellow')
122
+ log(' Please ensure you have updated the documentation before proceeding.', 'cyan')
123
+
124
+ let docConfirmed = false
125
+ do {
126
+ const docAnswer = await askQuestion('Have you updated the documentation? (y/n): ')
127
+ docConfirmed = docAnswer.toLowerCase() === 'y' || docAnswer.toLowerCase() === 'yes'
128
+
129
+ if (!docConfirmed) {
130
+ log('āŒ Please update the documentation before continuing with the release.', 'red')
131
+ log(' You can run: npm run build:docs', 'cyan')
132
+ }
133
+ } while (!docConfirmed)
134
+
135
+ log('āœ… Documentation update confirmed!', 'green')
136
+
137
+ // Step 4: Get current version and ask for new version
138
+ const packageJson = readPackageJson()
139
+ const currentVersion = packageJson.version
140
+
141
+ log(`\nšŸ“¦ Current version: ${currentVersion}`, 'blue')
142
+ log(' Format: x.y.z (e.g., 1.0.1, 1.1.0, 2.0.0)', 'cyan')
143
+
144
+ let newVersion
145
+ let versionType
146
+
147
+ do {
148
+ newVersion = await askQuestion(`Enter new version (current: ${currentVersion}): `)
149
+ versionType = validateVersion(currentVersion, newVersion)
150
+ } while (!versionType)
151
+
152
+ log(`\nšŸ”„ Step 4: Updating version from ${currentVersion} to ${newVersion} (${versionType} release)...`, 'yellow')
153
+
154
+ // Update package.json
155
+ packageJson.version = newVersion
156
+ writePackageJson(packageJson)
157
+ log('āœ… Package.json updated!', 'green')
158
+
159
+ // Update package-lock.json to match the new version
160
+ log('Updating package-lock.json...', 'cyan')
161
+ if (!exec('npm install --package-lock-only')) {
162
+ log('āŒ Failed to update package-lock.json. Aborting release.', 'red')
163
+ process.exit(1)
164
+ }
165
+ log('āœ… Package-lock.json updated!', 'green')
166
+
167
+ // Step 5: NPM login
168
+ log('\nšŸ” Step 5: NPM login...', 'yellow')
169
+ if (!exec('npm login')) {
170
+ log('āŒ NPM login failed. Aborting release.', 'red')
171
+ process.exit(1)
172
+ }
173
+ log('āœ… NPM login successful!', 'green')
174
+
175
+ // Step 6: NPM publish
176
+ log('\nšŸ“¤ Step 6: Publishing to NPM...', 'yellow')
177
+ if (!exec('npm publish')) {
178
+ log('āŒ NPM publish failed. Aborting release.', 'red')
179
+ process.exit(1)
180
+ }
181
+ log('āœ… Package published to NPM!', 'green')
182
+
183
+ log('\nšŸŽ‰ Release completed successfully!', 'bright')
184
+ log(`šŸ“¦ Version ${newVersion} is now published on NPM`, 'green')
185
+ log(`šŸ”— Package: https://www.npmjs.com/package/${packageJson.name}`, 'blue')
186
+ }
187
+
188
+ // Handle errors
189
+ process.on('unhandledRejection', (error) => {
190
+ log(`āŒ Unhandled error: ${error}`, 'red')
191
+ process.exit(1)
192
+ })
193
+
194
+ // Run the release script
195
+ main().catch((error) => {
196
+ log(`āŒ Release failed: ${error}`, 'red')
197
+ process.exit(1)
198
+ })
@@ -2,8 +2,12 @@ import CssClasses from './classes'
2
2
  import { debounce, hasClassInTree, isEqual } from './helpers'
3
3
  import Render from './render'
4
4
  import Select from './select'
5
- import Settings, { SettingsPartial } from './settings'
6
- import Store, { DataArray, DataArrayPartial, Option, OptionOptional } from './store'
5
+ import Settings from './settings'
6
+ import type { SettingsPartial } from './settings'
7
+ import Store from './store'
8
+ import type { DataArray, DataArrayPartial, Option, OptionOptional } from './store'
9
+
10
+ export { DataArray, DataArrayPartial, Option, OptionOptional, SettingsPartial }
7
11
 
8
12
  export interface Config {
9
13
  select: string | Element
@@ -748,7 +748,7 @@ describe('render module', () => {
748
748
  test('simply do nothing without breaking when options are empty', () => {
749
749
  render.renderOptions([])
750
750
 
751
- expect(() => render.highlight('up')).not.toThrowError()
751
+ expect(() => render.highlight('up')).not.toThrow()
752
752
  })
753
753
 
754
754
  test('highlight single option that is not already highlighted', () => {
package/vite.config.mts CHANGED
@@ -3,13 +3,6 @@ import { defineConfig } from 'vite'
3
3
 
4
4
  // https://vitejs.dev/config/
5
5
  export default defineConfig({
6
- css: {
7
- preprocessorOptions: {
8
- scss: {
9
- api: 'modern-compiler' // or "modern"
10
- }
11
- }
12
- },
13
6
  build: {
14
7
  outDir: 'docs',
15
8
  emptyOutDir: true,