@dathomir/shared 0.0.1-beta.0 → 0.0.1-beta.2

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 ADDED
@@ -0,0 +1,13 @@
1
+ # @dathomir/shared
2
+
3
+ Internal shared utilities for Dathomir packages. Not intended for direct use.
4
+
5
+ ## Exports
6
+
7
+ - `entries(obj)` — Type-safe `Object.entries()` wrapper
8
+ - `fromEntries(entries)` — Type-safe `Object.fromEntries()` wrapper
9
+ - `camelCase`, `pascalCase`, `kebabCase`, etc. — String case conversion utilities (from [scule](https://github.com/unjs/scule))
10
+
11
+ ## License
12
+
13
+ [MPL-2.0](./LICENSE.md)
package/dist/index.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
 
2
- //#region src/utils/entries.ts
2
+ //#region src/entries/implementation.ts
3
3
  const entries = (obj) => {
4
4
  return Object.entries(obj);
5
5
  };
6
6
 
7
7
  //#endregion
8
- //#region src/utils/fromEntries.ts
8
+ //#region src/fromEntries/implementation.ts
9
9
  const fromEntries = (entries$1) => {
10
10
  return entries$1.reduce((acc, cur) => {
11
11
  return {
@@ -16,7 +16,7 @@ const fromEntries = (entries$1) => {
16
16
  };
17
17
 
18
18
  //#endregion
19
- //#region src/utils/scule.ts
19
+ //#region src/scule/implementation.ts
20
20
  const NUMBER_CHAR_RE = /\d/;
21
21
  const STR_SPLITTERS = [
22
22
  "-",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["entries","parts: string[]","previousUpper: boolean | undefined","previousSplitter: boolean | undefined"],"sources":["../src/utils/entries.ts","../src/utils/fromEntries.ts","../src/utils/scule.ts"],"sourcesContent":["type Entries<T> = (keyof T extends infer U\n ? U extends keyof T\n ? [U, T[U]]\n : never\n : never)[];\n\nconst entries = <T extends Record<string, unknown>>(obj: T): Entries<T> => {\n return Object.entries(obj) as Entries<T>;\n};\n\nexport { entries };\nexport type { Entries };\n","type FromEntries<T extends [PropertyKey, unknown][]> = {\n [K in T[number][0]]: Extract<T[number], [K, unknown]>[1];\n};\n\nconst fromEntries = <T extends [PropertyKey, unknown][]>(\n entries: T\n): FromEntries<T> => {\n return entries.reduce((acc, cur) => {\n return {\n ...acc,\n [cur[0]]: cur[1],\n };\n }, {} as FromEntries<T>);\n};\n\nexport { fromEntries };\nexport type { FromEntries };\n","type Splitter = \"-\" | \"_\" | \"/\" | \".\";\ntype FirstOfString<S extends string> = S extends `${infer F}${string}`\n ? F\n : never;\ntype RemoveFirstOfString<S extends string> = S extends `${string}${infer R}`\n ? R\n : never;\ntype IsUpper<S extends string> = S extends Uppercase<S> ? true : false;\ntype IsLower<S extends string> = S extends Lowercase<S> ? true : false;\ntype SameLetterCase<\n X extends string,\n Y extends string\n> = IsUpper<X> extends IsUpper<Y>\n ? true\n : IsLower<X> extends IsLower<Y>\n ? true\n : false;\ntype CapitalizedWords<\n T extends readonly string[],\n Accumulator extends string = \"\",\n Normalize extends boolean | undefined = false\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? CapitalizedWords<\n R,\n `${Accumulator}${Capitalize<Normalize extends true ? Lowercase<F> : F>}`,\n Normalize\n >\n : Accumulator;\ntype JoinLowercaseWords<\n T extends readonly string[],\n Joiner extends string,\n Accumulator extends string = \"\"\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? Accumulator extends \"\"\n ? JoinLowercaseWords<R, Joiner, `${Accumulator}${Lowercase<F>}`>\n : JoinLowercaseWords<R, Joiner, `${Accumulator}${Joiner}${Lowercase<F>}`>\n : Accumulator;\n\ntype LastOfArray<T extends any[]> = T extends [...any, infer R] ? R : never;\ntype RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]\n ? F\n : never;\n\nexport type CaseOptions = {\n normalize?: boolean;\n};\n\nexport type SplitByCase<\n T,\n Separator extends string = Splitter,\n Accumulator extends unknown[] = []\n> = string extends Separator\n ? string[]\n : T extends `${infer F}${infer R}`\n ? [LastOfArray<Accumulator>] extends [never]\n ? SplitByCase<R, Separator, [F]>\n : LastOfArray<Accumulator> extends string\n ? R extends \"\"\n ? SplitByCase<\n R,\n Separator,\n [...RemoveLastOfArray<Accumulator>, `${LastOfArray<Accumulator>}${F}`]\n >\n : SameLetterCase<F, FirstOfString<R>> extends true\n ? F extends Separator\n ? FirstOfString<R> extends Separator\n ? SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : IsUpper<FirstOfString<R>> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [...Accumulator, FirstOfString<R>]\n >\n : SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`\n ]\n >\n : IsLower<F> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n FirstOfString<R>\n ]\n >\n : SplitByCase<R, Separator, [...Accumulator, F]>\n : never\n : Accumulator extends []\n ? T extends \"\"\n ? []\n : string[]\n : Accumulator;\n\nexport type JoinByCase<T, Joiner extends string> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? JoinLowercaseWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? JoinLowercaseWords<T, Joiner>\n : never;\n\nexport type PascalCase<\n T,\n Normalize extends boolean | undefined = false\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, \"\", Normalize>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, \"\", Normalize>\n : never;\n\nexport type CamelCase<\n T,\n Normalize extends boolean | undefined = false\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : Uncapitalize<PascalCase<T, Normalize>>;\n\nexport type KebabCase<\n T extends string | readonly string[],\n Joiner extends string = \"-\"\n> = JoinByCase<T, Joiner>;\n\nexport type SnakeCase<T extends string | readonly string[]> = JoinByCase<\n T,\n \"_\"\n>;\n\nexport type TrainCase<\n T,\n Normalize extends boolean | undefined = false,\n Joiner extends string = \"-\"\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, Joiner, Normalize>\n : never;\n\nexport type FlatCase<\n T extends string | readonly string[],\n Joiner extends string = \"\"\n> = JoinByCase<T, Joiner>;\n\nconst NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\"-\", \"_\", \"/\", \".\"] as const;\n\nexport function isUppercase(char = \"\"): boolean | undefined {\n if (NUMBER_CHAR_RE.test(char)) {\n return undefined;\n }\n return char !== char.toLowerCase();\n}\n\nexport function splitByCase<T extends string>(str: T): SplitByCase<T>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[]\n>(str: T, separators: Separator): SplitByCase<T, Separator[number]>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[]\n>(str: T, separators?: Separator) {\n const splitters = separators ?? STR_SPLITTERS;\n const parts: string[] = [];\n\n if (!str || typeof str !== \"string\") {\n return parts as SplitByCase<T, Separator[number]>;\n }\n\n let buff = \"\";\n\n let previousUpper: boolean | undefined;\n let previousSplitter: boolean | undefined;\n\n for (const char of str) {\n // Splitter\n const isSplitter = (splitters as unknown as string).includes(char);\n if (isSplitter === true) {\n parts.push(buff);\n buff = \"\";\n previousUpper = undefined;\n continue;\n }\n\n const isUpper = isUppercase(char);\n if (previousSplitter === false) {\n // Case rising edge\n if (previousUpper === false && isUpper === true) {\n parts.push(buff);\n buff = char;\n previousUpper = isUpper;\n continue;\n }\n // Case falling edge\n if (previousUpper === true && isUpper === false && buff.length > 1) {\n const lastChar = buff.at(-1);\n parts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n buff = lastChar + char;\n previousUpper = isUpper;\n continue;\n }\n }\n\n // Normal char\n buff += char;\n previousUpper = isUpper;\n previousSplitter = isSplitter;\n }\n\n parts.push(buff);\n\n return parts as SplitByCase<T, Separator[number]>;\n}\n\nexport function upperFirst<S extends string>(str: S): Capitalize<S> {\n return (str ? str[0].toUpperCase() + str.slice(1) : \"\") as Capitalize<S>;\n}\n\nexport function lowerFirst<S extends string>(str: S): Uncapitalize<S> {\n return (str ? str[0].toLowerCase() + str.slice(1) : \"\") as Uncapitalize<S>;\n}\n\nexport function pascalCase(): \"\";\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: CaseOptions): PascalCase<T, UserCaseOptions[\"normalize\"]>;\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"\") as PascalCase<T, UserCaseOptions[\"normalize\"]>)\n : \"\";\n}\n\nexport function camelCase(): \"\";\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: UserCaseOptions): CamelCase<T, UserCaseOptions[\"normalize\"]>;\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return lowerFirst(pascalCase(str || \"\", opts)) as CamelCase<\n T,\n UserCaseOptions[\"normalize\"]\n >;\n}\n\nexport function kebabCase(): \"\";\nexport function kebabCase<T extends string | readonly string[]>(\n str: T\n): KebabCase<T>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string\n>(str: T, joiner: Joiner): KebabCase<T, Joiner>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string\n>(str?: T, joiner?: Joiner) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => p.toLowerCase())\n .join(joiner ?? \"-\") as KebabCase<T, Joiner>)\n : \"\";\n}\n\nexport function snakeCase(): \"\";\nexport function snakeCase<T extends string | readonly string[]>(\n str: T\n): SnakeCase<T>;\nexport function snakeCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"_\") as SnakeCase<T>;\n}\n\nexport function flatCase(): \"\";\nexport function flatCase<T extends string | readonly string[]>(\n str: T\n): FlatCase<T>;\nexport function flatCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"\") as FlatCase<T>;\n}\n\nexport function trainCase(): \"\";\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: UserCaseOptions): TrainCase<T, UserCaseOptions[\"normalize\"]>;\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"-\") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n\nconst titleCaseExceptions =\n /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;\n\nexport function titleCase(): \"\";\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(\n str: T,\n opts?: UserCaseOptions\n): TrainCase<T, UserCaseOptions[\"normalize\"], \" \">;\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) =>\n titleCaseExceptions.test(p)\n ? p.toLowerCase()\n : upperFirst(opts?.normalize ? p.toLowerCase() : p)\n )\n .join(\" \") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n"],"mappings":";;AAMA,MAAM,WAA8C,QAAuB;AACzE,QAAO,OAAO,QAAQ,IAAI;;;;;ACH5B,MAAM,eACJ,cACmB;AACnB,QAAOA,UAAQ,QAAQ,KAAK,QAAQ;AAClC,SAAO;GACL,GAAG;IACF,IAAI,KAAK,IAAI;GACf;IACA,EAAE,CAAmB;;;;;AC2J1B,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAI;AAE1C,SAAgB,YAAY,OAAO,IAAyB;AAC1D,KAAI,eAAe,KAAK,KAAK,CAC3B;AAEF,QAAO,SAAS,KAAK,aAAa;;AAQpC,SAAgB,YAGd,KAAQ,YAAwB;CAChC,MAAM,YAAY,cAAc;CAChC,MAAMC,QAAkB,EAAE;AAE1B,KAAI,CAAC,OAAO,OAAO,QAAQ,SACzB,QAAO;CAGT,IAAI,OAAO;CAEX,IAAIC;CACJ,IAAIC;AAEJ,MAAK,MAAM,QAAQ,KAAK;EAEtB,MAAM,aAAc,UAAgC,SAAS,KAAK;AAClE,MAAI,eAAe,MAAM;AACvB,SAAM,KAAK,KAAK;AAChB,UAAO;AACP,mBAAgB;AAChB;;EAGF,MAAM,UAAU,YAAY,KAAK;AACjC,MAAI,qBAAqB,OAAO;AAE9B,OAAI,kBAAkB,SAAS,YAAY,MAAM;AAC/C,UAAM,KAAK,KAAK;AAChB,WAAO;AACP,oBAAgB;AAChB;;AAGF,OAAI,kBAAkB,QAAQ,YAAY,SAAS,KAAK,SAAS,GAAG;IAClE,MAAM,WAAW,KAAK,GAAG,GAAG;AAC5B,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC,CAAC;AACvD,WAAO,WAAW;AAClB,oBAAgB;AAChB;;;AAKJ,UAAQ;AACR,kBAAgB;AAChB,qBAAmB;;AAGrB,OAAM,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,WAA6B,KAAuB;AAClE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAGtD,SAAgB,WAA6B,KAAyB;AACpE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAQtD,SAAgB,WAGd,KAAS,MAAwB;AACjC,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,GAAG,GACX;;AAQN,SAAgB,UAGd,KAAS,MAAwB;AACjC,QAAO,WAAW,WAAW,OAAO,IAAI,KAAK,CAAC;;AAchD,SAAgB,UAGd,KAAS,QAAiB;AAC1B,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,EAAE,aAAa,CAAC,CAC3B,KAAK,UAAU,IAAI,GACtB;;AAON,SAAgB,UAAgD,KAAS;AACvE,QAAO,UAAU,OAAO,IAAI,IAAI;;AAOlC,SAAgB,SAA+C,KAAS;AACtE,QAAO,UAAU,OAAO,IAAI,GAAG;;AAQjC,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,IAAI;;AAGd,MAAM,sBACJ;AAUF,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MACJ,oBAAoB,KAAK,EAAE,GACvB,EAAE,aAAa,GACf,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CACtD,CACA,KAAK,IAAI"}
1
+ {"version":3,"file":"index.cjs","names":["entries","parts: string[]","previousUpper: boolean | undefined","previousSplitter: boolean | undefined"],"sources":["../src/entries/implementation.ts","../src/fromEntries/implementation.ts","../src/scule/implementation.ts"],"sourcesContent":["type Entries<T> = (keyof T extends infer U\n ? U extends keyof T\n ? [U, T[U]]\n : never\n : never)[];\n\nconst entries = <T extends Record<string, unknown>>(obj: T): Entries<T> => {\n return Object.entries(obj) as Entries<T>;\n};\n\nexport { entries };\nexport type { Entries };\n","type FromEntries<T extends [PropertyKey, unknown][]> = {\n [K in T[number][0]]: Extract<T[number], [K, unknown]>[1];\n};\n\nconst fromEntries = <T extends [PropertyKey, unknown][]>(\n entries: T,\n): FromEntries<T> => {\n return entries.reduce((acc, cur) => {\n return {\n ...acc,\n [cur[0]]: cur[1],\n };\n }, {} as FromEntries<T>);\n};\n\nexport { fromEntries };\nexport type { FromEntries };\n","type Splitter = \"-\" | \"_\" | \"/\" | \".\";\ntype FirstOfString<S extends string> = S extends `${infer F}${string}`\n ? F\n : never;\ntype RemoveFirstOfString<S extends string> = S extends `${string}${infer R}`\n ? R\n : never;\ntype IsUpper<S extends string> = S extends Uppercase<S> ? true : false;\ntype IsLower<S extends string> = S extends Lowercase<S> ? true : false;\ntype SameLetterCase<X extends string, Y extends string> =\n IsUpper<X> extends IsUpper<Y>\n ? true\n : IsLower<X> extends IsLower<Y>\n ? true\n : false;\ntype CapitalizedWords<\n T extends readonly string[],\n Accumulator extends string = \"\",\n Normalize extends boolean | undefined = false,\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? CapitalizedWords<\n R,\n `${Accumulator}${Capitalize<Normalize extends true ? Lowercase<F> : F>}`,\n Normalize\n >\n : Accumulator;\ntype JoinLowercaseWords<\n T extends readonly string[],\n Joiner extends string,\n Accumulator extends string = \"\",\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? Accumulator extends \"\"\n ? JoinLowercaseWords<R, Joiner, `${Accumulator}${Lowercase<F>}`>\n : JoinLowercaseWords<R, Joiner, `${Accumulator}${Joiner}${Lowercase<F>}`>\n : Accumulator;\n\ntype LastOfArray<T extends any[]> = T extends [...any, infer R] ? R : never;\ntype RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]\n ? F\n : never;\n\nexport type CaseOptions = {\n normalize?: boolean;\n};\n\nexport type SplitByCase<\n T,\n Separator extends string = Splitter,\n Accumulator extends unknown[] = [],\n> = string extends Separator\n ? string[]\n : T extends `${infer F}${infer R}`\n ? [LastOfArray<Accumulator>] extends [never]\n ? SplitByCase<R, Separator, [F]>\n : LastOfArray<Accumulator> extends string\n ? R extends \"\"\n ? SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n ]\n >\n : SameLetterCase<F, FirstOfString<R>> extends true\n ? F extends Separator\n ? FirstOfString<R> extends Separator\n ? SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : IsUpper<FirstOfString<R>> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [...Accumulator, FirstOfString<R>]\n >\n : SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n ]\n >\n : IsLower<F> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n FirstOfString<R>,\n ]\n >\n : SplitByCase<R, Separator, [...Accumulator, F]>\n : never\n : Accumulator extends []\n ? T extends \"\"\n ? []\n : string[]\n : Accumulator;\n\nexport type JoinByCase<T, Joiner extends string> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? JoinLowercaseWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? JoinLowercaseWords<T, Joiner>\n : never;\n\nexport type PascalCase<\n T,\n Normalize extends boolean | undefined = false,\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, \"\", Normalize>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, \"\", Normalize>\n : never;\n\nexport type CamelCase<\n T,\n Normalize extends boolean | undefined = false,\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : Uncapitalize<PascalCase<T, Normalize>>;\n\nexport type KebabCase<\n T extends string | readonly string[],\n Joiner extends string = \"-\",\n> = JoinByCase<T, Joiner>;\n\nexport type SnakeCase<T extends string | readonly string[]> = JoinByCase<\n T,\n \"_\"\n>;\n\nexport type TrainCase<\n T,\n Normalize extends boolean | undefined = false,\n Joiner extends string = \"-\",\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, Joiner, Normalize>\n : never;\n\nexport type FlatCase<\n T extends string | readonly string[],\n Joiner extends string = \"\",\n> = JoinByCase<T, Joiner>;\n\nconst NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\"-\", \"_\", \"/\", \".\"] as const;\n\nexport function isUppercase(char = \"\"): boolean | undefined {\n if (NUMBER_CHAR_RE.test(char)) {\n return undefined;\n }\n return char !== char.toLowerCase();\n}\n\nexport function splitByCase<T extends string>(str: T): SplitByCase<T>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[],\n>(str: T, separators: Separator): SplitByCase<T, Separator[number]>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[],\n>(str: T, separators?: Separator) {\n const splitters = separators ?? STR_SPLITTERS;\n const parts: string[] = [];\n\n if (!str || typeof str !== \"string\") {\n return parts as SplitByCase<T, Separator[number]>;\n }\n\n let buff = \"\";\n\n let previousUpper: boolean | undefined;\n let previousSplitter: boolean | undefined;\n\n for (const char of str) {\n // Splitter\n const isSplitter = (splitters as unknown as string).includes(char);\n if (isSplitter === true) {\n parts.push(buff);\n buff = \"\";\n previousUpper = undefined;\n continue;\n }\n\n const isUpper = isUppercase(char);\n if (previousSplitter === false) {\n // Case rising edge\n if (previousUpper === false && isUpper === true) {\n parts.push(buff);\n buff = char;\n previousUpper = isUpper;\n continue;\n }\n // Case falling edge\n if (previousUpper === true && isUpper === false && buff.length > 1) {\n const lastChar = buff.at(-1);\n parts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n buff = lastChar + char;\n previousUpper = isUpper;\n continue;\n }\n }\n\n // Normal char\n buff += char;\n previousUpper = isUpper;\n previousSplitter = isSplitter;\n }\n\n parts.push(buff);\n\n return parts as SplitByCase<T, Separator[number]>;\n}\n\nexport function upperFirst<S extends string>(str: S): Capitalize<S> {\n return (str ? str[0].toUpperCase() + str.slice(1) : \"\") as Capitalize<S>;\n}\n\nexport function lowerFirst<S extends string>(str: S): Uncapitalize<S> {\n return (str ? str[0].toLowerCase() + str.slice(1) : \"\") as Uncapitalize<S>;\n}\n\nexport function pascalCase(): \"\";\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: CaseOptions): PascalCase<T, UserCaseOptions[\"normalize\"]>;\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"\") as PascalCase<T, UserCaseOptions[\"normalize\"]>)\n : \"\";\n}\n\nexport function camelCase(): \"\";\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: UserCaseOptions): CamelCase<T, UserCaseOptions[\"normalize\"]>;\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return lowerFirst(pascalCase(str || \"\", opts)) as CamelCase<\n T,\n UserCaseOptions[\"normalize\"]\n >;\n}\n\nexport function kebabCase(): \"\";\nexport function kebabCase<T extends string | readonly string[]>(\n str: T,\n): KebabCase<T>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string,\n>(str: T, joiner: Joiner): KebabCase<T, Joiner>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string,\n>(str?: T, joiner?: Joiner) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => p.toLowerCase())\n .join(joiner ?? \"-\") as KebabCase<T, Joiner>)\n : \"\";\n}\n\nexport function snakeCase(): \"\";\nexport function snakeCase<T extends string | readonly string[]>(\n str: T,\n): SnakeCase<T>;\nexport function snakeCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"_\") as SnakeCase<T>;\n}\n\nexport function flatCase(): \"\";\nexport function flatCase<T extends string | readonly string[]>(\n str: T,\n): FlatCase<T>;\nexport function flatCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"\") as FlatCase<T>;\n}\n\nexport function trainCase(): \"\";\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: UserCaseOptions): TrainCase<T, UserCaseOptions[\"normalize\"]>;\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"-\") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n\nconst titleCaseExceptions =\n /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;\n\nexport function titleCase(): \"\";\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(\n str: T,\n opts?: UserCaseOptions,\n): TrainCase<T, UserCaseOptions[\"normalize\"], \" \">;\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) =>\n titleCaseExceptions.test(p)\n ? p.toLowerCase()\n : upperFirst(opts?.normalize ? p.toLowerCase() : p),\n )\n .join(\" \") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n"],"mappings":";;AAMA,MAAM,WAA8C,QAAuB;AACzE,QAAO,OAAO,QAAQ,IAAI;;;;;ACH5B,MAAM,eACJ,cACmB;AACnB,QAAOA,UAAQ,QAAQ,KAAK,QAAQ;AAClC,SAAO;GACL,GAAG;IACF,IAAI,KAAK,IAAI;GACf;IACA,EAAE,CAAmB;;;;;AC4J1B,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAI;AAE1C,SAAgB,YAAY,OAAO,IAAyB;AAC1D,KAAI,eAAe,KAAK,KAAK,CAC3B;AAEF,QAAO,SAAS,KAAK,aAAa;;AAQpC,SAAgB,YAGd,KAAQ,YAAwB;CAChC,MAAM,YAAY,cAAc;CAChC,MAAMC,QAAkB,EAAE;AAE1B,KAAI,CAAC,OAAO,OAAO,QAAQ,SACzB,QAAO;CAGT,IAAI,OAAO;CAEX,IAAIC;CACJ,IAAIC;AAEJ,MAAK,MAAM,QAAQ,KAAK;EAEtB,MAAM,aAAc,UAAgC,SAAS,KAAK;AAClE,MAAI,eAAe,MAAM;AACvB,SAAM,KAAK,KAAK;AAChB,UAAO;AACP,mBAAgB;AAChB;;EAGF,MAAM,UAAU,YAAY,KAAK;AACjC,MAAI,qBAAqB,OAAO;AAE9B,OAAI,kBAAkB,SAAS,YAAY,MAAM;AAC/C,UAAM,KAAK,KAAK;AAChB,WAAO;AACP,oBAAgB;AAChB;;AAGF,OAAI,kBAAkB,QAAQ,YAAY,SAAS,KAAK,SAAS,GAAG;IAClE,MAAM,WAAW,KAAK,GAAG,GAAG;AAC5B,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC,CAAC;AACvD,WAAO,WAAW;AAClB,oBAAgB;AAChB;;;AAKJ,UAAQ;AACR,kBAAgB;AAChB,qBAAmB;;AAGrB,OAAM,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,WAA6B,KAAuB;AAClE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAGtD,SAAgB,WAA6B,KAAyB;AACpE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAQtD,SAAgB,WAGd,KAAS,MAAwB;AACjC,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,GAAG,GACX;;AAQN,SAAgB,UAGd,KAAS,MAAwB;AACjC,QAAO,WAAW,WAAW,OAAO,IAAI,KAAK,CAAC;;AAchD,SAAgB,UAGd,KAAS,QAAiB;AAC1B,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,EAAE,aAAa,CAAC,CAC3B,KAAK,UAAU,IAAI,GACtB;;AAON,SAAgB,UAAgD,KAAS;AACvE,QAAO,UAAU,OAAO,IAAI,IAAI;;AAOlC,SAAgB,SAA+C,KAAS;AACtE,QAAO,UAAU,OAAO,IAAI,GAAG;;AAQjC,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,IAAI;;AAGd,MAAM,sBACJ;AAUF,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MACJ,oBAAoB,KAAK,EAAE,GACvB,EAAE,aAAa,GACf,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CACtD,CACA,KAAK,IAAI"}
package/dist/index.d.cts CHANGED
@@ -1,12 +1,12 @@
1
- //#region src/utils/entries.d.ts
1
+ //#region src/entries/implementation.d.ts
2
2
  type Entries<T> = (keyof T extends infer U ? U extends keyof T ? [U, T[U]] : never : never)[];
3
3
  declare const entries: <T extends Record<string, unknown>>(obj: T) => Entries<T>;
4
4
  //#endregion
5
- //#region src/utils/fromEntries.d.ts
5
+ //#region src/fromEntries/implementation.d.ts
6
6
  type FromEntries<T extends [PropertyKey, unknown][]> = { [K in T[number][0]]: Extract<T[number], [K, unknown]>[1] };
7
7
  declare const fromEntries: <T extends [PropertyKey, unknown][]>(entries: T) => FromEntries<T>;
8
8
  //#endregion
9
- //#region src/utils/scule.d.ts
9
+ //#region src/scule/implementation.d.ts
10
10
  type Splitter = "-" | "_" | "/" | ".";
11
11
  type FirstOfString<S extends string> = S extends `${infer F}${string}` ? F : never;
12
12
  type RemoveFirstOfString<S extends string> = S extends `${string}${infer R}` ? R : never;
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
1
- //#region src/utils/entries.d.ts
1
+ //#region src/entries/implementation.d.ts
2
2
  type Entries<T> = (keyof T extends infer U ? U extends keyof T ? [U, T[U]] : never : never)[];
3
3
  declare const entries: <T extends Record<string, unknown>>(obj: T) => Entries<T>;
4
4
  //#endregion
5
- //#region src/utils/fromEntries.d.ts
5
+ //#region src/fromEntries/implementation.d.ts
6
6
  type FromEntries<T extends [PropertyKey, unknown][]> = { [K in T[number][0]]: Extract<T[number], [K, unknown]>[1] };
7
7
  declare const fromEntries: <T extends [PropertyKey, unknown][]>(entries: T) => FromEntries<T>;
8
8
  //#endregion
9
- //#region src/utils/scule.d.ts
9
+ //#region src/scule/implementation.d.ts
10
10
  type Splitter = "-" | "_" | "/" | ".";
11
11
  type FirstOfString<S extends string> = S extends `${infer F}${string}` ? F : never;
12
12
  type RemoveFirstOfString<S extends string> = S extends `${string}${infer R}` ? R : never;
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
- //#region src/utils/entries.ts
1
+ //#region src/entries/implementation.ts
2
2
  const entries = (obj) => {
3
3
  return Object.entries(obj);
4
4
  };
5
5
 
6
6
  //#endregion
7
- //#region src/utils/fromEntries.ts
7
+ //#region src/fromEntries/implementation.ts
8
8
  const fromEntries = (entries$1) => {
9
9
  return entries$1.reduce((acc, cur) => {
10
10
  return {
@@ -15,7 +15,7 @@ const fromEntries = (entries$1) => {
15
15
  };
16
16
 
17
17
  //#endregion
18
- //#region src/utils/scule.ts
18
+ //#region src/scule/implementation.ts
19
19
  const NUMBER_CHAR_RE = /\d/;
20
20
  const STR_SPLITTERS = [
21
21
  "-",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["entries","parts: string[]","previousUpper: boolean | undefined","previousSplitter: boolean | undefined"],"sources":["../src/utils/entries.ts","../src/utils/fromEntries.ts","../src/utils/scule.ts"],"sourcesContent":["type Entries<T> = (keyof T extends infer U\n ? U extends keyof T\n ? [U, T[U]]\n : never\n : never)[];\n\nconst entries = <T extends Record<string, unknown>>(obj: T): Entries<T> => {\n return Object.entries(obj) as Entries<T>;\n};\n\nexport { entries };\nexport type { Entries };\n","type FromEntries<T extends [PropertyKey, unknown][]> = {\n [K in T[number][0]]: Extract<T[number], [K, unknown]>[1];\n};\n\nconst fromEntries = <T extends [PropertyKey, unknown][]>(\n entries: T\n): FromEntries<T> => {\n return entries.reduce((acc, cur) => {\n return {\n ...acc,\n [cur[0]]: cur[1],\n };\n }, {} as FromEntries<T>);\n};\n\nexport { fromEntries };\nexport type { FromEntries };\n","type Splitter = \"-\" | \"_\" | \"/\" | \".\";\ntype FirstOfString<S extends string> = S extends `${infer F}${string}`\n ? F\n : never;\ntype RemoveFirstOfString<S extends string> = S extends `${string}${infer R}`\n ? R\n : never;\ntype IsUpper<S extends string> = S extends Uppercase<S> ? true : false;\ntype IsLower<S extends string> = S extends Lowercase<S> ? true : false;\ntype SameLetterCase<\n X extends string,\n Y extends string\n> = IsUpper<X> extends IsUpper<Y>\n ? true\n : IsLower<X> extends IsLower<Y>\n ? true\n : false;\ntype CapitalizedWords<\n T extends readonly string[],\n Accumulator extends string = \"\",\n Normalize extends boolean | undefined = false\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? CapitalizedWords<\n R,\n `${Accumulator}${Capitalize<Normalize extends true ? Lowercase<F> : F>}`,\n Normalize\n >\n : Accumulator;\ntype JoinLowercaseWords<\n T extends readonly string[],\n Joiner extends string,\n Accumulator extends string = \"\"\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? Accumulator extends \"\"\n ? JoinLowercaseWords<R, Joiner, `${Accumulator}${Lowercase<F>}`>\n : JoinLowercaseWords<R, Joiner, `${Accumulator}${Joiner}${Lowercase<F>}`>\n : Accumulator;\n\ntype LastOfArray<T extends any[]> = T extends [...any, infer R] ? R : never;\ntype RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]\n ? F\n : never;\n\nexport type CaseOptions = {\n normalize?: boolean;\n};\n\nexport type SplitByCase<\n T,\n Separator extends string = Splitter,\n Accumulator extends unknown[] = []\n> = string extends Separator\n ? string[]\n : T extends `${infer F}${infer R}`\n ? [LastOfArray<Accumulator>] extends [never]\n ? SplitByCase<R, Separator, [F]>\n : LastOfArray<Accumulator> extends string\n ? R extends \"\"\n ? SplitByCase<\n R,\n Separator,\n [...RemoveLastOfArray<Accumulator>, `${LastOfArray<Accumulator>}${F}`]\n >\n : SameLetterCase<F, FirstOfString<R>> extends true\n ? F extends Separator\n ? FirstOfString<R> extends Separator\n ? SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : IsUpper<FirstOfString<R>> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [...Accumulator, FirstOfString<R>]\n >\n : SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`\n ]\n >\n : IsLower<F> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n FirstOfString<R>\n ]\n >\n : SplitByCase<R, Separator, [...Accumulator, F]>\n : never\n : Accumulator extends []\n ? T extends \"\"\n ? []\n : string[]\n : Accumulator;\n\nexport type JoinByCase<T, Joiner extends string> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? JoinLowercaseWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? JoinLowercaseWords<T, Joiner>\n : never;\n\nexport type PascalCase<\n T,\n Normalize extends boolean | undefined = false\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, \"\", Normalize>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, \"\", Normalize>\n : never;\n\nexport type CamelCase<\n T,\n Normalize extends boolean | undefined = false\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : Uncapitalize<PascalCase<T, Normalize>>;\n\nexport type KebabCase<\n T extends string | readonly string[],\n Joiner extends string = \"-\"\n> = JoinByCase<T, Joiner>;\n\nexport type SnakeCase<T extends string | readonly string[]> = JoinByCase<\n T,\n \"_\"\n>;\n\nexport type TrainCase<\n T,\n Normalize extends boolean | undefined = false,\n Joiner extends string = \"-\"\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, Joiner, Normalize>\n : never;\n\nexport type FlatCase<\n T extends string | readonly string[],\n Joiner extends string = \"\"\n> = JoinByCase<T, Joiner>;\n\nconst NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\"-\", \"_\", \"/\", \".\"] as const;\n\nexport function isUppercase(char = \"\"): boolean | undefined {\n if (NUMBER_CHAR_RE.test(char)) {\n return undefined;\n }\n return char !== char.toLowerCase();\n}\n\nexport function splitByCase<T extends string>(str: T): SplitByCase<T>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[]\n>(str: T, separators: Separator): SplitByCase<T, Separator[number]>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[]\n>(str: T, separators?: Separator) {\n const splitters = separators ?? STR_SPLITTERS;\n const parts: string[] = [];\n\n if (!str || typeof str !== \"string\") {\n return parts as SplitByCase<T, Separator[number]>;\n }\n\n let buff = \"\";\n\n let previousUpper: boolean | undefined;\n let previousSplitter: boolean | undefined;\n\n for (const char of str) {\n // Splitter\n const isSplitter = (splitters as unknown as string).includes(char);\n if (isSplitter === true) {\n parts.push(buff);\n buff = \"\";\n previousUpper = undefined;\n continue;\n }\n\n const isUpper = isUppercase(char);\n if (previousSplitter === false) {\n // Case rising edge\n if (previousUpper === false && isUpper === true) {\n parts.push(buff);\n buff = char;\n previousUpper = isUpper;\n continue;\n }\n // Case falling edge\n if (previousUpper === true && isUpper === false && buff.length > 1) {\n const lastChar = buff.at(-1);\n parts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n buff = lastChar + char;\n previousUpper = isUpper;\n continue;\n }\n }\n\n // Normal char\n buff += char;\n previousUpper = isUpper;\n previousSplitter = isSplitter;\n }\n\n parts.push(buff);\n\n return parts as SplitByCase<T, Separator[number]>;\n}\n\nexport function upperFirst<S extends string>(str: S): Capitalize<S> {\n return (str ? str[0].toUpperCase() + str.slice(1) : \"\") as Capitalize<S>;\n}\n\nexport function lowerFirst<S extends string>(str: S): Uncapitalize<S> {\n return (str ? str[0].toLowerCase() + str.slice(1) : \"\") as Uncapitalize<S>;\n}\n\nexport function pascalCase(): \"\";\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: CaseOptions): PascalCase<T, UserCaseOptions[\"normalize\"]>;\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"\") as PascalCase<T, UserCaseOptions[\"normalize\"]>)\n : \"\";\n}\n\nexport function camelCase(): \"\";\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: UserCaseOptions): CamelCase<T, UserCaseOptions[\"normalize\"]>;\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return lowerFirst(pascalCase(str || \"\", opts)) as CamelCase<\n T,\n UserCaseOptions[\"normalize\"]\n >;\n}\n\nexport function kebabCase(): \"\";\nexport function kebabCase<T extends string | readonly string[]>(\n str: T\n): KebabCase<T>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string\n>(str: T, joiner: Joiner): KebabCase<T, Joiner>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string\n>(str?: T, joiner?: Joiner) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => p.toLowerCase())\n .join(joiner ?? \"-\") as KebabCase<T, Joiner>)\n : \"\";\n}\n\nexport function snakeCase(): \"\";\nexport function snakeCase<T extends string | readonly string[]>(\n str: T\n): SnakeCase<T>;\nexport function snakeCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"_\") as SnakeCase<T>;\n}\n\nexport function flatCase(): \"\";\nexport function flatCase<T extends string | readonly string[]>(\n str: T\n): FlatCase<T>;\nexport function flatCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"\") as FlatCase<T>;\n}\n\nexport function trainCase(): \"\";\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str: T, opts?: UserCaseOptions): TrainCase<T, UserCaseOptions[\"normalize\"]>;\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"-\") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n\nconst titleCaseExceptions =\n /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;\n\nexport function titleCase(): \"\";\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(\n str: T,\n opts?: UserCaseOptions\n): TrainCase<T, UserCaseOptions[\"normalize\"], \" \">;\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) =>\n titleCaseExceptions.test(p)\n ? p.toLowerCase()\n : upperFirst(opts?.normalize ? p.toLowerCase() : p)\n )\n .join(\" \") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n"],"mappings":";AAMA,MAAM,WAA8C,QAAuB;AACzE,QAAO,OAAO,QAAQ,IAAI;;;;;ACH5B,MAAM,eACJ,cACmB;AACnB,QAAOA,UAAQ,QAAQ,KAAK,QAAQ;AAClC,SAAO;GACL,GAAG;IACF,IAAI,KAAK,IAAI;GACf;IACA,EAAE,CAAmB;;;;;AC2J1B,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAI;AAE1C,SAAgB,YAAY,OAAO,IAAyB;AAC1D,KAAI,eAAe,KAAK,KAAK,CAC3B;AAEF,QAAO,SAAS,KAAK,aAAa;;AAQpC,SAAgB,YAGd,KAAQ,YAAwB;CAChC,MAAM,YAAY,cAAc;CAChC,MAAMC,QAAkB,EAAE;AAE1B,KAAI,CAAC,OAAO,OAAO,QAAQ,SACzB,QAAO;CAGT,IAAI,OAAO;CAEX,IAAIC;CACJ,IAAIC;AAEJ,MAAK,MAAM,QAAQ,KAAK;EAEtB,MAAM,aAAc,UAAgC,SAAS,KAAK;AAClE,MAAI,eAAe,MAAM;AACvB,SAAM,KAAK,KAAK;AAChB,UAAO;AACP,mBAAgB;AAChB;;EAGF,MAAM,UAAU,YAAY,KAAK;AACjC,MAAI,qBAAqB,OAAO;AAE9B,OAAI,kBAAkB,SAAS,YAAY,MAAM;AAC/C,UAAM,KAAK,KAAK;AAChB,WAAO;AACP,oBAAgB;AAChB;;AAGF,OAAI,kBAAkB,QAAQ,YAAY,SAAS,KAAK,SAAS,GAAG;IAClE,MAAM,WAAW,KAAK,GAAG,GAAG;AAC5B,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC,CAAC;AACvD,WAAO,WAAW;AAClB,oBAAgB;AAChB;;;AAKJ,UAAQ;AACR,kBAAgB;AAChB,qBAAmB;;AAGrB,OAAM,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,WAA6B,KAAuB;AAClE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAGtD,SAAgB,WAA6B,KAAyB;AACpE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAQtD,SAAgB,WAGd,KAAS,MAAwB;AACjC,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,GAAG,GACX;;AAQN,SAAgB,UAGd,KAAS,MAAwB;AACjC,QAAO,WAAW,WAAW,OAAO,IAAI,KAAK,CAAC;;AAchD,SAAgB,UAGd,KAAS,QAAiB;AAC1B,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,EAAE,aAAa,CAAC,CAC3B,KAAK,UAAU,IAAI,GACtB;;AAON,SAAgB,UAAgD,KAAS;AACvE,QAAO,UAAU,OAAO,IAAI,IAAI;;AAOlC,SAAgB,SAA+C,KAAS;AACtE,QAAO,UAAU,OAAO,IAAI,GAAG;;AAQjC,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,IAAI;;AAGd,MAAM,sBACJ;AAUF,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MACJ,oBAAoB,KAAK,EAAE,GACvB,EAAE,aAAa,GACf,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CACtD,CACA,KAAK,IAAI"}
1
+ {"version":3,"file":"index.mjs","names":["entries","parts: string[]","previousUpper: boolean | undefined","previousSplitter: boolean | undefined"],"sources":["../src/entries/implementation.ts","../src/fromEntries/implementation.ts","../src/scule/implementation.ts"],"sourcesContent":["type Entries<T> = (keyof T extends infer U\n ? U extends keyof T\n ? [U, T[U]]\n : never\n : never)[];\n\nconst entries = <T extends Record<string, unknown>>(obj: T): Entries<T> => {\n return Object.entries(obj) as Entries<T>;\n};\n\nexport { entries };\nexport type { Entries };\n","type FromEntries<T extends [PropertyKey, unknown][]> = {\n [K in T[number][0]]: Extract<T[number], [K, unknown]>[1];\n};\n\nconst fromEntries = <T extends [PropertyKey, unknown][]>(\n entries: T,\n): FromEntries<T> => {\n return entries.reduce((acc, cur) => {\n return {\n ...acc,\n [cur[0]]: cur[1],\n };\n }, {} as FromEntries<T>);\n};\n\nexport { fromEntries };\nexport type { FromEntries };\n","type Splitter = \"-\" | \"_\" | \"/\" | \".\";\ntype FirstOfString<S extends string> = S extends `${infer F}${string}`\n ? F\n : never;\ntype RemoveFirstOfString<S extends string> = S extends `${string}${infer R}`\n ? R\n : never;\ntype IsUpper<S extends string> = S extends Uppercase<S> ? true : false;\ntype IsLower<S extends string> = S extends Lowercase<S> ? true : false;\ntype SameLetterCase<X extends string, Y extends string> =\n IsUpper<X> extends IsUpper<Y>\n ? true\n : IsLower<X> extends IsLower<Y>\n ? true\n : false;\ntype CapitalizedWords<\n T extends readonly string[],\n Accumulator extends string = \"\",\n Normalize extends boolean | undefined = false,\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? CapitalizedWords<\n R,\n `${Accumulator}${Capitalize<Normalize extends true ? Lowercase<F> : F>}`,\n Normalize\n >\n : Accumulator;\ntype JoinLowercaseWords<\n T extends readonly string[],\n Joiner extends string,\n Accumulator extends string = \"\",\n> = T extends readonly [infer F extends string, ...infer R extends string[]]\n ? Accumulator extends \"\"\n ? JoinLowercaseWords<R, Joiner, `${Accumulator}${Lowercase<F>}`>\n : JoinLowercaseWords<R, Joiner, `${Accumulator}${Joiner}${Lowercase<F>}`>\n : Accumulator;\n\ntype LastOfArray<T extends any[]> = T extends [...any, infer R] ? R : never;\ntype RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]\n ? F\n : never;\n\nexport type CaseOptions = {\n normalize?: boolean;\n};\n\nexport type SplitByCase<\n T,\n Separator extends string = Splitter,\n Accumulator extends unknown[] = [],\n> = string extends Separator\n ? string[]\n : T extends `${infer F}${infer R}`\n ? [LastOfArray<Accumulator>] extends [never]\n ? SplitByCase<R, Separator, [F]>\n : LastOfArray<Accumulator> extends string\n ? R extends \"\"\n ? SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n ]\n >\n : SameLetterCase<F, FirstOfString<R>> extends true\n ? F extends Separator\n ? FirstOfString<R> extends Separator\n ? SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : IsUpper<FirstOfString<R>> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [...Accumulator, FirstOfString<R>]\n >\n : SplitByCase<R, Separator, [...Accumulator, \"\"]>\n : SplitByCase<\n R,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n ]\n >\n : IsLower<F> extends true\n ? SplitByCase<\n RemoveFirstOfString<R>,\n Separator,\n [\n ...RemoveLastOfArray<Accumulator>,\n `${LastOfArray<Accumulator>}${F}`,\n FirstOfString<R>,\n ]\n >\n : SplitByCase<R, Separator, [...Accumulator, F]>\n : never\n : Accumulator extends []\n ? T extends \"\"\n ? []\n : string[]\n : Accumulator;\n\nexport type JoinByCase<T, Joiner extends string> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? JoinLowercaseWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? JoinLowercaseWords<T, Joiner>\n : never;\n\nexport type PascalCase<\n T,\n Normalize extends boolean | undefined = false,\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, \"\", Normalize>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, \"\", Normalize>\n : never;\n\nexport type CamelCase<\n T,\n Normalize extends boolean | undefined = false,\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : Uncapitalize<PascalCase<T, Normalize>>;\n\nexport type KebabCase<\n T extends string | readonly string[],\n Joiner extends string = \"-\",\n> = JoinByCase<T, Joiner>;\n\nexport type SnakeCase<T extends string | readonly string[]> = JoinByCase<\n T,\n \"_\"\n>;\n\nexport type TrainCase<\n T,\n Normalize extends boolean | undefined = false,\n Joiner extends string = \"-\",\n> = string extends T\n ? string\n : string[] extends T\n ? string\n : T extends string\n ? SplitByCase<T> extends readonly string[]\n ? CapitalizedWords<SplitByCase<T>, Joiner>\n : never\n : T extends readonly string[]\n ? CapitalizedWords<T, Joiner, Normalize>\n : never;\n\nexport type FlatCase<\n T extends string | readonly string[],\n Joiner extends string = \"\",\n> = JoinByCase<T, Joiner>;\n\nconst NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\"-\", \"_\", \"/\", \".\"] as const;\n\nexport function isUppercase(char = \"\"): boolean | undefined {\n if (NUMBER_CHAR_RE.test(char)) {\n return undefined;\n }\n return char !== char.toLowerCase();\n}\n\nexport function splitByCase<T extends string>(str: T): SplitByCase<T>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[],\n>(str: T, separators: Separator): SplitByCase<T, Separator[number]>;\nexport function splitByCase<\n T extends string,\n Separator extends readonly string[],\n>(str: T, separators?: Separator) {\n const splitters = separators ?? STR_SPLITTERS;\n const parts: string[] = [];\n\n if (!str || typeof str !== \"string\") {\n return parts as SplitByCase<T, Separator[number]>;\n }\n\n let buff = \"\";\n\n let previousUpper: boolean | undefined;\n let previousSplitter: boolean | undefined;\n\n for (const char of str) {\n // Splitter\n const isSplitter = (splitters as unknown as string).includes(char);\n if (isSplitter === true) {\n parts.push(buff);\n buff = \"\";\n previousUpper = undefined;\n continue;\n }\n\n const isUpper = isUppercase(char);\n if (previousSplitter === false) {\n // Case rising edge\n if (previousUpper === false && isUpper === true) {\n parts.push(buff);\n buff = char;\n previousUpper = isUpper;\n continue;\n }\n // Case falling edge\n if (previousUpper === true && isUpper === false && buff.length > 1) {\n const lastChar = buff.at(-1);\n parts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n buff = lastChar + char;\n previousUpper = isUpper;\n continue;\n }\n }\n\n // Normal char\n buff += char;\n previousUpper = isUpper;\n previousSplitter = isSplitter;\n }\n\n parts.push(buff);\n\n return parts as SplitByCase<T, Separator[number]>;\n}\n\nexport function upperFirst<S extends string>(str: S): Capitalize<S> {\n return (str ? str[0].toUpperCase() + str.slice(1) : \"\") as Capitalize<S>;\n}\n\nexport function lowerFirst<S extends string>(str: S): Uncapitalize<S> {\n return (str ? str[0].toLowerCase() + str.slice(1) : \"\") as Uncapitalize<S>;\n}\n\nexport function pascalCase(): \"\";\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: CaseOptions): PascalCase<T, UserCaseOptions[\"normalize\"]>;\nexport function pascalCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"\") as PascalCase<T, UserCaseOptions[\"normalize\"]>)\n : \"\";\n}\n\nexport function camelCase(): \"\";\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: UserCaseOptions): CamelCase<T, UserCaseOptions[\"normalize\"]>;\nexport function camelCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return lowerFirst(pascalCase(str || \"\", opts)) as CamelCase<\n T,\n UserCaseOptions[\"normalize\"]\n >;\n}\n\nexport function kebabCase(): \"\";\nexport function kebabCase<T extends string | readonly string[]>(\n str: T,\n): KebabCase<T>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string,\n>(str: T, joiner: Joiner): KebabCase<T, Joiner>;\nexport function kebabCase<\n T extends string | readonly string[],\n Joiner extends string,\n>(str?: T, joiner?: Joiner) {\n return str\n ? ((Array.isArray(str) ? str : splitByCase(str as string))\n .map((p) => p.toLowerCase())\n .join(joiner ?? \"-\") as KebabCase<T, Joiner>)\n : \"\";\n}\n\nexport function snakeCase(): \"\";\nexport function snakeCase<T extends string | readonly string[]>(\n str: T,\n): SnakeCase<T>;\nexport function snakeCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"_\") as SnakeCase<T>;\n}\n\nexport function flatCase(): \"\";\nexport function flatCase<T extends string | readonly string[]>(\n str: T,\n): FlatCase<T>;\nexport function flatCase<T extends string | readonly string[]>(str?: T) {\n return kebabCase(str || \"\", \"\") as FlatCase<T>;\n}\n\nexport function trainCase(): \"\";\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str: T, opts?: UserCaseOptions): TrainCase<T, UserCaseOptions[\"normalize\"]>;\nexport function trainCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p))\n .join(\"-\") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n\nconst titleCaseExceptions =\n /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;\n\nexport function titleCase(): \"\";\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(\n str: T,\n opts?: UserCaseOptions,\n): TrainCase<T, UserCaseOptions[\"normalize\"], \" \">;\nexport function titleCase<\n T extends string | readonly string[],\n UserCaseOptions extends CaseOptions = CaseOptions,\n>(str?: T, opts?: UserCaseOptions) {\n return (Array.isArray(str) ? str : splitByCase(str as string))\n .filter(Boolean)\n .map((p) =>\n titleCaseExceptions.test(p)\n ? p.toLowerCase()\n : upperFirst(opts?.normalize ? p.toLowerCase() : p),\n )\n .join(\" \") as TrainCase<T, UserCaseOptions[\"normalize\"]>;\n}\n"],"mappings":";AAMA,MAAM,WAA8C,QAAuB;AACzE,QAAO,OAAO,QAAQ,IAAI;;;;;ACH5B,MAAM,eACJ,cACmB;AACnB,QAAOA,UAAQ,QAAQ,KAAK,QAAQ;AAClC,SAAO;GACL,GAAG;IACF,IAAI,KAAK,IAAI;GACf;IACA,EAAE,CAAmB;;;;;AC4J1B,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAI;AAE1C,SAAgB,YAAY,OAAO,IAAyB;AAC1D,KAAI,eAAe,KAAK,KAAK,CAC3B;AAEF,QAAO,SAAS,KAAK,aAAa;;AAQpC,SAAgB,YAGd,KAAQ,YAAwB;CAChC,MAAM,YAAY,cAAc;CAChC,MAAMC,QAAkB,EAAE;AAE1B,KAAI,CAAC,OAAO,OAAO,QAAQ,SACzB,QAAO;CAGT,IAAI,OAAO;CAEX,IAAIC;CACJ,IAAIC;AAEJ,MAAK,MAAM,QAAQ,KAAK;EAEtB,MAAM,aAAc,UAAgC,SAAS,KAAK;AAClE,MAAI,eAAe,MAAM;AACvB,SAAM,KAAK,KAAK;AAChB,UAAO;AACP,mBAAgB;AAChB;;EAGF,MAAM,UAAU,YAAY,KAAK;AACjC,MAAI,qBAAqB,OAAO;AAE9B,OAAI,kBAAkB,SAAS,YAAY,MAAM;AAC/C,UAAM,KAAK,KAAK;AAChB,WAAO;AACP,oBAAgB;AAChB;;AAGF,OAAI,kBAAkB,QAAQ,YAAY,SAAS,KAAK,SAAS,GAAG;IAClE,MAAM,WAAW,KAAK,GAAG,GAAG;AAC5B,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC,CAAC;AACvD,WAAO,WAAW;AAClB,oBAAgB;AAChB;;;AAKJ,UAAQ;AACR,kBAAgB;AAChB,qBAAmB;;AAGrB,OAAM,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,WAA6B,KAAuB;AAClE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAGtD,SAAgB,WAA6B,KAAyB;AACpE,QAAQ,MAAM,IAAI,GAAG,aAAa,GAAG,IAAI,MAAM,EAAE,GAAG;;AAQtD,SAAgB,WAGd,KAAS,MAAwB;AACjC,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,GAAG,GACX;;AAQN,SAAgB,UAGd,KAAS,MAAwB;AACjC,QAAO,WAAW,WAAW,OAAO,IAAI,KAAK,CAAC;;AAchD,SAAgB,UAGd,KAAS,QAAiB;AAC1B,QAAO,OACD,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EACpD,KAAK,MAAM,EAAE,aAAa,CAAC,CAC3B,KAAK,UAAU,IAAI,GACtB;;AAON,SAAgB,UAAgD,KAAS;AACvE,QAAO,UAAU,OAAO,IAAI,IAAI;;AAOlC,SAAgB,SAA+C,KAAS;AACtE,QAAO,UAAU,OAAO,IAAI,GAAG;;AAQjC,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MAAM,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CAAC,CAC7D,KAAK,IAAI;;AAGd,MAAM,sBACJ;AAUF,SAAgB,UAGd,KAAS,MAAwB;AACjC,SAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,YAAY,IAAc,EAC1D,OAAO,QAAQ,CACf,KAAK,MACJ,oBAAoB,KAAK,EAAE,GACvB,EAAE,aAAa,GACf,WAAW,MAAM,YAAY,EAAE,aAAa,GAAG,EAAE,CACtD,CACA,KAAK,IAAI"}
package/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "@dathomir/shared",
3
3
  "description": "dathomir shared package",
4
- "version": "0.0.1-beta.0",
4
+ "version": "0.0.1-beta.2",
5
5
  "private": false,
6
6
  "publishConfig": {
7
- "access": "public"
7
+ "access": "public",
8
+ "registry": "https://registry.npmjs.org/",
9
+ "provenance": true
8
10
  },
9
11
  "type": "module",
10
12
  "license": "MPL-2.0",
@@ -37,6 +39,9 @@
37
39
  ],
38
40
  "devDependencies": {
39
41
  "@takuma-ru/rlse": "0.0.1-beta.8",
42
+ "@types/node": "24.2.0",
43
+ "@vitest/coverage-v8": "4.0.4",
44
+ "vitest": "4.0.4",
40
45
  "@dathomir/config": "0.0.0"
41
46
  },
42
47
  "scripts": {
@@ -44,6 +49,7 @@
44
49
  "build": "tsdown",
45
50
  "typecheck": "tsc --noEmit",
46
51
  "lint": "oxlint",
52
+ "test": "vitest run --coverage",
47
53
  "release": "rlse"
48
54
  }
49
55
  }