Skip to content

Commit df343af

Browse files
wheatjsantfu
andauthored
feat(useChangeCase)!: migrate to change-case@v5, closes #3457 (#3460)
Co-authored-by: Anthony Fu <[email protected]>
1 parent cb44cee commit df343af

File tree

7 files changed

+65
-197
lines changed

7 files changed

+65
-197
lines changed

packages/integrations/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
"peerDependencies": {
9696
"async-validator": "^4",
9797
"axios": "^1",
98-
"change-case": "^4",
98+
"change-case": "^5",
9999
"drauu": "^0.3",
100100
"focus-trap": "^7",
101101
"fuse.js": "^7",
@@ -155,7 +155,7 @@
155155
"@types/sortablejs": "^1.15.8",
156156
"async-validator": "^4.2.5",
157157
"axios": "^1.7.2",
158-
"change-case": "^4.1.2",
158+
"change-case": "^5.3.0",
159159
"drauu": "^0.3.7",
160160
"focus-trap": "^7.5.4",
161161
"fuse.js": "^7.0.0",

packages/integrations/useChangeCase/changeCase.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

packages/integrations/useChangeCase/demo.vue

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,18 @@
11
<script setup lang="ts">
2-
import { computed, ref, shallowReadonly } from 'vue-demi'
2+
import { ref } from 'vue-demi'
3+
import * as ChangeCase from 'change-case'
34
import { useChangeCase } from '.'
45
import type { ChangeCaseType } from '.'
56
6-
const arr: Array<ChangeCaseType> = [
7-
'camelCase',
8-
'capitalCase',
9-
'constantCase',
10-
'dotCase',
11-
'headerCase',
12-
'noCase',
13-
'paramCase',
14-
'pascalCase',
15-
'pathCase',
16-
'sentenceCase',
17-
'snakeCase',
18-
]
19-
const types = shallowReadonly(arr)
7+
const transforms: any = Object.keys(ChangeCase).filter(v => v.endsWith('Case'))
208
const input = ref('helloWorld')
21-
const type = ref<ChangeCaseType>(arr[0])
22-
const changeCase = computed(() => {
23-
return useChangeCase(input, type.value)
24-
})
9+
const type = ref<ChangeCaseType>(transforms[0])
10+
const changeCase = useChangeCase(input, type)
2511
</script>
2612

2713
<template>
2814
<div>
29-
<label v-for="item in types" :key="item" class="radio">
15+
<label v-for="item in transforms" :key="item" class="radio">
3016
<input v-model="type" :value="item" type="radio">
3117
<span>{{ item }}</span>
3218
</label>
@@ -35,9 +21,6 @@ const changeCase = computed(() => {
3521
<pre lang="yaml">{{ changeCase }}</pre>
3622
</template>
3723

38-
<style scoped>
39-
</style>
40-
4124
<style scoped lang="postcss">
4225
input {
4326
--tw-ring-offset-width: 1px !important;
@@ -46,7 +29,7 @@ input {
4629
}
4730
4831
.radio {
49-
width: 7rem;
32+
width: 9rem;
5033
@apply ml-2;
5134
@apply inline-flex items-center my-auto cursor-pointer select-none;
5235
}

packages/integrations/useChangeCase/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Subsitutes `useCamelCase`, `usePascalCase`, `useSnakeCase`, `useSentenceCase`, `
1111
## Install
1212

1313
```bash
14-
npm i change-case@^4
14+
npm i change-case@^5
1515
```
1616

1717
## Usage

packages/integrations/useChangeCase/index.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('useChangeCase', () => {
3333
delimiterHelloWorld: 'hello-world',
3434
delimiterVueuse: 'vue-use',
3535
},
36-
headerCase: {
36+
trainCase: {
3737
helloWorld: 'Hello-World',
3838
vueuse: 'Vue-Use',
3939
delimiterHelloWorld: 'Hello-World',
@@ -45,7 +45,7 @@ describe('useChangeCase', () => {
4545
delimiterHelloWorld: 'hello-world',
4646
delimiterVueuse: 'vue-use',
4747
},
48-
paramCase: {
48+
kebabCase: {
4949
helloWorld: 'hello-world',
5050
vueuse: 'vue-use',
5151
delimiterHelloWorld: 'hello-world',
@@ -57,6 +57,12 @@ describe('useChangeCase', () => {
5757
delimiterHelloWorld: 'Hello-World',
5858
delimiterVueuse: 'Vue-Use',
5959
},
60+
pascalSnakeCase: {
61+
helloWorld: 'Hello_World',
62+
vueuse: 'Vue_Use',
63+
delimiterHelloWorld: 'Hello-World',
64+
delimiterVueuse: 'Vue-Use',
65+
},
6066
pathCase: {
6167
helloWorld: 'hello/world',
6268
vueuse: 'vue/use',

packages/integrations/useChangeCase/index.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,43 @@ import type { MaybeRef, MaybeRefOrGetter } from '@vueuse/shared'
33
import { toValue } from '@vueuse/shared'
44
import type { ComputedRef, WritableComputedRef } from 'vue-demi'
55
import { computed, ref } from 'vue-demi'
6-
import * as changeCase from './changeCase'
6+
import * as changeCase from 'change-case'
77

8-
export type ChangeCaseType = keyof typeof changeCase
8+
type EndsWithCase<T> = T extends `${infer _}Case` ? T : never
9+
type FilterKeys<T> = { [K in keyof T as K extends string ? K : never]: EndsWithCase<K> }
10+
type ChangeCaseKeys = FilterKeys<typeof changeCase>
911

10-
export function useChangeCase(input: MaybeRef<string>, type: ChangeCaseType, options?: Options | undefined): WritableComputedRef<string>
11-
export function useChangeCase(input: MaybeRefOrGetter<string>, type: ChangeCaseType, options?: Options | undefined): ComputedRef<string>
12+
export type ChangeCaseType = ChangeCaseKeys[keyof ChangeCaseKeys]
13+
14+
const changeCaseTransforms: any = /* @__PURE__ */ Object.values(changeCase)
15+
.filter(v => typeof v === 'function' && v.name.endsWith('Case')).reduce((acc, fn) => {
16+
acc[fn.name] = fn
17+
return acc
18+
}, {} as any)
19+
20+
export function useChangeCase(input: MaybeRef<string>, type: MaybeRefOrGetter<ChangeCaseType>, options?: MaybeRefOrGetter<Options> | undefined): WritableComputedRef<string>
21+
export function useChangeCase(input: MaybeRefOrGetter<string>, type: MaybeRefOrGetter<ChangeCaseType>, options?: MaybeRefOrGetter<Options> | undefined): ComputedRef<string>
1222

1323
/**
1424
* Reactive wrapper for `change-case`
1525
*
1626
* @see https://vueuse.org/useChangeCase
1727
*/
18-
export function useChangeCase(input: MaybeRefOrGetter<string>, type: ChangeCaseType, options?: Options | undefined) {
28+
export function useChangeCase(input: MaybeRefOrGetter<string>, type: MaybeRefOrGetter<ChangeCaseType>, options?: MaybeRefOrGetter<Options> | undefined) {
29+
const typeRef = computed(() => {
30+
const t = toValue(type)
31+
if (!changeCaseTransforms[t])
32+
throw new Error(`Invalid change case type "${t}"`)
33+
return t
34+
})
35+
1936
if (typeof input === 'function')
20-
return computed(() => changeCase[type](toValue(input), options))
37+
return computed(() => changeCaseTransforms[typeRef.value](toValue(input), toValue(options)))
2138

2239
const text = ref(input)
2340
return computed<string>({
2441
get() {
25-
return changeCase[type](text.value, options)
42+
return changeCaseTransforms[typeRef.value](text.value, toValue(options))
2643
},
2744
set(value) {
2845
text.value = value

0 commit comments

Comments
 (0)