type-fest 1.1.3 → 1.2.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-fest",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "description": "A collection of essential TypeScript types",
5
5
  "license": "(MIT OR CC0-1.0)",
6
6
  "repository": "sindresorhus/type-fest",
package/readme.md CHANGED
@@ -136,6 +136,7 @@ Click the type names for complete docs.
136
136
  - [`SnakeCase`](ts41/snake-case.d.ts) – Convert a string literal to snake-case (`foo_bar`).
137
137
  - [`SnakeCasedProperties`](ts41/snake-cased-properties-deep.d.ts) – Convert object properties to snake-case (`foo_bar`).
138
138
  - [`SnakeCasedPropertiesDeep`](ts41/snake-cased-properties-deep.d.ts) – Convert object properties to snake-case recursively (`foo_bar`).
139
+ - [`ScreamingSnakeCase`](ts41/screaming-snake-case.d.ts) - Convert a string literal to screaming-snake-case (`FOO_BAR`).
139
140
  - [`DelimiterCase`](ts41/delimiter-case.d.ts) – Convert a string literal to a custom string delimiter casing.
140
141
  - [`DelimiterCasedProperties`](ts41/delimiter-cased-properties.d.ts) – Convert object properties to a custom string delimiter casing.
141
142
  - [`DelimiterCasedPropertiesDeep`](ts41/delimiter-cased-properties-deep.d.ts) – Convert object properties to a custom string delimiter casing recursively.
package/ts41/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export {PascalCasedPropertiesDeep} from './pascal-cased-properties-deep';
14
14
  export {SnakeCase} from './snake-case';
15
15
  export {SnakeCasedProperties} from './snake-cased-properties';
16
16
  export {SnakeCasedPropertiesDeep} from './snake-cased-properties-deep';
17
+ export {ScreamingSnakeCase} from './screaming-snake-case';
17
18
  export {DelimiterCase} from './delimiter-case';
18
19
  export {DelimiterCasedProperties} from './delimiter-cased-properties';
19
20
  export {DelimiterCasedPropertiesDeep} from './delimiter-cased-properties-deep';
@@ -0,0 +1,40 @@
1
+ import {SplitIncludingDelimiters} from './delimiter-case';
2
+ import {SnakeCase} from './snake-case';
3
+
4
+ /**
5
+ Returns a boolean for whether the given array includes the given item.
6
+ */
7
+ type Includes<Value extends any[], Item> = {
8
+ [P in keyof Value & number as Value[P]]: true;
9
+ }[Item] extends true
10
+ ? true
11
+ : false;
12
+
13
+ /**
14
+ Returns a boolean for whether the string is screaming snake case.
15
+ */
16
+ type IsScreamingSnakeCase<Value extends string> = Value extends Uppercase<Value>
17
+ ? Includes<SplitIncludingDelimiters<Lowercase<Value>, '_'>, '_'> extends true
18
+ ? true
19
+ : false
20
+ : false;
21
+
22
+ /**
23
+ Convert a string literal to screaming-snake-case.
24
+
25
+ This can be useful when, for example, converting a camel-cased object property to a screaming-snake-cased SQL column name.
26
+
27
+ @example
28
+ ```
29
+ import {ScreamingSnakeCase} from 'type-fest';
30
+
31
+ const someVariable: ScreamingSnakeCase<'fooBar'> = 'FOO_BAR';
32
+ ```
33
+
34
+ @category Template Literals
35
+ */
36
+ export type ScreamingSnakeCase<Value> = Value extends string
37
+ ? IsScreamingSnakeCase<Value> extends true
38
+ ? Value
39
+ : Uppercase<SnakeCase<Value>>
40
+ : Value;