UNPKG

@toolpad/utils

Version:

Shared utilities used by Toolpad packages.

1 lines 8.26 kB
{"version":3,"sources":["../src/strings.ts"],"sourcesContent":["import title from 'title';\n\n/**\n * Makes the first letter of [str] uppercase.\n * Not locale aware.\n */\nexport function uncapitalize(str: string): string {\n return str.length > 0 ? str[0].toLowerCase() + str.slice(1) : '';\n}\n\n/**\n * Makes the first letter of [str] lowercase.\n * Not locale aware.\n */\nexport function capitalize(str: string): string {\n return str.length > 0 ? str[0].toUpperCase() + str.slice(1) : '';\n}\n\n/**\n * Capitalizes and joins all [parts].\n */\nexport function pascalCase(...parts: string[]): string {\n return parts.map((part) => capitalize(part.toLowerCase())).join('');\n}\n\n/**\n * Joins all [parts] and camelcases the result\n */\nexport function camelCase(...parts: string[]): string {\n if (parts.length > 0) {\n const [first, ...rest] = parts;\n return uncapitalize(first) + pascalCase(...rest);\n }\n return '';\n}\n\n/**\n * Turns a kebab-case string into a constant case string.\n */\nexport function kebabToConstant(input: string): string {\n return input\n .split('-')\n .map((part) => part.toUpperCase())\n .join('_');\n}\n\n/**\n * Turns a kebab-case string into a PascalCase string.\n */\nexport function kebabToPascal(input: string): string {\n return input\n .split('-')\n .map((part) => capitalize(part))\n .join('');\n}\n\n/**\n * Generates a string for `base` by add a number until it's unique amongst a set of predefined names.\n */\nexport function generateUniqueString(base: string, existingNames: Set<string>) {\n let i = 1;\n if (!existingNames.has(base)) {\n return base;\n }\n const newBase = base.replace(/\\d+$/, '');\n let suggestion = newBase;\n while (existingNames.has(suggestion)) {\n suggestion = newBase + String(i);\n i += 1;\n }\n return suggestion;\n}\n\n/**\n * Escape string for use in HTML.\n */\nexport function escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/**\n * Normalizes and removes all diacritics from a javascript string.\n *\n * See https://stackoverflow.com/a/37511463\n */\nexport function removeDiacritics(input: string): string {\n return input.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\nexport function isAbsoluteUrl(maybeUrl: string) {\n try {\n return !!new URL(maybeUrl);\n } catch {\n return false;\n }\n}\n\n/**\n * Removes a prefix from a string if it starts with it.\n */\nexport function removePrefix(input: string, prefix: string): string {\n return input.startsWith(prefix) ? input.slice(prefix.length) : input;\n}\n\n/**\n * Removes a suffix from a string if it ends with it.\n */\nexport function removeSuffix(input: string, suffix: string): string {\n return input.endsWith(suffix) ? input.slice(0, -suffix.length) : input;\n}\n\n/**\n * Adds a prefix to a string if it doesn't start with it.\n */\nexport function ensurePrefix(input: string, prefix: string): string {\n return input.startsWith(prefix) ? input : prefix + input;\n}\n\n/**\n * Adds a suffix to a string if it doesn't end with it.\n */\nexport function ensureSuffix(input: string, suffix: string): string {\n return input.endsWith(suffix) ? input : input + suffix;\n}\n\n/**\n * Regex to statically find all static import statements\n *\n * Tested against:\n * import {\n * Component\n * } from '@angular2/core';\n * import defaultMember from \"module-name\";\n * import * as name from \"module-name \";\n * import { member } from \" module-name\";\n * import { member as alias } from \"module-name\";\n * import { member1 ,\n * member2 } from \"module-name\";\n * import { member1 , member2 as alias2 , member3 as alias3 } from \"module-name\";\n * import defaultMember, { member, member } from \"module-name\";\n * import defaultMember, * as name from \"module-name\";\n * import \"module-name\";\n * import * from './smdn';\n */\nconst IMPORT_STATEMENT_REGEX =\n /^\\s*import(?:[\"'\\s]*([\\w*{}\\n, ]+)from\\s*)?[\"'\\s]*([^\"']+)[\"'\\s].*/gm;\n\n/**\n * Statically analyses a javascript source code for import statements and return the specifiers.\n *\n * NOTE: This function does a best effort without parsing the code. The result may contain false\n * positives\n */\nexport function findImports(src: string): string[] {\n return Array.from(src.matchAll(IMPORT_STATEMENT_REGEX), (match) => match[2]);\n}\n\n/**\n * Limits the length of a string and adds ellipsis if necessary.\n */\nexport function truncate(str: string, maxLength: number, dots: string = '...') {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + dots;\n}\n\n/**\n * Prepend a prefix to each line in the text\n */\nexport function prependLines(text: string, prefix: string): string {\n return text\n .split('\\n')\n .map((line) => prefix + line)\n .join('\\n');\n}\n\n/**\n * Indent the text with [length] number of spaces\n */\nexport function indent(text: string, length = 2): string {\n return prependLines(text, ' '.repeat(length));\n}\n\n/**\n * Returns true if the string is a valid javascript identifier\n */\nexport function isValidJsIdentifier(base: string): boolean {\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(base);\n}\n\nexport function guessTitle(str: string): string {\n // Replace snake_case with space\n str = str.replace(/[_-]/g, ' ');\n // Split camelCase\n str = str.replace(/([a-z0-9])([A-Z])/g, '$1 $2');\n // Split acronyms\n str = str.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n // Split numbers\n str = str.replace(/([a-zA-Z])(\\d+)/g, '$1 $2');\n str = str.replace(/(\\d+)([a-zA-Z])/g, '$1 $2');\n\n return title(str);\n}\n"],"mappings":"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","names":["title"]}