@jfdevelops/multi-step-form-core 1.0.0-alpha.22 → 1.0.0-alpha.24

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.
Files changed (149) hide show
  1. package/dist/_internals.cjs +0 -4
  2. package/dist/_internals.d.cts +2 -3
  3. package/dist/_internals.d.mts +2 -3
  4. package/dist/_internals.mjs +1 -2
  5. package/dist/index.cjs +17 -17
  6. package/dist/index.d.cts +12 -11
  7. package/dist/index.d.mts +12 -11
  8. package/dist/index.mjs +8 -10
  9. package/dist/internals/step-schema.cjs +120 -71
  10. package/dist/internals/step-schema.cjs.map +1 -1
  11. package/dist/internals/step-schema.d.cts +47 -29
  12. package/dist/internals/step-schema.d.cts.map +1 -1
  13. package/dist/internals/step-schema.d.mts +47 -29
  14. package/dist/internals/step-schema.d.mts.map +1 -1
  15. package/dist/internals/step-schema.mjs +120 -71
  16. package/dist/internals/step-schema.mjs.map +1 -1
  17. package/dist/schema.cjs +14 -10
  18. package/dist/schema.cjs.map +1 -1
  19. package/dist/schema.d.cts +11 -13
  20. package/dist/schema.d.cts.map +1 -1
  21. package/dist/schema.d.mts +11 -13
  22. package/dist/schema.d.mts.map +1 -1
  23. package/dist/schema.mjs +14 -10
  24. package/dist/schema.mjs.map +1 -1
  25. package/dist/steps/fields.cjs +80 -0
  26. package/dist/steps/fields.cjs.map +1 -1
  27. package/dist/steps/fields.d.cts +117 -9
  28. package/dist/steps/fields.d.cts.map +1 -1
  29. package/dist/steps/fields.d.mts +117 -9
  30. package/dist/steps/fields.d.mts.map +1 -1
  31. package/dist/steps/fields.mjs +80 -0
  32. package/dist/steps/fields.mjs.map +1 -1
  33. package/dist/steps/fn-utils/helper-fn/index.cjs +81 -0
  34. package/dist/steps/fn-utils/helper-fn/index.cjs.map +1 -0
  35. package/dist/steps/fn-utils/helper-fn/index.d.cts +146 -0
  36. package/dist/steps/fn-utils/helper-fn/index.d.cts.map +1 -0
  37. package/dist/steps/fn-utils/helper-fn/index.d.mts +146 -0
  38. package/dist/steps/fn-utils/helper-fn/index.d.mts.map +1 -0
  39. package/dist/steps/fn-utils/helper-fn/index.mjs +75 -0
  40. package/dist/steps/fn-utils/helper-fn/index.mjs.map +1 -0
  41. package/dist/steps/fn-utils/helper-fn/utils.d.cts +81 -0
  42. package/dist/steps/fn-utils/helper-fn/utils.d.cts.map +1 -0
  43. package/dist/steps/fn-utils/helper-fn/utils.d.mts +81 -0
  44. package/dist/steps/fn-utils/helper-fn/utils.d.mts.map +1 -0
  45. package/dist/steps/fn-utils/index.cjs +1 -0
  46. package/dist/steps/fn-utils/index.mjs +3 -0
  47. package/dist/steps/fn-utils/reset-fn.d.cts +30 -0
  48. package/dist/steps/fn-utils/reset-fn.d.cts.map +1 -0
  49. package/dist/steps/fn-utils/reset-fn.d.mts +30 -0
  50. package/dist/steps/fn-utils/reset-fn.d.mts.map +1 -0
  51. package/dist/steps/fn-utils/update-fn.d.cts +121 -0
  52. package/dist/steps/fn-utils/update-fn.d.cts.map +1 -0
  53. package/dist/steps/fn-utils/update-fn.d.mts +121 -0
  54. package/dist/steps/fn-utils/update-fn.d.mts.map +1 -0
  55. package/dist/steps/index.cjs +4 -2
  56. package/dist/steps/index.mjs +5 -3
  57. package/dist/steps/schema.cjs +61 -84
  58. package/dist/steps/schema.cjs.map +1 -1
  59. package/dist/steps/schema.d.cts +66 -67
  60. package/dist/steps/schema.d.cts.map +1 -1
  61. package/dist/steps/schema.d.mts +66 -67
  62. package/dist/steps/schema.d.mts.map +1 -1
  63. package/dist/steps/schema.mjs +62 -86
  64. package/dist/steps/schema.mjs.map +1 -1
  65. package/dist/steps/steps.cjs +83 -0
  66. package/dist/steps/steps.cjs.map +1 -0
  67. package/dist/steps/steps.d.cts +81 -0
  68. package/dist/steps/steps.d.cts.map +1 -0
  69. package/dist/steps/steps.d.mts +81 -0
  70. package/dist/steps/steps.d.mts.map +1 -0
  71. package/dist/steps/steps.mjs +76 -0
  72. package/dist/steps/steps.mjs.map +1 -0
  73. package/dist/steps/utils.cjs +40 -30
  74. package/dist/steps/utils.cjs.map +1 -1
  75. package/dist/steps/utils.d.cts +8 -5
  76. package/dist/steps/utils.d.cts.map +1 -1
  77. package/dist/steps/utils.d.mts +8 -5
  78. package/dist/steps/utils.d.mts.map +1 -1
  79. package/dist/steps/utils.mjs +40 -31
  80. package/dist/steps/utils.mjs.map +1 -1
  81. package/dist/storage.cjs +1 -1
  82. package/dist/storage.cjs.map +1 -1
  83. package/dist/storage.d.cts +9 -7
  84. package/dist/storage.d.cts.map +1 -1
  85. package/dist/storage.d.mts +9 -7
  86. package/dist/storage.d.mts.map +1 -1
  87. package/dist/storage.mjs +1 -1
  88. package/dist/storage.mjs.map +1 -1
  89. package/dist/utils/casing.cjs +1 -1
  90. package/dist/utils/casing.cjs.map +1 -1
  91. package/dist/utils/casing.d.cts +27 -11
  92. package/dist/utils/casing.d.cts.map +1 -1
  93. package/dist/utils/casing.d.mts +27 -11
  94. package/dist/utils/casing.d.mts.map +1 -1
  95. package/dist/utils/casing.mjs +1 -1
  96. package/dist/utils/casing.mjs.map +1 -1
  97. package/dist/utils/helpers.cjs +8 -0
  98. package/dist/utils/helpers.cjs.map +1 -1
  99. package/dist/utils/helpers.mjs +7 -1
  100. package/dist/utils/helpers.mjs.map +1 -1
  101. package/dist/utils/index.cjs +3 -0
  102. package/dist/utils/index.mjs +5 -0
  103. package/dist/utils/invariant.cjs +28 -8
  104. package/dist/utils/invariant.cjs.map +1 -1
  105. package/dist/utils/invariant.d.cts +12 -2
  106. package/dist/utils/invariant.d.cts.map +1 -1
  107. package/dist/utils/invariant.d.mts +12 -2
  108. package/dist/utils/invariant.d.mts.map +1 -1
  109. package/dist/utils/invariant.mjs +28 -9
  110. package/dist/utils/invariant.mjs.map +1 -1
  111. package/dist/utils/types.d.cts +15 -3
  112. package/dist/utils/types.d.cts.map +1 -1
  113. package/dist/utils/types.d.mts +15 -3
  114. package/dist/utils/types.d.mts.map +1 -1
  115. package/dist/utils/validator.d.cts.map +1 -1
  116. package/dist/utils/validator.d.mts.map +1 -1
  117. package/package.json +1 -1
  118. package/dist/internals/utils.cjs +0 -94
  119. package/dist/internals/utils.cjs.map +0 -1
  120. package/dist/internals/utils.d.cts +0 -33
  121. package/dist/internals/utils.d.cts.map +0 -1
  122. package/dist/internals/utils.d.mts +0 -33
  123. package/dist/internals/utils.d.mts.map +0 -1
  124. package/dist/internals/utils.mjs +0 -91
  125. package/dist/internals/utils.mjs.map +0 -1
  126. package/dist/observable.cjs +0 -44
  127. package/dist/observable.cjs.map +0 -1
  128. package/dist/observable.d.cts +0 -26
  129. package/dist/observable.d.cts.map +0 -1
  130. package/dist/observable.d.mts +0 -26
  131. package/dist/observable.d.mts.map +0 -1
  132. package/dist/observable.mjs +0 -44
  133. package/dist/observable.mjs.map +0 -1
  134. package/dist/steps/types.cjs +0 -33
  135. package/dist/steps/types.cjs.map +0 -1
  136. package/dist/steps/types.d.cts +0 -354
  137. package/dist/steps/types.d.cts.map +0 -1
  138. package/dist/steps/types.d.mts +0 -354
  139. package/dist/steps/types.d.mts.map +0 -1
  140. package/dist/steps/types.mjs +0 -27
  141. package/dist/steps/types.mjs.map +0 -1
  142. package/dist/utils/field-types.cjs +0 -23
  143. package/dist/utils/field-types.cjs.map +0 -1
  144. package/dist/utils/field-types.d.cts +0 -39
  145. package/dist/utils/field-types.d.cts.map +0 -1
  146. package/dist/utils/field-types.d.mts +0 -39
  147. package/dist/utils/field-types.d.mts.map +0 -1
  148. package/dist/utils/field-types.mjs +0 -20
  149. package/dist/utils/field-types.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","names":[],"sources":["../src/storage.ts"],"sourcesContent":["import type { Updater } from '@/steps/types';\nimport { invariant } from '@/utils/invariant';\nimport { MultiStepFormLogger } from '@/utils/logger';\n\nexport type DefaultStorageKey = typeof DEFAULT_STORAGE_KEY;\nexport type StorageConfig<TData, TKey extends string> = {\n key: TKey;\n data: TData;\n store?: Storage;\n /**\n * An extra option to throw an error when {@linkcode window} is `undefined`\n * @default false\n */\n throwWhenUndefined?: boolean;\n};\n\nconst WINDOW_UNDEFINED_MESSAGE =\n '\"window\" in undefined. No storage is available';\nexport const DEFAULT_STORAGE_KEY = 'MultiStepForm';\n\n/**\n * Converts Date strings back to Date objects for fields with type: 'date'.\n */\nfunction convertDateStringsToDates(parsed: unknown): unknown {\n if (!parsed || typeof parsed !== 'object') {\n return parsed;\n }\n\n const converted = Array.isArray(parsed) ? [...parsed] : { ...parsed };\n\n // Iterate through each step\n for (const [stepKey, stepValue] of Object.entries(converted)) {\n if (\n !stepValue ||\n typeof stepValue !== 'object' ||\n !('fields' in stepValue) ||\n typeof stepValue.fields !== 'object'\n ) {\n continue;\n }\n\n const fields = { ...(stepValue.fields as Record<string, unknown>) };\n let hasChanges = false;\n\n // Iterate through each field\n for (const [fieldName, fieldValue] of Object.entries(fields)) {\n if (\n !fieldValue ||\n typeof fieldValue !== 'object' ||\n !('type' in fieldValue) ||\n !('defaultValue' in fieldValue)\n ) {\n continue;\n }\n\n // Check if field has type: 'date' and defaultValue is a string\n if (\n fieldValue.type === 'date' &&\n typeof fieldValue.defaultValue === 'string'\n ) {\n // Convert string to Date\n const dateValue = new Date(fieldValue.defaultValue);\n\n // Only convert if it's a valid date\n if (!Number.isNaN(dateValue.getTime())) {\n fields[fieldName] = {\n ...fieldValue,\n defaultValue: dateValue,\n };\n hasChanges = true;\n }\n }\n }\n\n // Update the step with converted fields if there were changes\n if (hasChanges) {\n (converted as Record<string, unknown>)[stepKey] = {\n ...stepValue,\n fields,\n };\n }\n }\n\n return converted;\n}\n\nexport class MultiStepFormStorage<\n data,\n key extends string = DefaultStorageKey\n> {\n readonly key: key;\n readonly store!: Storage;\n readonly data: data;\n private readonly log: MultiStepFormLogger;\n private readonly shouldRunActions: boolean;\n private readonly throwWhenUndefined: boolean;\n\n constructor(config: StorageConfig<data, key>) {\n const { key, data, store, throwWhenUndefined = false } = config;\n\n this.log = new MultiStepFormLogger({\n prefix: DEFAULT_STORAGE_KEY,\n });\n this.key = key;\n this.data = data;\n this.throwWhenUndefined = throwWhenUndefined;\n\n if (store) {\n this.store = store;\n this.shouldRunActions = true;\n\n if (typeof window === 'undefined') {\n // this.shouldRunActions = false;\n this.log.warn(WINDOW_UNDEFINED_MESSAGE);\n }\n } else if (typeof window !== 'undefined') {\n this.store = window.localStorage;\n this.shouldRunActions = true;\n } else {\n this.shouldRunActions = false;\n this.log.warn(WINDOW_UNDEFINED_MESSAGE);\n }\n }\n\n private throwOnEmptyStore() {\n if (!this.throwWhenUndefined) {\n return;\n }\n\n invariant(this.store, () => {\n if (this.shouldRunActions) {\n return WINDOW_UNDEFINED_MESSAGE;\n }\n\n return 'No storage available';\n });\n }\n\n private resolveValue(value: Updater<data>) {\n if (typeof value === 'function') {\n return (value as (input: data) => data)(this.data);\n }\n\n return value;\n }\n\n hasKey() {\n return this.store.getItem(this.key) !== null;\n }\n\n get() {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n const item = this.store.getItem(this.key);\n\n if (item) {\n const parsed = JSON.parse(item);\n const converted = convertDateStringsToDates(parsed);\n\n return converted as data;\n }\n }\n\n remove() {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n this.store.removeItem(this.key);\n }\n\n add(value: Updater<data>) {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n const resolvedValue = JSON.stringify(this.resolveValue(value));\n\n this.store.setItem(this.key, resolvedValue);\n }\n}\n"],"mappings":";;;;AAgBA,MAAM,2BACJ;AACF,MAAa,sBAAsB;;;;AAKnC,SAAS,0BAA0B,QAA0B;AAC3D,KAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;CAGT,MAAM,YAAY,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,QAAQ;AAGrE,MAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,UAAU,EAAE;AAC5D,MACE,CAAC,aACD,OAAO,cAAc,YACrB,EAAE,YAAY,cACd,OAAO,UAAU,WAAW,SAE5B;EAGF,MAAM,SAAS,EAAE,GAAI,UAAU,QAAoC;EACnE,IAAI,aAAa;AAGjB,OAAK,MAAM,CAAC,WAAW,eAAe,OAAO,QAAQ,OAAO,EAAE;AAC5D,OACE,CAAC,cACD,OAAO,eAAe,YACtB,EAAE,UAAU,eACZ,EAAE,kBAAkB,YAEpB;AAIF,OACE,WAAW,SAAS,UACpB,OAAO,WAAW,iBAAiB,UACnC;IAEA,MAAM,YAAY,IAAI,KAAK,WAAW,aAAa;AAGnD,QAAI,CAAC,OAAO,MAAM,UAAU,SAAS,CAAC,EAAE;AACtC,YAAO,aAAa;MAClB,GAAG;MACH,cAAc;MACf;AACD,kBAAa;;;;AAMnB,MAAI,WACF,CAAC,UAAsC,WAAW;GAChD,GAAG;GACH;GACD;;AAIL,QAAO;;AAGT,IAAa,uBAAb,MAGE;CACA,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,QAAkC;EAC5C,MAAM,EAAE,KAAK,MAAM,OAAO,qBAAqB,UAAU;AAEzD,OAAK,MAAM,IAAI,oBAAoB,EACjC,QAAQ,qBACT,CAAC;AACF,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,OAAK,qBAAqB;AAE1B,MAAI,OAAO;AACT,QAAK,QAAQ;AACb,QAAK,mBAAmB;AAExB,OAAI,OAAO,WAAW,YAEpB,MAAK,IAAI,KAAK,yBAAyB;aAEhC,OAAO,WAAW,aAAa;AACxC,QAAK,QAAQ,OAAO;AACpB,QAAK,mBAAmB;SACnB;AACL,QAAK,mBAAmB;AACxB,QAAK,IAAI,KAAK,yBAAyB;;;CAI3C,AAAQ,oBAAoB;AAC1B,MAAI,CAAC,KAAK,mBACR;AAGF,YAAU,KAAK,aAAa;AAC1B,OAAI,KAAK,iBACP,QAAO;AAGT,UAAO;IACP;;CAGJ,AAAQ,aAAa,OAAsB;AACzC,MAAI,OAAO,UAAU,WACnB,QAAQ,MAAgC,KAAK,KAAK;AAGpD,SAAO;;CAGT,SAAS;AACP,SAAO,KAAK,MAAM,QAAQ,KAAK,IAAI,KAAK;;CAG1C,MAAM;AACJ,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;EAGF,MAAM,OAAO,KAAK,MAAM,QAAQ,KAAK,IAAI;AAEzC,MAAI,KAIF,QAFkB,0BADH,KAAK,MAAM,KAAK,CACoB;;CAMvD,SAAS;AACP,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;AAGF,OAAK,MAAM,WAAW,KAAK,IAAI;;CAGjC,IAAI,OAAsB;AACxB,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;EAGF,MAAM,gBAAgB,KAAK,UAAU,KAAK,aAAa,MAAM,CAAC;AAE9D,OAAK,MAAM,QAAQ,KAAK,KAAK,cAAc"}
1
+ {"version":3,"file":"storage.mjs","names":[],"sources":["../src/storage.ts"],"sourcesContent":["import type { Updater } from '@/utils/types';\nimport { invariant } from '@/utils/invariant';\nimport { MultiStepFormLogger } from '@/utils/logger';\n\nexport type DefaultStorageKey = typeof DEFAULT_STORAGE_KEY;\nexport interface BaseStorageConfig<TKey extends string> {\n key: TKey;\n store?: Storage;\n /**\n * An extra option to throw an error when {@linkcode window} is `undefined`\n * @default false\n */\n throwWhenUndefined?: boolean;\n}\nexport type StorageConfig<\nTData,\nTKey extends string\n> = BaseStorageConfig<TKey> & {\n data: TData;\n};\n\nconst WINDOW_UNDEFINED_MESSAGE =\n'\"window\" in undefined. No storage is available';\nexport const DEFAULT_STORAGE_KEY = 'MultiStepForm';\n\n/**\n* Converts Date strings back to Date objects for fields with type: 'date'.\n*/\nfunction convertDateStringsToDates(parsed: unknown): unknown {\n if (!parsed || typeof parsed !== 'object') {\n return parsed;\n }\n\n const converted = Array.isArray(parsed) ? [...parsed] : { ...parsed };\n\n // Iterate through each step\n for (const [stepKey, stepValue] of Object.entries(converted)) {\n if (\n !stepValue ||\n typeof stepValue !== 'object' ||\n !('fields' in stepValue) ||\n typeof stepValue.fields !== 'object'\n ) {\n continue;\n }\n\n const fields = { ...(stepValue.fields as Record<string, unknown>) };\n let hasChanges = false;\n\n // Iterate through each field\n for (const [fieldName, fieldValue] of Object.entries(fields)) {\n if (\n !fieldValue ||\n typeof fieldValue !== 'object' ||\n !('type' in fieldValue) ||\n !('defaultValue' in fieldValue)\n ) {\n continue;\n }\n\n // Check if field has type: 'date' and defaultValue is a string\n if (\n fieldValue.type === 'date' &&\n typeof fieldValue.defaultValue === 'string'\n ) {\n // Convert string to Date\n const dateValue = new Date(fieldValue.defaultValue);\n\n // Only convert if it's a valid date\n if (!Number.isNaN(dateValue.getTime())) {\n fields[fieldName] = {\n ...fieldValue,\n defaultValue: dateValue,\n };\n hasChanges = true;\n }\n }\n }\n\n // Update the step with converted fields if there were changes\n if (hasChanges) {\n (converted as Record<string, unknown>)[stepKey] = {\n ...stepValue,\n fields,\n };\n }\n }\n\n return converted;\n}\n\nexport class MultiStepFormStorage<\ndata,\nkey extends string = DefaultStorageKey\n> {\n readonly key: key;\n readonly store!: Storage;\n readonly data: data;\n private readonly log: MultiStepFormLogger;\n private readonly shouldRunActions: boolean;\n private readonly throwWhenUndefined: boolean;\n\n constructor(config: StorageConfig<data, key>) {\n const { key, data, store, throwWhenUndefined = false } = config;\n\n this.log = new MultiStepFormLogger({\n prefix: DEFAULT_STORAGE_KEY,\n });\n this.key = key;\n this.data = data;\n this.throwWhenUndefined = throwWhenUndefined;\n\n if (store) {\n this.store = store;\n this.shouldRunActions = true;\n\n if (typeof window === 'undefined') {\n // this.shouldRunActions = false;\n this.log.warn(WINDOW_UNDEFINED_MESSAGE);\n }\n } else if (typeof window !== 'undefined') {\n this.store = window.localStorage;\n this.shouldRunActions = true;\n } else {\n this.shouldRunActions = false;\n this.log.warn(WINDOW_UNDEFINED_MESSAGE);\n }\n }\n\n private throwOnEmptyStore() {\n if (!this.throwWhenUndefined) {\n return;\n }\n\n invariant(this.store, () => {\n if (this.shouldRunActions) {\n return WINDOW_UNDEFINED_MESSAGE;\n }\n\n return 'No storage available';\n });\n }\n\n private resolveValue(value: Updater<data>) {\n if (typeof value === 'function') {\n return (value as (input: data) => data)(this.data);\n }\n\n return value;\n }\n\n hasKey() {\n return this.store.getItem(this.key) !== null;\n }\n\n get() {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n const item = this.store.getItem(this.key);\n\n if (item) {\n const parsed = JSON.parse(item);\n const converted = convertDateStringsToDates(parsed);\n\n return converted as data;\n }\n }\n\n remove() {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n this.store.removeItem(this.key);\n }\n\n add(value: Updater<data>) {\n this.throwOnEmptyStore();\n\n if (!this.shouldRunActions) {\n return;\n }\n\n const resolvedValue = JSON.stringify(this.resolveValue(value));\n\n this.store.setItem(this.key, resolvedValue);\n }\n}\n"],"mappings":";;;;AAqBA,MAAM,2BACN;AACA,MAAa,sBAAsB;;;;AAKnC,SAAS,0BAA0B,QAA0B;AAC3D,KAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;CAGT,MAAM,YAAY,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,QAAQ;AAGrE,MAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,UAAU,EAAE;AAC5D,MACE,CAAC,aACD,OAAO,cAAc,YACrB,EAAE,YAAY,cACd,OAAO,UAAU,WAAW,SAE5B;EAGF,MAAM,SAAS,EAAE,GAAI,UAAU,QAAoC;EACnE,IAAI,aAAa;AAGjB,OAAK,MAAM,CAAC,WAAW,eAAe,OAAO,QAAQ,OAAO,EAAE;AAC5D,OACE,CAAC,cACD,OAAO,eAAe,YACtB,EAAE,UAAU,eACZ,EAAE,kBAAkB,YAEpB;AAIF,OACE,WAAW,SAAS,UACpB,OAAO,WAAW,iBAAiB,UACnC;IAEA,MAAM,YAAY,IAAI,KAAK,WAAW,aAAa;AAGnD,QAAI,CAAC,OAAO,MAAM,UAAU,SAAS,CAAC,EAAE;AACtC,YAAO,aAAa;MAClB,GAAG;MACH,cAAc;MACf;AACD,kBAAa;;;;AAMnB,MAAI,WACF,CAAC,UAAsC,WAAW;GAChD,GAAG;GACH;GACD;;AAIL,QAAO;;AAGT,IAAa,uBAAb,MAGE;CACA,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,QAAkC;EAC5C,MAAM,EAAE,KAAK,MAAM,OAAO,qBAAqB,UAAU;AAEzD,OAAK,MAAM,IAAI,oBAAoB,EACjC,QAAQ,qBACT,CAAC;AACF,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,OAAK,qBAAqB;AAE1B,MAAI,OAAO;AACT,QAAK,QAAQ;AACb,QAAK,mBAAmB;AAExB,OAAI,OAAO,WAAW,YAEpB,MAAK,IAAI,KAAK,yBAAyB;aAEhC,OAAO,WAAW,aAAa;AACxC,QAAK,QAAQ,OAAO;AACpB,QAAK,mBAAmB;SACnB;AACL,QAAK,mBAAmB;AACxB,QAAK,IAAI,KAAK,yBAAyB;;;CAI3C,AAAQ,oBAAoB;AAC1B,MAAI,CAAC,KAAK,mBACR;AAGF,YAAU,KAAK,aAAa;AAC1B,OAAI,KAAK,iBACP,QAAO;AAGT,UAAO;IACP;;CAGJ,AAAQ,aAAa,OAAsB;AACzC,MAAI,OAAO,UAAU,WACnB,QAAQ,MAAgC,KAAK,KAAK;AAGpD,SAAO;;CAGT,SAAS;AACP,SAAO,KAAK,MAAM,QAAQ,KAAK,IAAI,KAAK;;CAG1C,MAAM;AACJ,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;EAGF,MAAM,OAAO,KAAK,MAAM,QAAQ,KAAK,IAAI;AAEzC,MAAI,KAIF,QAFkB,0BADH,KAAK,MAAM,KAAK,CACoB;;CAMvD,SAAS;AACP,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;AAGF,OAAK,MAAM,WAAW,KAAK,IAAI;;CAGjC,IAAI,OAAsB;AACxB,OAAK,mBAAmB;AAExB,MAAI,CAAC,KAAK,iBACR;EAGF,MAAM,gBAAgB,KAAK,UAAU,KAAK,aAAa,MAAM,CAAC;AAE9D,OAAK,MAAM,QAAQ,KAAK,KAAK,cAAc"}
@@ -14,7 +14,7 @@ const CASING_TYPES = [
14
14
  ];
15
15
  const DEFAULT_CASING = "title";
16
16
  function changeCasing(input, type) {
17
- const words = input.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[-_]+/g, " ").trim().split(/\s+/).map((w) => w.toLowerCase());
17
+ const words = input.replaceAll(/([a-z])([A-Z])/g, "$1 $2").replaceAll(/[-_]+/g, " ").trim().split(/\s+/).map((w) => w.toLowerCase());
18
18
  switch (type) {
19
19
  case "sentence": return words[0].charAt(0).toUpperCase() + words[0].slice(1) + (words.length > 1 ? " " + words.slice(1).join(" ") : "");
20
20
  case "title": return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
@@ -1 +1 @@
1
- {"version":3,"file":"casing.cjs","names":["DEFAULT_CASING: SetDefaultString<CasingType, 'title'>"],"sources":["../../src/utils/casing.ts"],"sourcesContent":["import type { Expand, SetDefaultString } from './types';\n\nexport type CasingType = (typeof CASING_TYPES)[number];\nexport type ToLower<S extends string> = S extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${ToLower<R>}`\n : S;\n\nexport type CapitalizeWord<S extends string> = S extends `${infer F}${infer R}`\n ? `${Uppercase<F>}${ToLower<R>}`\n : S;\n// Pascal => Capitalize each \"word\" chunk\ntype Pascalize<S extends string> = Capitalize<S>; // naive\n\n// SnakeCase: turn spaces/hyphens into underscores, lowercase\ntype SnakeCase<S extends string> = Lowercase<\n S extends `${infer A} ${infer B}`\n ? `${A}_${SnakeCase<B>}`\n : S extends `${infer A}-${infer B}`\n ? `${A}_${SnakeCase<B>}`\n : S\n>;\n\n// KebabCase: same as snake but with \"-\"\ntype KebabCase<S extends string> = Lowercase<\n S extends `${infer A} ${infer B}`\n ? `${A}-${KebabCase<B>}`\n : S extends `${infer A}_${infer B}`\n ? `${A}-${KebabCase<B>}`\n : S\n>;\n\n// Flat: just strip spaces/underscores/hyphens\ntype RemoveDelimiters<S extends string> = S extends `${infer A} ${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S extends `${infer A}_${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S extends `${infer A}-${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S;\n\n// TitleCase: Capitalize the whole thing\ntype TitleCase<S extends string> = Capitalize<Lowercase<S>>;\n\n// SentenceCase: First word capped, rest lower\ntype SentenceCase<S extends string> = Capitalize<Lowercase<S>>;\nexport type ChangeCasing<\n S extends string,\n T extends CasingType\n> = T extends 'lower'\n ? Lowercase<S>\n : T extends 'upper'\n ? Uppercase<S>\n : T extends 'camel'\n ? Uncapitalize<Pascalize<S>>\n : T extends 'pascal'\n ? Pascalize<S>\n : T extends 'snake'\n ? SnakeCase<S>\n : T extends 'screaming-snake'\n ? Uppercase<SnakeCase<S>>\n : T extends 'kebab'\n ? KebabCase<S>\n : T extends 'flat'\n ? RemoveDelimiters<Lowercase<S>>\n : T extends 'title'\n ? TitleCase<S>\n : T extends 'sentence'\n ? SentenceCase<S>\n : S;\nexport type ChangeObjectCasing<\n T extends object,\n TCasing extends CasingType\n> = Expand<{\n [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K];\n}>;\n\nexport const CASING_TYPES = [\n 'sentence',\n 'title',\n 'camel',\n 'lower',\n 'upper',\n 'pascal',\n 'snake',\n 'screaming-snake',\n 'flat',\n 'kebab',\n] as const;\n\nexport type DefaultCasing = typeof DEFAULT_CASING;\nexport const DEFAULT_CASING: SetDefaultString<CasingType, 'title'> = 'title';\n\n/**\n * Changes the casing of a string according to the specified casing type.\n *\n * @param input - The string to transform.\n * @param type - The casing type to apply.\n * @returns The transformed string in the specified casing.\n */\n// TODO make return type safe\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n): ChangeCasing<TValue, TType>;\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n) {\n // Step 1: Normalize to words\n const words = input\n // Replace camelCase boundaries with space\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Replace separators with space\n .replace(/[-_]+/g, ' ')\n // Trim and split into words\n .trim()\n .split(/\\s+/)\n .map((w) => w.toLowerCase());\n\n // Step 2: Apply casing\n switch (type) {\n case 'sentence':\n return (\n words[0].charAt(0).toUpperCase() +\n words[0].slice(1) +\n (words.length > 1 ? ' ' + words.slice(1).join(' ') : '')\n );\n\n case 'title':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n\n case 'camel':\n return (\n words[0] +\n words\n .slice(1)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('')\n );\n\n case 'pascal':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n\n case 'lower':\n return words.join(' ');\n\n case 'upper':\n return words.join(' ').toUpperCase();\n\n case 'snake':\n return words.join('_');\n\n case 'screaming-snake':\n return words.join('_').toUpperCase();\n\n case 'kebab':\n return words.join('-');\n\n case 'flat':\n return words.join('');\n\n default:\n return input;\n }\n}\n\nexport function quote(str: string, quoteChar: '\"' | \"'\" = '\"') {\n const startsWithQuote = str.startsWith(quoteChar);\n const endsWithQuote = str.endsWith(quoteChar);\n\n if (startsWithQuote && endsWithQuote) {\n // Already wrapped correctly\n return str;\n }\n\n // If it starts or ends with a quote but not both → strip those first\n const trimmed = str.replace(/^['\"]|['\"]$/g, '');\n\n // Then add new quotes consistently\n return `${quoteChar}${trimmed}${quoteChar}`;\n}\n\nexport function isCasingValid(value: unknown): value is CasingType {\n if (typeof value !== 'string') {\n return false;\n }\n\n const isValid = CASING_TYPES.includes(value as CasingType);\n\n // invariant(isValid, () => {\n // const formatter = new Intl.ListFormat('en', {\n // style: 'long',\n // type: 'conjunction',\n // });\n\n // return `${value} is not a valid casing type. Valid types include ${formatter.format(\n // CASING_TYPES.map((word) => quote(word))\n // )}`;\n // });\n\n return isValid;\n}\n\n/**\n * Validates {@linkcode input} is a valid {@linkcode CasingType}.\n *\n * If there is no explicit {@linkcode fallback} value provided,\n * it will default to {@linkcode DEFAULT_CASING}.\n * @param input The input to check.\n * @param fallback An optional fallback value if {@linkcode input} is `undefined`.\n * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.\n */\nexport function setCasingType<TCasing extends CasingType>(\n input: TCasing | undefined,\n fallback: CasingType = DEFAULT_CASING\n) {\n if (isCasingValid(input)) {\n return input;\n }\n\n return fallback;\n}\n"],"mappings":";;AA4EA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAaA,iBAAwD;AAcrE,SAAgB,aACd,OACA,MACA;CAEA,MAAM,QAAQ,MAEX,QAAQ,mBAAmB,QAAQ,CAEnC,QAAQ,UAAU,IAAI,CAEtB,MAAM,CACN,MAAM,MAAM,CACZ,KAAK,MAAM,EAAE,aAAa,CAAC;AAG9B,SAAQ,MAAR;EACE,KAAK,WACH,QACE,MAAM,GAAG,OAAO,EAAE,CAAC,aAAa,GAChC,MAAM,GAAG,MAAM,EAAE,IAChB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG;EAGzD,KAAK,QACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;EAE3E,KAAK,QACH,QACE,MAAM,KACN,MACG,MAAM,EAAE,CACR,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAClD,KAAK,GAAG;EAGf,KAAK,SACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;EAE1E,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,QACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,kBACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,OACH,QAAO,MAAM,KAAK,GAAG;EAEvB,QACE,QAAO;;;AAIb,SAAgB,MAAM,KAAa,YAAuB,MAAK;CAC7D,MAAM,kBAAkB,IAAI,WAAW,UAAU;CACjD,MAAM,gBAAgB,IAAI,SAAS,UAAU;AAE7C,KAAI,mBAAmB,cAErB,QAAO;AAOT,QAAO,GAAG,YAHM,IAAI,QAAQ,gBAAgB,GAAG,GAGf;;AAGlC,SAAgB,cAAc,OAAqC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO;AAgBT,QAbgB,aAAa,SAAS,MAAoB;;;;;;;;;;;AAyB5D,SAAgB,cACd,OACA,WAAuB,gBACvB;AACA,KAAI,cAAc,MAAM,CACtB,QAAO;AAGT,QAAO"}
1
+ {"version":3,"file":"casing.cjs","names":["DEFAULT_CASING: SetDefaultString<CasingType, 'title'>"],"sources":["../../src/utils/casing.ts"],"sourcesContent":["import type { Expand, SetDefaultString } from './types';\n\nexport type CasingType = (typeof CASING_TYPES)[number];\n\ntype LowerChar =\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z';\ntype UpperChar = Uppercase<LowerChar>;\ntype IsLower<T extends string> = T extends Lowercase<T> ? true : false;\ntype IsUpper<T extends string> = T extends Uppercase<T> ? true : false;\ntype IsSnake<T extends string> = T extends `${string}_${string}` ? true : false;\ntype IsKebab<T extends string> = T extends `${string}-${string}` ? true : false;\ntype IsCamel<T extends string> = T extends `${LowerChar}${string}`\n ? T extends Capitalize<T>\n ? false\n : true\n : false;\ntype IsCapitalized<T extends string> = T extends `${UpperChar}${string}`\n ? true\n : false;\ntype IsTitle<T extends string> = IsCapitalized<\n SplitSpaces<T>[number]\n> extends true\n ? true\n : false;\n\ntype IsSentence<T extends string> = SplitSpaces<T> extends [\n infer First extends string,\n ...infer Rest extends string[]\n]\n ? IsCapitalized<First> extends true\n ? IsCapitalized<Rest[number]> extends false\n ? true\n : false\n : false\n : false;\n\ntype IsPascal<T extends string> = T extends Capitalize<T> ? true : false;\n\ntype DetectCasing<T extends string> = T extends `${string} ${string}`\n ? IsUpper<T> extends true\n ? 'upper'\n : IsSentence<T> extends true\n ? 'sentence'\n : IsTitle<T> extends true\n ? 'title'\n : IsLower<T> extends true\n ? 'lower'\n : IsUpper<T> extends true\n ? 'upper'\n : 'unknown'\n : IsSnake<T> extends true\n ? IsUpper<T> extends true\n ? 'screaming-snake'\n : 'snake'\n : IsKebab<T> extends true\n ? 'kebab'\n : IsCamel<T> extends true\n ? 'camel'\n : IsPascal<T> extends true\n ? 'pascal'\n : IsLower<T> extends true\n ? 'flat' | 'lower'\n : IsUpper<T> extends true\n ? 'upper'\n : 'unknown';\n\n/* ============================================================\n * Word Normalization\n * ============================================================ */\n\ntype SplitSnake<T extends string> = T extends `${infer A}_${infer B}`\n ? [A, ...SplitSnake<B>]\n : [T];\n\ntype SplitKebab<T extends string> = T extends `${infer A}-${infer B}`\n ? [A, ...SplitKebab<B>]\n : [T];\n\ntype SplitSpaces<T extends string> = T extends `${infer A} ${infer B}`\n ? [A, ...SplitSpaces<B>]\n : [T];\n\ntype SplitCamel<\n T extends string,\n Acc extends string = ''\n> = T extends `${infer C}${infer R}`\n ? C extends Lowercase<C>\n ? SplitCamel<R, `${Acc}${C}`>\n : Acc extends ''\n ? SplitCamel<R, `${Lowercase<C>}`>\n : [Acc, ...SplitCamel<R, `${Lowercase<C>}`>]\n : Acc extends ''\n ? []\n : [Acc];\n\ntype WordsFrom<T extends string> = DetectCasing<T> extends\n | 'snake'\n | 'screaming-snake'\n ? SplitSnake<Lowercase<T>>\n : DetectCasing<T> extends 'kebab'\n ? SplitKebab<Lowercase<T>>\n : DetectCasing<T> extends 'camel' | 'pascal'\n ? SplitCamel<T>\n : DetectCasing<T> extends 'sentence' | 'title' | 'lower' | 'upper'\n ? SplitSpaces<Lowercase<T>>\n : [Lowercase<T>];\n\ntype JoinCamel<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${Capitalize<JoinCamel<R>>}`\n : '';\ntype ToTitle<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${Capitalize<H>}${R extends [] ? '' : ` ${ToTitle<R>}`}`\n : '';\ntype ToSentence<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${Capitalize<H>}${R extends [] ? '' : ` ${Lowercase<JoinSpaces<R>>}`}`\n : '';\n\ntype JoinPascal<T extends string[]> = Capitalize<JoinCamel<T>>;\n\ntype JoinSnake<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : `_${JoinSnake<R>}`}`\n : '';\n\ntype JoinKebab<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : `-${JoinKebab<R>}`}`\n : '';\n\ntype JoinSpaces<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : ` ${JoinSpaces<R>}`}`\n : '';\n\nexport type ChangeCasing<\n T extends string,\n To extends CasingType\n> = WordsFrom<T> extends infer W extends string[]\n ? To extends 'camel'\n ? JoinCamel<W>\n : To extends 'pascal'\n ? JoinPascal<W>\n : To extends 'snake'\n ? JoinSnake<W>\n : To extends 'screaming-snake'\n ? Uppercase<JoinSnake<W>>\n : To extends 'kebab'\n ? JoinKebab<W>\n : To extends 'lower'\n ? JoinSpaces<W>\n : To extends 'upper'\n ? Uppercase<JoinSpaces<W>>\n : To extends 'sentence'\n ? ToSentence<W>\n : To extends 'title'\n ? ToTitle<W>\n : To extends 'flat'\n ? Lowercase<JoinCamel<W>>\n : never\n : never;\n\nexport type ChangeObjectCasing<\n T extends object,\n TCasing extends CasingType\n> = Expand<{\n [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K];\n}>;\n\nexport const CASING_TYPES = [\n 'sentence',\n 'title',\n 'camel',\n 'lower',\n 'upper',\n 'pascal',\n 'snake',\n 'screaming-snake',\n 'flat',\n 'kebab',\n] as const;\n\nexport type DefaultCasing = typeof DEFAULT_CASING;\nexport const DEFAULT_CASING: SetDefaultString<CasingType, 'title'> = 'title';\n\n/**\n * Changes the casing of a string according to the specified casing type.\n *\n * @param input - The string to transform.\n * @param type - The casing type to apply.\n * @returns The transformed string in the specified casing.\n */\n// TODO make return type safe\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n): ChangeCasing<TValue, TType>;\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n) {\n // Step 1: Normalize to words\n const words = input\n // Replace camelCase boundaries with space\n .replaceAll(/([a-z])([A-Z])/g, '$1 $2')\n // Replace separators with space\n .replaceAll(/[-_]+/g, ' ')\n // Trim and split into words\n .trim()\n .split(/\\s+/)\n .map((w) => w.toLowerCase());\n\n // Step 2: Apply casing\n switch (type) {\n case 'sentence':\n return (\n words[0].charAt(0).toUpperCase() +\n words[0].slice(1) +\n (words.length > 1 ? ' ' + words.slice(1).join(' ') : '')\n );\n\n case 'title':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n\n case 'camel':\n return (\n words[0] +\n words\n .slice(1)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('')\n );\n\n case 'pascal':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n\n case 'lower':\n return words.join(' ');\n\n case 'upper':\n return words.join(' ').toUpperCase();\n\n case 'snake':\n return words.join('_');\n\n case 'screaming-snake':\n return words.join('_').toUpperCase();\n\n case 'kebab':\n return words.join('-');\n\n case 'flat':\n return words.join('');\n\n default:\n return input;\n }\n}\n\nexport function quote(str: string, quoteChar: '\"' | \"'\" = '\"') {\n const startsWithQuote = str.startsWith(quoteChar);\n const endsWithQuote = str.endsWith(quoteChar);\n\n if (startsWithQuote && endsWithQuote) {\n // Already wrapped correctly\n return str;\n }\n\n // If it starts or ends with a quote but not both → strip those first\n const trimmed = str.replace(/^['\"]|['\"]$/g, '');\n\n // Then add new quotes consistently\n return `${quoteChar}${trimmed}${quoteChar}`;\n}\n\nexport function isCasingValid(value: unknown): value is CasingType {\n if (typeof value !== 'string') {\n return false;\n }\n\n const isValid = CASING_TYPES.includes(value as CasingType);\n\n // invariant(isValid, () => {\n // const formatter = new Intl.ListFormat('en', {\n // style: 'long',\n // type: 'conjunction',\n // });\n\n // return `${value} is not a valid casing type. Valid types include ${formatter.format(\n // CASING_TYPES.map((word) => quote(word))\n // )}`;\n // });\n\n return isValid;\n}\n\n/**\n * Validates {@linkcode input} is a valid {@linkcode CasingType}.\n *\n * If there is no explicit {@linkcode fallback} value provided,\n * it will default to {@linkcode DEFAULT_CASING}.\n * @param input The input to check.\n * @param fallback An optional fallback value if {@linkcode input} is `undefined`.\n * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.\n */\nexport function setCasingType<TCasing extends CasingType>(\n input: TCasing | undefined,\n fallback: CasingType = DEFAULT_CASING\n) {\n if (isCasingValid(input)) {\n return input;\n }\n\n return fallback;\n}\n"],"mappings":";;AAgNA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAaA,iBAAwD;AAcrE,SAAgB,aACd,OACA,MACA;CAEA,MAAM,QAAQ,MAEX,WAAW,mBAAmB,QAAQ,CAEtC,WAAW,UAAU,IAAI,CAEzB,MAAM,CACN,MAAM,MAAM,CACZ,KAAK,MAAM,EAAE,aAAa,CAAC;AAG9B,SAAQ,MAAR;EACE,KAAK,WACH,QACE,MAAM,GAAG,OAAO,EAAE,CAAC,aAAa,GAChC,MAAM,GAAG,MAAM,EAAE,IAChB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG;EAGzD,KAAK,QACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;EAE3E,KAAK,QACH,QACE,MAAM,KACN,MACG,MAAM,EAAE,CACR,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAClD,KAAK,GAAG;EAGf,KAAK,SACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;EAE1E,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,QACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,kBACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,OACH,QAAO,MAAM,KAAK,GAAG;EAEvB,QACE,QAAO;;;AAIb,SAAgB,MAAM,KAAa,YAAuB,MAAK;CAC7D,MAAM,kBAAkB,IAAI,WAAW,UAAU;CACjD,MAAM,gBAAgB,IAAI,SAAS,UAAU;AAE7C,KAAI,mBAAmB,cAErB,QAAO;AAOT,QAAO,GAAG,YAHM,IAAI,QAAQ,gBAAgB,GAAG,GAGf;;AAGlC,SAAgB,cAAc,OAAqC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO;AAgBT,QAbgB,aAAa,SAAS,MAAoB;;;;;;;;;;;AAyB5D,SAAgB,cACd,OACA,WAAuB,gBACvB;AACA,KAAI,cAAc,MAAM,CACtB,QAAO;AAGT,QAAO"}
@@ -2,15 +2,31 @@ import { Expand, SetDefaultString } from "./types.cjs";
2
2
 
3
3
  //#region src/utils/casing.d.ts
4
4
  type CasingType = (typeof CASING_TYPES)[number];
5
- type ToLower<S extends string> = S extends `${infer F}${infer R}` ? `${Lowercase<F>}${ToLower<R>}` : S;
6
- type CapitalizeWord<S extends string> = S extends `${infer F}${infer R}` ? `${Uppercase<F>}${ToLower<R>}` : S;
7
- type Pascalize<S extends string> = Capitalize<S>;
8
- type SnakeCase<S extends string> = Lowercase<S extends `${infer A} ${infer B}` ? `${A}_${SnakeCase<B>}` : S extends `${infer A}-${infer B}` ? `${A}_${SnakeCase<B>}` : S>;
9
- type KebabCase<S extends string> = Lowercase<S extends `${infer A} ${infer B}` ? `${A}-${KebabCase<B>}` : S extends `${infer A}_${infer B}` ? `${A}-${KebabCase<B>}` : S>;
10
- type RemoveDelimiters<S extends string> = S extends `${infer A} ${infer B}` ? `${A}${RemoveDelimiters<B>}` : S extends `${infer A}_${infer B}` ? `${A}${RemoveDelimiters<B>}` : S extends `${infer A}-${infer B}` ? `${A}${RemoveDelimiters<B>}` : S;
11
- type TitleCase<S extends string> = Capitalize<Lowercase<S>>;
12
- type SentenceCase<S extends string> = Capitalize<Lowercase<S>>;
13
- type ChangeCasing<S extends string, T extends CasingType> = T extends 'lower' ? Lowercase<S> : T extends 'upper' ? Uppercase<S> : T extends 'camel' ? Uncapitalize<Pascalize<S>> : T extends 'pascal' ? Pascalize<S> : T extends 'snake' ? SnakeCase<S> : T extends 'screaming-snake' ? Uppercase<SnakeCase<S>> : T extends 'kebab' ? KebabCase<S> : T extends 'flat' ? RemoveDelimiters<Lowercase<S>> : T extends 'title' ? TitleCase<S> : T extends 'sentence' ? SentenceCase<S> : S;
5
+ type LowerChar = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
6
+ type UpperChar = Uppercase<LowerChar>;
7
+ type IsLower<T extends string> = T extends Lowercase<T> ? true : false;
8
+ type IsUpper<T extends string> = T extends Uppercase<T> ? true : false;
9
+ type IsSnake<T extends string> = T extends `${string}_${string}` ? true : false;
10
+ type IsKebab<T extends string> = T extends `${string}-${string}` ? true : false;
11
+ type IsCamel<T extends string> = T extends `${LowerChar}${string}` ? T extends Capitalize<T> ? false : true : false;
12
+ type IsCapitalized<T extends string> = T extends `${UpperChar}${string}` ? true : false;
13
+ type IsTitle<T extends string> = IsCapitalized<SplitSpaces<T>[number]> extends true ? true : false;
14
+ type IsSentence<T extends string> = SplitSpaces<T> extends [infer First extends string, ...infer Rest extends string[]] ? IsCapitalized<First> extends true ? IsCapitalized<Rest[number]> extends false ? true : false : false : false;
15
+ type IsPascal<T extends string> = T extends Capitalize<T> ? true : false;
16
+ type DetectCasing<T extends string> = T extends `${string} ${string}` ? IsUpper<T> extends true ? 'upper' : IsSentence<T> extends true ? 'sentence' : IsTitle<T> extends true ? 'title' : IsLower<T> extends true ? 'lower' : IsUpper<T> extends true ? 'upper' : 'unknown' : IsSnake<T> extends true ? IsUpper<T> extends true ? 'screaming-snake' : 'snake' : IsKebab<T> extends true ? 'kebab' : IsCamel<T> extends true ? 'camel' : IsPascal<T> extends true ? 'pascal' : IsLower<T> extends true ? 'flat' | 'lower' : IsUpper<T> extends true ? 'upper' : 'unknown';
17
+ type SplitSnake<T extends string> = T extends `${infer A}_${infer B}` ? [A, ...SplitSnake<B>] : [T];
18
+ type SplitKebab<T extends string> = T extends `${infer A}-${infer B}` ? [A, ...SplitKebab<B>] : [T];
19
+ type SplitSpaces<T extends string> = T extends `${infer A} ${infer B}` ? [A, ...SplitSpaces<B>] : [T];
20
+ type SplitCamel<T extends string, Acc extends string = ''> = T extends `${infer C}${infer R}` ? C extends Lowercase<C> ? SplitCamel<R, `${Acc}${C}`> : Acc extends '' ? SplitCamel<R, `${Lowercase<C>}`> : [Acc, ...SplitCamel<R, `${Lowercase<C>}`>] : Acc extends '' ? [] : [Acc];
21
+ type WordsFrom<T extends string> = DetectCasing<T> extends 'snake' | 'screaming-snake' ? SplitSnake<Lowercase<T>> : DetectCasing<T> extends 'kebab' ? SplitKebab<Lowercase<T>> : DetectCasing<T> extends 'camel' | 'pascal' ? SplitCamel<T> : DetectCasing<T> extends 'sentence' | 'title' | 'lower' | 'upper' ? SplitSpaces<Lowercase<T>> : [Lowercase<T>];
22
+ type JoinCamel<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${Capitalize<JoinCamel<R>>}` : '';
23
+ type ToTitle<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${Capitalize<H>}${R extends [] ? '' : ` ${ToTitle<R>}`}` : '';
24
+ type ToSentence<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${Capitalize<H>}${R extends [] ? '' : ` ${Lowercase<JoinSpaces<R>>}`}` : '';
25
+ type JoinPascal<T extends string[]> = Capitalize<JoinCamel<T>>;
26
+ type JoinSnake<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : `_${JoinSnake<R>}`}` : '';
27
+ type JoinKebab<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : `-${JoinKebab<R>}`}` : '';
28
+ type JoinSpaces<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : ` ${JoinSpaces<R>}`}` : '';
29
+ type ChangeCasing<T extends string, To extends CasingType> = WordsFrom<T> extends infer W extends string[] ? To extends 'camel' ? JoinCamel<W> : To extends 'pascal' ? JoinPascal<W> : To extends 'snake' ? JoinSnake<W> : To extends 'screaming-snake' ? Uppercase<JoinSnake<W>> : To extends 'kebab' ? JoinKebab<W> : To extends 'lower' ? JoinSpaces<W> : To extends 'upper' ? Uppercase<JoinSpaces<W>> : To extends 'sentence' ? ToSentence<W> : To extends 'title' ? ToTitle<W> : To extends 'flat' ? Lowercase<JoinCamel<W>> : never : never;
14
30
  type ChangeObjectCasing<T extends object, TCasing extends CasingType> = Expand<{ [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K] }>;
15
31
  declare const CASING_TYPES: readonly ["sentence", "title", "camel", "lower", "upper", "pascal", "snake", "screaming-snake", "flat", "kebab"];
16
32
  type DefaultCasing = typeof DEFAULT_CASING;
@@ -34,7 +50,7 @@ declare function isCasingValid(value: unknown): value is CasingType;
34
50
  * @param fallback An optional fallback value if {@linkcode input} is `undefined`.
35
51
  * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.
36
52
  */
37
- declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "lower" | "upper" | "camel" | "pascal" | "snake" | "screaming-snake" | "kebab" | "flat" | "title" | "sentence";
53
+ declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "flat" | "sentence" | "title" | "camel" | "lower" | "upper" | "pascal" | "snake" | "screaming-snake" | "kebab";
38
54
  //#endregion
39
- export { CASING_TYPES, CapitalizeWord, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, ToLower, changeCasing, isCasingValid, quote, setCasingType };
55
+ export { CASING_TYPES, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, changeCasing, isCasingValid, quote, setCasingType };
40
56
  //# sourceMappingURL=casing.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"casing.d.cts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"casing.d.cts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":";;;KAEY,UAAA,WAAqB;KAE5B,SAAA;AAFL,KA6BK,SAAA,GAAY,SA7BK,CA6BK,SA7BM,CAAA;AAAsB,KA8BlD,OA5BA,CAAA,UAAS,MAAA,CAAA,GA4BmB,CA5BnB,SA4B6B,SA5B7B,CA4BuC,CA5BvC,CAAA,GAAA,IAAA,GAAA,KAAA;AAAA,KA6BT,OAFA,CAAA,UAAS,MAAa,CAAA,GAEM,CAFN,SAEgB,SAFjB,CAE2B,CAF3B,CAAA,GAAA,IAAA,GAAA,KAAA;AAAA,KAGrB,OAFA,CAAA,UAAO,MAAA,CAAA,GAEqB,CAFrB,SAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,IAAA,GAAA,KAAA;KAGP,OAH4B,CAAA,UAAA,MAAA,CAAA,GAGA,CAHA,SAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,IAAA,GAAA,KAAA;KAI5B,OAJgD,CAAA,UAAA,MAAA,CAAA,GAIpB,CAJoB,SAAA,GAIP,SAJO,GAAA,MAAA,EAAA,GAKjD,CALiD,SAKvC,UALuC,CAK5B,CAL4B,CAAA,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA;KAShD,aATsC,CAAA,UAAA,MAAA,CAAA,GASJ,CATI,SAAA,GASS,SATT,GAAA,MAAA,EAAA,GAAA,IAAA,GAAA,KAAA;KAYtC,OAZ+C,CAAA,UAAA,MAAA,CAAA,GAYnB,aAZmB,CAalD,WAbkD,CAatC,CAbsC,CAAA,CAAA,MAAA,CAAA,CAAA,SAAA,IAAA,GAAA,IAAA,GAAA,KAAA;AAAA,KAkB/C,UAjBO,CAAA,UAAA,MAAA,CAAA,GAiBwB,WAjBxB,CAiBoC,CAjBpC,CAAA,SAAA,CAAqB,KAAA,eAAA,MAAA,EAAoB,GAAA,KAAA,cAAA,MAAA,EAAA,CAAV,GAqBvC,aArBuC,CAqBzB,KArByB,CAAA,SAAA,IAAA,GAsBrC,aAtBqC,CAsBvB,IAtBuB,CAAA,MAAA,CAAA,CAAA,SAAA,KAAA,GAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;KA4BtC,QA5B+C,CAAA,UAAA,MAAA,CAAA,GA4BlB,CA5BkB,SA4BR,UA5BQ,CA4BG,CA5BH,CAAA,GAAA,IAAA,GAAA,KAAA;AAAA,KA8B/C,YA7BO,CAAA,UAAqB,MAAC,CAAA,GA6BI,CA7BJ,SAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GA8B9B,OA9B8B,CA8BtB,CA9BsB,CAAA,SAAA,IAAA,GAAA,OAAA,GAgC5B,UAhC4B,CAgCjB,CAhCiB,CAAA,SAAA,IAAA,GAAA,UAAA,GAkC5B,OAlC4B,CAkCpB,CAlCoB,CAAA,SAAA,IAAA,GAAA,OAAA,GAoC5B,OApC4B,CAoCpB,CApCoB,CAAA,SAAA,IAAA,GAAA,OAAA,GAsC5B,OAtC4B,CAsCpB,CAtCoB,CAAA,SAAA,IAAA,GAAA,OAAA,GAAA,SAAA,GAyC9B,OAzC8B,CAyCtB,CAzCsB,CAAA,SAAA,IAAA,GA0C9B,OA1C8B,CA0CtB,CA1CsB,CAAA,SAAA,IAAA,GAAA,iBAAA,GAAA,OAAA,GA6C9B,OA7C8B,CA6CtB,CA7CsB,CAAA,SAAA,IAAA,GAAA,OAAA,GA+C9B,OA/C8B,CA+CtB,CA/CsB,CAAA,SAAA,IAAA,GAAA,OAAA,GAiD9B,QAjD8B,CAiDrB,CAjDqB,CAAA,SAAA,IAAA,GAAA,QAAA,GAmD9B,OAnD8B,CAmDtB,CAnDsB,CAAA,SAAA,IAAA,GAAA,MAAA,GAAA,OAAA,GAqD9B,OArD8B,CAqDtB,CArDsB,CAAA,SAAA,IAAA,GAAA,OAAA,GAAA,SAAA;AAAA,KA6D7B,UA5DO,CAAA,UAAA,MAAsB,CAAA,GA4DE,CA5DF,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,CA6D7B,CA7D6B,EAAA,GA6DvB,UA7DuB,CA6DZ,CA7DY,CAAA,CAAA,GAAA,CA8D7B,CA9D6B,CAAA;AAAA,KAgE7B,UA/DO,CAAA,UAAA,MAAA,CAAA,GA+DwB,CA/DxB,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,CAgEP,CAhEO,EAAA,GAgED,UAhEC,CAgEU,CAhEV,CAAA,CAAA,GAAA,CAiEP,CAjEO,CAAA;KAmEP,WAnE4B,CAAA,UAAA,MAAA,CAAA,GAmEI,CAnEJ,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,CAoE5B,CApE4B,EAAA,GAoEtB,WApEsB,CAoEV,CApEU,CAAA,CAAA,GAAA,CAqE5B,CArE4B,CAAA;KAuE5B,UAvEyC,CAAA,UAAA,MAAA,EAAA,YAAA,MAAA,GAAA,EAAA,CAAA,GA0E1C,CA1E0C,SAAA,GAAA,KAAA,EAAA,GAAA,KAAA,EAAA,EAAA,GAAA,CAAA,SA2EhC,SA3EgC,CA2EtB,CA3EsB,CAAA,GA4ExC,UA5EwC,CA4E7B,CA5E6B,EAAA,GA4EvB,GA5EuB,GA4EjB,CA5EiB,EAAA,CAAA,GA6ExC,GA7EwC,SAAA,EAAA,GA8ExC,UA9EwC,CA8E7B,CA9E6B,EAAA,GA8EvB,SA9EuB,CA8Eb,CA9Ea,CAAA,EAAA,CAAA,GAAA,CA+EvC,GA/EuC,EAAA,GA+E/B,UA/E+B,CA+EpB,CA/EoB,EAAA,GA+Ed,SA/Ec,CA+EJ,CA/EI,CAAA,EAAA,CAAA,CAAA,GAgF1C,GAhF0C,SAAA,EAAA,GAAA,EAAA,GAAA,CAkFzC,GAlFyC,CAAA;KAoFzC,SAnFD,CAAA,UAAA,MAAA,CAAA,GAmF+B,YAnF/B,CAmF4C,CAnF5C,CAAA,SAAA,OAAA,GAAA,iBAAA,GAsFA,UAtFA,CAsFW,SAtFX,CAsFqB,CAtFrB,CAAA,CAAA,GAuFA,YAvFA,CAuFa,CAvFb,CAAA,SAAA,OAAA,GAwFA,UAxFA,CAwFW,SAxFX,CAwFqB,CAxFrB,CAAA,CAAA,GAyFA,YAzFA,CAyFa,CAzFb,CAAA,SAAA,OAAA,GAAA,QAAA,GA0FA,UA1FA,CA0FW,CA1FX,CAAA,GA2FA,YA3FA,CA2Fa,CA3Fb,CAAA,SAAA,UAAA,GAAA,OAAA,GAAA,OAAA,GAAA,OAAA,GA4FA,WA5FA,CA4FY,SA5FZ,CA4FsB,CA5FtB,CAAA,CAAA,GAAA,CA6FC,SA7FD,CA6FW,CA7FX,CAAA,CAAA;KA+FC,SA/FoB,CAAA,UAAA,MAAA,EAAA,CAAA,GA+FY,CA/FZ,SAAA,CAAX,KAAA,WAAA,MAAA,EAAU,GAAA,KAAA,WAAA,MAAA,EAAA,CAAA,GAInB,GA+FE,CA/FF,GA+FM,UA/FO,CA+FI,SA/FJ,CA+Fc,CA/FO,CAAA,CAAA,EAAa,GAAA,EAAA;AAAS,KAiGxD,OA9FA,CAAA,UAAO,MAAA,EAAA,CAAA,GA8FuB,CA9FvB,SAAA,CACE,KAAA,WAAA,MAAA,EAAZ,GAAA,KAAA,WAAA,MAAA,EAAA,CAD+B,GAAA,GAkG1B,UAlG0B,CAkGf,CAlGe,CAAA,GAAA,CAAA,SAAA,EAAA,GAAA,EAAA,GAAA,IAkGc,OAlGd,CAkGsB,CAlGtB,CAAA,EAAA,EAAA,GAAA,EAAA;KAoG5B,UApGyC,CAAA,UAAA,MAAA,EAAA,CAAA,GAoGR,CApGQ,SAAA,CAMzC,KAAA,WAAU,MAAA,EAAiC,GAAA,KAAA,WAAA,MAAA,EAAA,CAAZ,GAAA,GAkG7B,UAlG6B,CAkGlB,CAlGkB,CAAA,GAAA,CAAA,SAAA,EAAA,GAAA,EAAA,GAAA,IAkGW,SAlGX,CAkGqB,UAlGrB,CAkGgC,CAlGhC,CAAA,CAAA,EAAA,EAAA,GAAA,EAAA;KAqG/B,UAjGa,CAAA,UAAA,MAAA,EAAA,CAAA,GAiGoB,UAjGpB,CAiG+B,SAjG/B,CAiGyC,CAjGzC,CAAA,CAAA;KAmGb,SAnGD,CAAA,UAAA,MAAA,EAAA,CAAA,GAmGiC,CAnGjC,SAAA,CACgB,KAAA,WAAA,MAAA,EAAd,GAAA,KAAA,WAAA,MAAA,EAAA,CAAa,GAAA,GAsGZ,CAtGY,GAAA,CAAA,SAAA,EAAA,GAAA,EAAA,GAAA,IAsGgB,SAtGhB,CAsG0B,CAtG1B,CAAA,EAAA,EAAA,GAAA,EAAA;AAAA,KAyGd,SAnGA,CAAQ,UAAA,MAAA,EAAA,CAAA,GAmGwB,CAnGxB,SAAA,CAAqB,KAAA,WAAA,MAAA,EAAqB,GAAA,KAAA,WAAA,MAAA,EAAA,CAAX,GAAA,GAuGrC,CAvGqC,GAAA,CAAA,SAAA,EAAA,GAAA,EAAA,GAAA,IAuGT,SAvGS,CAuGC,CAvGD,CAAA,EAAA,EAAA,GAAA,EAAA;KA0GvC,UA1GiD,CAAA,UAAA,MAAA,EAAA,CAAA,GA0GhB,CA1GgB,SAAA,CAEjD,KAAA,WAAY,MAAA,EAAqB,GAAA,KAAA,WAAA,MAAA,EAAA,CAC1B,GAAA,GA2GL,CA3GK,GAAA,CAAA,SAAA,EAAA,GAAA,EAAA,GAAA,IA2GuB,UA3GvB,CA2GkC,CA3GlC,CAAA,EAAA,EAAA,GAAA,EAAA;AAAR,KA8GQ,YA9GR,CAAA,UAAA,MAAA,EAAA,WAgHS,UAhHT,CAAA,GAiHA,SAjHA,CAiHU,CAjHV,CAAA,SAAA,KAAA,WAAA,MAAA,EAAA,GAkHA,EAlHA,SAAA,OAAA,GAmHE,SAnHF,CAmHY,CAnHZ,CAAA,GAoHE,EApHF,SAAA,QAAA,GAqHE,UArHF,CAqHa,CArHb,CAAA,GAsHE,EAtHF,SAAA,OAAA,GAuHE,SAvHF,CAuHY,CAvHZ,CAAA,GAwHE,EAxHF,SAAA,iBAAA,GAyHE,SAzHF,CAyHY,SAzHZ,CAyHsB,CAzHtB,CAAA,CAAA,GA0HE,EA1HF,SAAA,OAAA,GA2HE,SA3HF,CA2HY,CA3HZ,CAAA,GA4HE,EA5HF,SAAA,OAAA,GA6HE,UA7HF,CA6Ha,CA7Hb,CAAA,GA8HE,EA9HF,SAAA,OAAA,GA+HE,SA/HF,CA+HY,UA/HZ,CA+HuB,CA/HvB,CAAA,CAAA,GAgIE,EAhIF,SAAA,UAAA,GAiIE,UAjIF,CAiIa,CAjIb,CAAA,GAkIE,EAlIF,SAAA,OAAA,GAmIE,OAnIF,CAmIU,CAnIV,CAAA,GAoIE,EApIF,SAAA,MAAA,GAqIE,SArIF,CAqIY,SArIZ,CAqIsB,CArItB,CAAA,CAAA,GAAA,KAAA,GAAA,KAAA;AAEa,KAuIL,kBAvIK,CAAA,UAAA,MAAA,EAAA,gBAyIC,UAzID,CAAA,GA0Ib,MA1Ia,CAAA,QAAX,MA2IQ,CA3IR,IA2Ia,CA3Ib,SAAA,MAAA,GA2IgC,YA3IhC,CA2I6C,CA3I7C,EA2IgD,OA3IhD,CAAA,GA2I2D,CA3I3D,GA2I+D,CA3I/D,CA2IiE,CA3IjE,CAAA,EAEQ,CAAA;AAAR,cA4IO,YA5IP,EAAA,SAAA,CAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,OAAA,CAAA;AAEQ,KAuJF,aAAA,GAvJE,OAuJqB,cAvJrB;AAAR,cAwJO,cAxJP,EAwJuB,gBAxJvB,CAwJwC,UAxJxC,EAAA,OAAA,CAAA;;;;;;;;AASF,iBAyJY,YAzJZ,CAAA,eAAA,MAAA,EAAA,cAyJ8D,UAzJ9D,CAAA,CAAA,KAAA,EA0JK,MA1JL,EAAA,IAAA,EA2JI,KA3JJ,CAAA,EA4JD,YA5JC,CA4JY,MA5JZ,EA4JoB,KA5JpB,CAAA;AAEQ,iBAyNI,KAAA,CAzNJ,GAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,GAAA,GAAA,GAAA,CAAA,EAAA,MAAA;AAAR,iBAyOY,aAAA,CAzOZ,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IAyOoD,UAzOpD;;;;;;;;AAMO;;AASN,iBAwPW,aAxPX,CAAA,gBAwPyC,UAxPzC,CAAA,CAAA,KAAA,EAyPI,OAzPJ,GAAA,SAAA,EAAA,QAAA,CAAA,EA0PO,UA1PP,CAAA,EAAA,MAAA,GAAA,UAAA,GAAA,OAAA,GAAA,OAAA,GAAA,OAAA,GAAA,OAAA,GAAA,QAAA,GAAA,OAAA,GAAA,iBAAA,GAAA,OAAA"}
@@ -2,15 +2,31 @@ import { Expand, SetDefaultString } from "./types.mjs";
2
2
 
3
3
  //#region src/utils/casing.d.ts
4
4
  type CasingType = (typeof CASING_TYPES)[number];
5
- type ToLower<S extends string> = S extends `${infer F}${infer R}` ? `${Lowercase<F>}${ToLower<R>}` : S;
6
- type CapitalizeWord<S extends string> = S extends `${infer F}${infer R}` ? `${Uppercase<F>}${ToLower<R>}` : S;
7
- type Pascalize<S extends string> = Capitalize<S>;
8
- type SnakeCase<S extends string> = Lowercase<S extends `${infer A} ${infer B}` ? `${A}_${SnakeCase<B>}` : S extends `${infer A}-${infer B}` ? `${A}_${SnakeCase<B>}` : S>;
9
- type KebabCase<S extends string> = Lowercase<S extends `${infer A} ${infer B}` ? `${A}-${KebabCase<B>}` : S extends `${infer A}_${infer B}` ? `${A}-${KebabCase<B>}` : S>;
10
- type RemoveDelimiters<S extends string> = S extends `${infer A} ${infer B}` ? `${A}${RemoveDelimiters<B>}` : S extends `${infer A}_${infer B}` ? `${A}${RemoveDelimiters<B>}` : S extends `${infer A}-${infer B}` ? `${A}${RemoveDelimiters<B>}` : S;
11
- type TitleCase<S extends string> = Capitalize<Lowercase<S>>;
12
- type SentenceCase<S extends string> = Capitalize<Lowercase<S>>;
13
- type ChangeCasing<S extends string, T extends CasingType> = T extends 'lower' ? Lowercase<S> : T extends 'upper' ? Uppercase<S> : T extends 'camel' ? Uncapitalize<Pascalize<S>> : T extends 'pascal' ? Pascalize<S> : T extends 'snake' ? SnakeCase<S> : T extends 'screaming-snake' ? Uppercase<SnakeCase<S>> : T extends 'kebab' ? KebabCase<S> : T extends 'flat' ? RemoveDelimiters<Lowercase<S>> : T extends 'title' ? TitleCase<S> : T extends 'sentence' ? SentenceCase<S> : S;
5
+ type LowerChar = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
6
+ type UpperChar = Uppercase<LowerChar>;
7
+ type IsLower<T extends string> = T extends Lowercase<T> ? true : false;
8
+ type IsUpper<T extends string> = T extends Uppercase<T> ? true : false;
9
+ type IsSnake<T extends string> = T extends `${string}_${string}` ? true : false;
10
+ type IsKebab<T extends string> = T extends `${string}-${string}` ? true : false;
11
+ type IsCamel<T extends string> = T extends `${LowerChar}${string}` ? T extends Capitalize<T> ? false : true : false;
12
+ type IsCapitalized<T extends string> = T extends `${UpperChar}${string}` ? true : false;
13
+ type IsTitle<T extends string> = IsCapitalized<SplitSpaces<T>[number]> extends true ? true : false;
14
+ type IsSentence<T extends string> = SplitSpaces<T> extends [infer First extends string, ...infer Rest extends string[]] ? IsCapitalized<First> extends true ? IsCapitalized<Rest[number]> extends false ? true : false : false : false;
15
+ type IsPascal<T extends string> = T extends Capitalize<T> ? true : false;
16
+ type DetectCasing<T extends string> = T extends `${string} ${string}` ? IsUpper<T> extends true ? 'upper' : IsSentence<T> extends true ? 'sentence' : IsTitle<T> extends true ? 'title' : IsLower<T> extends true ? 'lower' : IsUpper<T> extends true ? 'upper' : 'unknown' : IsSnake<T> extends true ? IsUpper<T> extends true ? 'screaming-snake' : 'snake' : IsKebab<T> extends true ? 'kebab' : IsCamel<T> extends true ? 'camel' : IsPascal<T> extends true ? 'pascal' : IsLower<T> extends true ? 'flat' | 'lower' : IsUpper<T> extends true ? 'upper' : 'unknown';
17
+ type SplitSnake<T extends string> = T extends `${infer A}_${infer B}` ? [A, ...SplitSnake<B>] : [T];
18
+ type SplitKebab<T extends string> = T extends `${infer A}-${infer B}` ? [A, ...SplitKebab<B>] : [T];
19
+ type SplitSpaces<T extends string> = T extends `${infer A} ${infer B}` ? [A, ...SplitSpaces<B>] : [T];
20
+ type SplitCamel<T extends string, Acc extends string = ''> = T extends `${infer C}${infer R}` ? C extends Lowercase<C> ? SplitCamel<R, `${Acc}${C}`> : Acc extends '' ? SplitCamel<R, `${Lowercase<C>}`> : [Acc, ...SplitCamel<R, `${Lowercase<C>}`>] : Acc extends '' ? [] : [Acc];
21
+ type WordsFrom<T extends string> = DetectCasing<T> extends 'snake' | 'screaming-snake' ? SplitSnake<Lowercase<T>> : DetectCasing<T> extends 'kebab' ? SplitKebab<Lowercase<T>> : DetectCasing<T> extends 'camel' | 'pascal' ? SplitCamel<T> : DetectCasing<T> extends 'sentence' | 'title' | 'lower' | 'upper' ? SplitSpaces<Lowercase<T>> : [Lowercase<T>];
22
+ type JoinCamel<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${Capitalize<JoinCamel<R>>}` : '';
23
+ type ToTitle<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${Capitalize<H>}${R extends [] ? '' : ` ${ToTitle<R>}`}` : '';
24
+ type ToSentence<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${Capitalize<H>}${R extends [] ? '' : ` ${Lowercase<JoinSpaces<R>>}`}` : '';
25
+ type JoinPascal<T extends string[]> = Capitalize<JoinCamel<T>>;
26
+ type JoinSnake<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : `_${JoinSnake<R>}`}` : '';
27
+ type JoinKebab<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : `-${JoinKebab<R>}`}` : '';
28
+ type JoinSpaces<T extends string[]> = T extends [infer H extends string, ...infer R extends string[]] ? `${H}${R extends [] ? '' : ` ${JoinSpaces<R>}`}` : '';
29
+ type ChangeCasing<T extends string, To extends CasingType> = WordsFrom<T> extends infer W extends string[] ? To extends 'camel' ? JoinCamel<W> : To extends 'pascal' ? JoinPascal<W> : To extends 'snake' ? JoinSnake<W> : To extends 'screaming-snake' ? Uppercase<JoinSnake<W>> : To extends 'kebab' ? JoinKebab<W> : To extends 'lower' ? JoinSpaces<W> : To extends 'upper' ? Uppercase<JoinSpaces<W>> : To extends 'sentence' ? ToSentence<W> : To extends 'title' ? ToTitle<W> : To extends 'flat' ? Lowercase<JoinCamel<W>> : never : never;
14
30
  type ChangeObjectCasing<T extends object, TCasing extends CasingType> = Expand<{ [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K] }>;
15
31
  declare const CASING_TYPES: readonly ["sentence", "title", "camel", "lower", "upper", "pascal", "snake", "screaming-snake", "flat", "kebab"];
16
32
  type DefaultCasing = typeof DEFAULT_CASING;
@@ -34,7 +50,7 @@ declare function isCasingValid(value: unknown): value is CasingType;
34
50
  * @param fallback An optional fallback value if {@linkcode input} is `undefined`.
35
51
  * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.
36
52
  */
37
- declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "lower" | "upper" | "camel" | "pascal" | "snake" | "screaming-snake" | "kebab" | "flat" | "title" | "sentence";
53
+ declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "flat" | "sentence" | "title" | "camel" | "lower" | "upper" | "pascal" | "snake" | "screaming-snake" | "kebab";
38
54
  //#endregion
39
- export { CASING_TYPES, CapitalizeWord, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, ToLower, changeCasing, isCasingValid, quote, setCasingType };
55
+ export { CASING_TYPES, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, changeCasing, isCasingValid, quote, setCasingType };
40
56
  //# sourceMappingURL=casing.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"casing.d.mts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"casing.d.mts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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"}
@@ -13,7 +13,7 @@ const CASING_TYPES = [
13
13
  ];
14
14
  const DEFAULT_CASING = "title";
15
15
  function changeCasing(input, type) {
16
- const words = input.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[-_]+/g, " ").trim().split(/\s+/).map((w) => w.toLowerCase());
16
+ const words = input.replaceAll(/([a-z])([A-Z])/g, "$1 $2").replaceAll(/[-_]+/g, " ").trim().split(/\s+/).map((w) => w.toLowerCase());
17
17
  switch (type) {
18
18
  case "sentence": return words[0].charAt(0).toUpperCase() + words[0].slice(1) + (words.length > 1 ? " " + words.slice(1).join(" ") : "");
19
19
  case "title": return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
@@ -1 +1 @@
1
- {"version":3,"file":"casing.mjs","names":["DEFAULT_CASING: SetDefaultString<CasingType, 'title'>"],"sources":["../../src/utils/casing.ts"],"sourcesContent":["import type { Expand, SetDefaultString } from './types';\n\nexport type CasingType = (typeof CASING_TYPES)[number];\nexport type ToLower<S extends string> = S extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${ToLower<R>}`\n : S;\n\nexport type CapitalizeWord<S extends string> = S extends `${infer F}${infer R}`\n ? `${Uppercase<F>}${ToLower<R>}`\n : S;\n// Pascal => Capitalize each \"word\" chunk\ntype Pascalize<S extends string> = Capitalize<S>; // naive\n\n// SnakeCase: turn spaces/hyphens into underscores, lowercase\ntype SnakeCase<S extends string> = Lowercase<\n S extends `${infer A} ${infer B}`\n ? `${A}_${SnakeCase<B>}`\n : S extends `${infer A}-${infer B}`\n ? `${A}_${SnakeCase<B>}`\n : S\n>;\n\n// KebabCase: same as snake but with \"-\"\ntype KebabCase<S extends string> = Lowercase<\n S extends `${infer A} ${infer B}`\n ? `${A}-${KebabCase<B>}`\n : S extends `${infer A}_${infer B}`\n ? `${A}-${KebabCase<B>}`\n : S\n>;\n\n// Flat: just strip spaces/underscores/hyphens\ntype RemoveDelimiters<S extends string> = S extends `${infer A} ${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S extends `${infer A}_${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S extends `${infer A}-${infer B}`\n ? `${A}${RemoveDelimiters<B>}`\n : S;\n\n// TitleCase: Capitalize the whole thing\ntype TitleCase<S extends string> = Capitalize<Lowercase<S>>;\n\n// SentenceCase: First word capped, rest lower\ntype SentenceCase<S extends string> = Capitalize<Lowercase<S>>;\nexport type ChangeCasing<\n S extends string,\n T extends CasingType\n> = T extends 'lower'\n ? Lowercase<S>\n : T extends 'upper'\n ? Uppercase<S>\n : T extends 'camel'\n ? Uncapitalize<Pascalize<S>>\n : T extends 'pascal'\n ? Pascalize<S>\n : T extends 'snake'\n ? SnakeCase<S>\n : T extends 'screaming-snake'\n ? Uppercase<SnakeCase<S>>\n : T extends 'kebab'\n ? KebabCase<S>\n : T extends 'flat'\n ? RemoveDelimiters<Lowercase<S>>\n : T extends 'title'\n ? TitleCase<S>\n : T extends 'sentence'\n ? SentenceCase<S>\n : S;\nexport type ChangeObjectCasing<\n T extends object,\n TCasing extends CasingType\n> = Expand<{\n [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K];\n}>;\n\nexport const CASING_TYPES = [\n 'sentence',\n 'title',\n 'camel',\n 'lower',\n 'upper',\n 'pascal',\n 'snake',\n 'screaming-snake',\n 'flat',\n 'kebab',\n] as const;\n\nexport type DefaultCasing = typeof DEFAULT_CASING;\nexport const DEFAULT_CASING: SetDefaultString<CasingType, 'title'> = 'title';\n\n/**\n * Changes the casing of a string according to the specified casing type.\n *\n * @param input - The string to transform.\n * @param type - The casing type to apply.\n * @returns The transformed string in the specified casing.\n */\n// TODO make return type safe\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n): ChangeCasing<TValue, TType>;\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n) {\n // Step 1: Normalize to words\n const words = input\n // Replace camelCase boundaries with space\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Replace separators with space\n .replace(/[-_]+/g, ' ')\n // Trim and split into words\n .trim()\n .split(/\\s+/)\n .map((w) => w.toLowerCase());\n\n // Step 2: Apply casing\n switch (type) {\n case 'sentence':\n return (\n words[0].charAt(0).toUpperCase() +\n words[0].slice(1) +\n (words.length > 1 ? ' ' + words.slice(1).join(' ') : '')\n );\n\n case 'title':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n\n case 'camel':\n return (\n words[0] +\n words\n .slice(1)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('')\n );\n\n case 'pascal':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n\n case 'lower':\n return words.join(' ');\n\n case 'upper':\n return words.join(' ').toUpperCase();\n\n case 'snake':\n return words.join('_');\n\n case 'screaming-snake':\n return words.join('_').toUpperCase();\n\n case 'kebab':\n return words.join('-');\n\n case 'flat':\n return words.join('');\n\n default:\n return input;\n }\n}\n\nexport function quote(str: string, quoteChar: '\"' | \"'\" = '\"') {\n const startsWithQuote = str.startsWith(quoteChar);\n const endsWithQuote = str.endsWith(quoteChar);\n\n if (startsWithQuote && endsWithQuote) {\n // Already wrapped correctly\n return str;\n }\n\n // If it starts or ends with a quote but not both → strip those first\n const trimmed = str.replace(/^['\"]|['\"]$/g, '');\n\n // Then add new quotes consistently\n return `${quoteChar}${trimmed}${quoteChar}`;\n}\n\nexport function isCasingValid(value: unknown): value is CasingType {\n if (typeof value !== 'string') {\n return false;\n }\n\n const isValid = CASING_TYPES.includes(value as CasingType);\n\n // invariant(isValid, () => {\n // const formatter = new Intl.ListFormat('en', {\n // style: 'long',\n // type: 'conjunction',\n // });\n\n // return `${value} is not a valid casing type. Valid types include ${formatter.format(\n // CASING_TYPES.map((word) => quote(word))\n // )}`;\n // });\n\n return isValid;\n}\n\n/**\n * Validates {@linkcode input} is a valid {@linkcode CasingType}.\n *\n * If there is no explicit {@linkcode fallback} value provided,\n * it will default to {@linkcode DEFAULT_CASING}.\n * @param input The input to check.\n * @param fallback An optional fallback value if {@linkcode input} is `undefined`.\n * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.\n */\nexport function setCasingType<TCasing extends CasingType>(\n input: TCasing | undefined,\n fallback: CasingType = DEFAULT_CASING\n) {\n if (isCasingValid(input)) {\n return input;\n }\n\n return fallback;\n}\n"],"mappings":";AA4EA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAaA,iBAAwD;AAcrE,SAAgB,aACd,OACA,MACA;CAEA,MAAM,QAAQ,MAEX,QAAQ,mBAAmB,QAAQ,CAEnC,QAAQ,UAAU,IAAI,CAEtB,MAAM,CACN,MAAM,MAAM,CACZ,KAAK,MAAM,EAAE,aAAa,CAAC;AAG9B,SAAQ,MAAR;EACE,KAAK,WACH,QACE,MAAM,GAAG,OAAO,EAAE,CAAC,aAAa,GAChC,MAAM,GAAG,MAAM,EAAE,IAChB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG;EAGzD,KAAK,QACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;EAE3E,KAAK,QACH,QACE,MAAM,KACN,MACG,MAAM,EAAE,CACR,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAClD,KAAK,GAAG;EAGf,KAAK,SACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;EAE1E,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,QACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,kBACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,OACH,QAAO,MAAM,KAAK,GAAG;EAEvB,QACE,QAAO;;;AAIb,SAAgB,MAAM,KAAa,YAAuB,MAAK;CAC7D,MAAM,kBAAkB,IAAI,WAAW,UAAU;CACjD,MAAM,gBAAgB,IAAI,SAAS,UAAU;AAE7C,KAAI,mBAAmB,cAErB,QAAO;AAOT,QAAO,GAAG,YAHM,IAAI,QAAQ,gBAAgB,GAAG,GAGf;;AAGlC,SAAgB,cAAc,OAAqC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO;AAgBT,QAbgB,aAAa,SAAS,MAAoB;;;;;;;;;;;AAyB5D,SAAgB,cACd,OACA,WAAuB,gBACvB;AACA,KAAI,cAAc,MAAM,CACtB,QAAO;AAGT,QAAO"}
1
+ {"version":3,"file":"casing.mjs","names":["DEFAULT_CASING: SetDefaultString<CasingType, 'title'>"],"sources":["../../src/utils/casing.ts"],"sourcesContent":["import type { Expand, SetDefaultString } from './types';\n\nexport type CasingType = (typeof CASING_TYPES)[number];\n\ntype LowerChar =\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z';\ntype UpperChar = Uppercase<LowerChar>;\ntype IsLower<T extends string> = T extends Lowercase<T> ? true : false;\ntype IsUpper<T extends string> = T extends Uppercase<T> ? true : false;\ntype IsSnake<T extends string> = T extends `${string}_${string}` ? true : false;\ntype IsKebab<T extends string> = T extends `${string}-${string}` ? true : false;\ntype IsCamel<T extends string> = T extends `${LowerChar}${string}`\n ? T extends Capitalize<T>\n ? false\n : true\n : false;\ntype IsCapitalized<T extends string> = T extends `${UpperChar}${string}`\n ? true\n : false;\ntype IsTitle<T extends string> = IsCapitalized<\n SplitSpaces<T>[number]\n> extends true\n ? true\n : false;\n\ntype IsSentence<T extends string> = SplitSpaces<T> extends [\n infer First extends string,\n ...infer Rest extends string[]\n]\n ? IsCapitalized<First> extends true\n ? IsCapitalized<Rest[number]> extends false\n ? true\n : false\n : false\n : false;\n\ntype IsPascal<T extends string> = T extends Capitalize<T> ? true : false;\n\ntype DetectCasing<T extends string> = T extends `${string} ${string}`\n ? IsUpper<T> extends true\n ? 'upper'\n : IsSentence<T> extends true\n ? 'sentence'\n : IsTitle<T> extends true\n ? 'title'\n : IsLower<T> extends true\n ? 'lower'\n : IsUpper<T> extends true\n ? 'upper'\n : 'unknown'\n : IsSnake<T> extends true\n ? IsUpper<T> extends true\n ? 'screaming-snake'\n : 'snake'\n : IsKebab<T> extends true\n ? 'kebab'\n : IsCamel<T> extends true\n ? 'camel'\n : IsPascal<T> extends true\n ? 'pascal'\n : IsLower<T> extends true\n ? 'flat' | 'lower'\n : IsUpper<T> extends true\n ? 'upper'\n : 'unknown';\n\n/* ============================================================\n * Word Normalization\n * ============================================================ */\n\ntype SplitSnake<T extends string> = T extends `${infer A}_${infer B}`\n ? [A, ...SplitSnake<B>]\n : [T];\n\ntype SplitKebab<T extends string> = T extends `${infer A}-${infer B}`\n ? [A, ...SplitKebab<B>]\n : [T];\n\ntype SplitSpaces<T extends string> = T extends `${infer A} ${infer B}`\n ? [A, ...SplitSpaces<B>]\n : [T];\n\ntype SplitCamel<\n T extends string,\n Acc extends string = ''\n> = T extends `${infer C}${infer R}`\n ? C extends Lowercase<C>\n ? SplitCamel<R, `${Acc}${C}`>\n : Acc extends ''\n ? SplitCamel<R, `${Lowercase<C>}`>\n : [Acc, ...SplitCamel<R, `${Lowercase<C>}`>]\n : Acc extends ''\n ? []\n : [Acc];\n\ntype WordsFrom<T extends string> = DetectCasing<T> extends\n | 'snake'\n | 'screaming-snake'\n ? SplitSnake<Lowercase<T>>\n : DetectCasing<T> extends 'kebab'\n ? SplitKebab<Lowercase<T>>\n : DetectCasing<T> extends 'camel' | 'pascal'\n ? SplitCamel<T>\n : DetectCasing<T> extends 'sentence' | 'title' | 'lower' | 'upper'\n ? SplitSpaces<Lowercase<T>>\n : [Lowercase<T>];\n\ntype JoinCamel<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${Capitalize<JoinCamel<R>>}`\n : '';\ntype ToTitle<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${Capitalize<H>}${R extends [] ? '' : ` ${ToTitle<R>}`}`\n : '';\ntype ToSentence<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${Capitalize<H>}${R extends [] ? '' : ` ${Lowercase<JoinSpaces<R>>}`}`\n : '';\n\ntype JoinPascal<T extends string[]> = Capitalize<JoinCamel<T>>;\n\ntype JoinSnake<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : `_${JoinSnake<R>}`}`\n : '';\n\ntype JoinKebab<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : `-${JoinKebab<R>}`}`\n : '';\n\ntype JoinSpaces<T extends string[]> = T extends [\n infer H extends string,\n ...infer R extends string[]\n]\n ? `${H}${R extends [] ? '' : ` ${JoinSpaces<R>}`}`\n : '';\n\nexport type ChangeCasing<\n T extends string,\n To extends CasingType\n> = WordsFrom<T> extends infer W extends string[]\n ? To extends 'camel'\n ? JoinCamel<W>\n : To extends 'pascal'\n ? JoinPascal<W>\n : To extends 'snake'\n ? JoinSnake<W>\n : To extends 'screaming-snake'\n ? Uppercase<JoinSnake<W>>\n : To extends 'kebab'\n ? JoinKebab<W>\n : To extends 'lower'\n ? JoinSpaces<W>\n : To extends 'upper'\n ? Uppercase<JoinSpaces<W>>\n : To extends 'sentence'\n ? ToSentence<W>\n : To extends 'title'\n ? ToTitle<W>\n : To extends 'flat'\n ? Lowercase<JoinCamel<W>>\n : never\n : never;\n\nexport type ChangeObjectCasing<\n T extends object,\n TCasing extends CasingType\n> = Expand<{\n [K in keyof T as K extends string ? ChangeCasing<K, TCasing> : K]: T[K];\n}>;\n\nexport const CASING_TYPES = [\n 'sentence',\n 'title',\n 'camel',\n 'lower',\n 'upper',\n 'pascal',\n 'snake',\n 'screaming-snake',\n 'flat',\n 'kebab',\n] as const;\n\nexport type DefaultCasing = typeof DEFAULT_CASING;\nexport const DEFAULT_CASING: SetDefaultString<CasingType, 'title'> = 'title';\n\n/**\n * Changes the casing of a string according to the specified casing type.\n *\n * @param input - The string to transform.\n * @param type - The casing type to apply.\n * @returns The transformed string in the specified casing.\n */\n// TODO make return type safe\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n): ChangeCasing<TValue, TType>;\nexport function changeCasing<TValue extends string, TType extends CasingType>(\n input: TValue,\n type: TType\n) {\n // Step 1: Normalize to words\n const words = input\n // Replace camelCase boundaries with space\n .replaceAll(/([a-z])([A-Z])/g, '$1 $2')\n // Replace separators with space\n .replaceAll(/[-_]+/g, ' ')\n // Trim and split into words\n .trim()\n .split(/\\s+/)\n .map((w) => w.toLowerCase());\n\n // Step 2: Apply casing\n switch (type) {\n case 'sentence':\n return (\n words[0].charAt(0).toUpperCase() +\n words[0].slice(1) +\n (words.length > 1 ? ' ' + words.slice(1).join(' ') : '')\n );\n\n case 'title':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n\n case 'camel':\n return (\n words[0] +\n words\n .slice(1)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('')\n );\n\n case 'pascal':\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n\n case 'lower':\n return words.join(' ');\n\n case 'upper':\n return words.join(' ').toUpperCase();\n\n case 'snake':\n return words.join('_');\n\n case 'screaming-snake':\n return words.join('_').toUpperCase();\n\n case 'kebab':\n return words.join('-');\n\n case 'flat':\n return words.join('');\n\n default:\n return input;\n }\n}\n\nexport function quote(str: string, quoteChar: '\"' | \"'\" = '\"') {\n const startsWithQuote = str.startsWith(quoteChar);\n const endsWithQuote = str.endsWith(quoteChar);\n\n if (startsWithQuote && endsWithQuote) {\n // Already wrapped correctly\n return str;\n }\n\n // If it starts or ends with a quote but not both → strip those first\n const trimmed = str.replace(/^['\"]|['\"]$/g, '');\n\n // Then add new quotes consistently\n return `${quoteChar}${trimmed}${quoteChar}`;\n}\n\nexport function isCasingValid(value: unknown): value is CasingType {\n if (typeof value !== 'string') {\n return false;\n }\n\n const isValid = CASING_TYPES.includes(value as CasingType);\n\n // invariant(isValid, () => {\n // const formatter = new Intl.ListFormat('en', {\n // style: 'long',\n // type: 'conjunction',\n // });\n\n // return `${value} is not a valid casing type. Valid types include ${formatter.format(\n // CASING_TYPES.map((word) => quote(word))\n // )}`;\n // });\n\n return isValid;\n}\n\n/**\n * Validates {@linkcode input} is a valid {@linkcode CasingType}.\n *\n * If there is no explicit {@linkcode fallback} value provided,\n * it will default to {@linkcode DEFAULT_CASING}.\n * @param input The input to check.\n * @param fallback An optional fallback value if {@linkcode input} is `undefined`.\n * @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.\n */\nexport function setCasingType<TCasing extends CasingType>(\n input: TCasing | undefined,\n fallback: CasingType = DEFAULT_CASING\n) {\n if (isCasingValid(input)) {\n return input;\n }\n\n return fallback;\n}\n"],"mappings":";AAgNA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAaA,iBAAwD;AAcrE,SAAgB,aACd,OACA,MACA;CAEA,MAAM,QAAQ,MAEX,WAAW,mBAAmB,QAAQ,CAEtC,WAAW,UAAU,IAAI,CAEzB,MAAM,CACN,MAAM,MAAM,CACZ,KAAK,MAAM,EAAE,aAAa,CAAC;AAG9B,SAAQ,MAAR;EACE,KAAK,WACH,QACE,MAAM,GAAG,OAAO,EAAE,CAAC,aAAa,GAChC,MAAM,GAAG,MAAM,EAAE,IAChB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG;EAGzD,KAAK,QACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;EAE3E,KAAK,QACH,QACE,MAAM,KACN,MACG,MAAM,EAAE,CACR,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAClD,KAAK,GAAG;EAGf,KAAK,SACH,QAAO,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;EAE1E,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,QACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,kBACH,QAAO,MAAM,KAAK,IAAI,CAAC,aAAa;EAEtC,KAAK,QACH,QAAO,MAAM,KAAK,IAAI;EAExB,KAAK,OACH,QAAO,MAAM,KAAK,GAAG;EAEvB,QACE,QAAO;;;AAIb,SAAgB,MAAM,KAAa,YAAuB,MAAK;CAC7D,MAAM,kBAAkB,IAAI,WAAW,UAAU;CACjD,MAAM,gBAAgB,IAAI,SAAS,UAAU;AAE7C,KAAI,mBAAmB,cAErB,QAAO;AAOT,QAAO,GAAG,YAHM,IAAI,QAAQ,gBAAgB,GAAG,GAGf;;AAGlC,SAAgB,cAAc,OAAqC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO;AAgBT,QAbgB,aAAa,SAAS,MAAoB;;;;;;;;;;;AAyB5D,SAAgB,cACd,OACA,WAAuB,gBACvB;AACA,KAAI,cAAc,MAAM,CACtB,QAAO;AAGT,QAAO"}
@@ -22,9 +22,17 @@ function printErrors(errors, mapper) {
22
22
  function typedObjectKeys(value) {
23
23
  return Object.keys(value);
24
24
  }
25
+ function mapToTuple(array, mapper) {
26
+ return array.map(mapper);
27
+ }
28
+ function addToTuple(tuple, ...values) {
29
+ return [...tuple, ...values];
30
+ }
25
31
 
26
32
  //#endregion
33
+ exports.addToTuple = addToTuple;
27
34
  exports.comparePartialArray = comparePartialArray;
35
+ exports.mapToTuple = mapToTuple;
28
36
  exports.printErrors = printErrors;
29
37
  exports.typedObjectKeys = typedObjectKeys;
30
38
  //# sourceMappingURL=helpers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.cjs","names":["errors: string[]"],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["export function comparePartialArray<T>(\n compareArray: T[],\n actualArray: T[],\n formatter?: Intl.ListFormat\n): { status: 'success' } | { status: 'error'; errors: string[] } {\n const errors: string[] = [];\n const compareSet = new Set(compareArray);\n const printedArray = formatter\n ? formatter.format(compareArray.map((value) => `${value}`))\n : `[${compareArray.join(', ')}]`;\n\n // Check extras: elements in b that aren't in a\n for (let i = 0; i < actualArray.length; i++) {\n const value = actualArray[i];\n if (!compareSet.has(value)) {\n errors.push(\n `Extra element at index ${i}: \"${value}\" is not in ${printedArray}`\n );\n }\n }\n\n // Check that at least one element from a is present in b\n const hasAtLeastOne = actualArray.some((v) => compareSet.has(v));\n if (!hasAtLeastOne) {\n errors.push(\n `Array must contain at least one valid element from ${printedArray}`\n );\n }\n\n if (errors.length > 0) {\n return { status: 'error', errors };\n }\n\n return { status: 'success' };\n}\n\nexport function printErrors<T>(\n errors: T[],\n mapper?: (value: T, index: number) => string\n) {\n const defaultMapper = (e: unknown, i: number) => `❌ ${i + 1}. ${e}`;\n return errors.map((e, i) => mapper?.(e, i) ?? defaultMapper(e, i)).join('\\n');\n}\n\nexport function typedObjectKeys<T extends Record<string, unknown>, TOverrideKey = keyof T>(value: T) {\n return Object.keys(value) as Array<TOverrideKey>;\n}\n"],"mappings":";;AAAA,SAAgB,oBACd,cACA,aACA,WAC+D;CAC/D,MAAMA,SAAmB,EAAE;CAC3B,MAAM,aAAa,IAAI,IAAI,aAAa;CACxC,MAAM,eAAe,YACjB,UAAU,OAAO,aAAa,KAAK,UAAU,GAAG,QAAQ,CAAC,GACzD,IAAI,aAAa,KAAK,KAAK,CAAC;AAGhC,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,WAAW,IAAI,MAAM,CACxB,QAAO,KACL,0BAA0B,EAAE,KAAK,MAAM,cAAc,eACtD;;AAML,KAAI,CADkB,YAAY,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC,CAE9D,QAAO,KACL,sDAAsD,eACvD;AAGH,KAAI,OAAO,SAAS,EAClB,QAAO;EAAE,QAAQ;EAAS;EAAQ;AAGpC,QAAO,EAAE,QAAQ,WAAW;;AAG9B,SAAgB,YACd,QACA,QACA;CACA,MAAM,iBAAiB,GAAY,MAAc,KAAK,IAAI,EAAE,IAAI;AAChE,QAAO,OAAO,KAAK,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI,cAAc,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAG/E,SAAgB,gBAA2E,OAAU;AACnG,QAAO,OAAO,KAAK,MAAM"}
1
+ {"version":3,"file":"helpers.cjs","names":["errors: string[]"],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { UnionToTuple } from './types';\n\nexport function comparePartialArray<T>(\n compareArray: T[],\n actualArray: T[],\n formatter?: Intl.ListFormat\n): { status: 'success' } | { status: 'error'; errors: string[] } {\n const errors: string[] = [];\n const compareSet = new Set(compareArray);\n const printedArray = formatter\n ? formatter.format(compareArray.map((value) => `${value}`))\n : `[${compareArray.join(', ')}]`;\n\n // Check extras: elements in b that aren't in a\n for (let i = 0; i < actualArray.length; i++) {\n const value = actualArray[i];\n if (!compareSet.has(value)) {\n errors.push(\n `Extra element at index ${i}: \"${value}\" is not in ${printedArray}`\n );\n }\n }\n\n // Check that at least one element from a is present in b\n const hasAtLeastOne = actualArray.some((v) => compareSet.has(v));\n if (!hasAtLeastOne) {\n errors.push(\n `Array must contain at least one valid element from ${printedArray}`\n );\n }\n\n if (errors.length > 0) {\n return { status: 'error', errors };\n }\n\n return { status: 'success' };\n}\n\nexport function printErrors<T>(\n errors: T[],\n mapper?: (value: T, index: number) => string\n) {\n const defaultMapper = (e: unknown, i: number) => `❌ ${i + 1}. ${e}`;\n return errors.map((e, i) => mapper?.(e, i) ?? defaultMapper(e, i)).join('\\n');\n}\n\nexport function typedObjectKeys<\n T extends Record<string, unknown>,\n TOverrideKey = keyof T\n>(value: T) {\n return Object.keys(value) as Array<TOverrideKey>;\n}\n\nexport function mapToTuple<T, M>(\n array: T[] | readonly T[],\n mapper: (value: T) => M\n) {\n return array.map(mapper) as UnionToTuple<M>;\n}\n\nexport function addToTuple<Tuple extends readonly unknown[], const Values>(\n tuple: Tuple,\n ...values: Values[]\n) {\n return [...tuple, ...values] as [...Tuple, ...UnionToTuple<Values>];\n}\n"],"mappings":";;AAEA,SAAgB,oBACd,cACA,aACA,WAC+D;CAC/D,MAAMA,SAAmB,EAAE;CAC3B,MAAM,aAAa,IAAI,IAAI,aAAa;CACxC,MAAM,eAAe,YACjB,UAAU,OAAO,aAAa,KAAK,UAAU,GAAG,QAAQ,CAAC,GACzD,IAAI,aAAa,KAAK,KAAK,CAAC;AAGhC,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,WAAW,IAAI,MAAM,CACxB,QAAO,KACL,0BAA0B,EAAE,KAAK,MAAM,cAAc,eACtD;;AAML,KAAI,CADkB,YAAY,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC,CAE9D,QAAO,KACL,sDAAsD,eACvD;AAGH,KAAI,OAAO,SAAS,EAClB,QAAO;EAAE,QAAQ;EAAS;EAAQ;AAGpC,QAAO,EAAE,QAAQ,WAAW;;AAG9B,SAAgB,YACd,QACA,QACA;CACA,MAAM,iBAAiB,GAAY,MAAc,KAAK,IAAI,EAAE,IAAI;AAChE,QAAO,OAAO,KAAK,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI,cAAc,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAG/E,SAAgB,gBAGd,OAAU;AACV,QAAO,OAAO,KAAK,MAAM;;AAG3B,SAAgB,WACd,OACA,QACA;AACA,QAAO,MAAM,IAAI,OAAO;;AAG1B,SAAgB,WACd,OACA,GAAG,QACH;AACA,QAAO,CAAC,GAAG,OAAO,GAAG,OAAO"}
@@ -21,7 +21,13 @@ function printErrors(errors, mapper) {
21
21
  function typedObjectKeys(value) {
22
22
  return Object.keys(value);
23
23
  }
24
+ function mapToTuple(array, mapper) {
25
+ return array.map(mapper);
26
+ }
27
+ function addToTuple(tuple, ...values) {
28
+ return [...tuple, ...values];
29
+ }
24
30
 
25
31
  //#endregion
26
- export { comparePartialArray, printErrors, typedObjectKeys };
32
+ export { addToTuple, comparePartialArray, mapToTuple, printErrors, typedObjectKeys };
27
33
  //# sourceMappingURL=helpers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.mjs","names":["errors: string[]"],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["export function comparePartialArray<T>(\n compareArray: T[],\n actualArray: T[],\n formatter?: Intl.ListFormat\n): { status: 'success' } | { status: 'error'; errors: string[] } {\n const errors: string[] = [];\n const compareSet = new Set(compareArray);\n const printedArray = formatter\n ? formatter.format(compareArray.map((value) => `${value}`))\n : `[${compareArray.join(', ')}]`;\n\n // Check extras: elements in b that aren't in a\n for (let i = 0; i < actualArray.length; i++) {\n const value = actualArray[i];\n if (!compareSet.has(value)) {\n errors.push(\n `Extra element at index ${i}: \"${value}\" is not in ${printedArray}`\n );\n }\n }\n\n // Check that at least one element from a is present in b\n const hasAtLeastOne = actualArray.some((v) => compareSet.has(v));\n if (!hasAtLeastOne) {\n errors.push(\n `Array must contain at least one valid element from ${printedArray}`\n );\n }\n\n if (errors.length > 0) {\n return { status: 'error', errors };\n }\n\n return { status: 'success' };\n}\n\nexport function printErrors<T>(\n errors: T[],\n mapper?: (value: T, index: number) => string\n) {\n const defaultMapper = (e: unknown, i: number) => `❌ ${i + 1}. ${e}`;\n return errors.map((e, i) => mapper?.(e, i) ?? defaultMapper(e, i)).join('\\n');\n}\n\nexport function typedObjectKeys<T extends Record<string, unknown>, TOverrideKey = keyof T>(value: T) {\n return Object.keys(value) as Array<TOverrideKey>;\n}\n"],"mappings":";AAAA,SAAgB,oBACd,cACA,aACA,WAC+D;CAC/D,MAAMA,SAAmB,EAAE;CAC3B,MAAM,aAAa,IAAI,IAAI,aAAa;CACxC,MAAM,eAAe,YACjB,UAAU,OAAO,aAAa,KAAK,UAAU,GAAG,QAAQ,CAAC,GACzD,IAAI,aAAa,KAAK,KAAK,CAAC;AAGhC,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,WAAW,IAAI,MAAM,CACxB,QAAO,KACL,0BAA0B,EAAE,KAAK,MAAM,cAAc,eACtD;;AAML,KAAI,CADkB,YAAY,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC,CAE9D,QAAO,KACL,sDAAsD,eACvD;AAGH,KAAI,OAAO,SAAS,EAClB,QAAO;EAAE,QAAQ;EAAS;EAAQ;AAGpC,QAAO,EAAE,QAAQ,WAAW;;AAG9B,SAAgB,YACd,QACA,QACA;CACA,MAAM,iBAAiB,GAAY,MAAc,KAAK,IAAI,EAAE,IAAI;AAChE,QAAO,OAAO,KAAK,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI,cAAc,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAG/E,SAAgB,gBAA2E,OAAU;AACnG,QAAO,OAAO,KAAK,MAAM"}
1
+ {"version":3,"file":"helpers.mjs","names":["errors: string[]"],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { UnionToTuple } from './types';\n\nexport function comparePartialArray<T>(\n compareArray: T[],\n actualArray: T[],\n formatter?: Intl.ListFormat\n): { status: 'success' } | { status: 'error'; errors: string[] } {\n const errors: string[] = [];\n const compareSet = new Set(compareArray);\n const printedArray = formatter\n ? formatter.format(compareArray.map((value) => `${value}`))\n : `[${compareArray.join(', ')}]`;\n\n // Check extras: elements in b that aren't in a\n for (let i = 0; i < actualArray.length; i++) {\n const value = actualArray[i];\n if (!compareSet.has(value)) {\n errors.push(\n `Extra element at index ${i}: \"${value}\" is not in ${printedArray}`\n );\n }\n }\n\n // Check that at least one element from a is present in b\n const hasAtLeastOne = actualArray.some((v) => compareSet.has(v));\n if (!hasAtLeastOne) {\n errors.push(\n `Array must contain at least one valid element from ${printedArray}`\n );\n }\n\n if (errors.length > 0) {\n return { status: 'error', errors };\n }\n\n return { status: 'success' };\n}\n\nexport function printErrors<T>(\n errors: T[],\n mapper?: (value: T, index: number) => string\n) {\n const defaultMapper = (e: unknown, i: number) => `❌ ${i + 1}. ${e}`;\n return errors.map((e, i) => mapper?.(e, i) ?? defaultMapper(e, i)).join('\\n');\n}\n\nexport function typedObjectKeys<\n T extends Record<string, unknown>,\n TOverrideKey = keyof T\n>(value: T) {\n return Object.keys(value) as Array<TOverrideKey>;\n}\n\nexport function mapToTuple<T, M>(\n array: T[] | readonly T[],\n mapper: (value: T) => M\n) {\n return array.map(mapper) as UnionToTuple<M>;\n}\n\nexport function addToTuple<Tuple extends readonly unknown[], const Values>(\n tuple: Tuple,\n ...values: Values[]\n) {\n return [...tuple, ...values] as [...Tuple, ...UnionToTuple<Values>];\n}\n"],"mappings":";AAEA,SAAgB,oBACd,cACA,aACA,WAC+D;CAC/D,MAAMA,SAAmB,EAAE;CAC3B,MAAM,aAAa,IAAI,IAAI,aAAa;CACxC,MAAM,eAAe,YACjB,UAAU,OAAO,aAAa,KAAK,UAAU,GAAG,QAAQ,CAAC,GACzD,IAAI,aAAa,KAAK,KAAK,CAAC;AAGhC,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,WAAW,IAAI,MAAM,CACxB,QAAO,KACL,0BAA0B,EAAE,KAAK,MAAM,cAAc,eACtD;;AAML,KAAI,CADkB,YAAY,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC,CAE9D,QAAO,KACL,sDAAsD,eACvD;AAGH,KAAI,OAAO,SAAS,EAClB,QAAO;EAAE,QAAQ;EAAS;EAAQ;AAGpC,QAAO,EAAE,QAAQ,WAAW;;AAG9B,SAAgB,YACd,QACA,QACA;CACA,MAAM,iBAAiB,GAAY,MAAc,KAAK,IAAI,EAAE,IAAI;AAChE,QAAO,OAAO,KAAK,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI,cAAc,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAG/E,SAAgB,gBAGd,OAAU;AACV,QAAO,OAAO,KAAK,MAAM;;AAG3B,SAAgB,WACd,OACA,QACA;AACA,QAAO,MAAM,IAAI,OAAO;;AAG1B,SAAgB,WACd,OACA,GAAG,QACH;AACA,QAAO,CAAC,GAAG,OAAO,GAAG,OAAO"}
@@ -0,0 +1,3 @@
1
+ const require_casing = require('./casing.cjs');
2
+ const require_logger = require('./logger.cjs');
3
+ const require_invariant = require('./invariant.cjs');
@@ -0,0 +1,5 @@
1
+ import { CASING_TYPES, DEFAULT_CASING, changeCasing, isCasingValid, quote, setCasingType } from "./casing.mjs";
2
+ import { DEFAULT_LOGGER_PREFIX, MultiStepFormLogger } from "./logger.mjs";
3
+ import { createInvariant, invariant } from "./invariant.mjs";
4
+
5
+ export { };
@@ -1,18 +1,38 @@
1
1
 
2
2
  //#region src/utils/invariant.ts
3
+ /**
4
+ * Creates a lazy message for the invariant function.
5
+ * @param strings The strings to create the message from.
6
+ * @param values The values to insert into the message.
7
+ * @returns The lazy message.
8
+ */
3
9
  function lazy(strings, ...values) {
4
10
  return () => String.raw({ raw: strings }, ...values);
5
11
  }
6
- function invariant(condition, message, error = Error) {
7
- if (!condition) {
8
- const formatter = new Intl.ListFormat("en", {
9
- style: "long",
10
- type: "conjunction"
11
- });
12
- throw new error(typeof message === "function" ? message(formatter) : lazy`${message}`());
13
- }
12
+ /**
13
+ * The default invariant function without a prefix.
14
+ */
15
+ const invariant = createInvariant();
16
+ /**
17
+ * Creates a new invariant function with a prefix.
18
+ * @param prefix The prefix to add to the message.
19
+ * @returns The invariant function.
20
+ */
21
+ function createInvariant(prefix) {
22
+ return function(condition, message, error = Error) {
23
+ if (!condition) {
24
+ const formatter = new Intl.ListFormat("en", {
25
+ style: "long",
26
+ type: "conjunction"
27
+ });
28
+ let resolvedMessage = typeof message === "function" ? message(formatter) : lazy`${message}`();
29
+ if (prefix) resolvedMessage = `${prefix}: ${resolvedMessage}`;
30
+ throw new error(resolvedMessage);
31
+ }
32
+ };
14
33
  }
15
34
 
16
35
  //#endregion
36
+ exports.createInvariant = createInvariant;
17
37
  exports.invariant = invariant;
18
38
  //# sourceMappingURL=invariant.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"invariant.cjs","names":[],"sources":["../../src/utils/invariant.ts"],"sourcesContent":["function lazy(strings: TemplateStringsArray, ...values: any[]) {\n return () => String.raw({ raw: strings }, ...values);\n}\n\nexport function invariant<T>(\n condition: T,\n message: string | ((formatter: Intl.ListFormat) => string),\n error: new (message: string) => Error = Error\n): asserts condition {\n if (!condition) {\n const formatter = new Intl.ListFormat('en', {\n style: 'long',\n type: 'conjunction',\n });\n const resolvedMessage =\n typeof message === 'function' ? message(formatter) : lazy`${message}`();\n\n throw new error(resolvedMessage);\n }\n}\n"],"mappings":";;AAAA,SAAS,KAAK,SAA+B,GAAG,QAAe;AAC7D,cAAa,OAAO,IAAI,EAAE,KAAK,SAAS,EAAE,GAAG,OAAO;;AAGtD,SAAgB,UACd,WACA,SACA,QAAwC,OACrB;AACnB,KAAI,CAAC,WAAW;EACd,MAAM,YAAY,IAAI,KAAK,WAAW,MAAM;GAC1C,OAAO;GACP,MAAM;GACP,CAAC;AAIF,QAAM,IAAI,MAFR,OAAO,YAAY,aAAa,QAAQ,UAAU,GAAG,IAAI,GAAG,WAAW,CAEzC"}
1
+ {"version":3,"file":"invariant.cjs","names":["invariant: Invariant"],"sources":["../../src/utils/invariant.ts"],"sourcesContent":["export type Invariant = <T>(\n condition: T,\n message: string | ((formatter: Intl.ListFormat) => string),\n error?: new (message: string) => Error\n) => asserts condition;\n\n/**\n * Creates a lazy message for the invariant function.\n * @param strings The strings to create the message from.\n * @param values The values to insert into the message.\n * @returns The lazy message.\n */\nfunction lazy(strings: TemplateStringsArray, ...values: any[]) {\n return () => String.raw({ raw: strings }, ...values);\n}\n\n/**\n * The default invariant function without a prefix.\n */\nexport const invariant: Invariant = createInvariant();\n\n/**\n * Creates a new invariant function with a prefix.\n * @param prefix The prefix to add to the message.\n * @returns The invariant function.\n */\nexport function createInvariant(prefix?: string): Invariant {\n return function (condition, message, error = Error) {\n if (!condition) {\n const formatter = new Intl.ListFormat('en', {\n style: 'long',\n type: 'conjunction',\n });\n let resolvedMessage =\n typeof message === 'function' ? message(formatter) : lazy`${message}`();\n\n if (prefix) {\n resolvedMessage = `${prefix}: ${resolvedMessage}`;\n }\n\n throw new error(resolvedMessage);\n }\n };\n}\n"],"mappings":";;;;;;;;AAYA,SAAS,KAAK,SAA+B,GAAG,QAAe;AAC7D,cAAa,OAAO,IAAI,EAAE,KAAK,SAAS,EAAE,GAAG,OAAO;;;;;AAMtD,MAAaA,YAAuB,iBAAiB;;;;;;AAOrD,SAAgB,gBAAgB,QAA4B;AAC1D,QAAO,SAAU,WAAW,SAAS,QAAQ,OAAO;AAClD,MAAI,CAAC,WAAW;GACd,MAAM,YAAY,IAAI,KAAK,WAAW,MAAM;IAC1C,OAAO;IACP,MAAM;IACP,CAAC;GACF,IAAI,kBACF,OAAO,YAAY,aAAa,QAAQ,UAAU,GAAG,IAAI,GAAG,WAAW;AAEzE,OAAI,OACF,mBAAkB,GAAG,OAAO,IAAI;AAGlC,SAAM,IAAI,MAAM,gBAAgB"}
@@ -1,5 +1,15 @@
1
1
  //#region src/utils/invariant.d.ts
2
- declare function invariant<T>(condition: T, message: string | ((formatter: Intl.ListFormat) => string), error?: new (message: string) => Error): asserts condition;
2
+ type Invariant = <T>(condition: T, message: string | ((formatter: Intl.ListFormat) => string), error?: new (message: string) => Error) => asserts condition;
3
+ /**
4
+ * The default invariant function without a prefix.
5
+ */
6
+ declare const invariant: Invariant;
7
+ /**
8
+ * Creates a new invariant function with a prefix.
9
+ * @param prefix The prefix to add to the message.
10
+ * @returns The invariant function.
11
+ */
12
+ declare function createInvariant(prefix?: string): Invariant;
3
13
  //#endregion
4
- export { invariant };
14
+ export { Invariant, createInvariant, invariant };
5
15
  //# sourceMappingURL=invariant.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invariant.d.cts","names":[],"sources":["../../src/utils/invariant.ts"],"sourcesContent":[],"mappings":";iBAIgB,wBACH,kCACoB,IAAA,CAAK,yDACJ"}
1
+ {"version":3,"file":"invariant.d.cts","names":[],"sources":["../../src/utils/invariant.ts"],"sourcesContent":[],"mappings":";KAAY,SAAA,kBACC,kCACoB,IAAA,CAAK,yDACH;AAHnC;;;AAGmC,cAgBtB,SAhBsB,EAgBX,SAhBW;;AAgBnC;AAOA;;;iBAAgB,eAAA,mBAAkC"}
@@ -1,5 +1,15 @@
1
1
  //#region src/utils/invariant.d.ts
2
- declare function invariant<T>(condition: T, message: string | ((formatter: Intl.ListFormat) => string), error?: new (message: string) => Error): asserts condition;
2
+ type Invariant = <T>(condition: T, message: string | ((formatter: Intl.ListFormat) => string), error?: new (message: string) => Error) => asserts condition;
3
+ /**
4
+ * The default invariant function without a prefix.
5
+ */
6
+ declare const invariant: Invariant;
7
+ /**
8
+ * Creates a new invariant function with a prefix.
9
+ * @param prefix The prefix to add to the message.
10
+ * @returns The invariant function.
11
+ */
12
+ declare function createInvariant(prefix?: string): Invariant;
3
13
  //#endregion
4
- export { invariant };
14
+ export { Invariant, createInvariant, invariant };
5
15
  //# sourceMappingURL=invariant.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invariant.d.mts","names":[],"sources":["../../src/utils/invariant.ts"],"sourcesContent":[],"mappings":";iBAIgB,wBACH,kCACoB,IAAA,CAAK,yDACJ"}
1
+ {"version":3,"file":"invariant.d.mts","names":[],"sources":["../../src/utils/invariant.ts"],"sourcesContent":[],"mappings":";KAAY,SAAA,kBACC,kCACoB,IAAA,CAAK,yDACH;AAHnC;;;AAGmC,cAgBtB,SAhBsB,EAgBX,SAhBW;;AAgBnC;AAOA;;;iBAAgB,eAAA,mBAAkC"}