333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../browser/src/util/StringUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,YAA6B;IAA7B,6BAAA,EAAA,oBAA6B;IAChE,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,UAAS,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM;QACrE,IAAI,YAAY,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,6CAA6C,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;AACjG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAzD,CAAyD,CAAC,CAAC;AACnG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,gBAA4B;IAA5B,iCAAA,EAAA,oBAA4B;IAChE,IAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,IAAI;QAC1B,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAWC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,OAA6B;IAA7B,wBAAA,EAAA,YAA6B;IAC1D,IAAA,0BAAiB,EAAjB,sCAAiB,EAAE,sBAAgB,EAAhB,qCAAgB,EAAE,uBAAc,EAAd,mCAAc,CAAa;IAExE,IAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,IAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAC,GAAa,EAAE,GAAW;QAC7D,gFAAgF;QAChF,IAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1F,mEAAmE;QACnE,IAAM,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;QACpE,IAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAtB,CAAsB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE/E,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC","file":"StringUtils.js","sourcesContent":["/**\n * Converts string into camelCase.\n *\n * @see http://stackoverflow.com/questions/2970525/converting-any-string-into-camel-case\n */\nexport function camelCase(str: string, firstCapital: boolean = false): string {\n    return str.replace(/^([A-Z])|[\\s-_](\\w)/g, function(match, p1, p2, offset) {\n        if (firstCapital === true && offset === 0) return p1;\n        if (p2) return p2.toUpperCase();\n        return p1.toLowerCase();\n    });\n}\n\n/**\n * Converts string into snake-case.\n *\n * @see https://regex101.com/r/QeSm2I/1\n */\nexport function snakeCase(str: string) {\n    return str.replace(/(?:([a-z])([A-Z]))|(?:((?!^)[A-Z])([a-z]))/g, \"$1_$3$2$4\").toLowerCase();\n}\n\n/**\n * Converts string into title-case.\n *\n * @see http://stackoverflow.com/questions/196972/convert-string-to-title-case-with-javascript\n */\nexport function titleCase(str: string): string {\n    return str.replace(/\\w\\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());\n}\n\n/**\n * Builds abbreviated string from given string;\n */\nexport function abbreviate(str: string, abbrLettersCount: number = 1): string {\n    const words = str.replace(/([a-z\\xE0-\\xFF])([A-Z\\xC0\\xDF])/g, \"$1 $2\").split(\" \");\n    return words.reduce((res, word) => {\n        res += word.substr(0, abbrLettersCount);\n        return res;\n    }, \"\");\n}\n\nexport interface IShortenOptions {\n    /** String used to split \"segments\" of the alias/column name */\n    separator?: string;\n    /** Maximum length of any \"segment\" */\n    segmentLength?: number;\n    /** Length of any \"term\" in a \"segment\"; \"OrderItem\" is a segment, \"Order\" and \"Items\" are terms */\n    termLength?: number;\n  }\n\n  /**\n   * Shorten a given `input`. Useful for RDBMS imposing a limit on the\n   * maximum length of aliases and column names in SQL queries.\n   *\n   * @param input String to be shortened.\n   * @param options Default to `4` for segments length, `2` for terms length, `'__'` as a separator.\n   *\n   * @return Shortened `input`.\n   *\n   * @example\n   * // returns: \"UsShCa__orde__mark__dire\"\n   * shorten('UserShoppingCart__order__market__director')\n   *\n   * // returns: \"cat_wit_ver_lon_nam_pos_wit_ver_lon_nam_pos_wit_ver_lon_nam\"\n   * shorten(\n   *   'category_with_very_long_name_posts_with_very_long_name_post_with_very_long_name',\n   *   { separator: '_', segmentLength: 3 }\n   * )\n   *\n   * // equals: UsShCa__orde__mark_market_id\n   * `${shorten('UserShoppingCart__order__market')}_market_id`\n   */\n  export function shorten(input: string, options: IShortenOptions = {}): string {\n    const { segmentLength = 4, separator = \"__\", termLength = 2 } = options;\n\n    const segments = input.split(separator);\n    const shortSegments = segments.reduce((acc: string[], val: string) => {\n        // split the given segment into many terms based on an eventual camel cased name\n        const segmentTerms = val.replace(/([a-z\\xE0-\\xFF])([A-Z\\xC0-\\xDF])/g, \"$1 $2\").split(\" \");\n        // \"OrderItemList\" becomes \"OrItLi\", while \"company\" becomes \"comp\"\n        const length = segmentTerms.length > 1 ? termLength : segmentLength;\n        const shortSegment = segmentTerms.map(term => term.substr(0, length)).join(\"\");\n\n        acc.push(shortSegment);\n        return acc;\n    }, []);\n\n    return shortSegments.join(separator);\n  }\n"],"sourceRoot":".."}