@lichens-innovation/ts-common 1.15.5 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mime.cjs CHANGED
@@ -7,6 +7,63 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
7
  var mime__default = /*#__PURE__*/_interopDefault(mime);
8
8
 
9
9
  // src/mime/index.ts
10
+
11
+ // src/utils/types.utils.ts
12
+ var isNullish = (value) => value === null || value === void 0;
13
+
14
+ // src/utils/string.utils.ts
15
+ var isBlank = (str) => {
16
+ return isNullish(str) || str?.trim() === "";
17
+ };
18
+ var DATA_URI_PATTERN = /^data:([\w.+-]+\/[\w.+-]+);base64,(.+)$/;
19
+ var isValidDataUri = (uri) => {
20
+ if (isBlank(uri)) {
21
+ return false;
22
+ }
23
+ return DATA_URI_PATTERN.test(uri);
24
+ };
25
+
26
+ // src/mime/mime.utils.ts
27
+ var VALID_IMAGE_TYPES = [
28
+ "image/png",
29
+ "image/jpeg",
30
+ "image/jpg",
31
+ "image/gif",
32
+ "image/webp",
33
+ "image/bmp",
34
+ "image/svg+xml",
35
+ "image/avif",
36
+ "image/tiff",
37
+ "image/x-icon",
38
+ "image/vnd.microsoft.icon",
39
+ "image/heic",
40
+ "image/heif"
41
+ ];
42
+
43
+ // src/mime/index.ts
44
+ var parseDataUri = (input) => {
45
+ if (!isValidDataUri(input)) return null;
46
+ const match = DATA_URI_PATTERN.exec(input);
47
+ if (!match) return null;
48
+ const [, mimeType, base64] = match;
49
+ if (!mimeType || !base64) return null;
50
+ return { mimeType, base64, ext: mimeToExt(mimeType) };
51
+ };
52
+ var isImageMimeType = (mimeType) => {
53
+ return VALID_IMAGE_TYPES.includes(mimeType);
54
+ };
55
+ var getImagePreviewSrc = (input) => {
56
+ const parsed = parseDataUri(input);
57
+ if (!parsed) return null;
58
+ if (!isImageMimeType(parsed.mimeType)) return null;
59
+ return input;
60
+ };
61
+ var mimeToExt = (mimeType) => {
62
+ const ext = mime__default.default.getExtension(mimeType);
63
+ if (ext) return ext;
64
+ const subtype = mimeType.split("/")[1] ?? mimeType;
65
+ return subtype.split("+")[0] ?? subtype;
66
+ };
10
67
  var getMimeType = (extension) => {
11
68
  const mimeType = mime__default.default.getType(extension);
12
69
  if (!mimeType) {
@@ -15,6 +72,10 @@ var getMimeType = (extension) => {
15
72
  return mimeType;
16
73
  };
17
74
 
75
+ exports.getImagePreviewSrc = getImagePreviewSrc;
18
76
  exports.getMimeType = getMimeType;
77
+ exports.isImageMimeType = isImageMimeType;
78
+ exports.mimeToExt = mimeToExt;
79
+ exports.parseDataUri = parseDataUri;
19
80
  //# sourceMappingURL=mime.cjs.map
20
81
  //# sourceMappingURL=mime.cjs.map
package/dist/mime.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mime/index.ts"],"names":["mime"],"mappings":";;;;;;;;;AAEO,IAAM,WAAA,GAAc,CAAC,SAAA,KAA8B;AACxD,EAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,QAAA;AACT","file":"mime.cjs","sourcesContent":["import mime from \"mime\";\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":["mime"],"mappings":";;;;;;;;;;;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;;;ACC7F,IAAM,OAAA,GAAU,CAAC,GAAA,KAAsD;AAC5E,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA,EAAK,MAAK,KAAM,EAAA;AAC3C,CAAA;ACUO,IAAM,gBAAA,GAAmB,yCAAA;AAEzB,IAAM,cAAA,GAAiB,CAAC,GAAA,KAAiC;AAC9D,EAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAClC,CAAA;;;ACvBO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;;;ACHO,IAAM,YAAA,GAAe,CAAC,KAAA,KAA6C;AACxE,EAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,GAAG,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ,OAAO,IAAA;AAEjC,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,SAAA,CAAU,QAAQ,CAAA,EAAE;AACtD;AAEO,IAAM,eAAA,GAAkB,CAAC,QAAA,KAA8B;AAC5D,EAAA,OAAO,iBAAA,CAAkB,SAAS,QAAQ,CAAA;AAC5C;AAEO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAAiC;AAClE,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,CAAO,QAAQ,GAAG,OAAO,IAAA;AAE9C,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,SAAA,GAAY,CAAC,QAAA,KAA6B;AACrD,EAAA,MAAM,GAAA,GAAMA,qBAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACtC,EAAA,IAAI,KAAK,OAAO,GAAA;AAEhB,EAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAClC;AAEO,IAAM,WAAA,GAAc,CAAC,SAAA,KAA8B;AACxD,EAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,QAAA;AACT","file":"mime.cjs","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from \"./mime.utils\";\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
package/dist/mime.d.cts CHANGED
@@ -1,3 +1,12 @@
1
+ interface ParseDataUriResult {
2
+ mimeType: string;
3
+ base64: string;
4
+ ext: string;
5
+ }
6
+ declare const parseDataUri: (input: string) => ParseDataUriResult | null;
7
+ declare const isImageMimeType: (mimeType: string) => boolean;
8
+ declare const getImagePreviewSrc: (input: string) => string | null;
9
+ declare const mimeToExt: (mimeType: string) => string;
1
10
  declare const getMimeType: (extension: string) => string;
2
11
 
3
- export { getMimeType };
12
+ export { type ParseDataUriResult, getImagePreviewSrc, getMimeType, isImageMimeType, mimeToExt, parseDataUri };
package/dist/mime.d.ts CHANGED
@@ -1,3 +1,12 @@
1
+ interface ParseDataUriResult {
2
+ mimeType: string;
3
+ base64: string;
4
+ ext: string;
5
+ }
6
+ declare const parseDataUri: (input: string) => ParseDataUriResult | null;
7
+ declare const isImageMimeType: (mimeType: string) => boolean;
8
+ declare const getImagePreviewSrc: (input: string) => string | null;
9
+ declare const mimeToExt: (mimeType: string) => string;
1
10
  declare const getMimeType: (extension: string) => string;
2
11
 
3
- export { getMimeType };
12
+ export { type ParseDataUriResult, getImagePreviewSrc, getMimeType, isImageMimeType, mimeToExt, parseDataUri };
package/dist/mime.js CHANGED
@@ -1,6 +1,63 @@
1
1
  import mime from 'mime';
2
2
 
3
3
  // src/mime/index.ts
4
+
5
+ // src/utils/types.utils.ts
6
+ var isNullish = (value) => value === null || value === void 0;
7
+
8
+ // src/utils/string.utils.ts
9
+ var isBlank = (str) => {
10
+ return isNullish(str) || str?.trim() === "";
11
+ };
12
+ var DATA_URI_PATTERN = /^data:([\w.+-]+\/[\w.+-]+);base64,(.+)$/;
13
+ var isValidDataUri = (uri) => {
14
+ if (isBlank(uri)) {
15
+ return false;
16
+ }
17
+ return DATA_URI_PATTERN.test(uri);
18
+ };
19
+
20
+ // src/mime/mime.utils.ts
21
+ var VALID_IMAGE_TYPES = [
22
+ "image/png",
23
+ "image/jpeg",
24
+ "image/jpg",
25
+ "image/gif",
26
+ "image/webp",
27
+ "image/bmp",
28
+ "image/svg+xml",
29
+ "image/avif",
30
+ "image/tiff",
31
+ "image/x-icon",
32
+ "image/vnd.microsoft.icon",
33
+ "image/heic",
34
+ "image/heif"
35
+ ];
36
+
37
+ // src/mime/index.ts
38
+ var parseDataUri = (input) => {
39
+ if (!isValidDataUri(input)) return null;
40
+ const match = DATA_URI_PATTERN.exec(input);
41
+ if (!match) return null;
42
+ const [, mimeType, base64] = match;
43
+ if (!mimeType || !base64) return null;
44
+ return { mimeType, base64, ext: mimeToExt(mimeType) };
45
+ };
46
+ var isImageMimeType = (mimeType) => {
47
+ return VALID_IMAGE_TYPES.includes(mimeType);
48
+ };
49
+ var getImagePreviewSrc = (input) => {
50
+ const parsed = parseDataUri(input);
51
+ if (!parsed) return null;
52
+ if (!isImageMimeType(parsed.mimeType)) return null;
53
+ return input;
54
+ };
55
+ var mimeToExt = (mimeType) => {
56
+ const ext = mime.getExtension(mimeType);
57
+ if (ext) return ext;
58
+ const subtype = mimeType.split("/")[1] ?? mimeType;
59
+ return subtype.split("+")[0] ?? subtype;
60
+ };
4
61
  var getMimeType = (extension) => {
5
62
  const mimeType = mime.getType(extension);
6
63
  if (!mimeType) {
@@ -9,6 +66,6 @@ var getMimeType = (extension) => {
9
66
  return mimeType;
10
67
  };
11
68
 
12
- export { getMimeType };
69
+ export { getImagePreviewSrc, getMimeType, isImageMimeType, mimeToExt, parseDataUri };
13
70
  //# sourceMappingURL=mime.js.map
14
71
  //# sourceMappingURL=mime.js.map
package/dist/mime.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mime/index.ts"],"names":[],"mappings":";;;AAEO,IAAM,WAAA,GAAc,CAAC,SAAA,KAA8B;AACxD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,QAAA;AACT","file":"mime.js","sourcesContent":["import mime from \"mime\";\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":[],"mappings":";;;;;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;;;ACC7F,IAAM,OAAA,GAAU,CAAC,GAAA,KAAsD;AAC5E,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA,EAAK,MAAK,KAAM,EAAA;AAC3C,CAAA;ACUO,IAAM,gBAAA,GAAmB,yCAAA;AAEzB,IAAM,cAAA,GAAiB,CAAC,GAAA,KAAiC;AAC9D,EAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAClC,CAAA;;;ACvBO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;;;ACHO,IAAM,YAAA,GAAe,CAAC,KAAA,KAA6C;AACxE,EAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,GAAG,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ,OAAO,IAAA;AAEjC,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,SAAA,CAAU,QAAQ,CAAA,EAAE;AACtD;AAEO,IAAM,eAAA,GAAkB,CAAC,QAAA,KAA8B;AAC5D,EAAA,OAAO,iBAAA,CAAkB,SAAS,QAAQ,CAAA;AAC5C;AAEO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAAiC;AAClE,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,CAAO,QAAQ,GAAG,OAAO,IAAA;AAE9C,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,SAAA,GAAY,CAAC,QAAA,KAA6B;AACrD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACtC,EAAA,IAAI,KAAK,OAAO,GAAA;AAEhB,EAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAClC;AAEO,IAAM,WAAA,GAAc,CAAC,SAAA,KAA8B;AACxD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,QAAA;AACT","file":"mime.js","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from \"./mime.utils\";\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lichens-innovation/ts-common",
3
- "version": "1.15.5",
3
+ "version": "1.17.0",
4
4
  "description": "Reusable generic typescript utilities, types, constants, helpers",
5
5
  "keywords": [
6
6
  "typescript",