@dolthub/web-utils 0.2.1 → 0.3.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.
Files changed (127) hide show
  1. package/dist/Maybe.d.d.ts +3 -0
  2. package/dist/cjs/compareArray.js +2 -0
  3. package/dist/cjs/compareArray.js.map +1 -0
  4. package/dist/cjs/dateConversions.js +2 -0
  5. package/dist/cjs/dateConversions.js.map +1 -0
  6. package/dist/cjs/dedupe.js +2 -0
  7. package/dist/cjs/dedupe.js.map +1 -0
  8. package/dist/cjs/enumKeys.js +2 -0
  9. package/dist/cjs/enumKeys.js.map +1 -0
  10. package/dist/cjs/excerpt.js +2 -0
  11. package/dist/cjs/excerpt.js.map +1 -0
  12. package/dist/cjs/fakeEscapePress.js +2 -0
  13. package/dist/cjs/fakeEscapePress.js.map +1 -0
  14. package/dist/cjs/index.js +1 -1
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/initialUppercase.js +2 -0
  17. package/dist/cjs/initialUppercase.js.map +1 -0
  18. package/dist/cjs/keycodes.js +2 -0
  19. package/dist/cjs/keycodes.js.map +1 -0
  20. package/dist/cjs/loremer/index.js +2 -0
  21. package/dist/cjs/loremer/index.js.map +1 -0
  22. package/dist/cjs/loremer/words.js +2 -0
  23. package/dist/cjs/loremer/words.js.map +1 -0
  24. package/dist/cjs/nTimes.js +2 -0
  25. package/dist/cjs/nTimes.js.map +1 -0
  26. package/dist/cjs/null.js +2 -0
  27. package/dist/cjs/null.js.map +1 -0
  28. package/dist/cjs/numberFormat.js +2 -0
  29. package/dist/cjs/numberFormat.js.map +1 -0
  30. package/dist/cjs/parseSqlQuery.js +2 -0
  31. package/dist/cjs/parseSqlQuery.js.map +1 -0
  32. package/dist/cjs/pluralize.js +2 -0
  33. package/dist/cjs/pluralize.js.map +1 -0
  34. package/dist/cjs/prettyJSON.js +2 -0
  35. package/dist/cjs/prettyJSON.js.map +1 -0
  36. package/dist/cjs/randomArrayItem.js +2 -0
  37. package/dist/cjs/randomArrayItem.js.map +1 -0
  38. package/dist/cjs/randomNum.js +2 -0
  39. package/dist/cjs/randomNum.js.map +1 -0
  40. package/dist/cjs/safeJSONParse.js +2 -0
  41. package/dist/cjs/safeJSONParse.js.map +1 -0
  42. package/dist/cjs/sprintf.js +2 -0
  43. package/dist/cjs/sprintf.js.map +1 -0
  44. package/dist/cjs/toOrdinal.js +2 -0
  45. package/dist/cjs/toOrdinal.js.map +1 -0
  46. package/dist/cjs/tuplify.js +2 -0
  47. package/dist/cjs/tuplify.js.map +1 -0
  48. package/dist/cjs/urlUtils.js +2 -0
  49. package/dist/cjs/urlUtils.js.map +1 -0
  50. package/dist/cjs/validators.js +2 -0
  51. package/dist/cjs/validators.js.map +1 -0
  52. package/dist/compareArray.d.d.ts +3 -0
  53. package/dist/dateConversions.d.d.ts +15 -0
  54. package/dist/dedupe.d.d.ts +3 -0
  55. package/dist/enumKeys.d.d.ts +22 -0
  56. package/dist/esm/compareArray.js +2 -0
  57. package/dist/esm/compareArray.js.map +1 -0
  58. package/dist/esm/dateConversions.js +2 -0
  59. package/dist/esm/dateConversions.js.map +1 -0
  60. package/dist/esm/dedupe.js +2 -0
  61. package/dist/esm/dedupe.js.map +1 -0
  62. package/dist/esm/enumKeys.js +2 -0
  63. package/dist/esm/enumKeys.js.map +1 -0
  64. package/dist/esm/excerpt.js +2 -0
  65. package/dist/esm/excerpt.js.map +1 -0
  66. package/dist/esm/fakeEscapePress.js +2 -0
  67. package/dist/esm/fakeEscapePress.js.map +1 -0
  68. package/dist/esm/index.js +1 -1
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/initialUppercase.js +2 -0
  71. package/dist/esm/initialUppercase.js.map +1 -0
  72. package/dist/esm/keycodes.js +2 -0
  73. package/dist/esm/keycodes.js.map +1 -0
  74. package/dist/esm/loremer/index.js +2 -0
  75. package/dist/esm/loremer/index.js.map +1 -0
  76. package/dist/esm/loremer/words.js +2 -0
  77. package/dist/esm/loremer/words.js.map +1 -0
  78. package/dist/esm/nTimes.js +2 -0
  79. package/dist/esm/nTimes.js.map +1 -0
  80. package/dist/esm/null.js +2 -0
  81. package/dist/esm/null.js.map +1 -0
  82. package/dist/esm/numberFormat.js +2 -0
  83. package/dist/esm/numberFormat.js.map +1 -0
  84. package/dist/esm/parseSqlQuery.js +2 -0
  85. package/dist/esm/parseSqlQuery.js.map +1 -0
  86. package/dist/esm/pluralize.js +2 -0
  87. package/dist/esm/pluralize.js.map +1 -0
  88. package/dist/esm/prettyJSON.js +2 -0
  89. package/dist/esm/prettyJSON.js.map +1 -0
  90. package/dist/esm/randomArrayItem.js +2 -0
  91. package/dist/esm/randomArrayItem.js.map +1 -0
  92. package/dist/esm/randomNum.js +2 -0
  93. package/dist/esm/randomNum.js.map +1 -0
  94. package/dist/esm/safeJSONParse.js +2 -0
  95. package/dist/esm/safeJSONParse.js.map +1 -0
  96. package/dist/esm/sprintf.js +2 -0
  97. package/dist/esm/sprintf.js.map +1 -0
  98. package/dist/esm/toOrdinal.js +2 -0
  99. package/dist/esm/toOrdinal.js.map +1 -0
  100. package/dist/esm/tuplify.js +2 -0
  101. package/dist/esm/tuplify.js.map +1 -0
  102. package/dist/esm/urlUtils.js +2 -0
  103. package/dist/esm/urlUtils.js.map +1 -0
  104. package/dist/esm/validators.js +2 -0
  105. package/dist/esm/validators.js.map +1 -0
  106. package/dist/excerpt.d.d.ts +3 -0
  107. package/dist/fakeEscapePress.d.d.ts +3 -0
  108. package/dist/index.d.ts +23 -431
  109. package/dist/initialUppercase.d.d.ts +3 -0
  110. package/dist/keycodes.d.d.ts +103 -0
  111. package/dist/loremer/index.d.d.ts +18 -0
  112. package/dist/nTimes.d.d.ts +4 -0
  113. package/dist/null.d.d.ts +6 -0
  114. package/dist/numberFormat.d.d.ts +5 -0
  115. package/dist/parseSqlQuery.d.ts +33 -0
  116. package/dist/pluralize.d.d.ts +3 -0
  117. package/dist/prettyJSON.d.d.ts +4 -0
  118. package/dist/randomArrayItem.d.d.ts +3 -0
  119. package/dist/randomNum.d.d.ts +3 -0
  120. package/dist/safeJSONParse.d.d.ts +3 -0
  121. package/dist/sprintf.d.d.ts +3 -0
  122. package/dist/toOrdinal.d.d.ts +3 -0
  123. package/dist/tsconfig.tsbuildinfo +1 -0
  124. package/dist/tuplify.d.d.ts +3 -0
  125. package/dist/urlUtils.d.d.ts +200 -0
  126. package/dist/validators.d.d.ts +11 -0
  127. package/package.json +13 -1
@@ -0,0 +1,3 @@
1
+ type Maybe<T> = T | undefined | null;
2
+
3
+ export type { Maybe as default };
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(t,r){if(t.length!==r.length)return!1;const e=t.sort(),n=r.sort();for(let r=0;r<t.length;r++)if(e[r]!==n[r])return!1;return!0};
2
+ //# sourceMappingURL=compareArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareArray.js","sources":["../../../src/compareArray.ts"],"sourcesContent":["export default function compareArray(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) return false;\n const sortedArr1 = arr1.sort();\n const sortedArr2 = arr2.sort();\n for (let i = 0; i < arr1.length; i++) {\n if (sortedArr1[i] !== sortedArr2[i]) {\n return false;\n }\n }\n return true;\n}\n"],"names":["arr1","arr2","length","sortedArr1","sort","sortedArr2","i"],"mappings":"4BAAc,SAAuBA,EAAgBC,GACnD,GAAID,EAAKE,SAAWD,EAAKC,OAAQ,OAAO,EACxC,MAAMC,EAAaH,EAAKI,OAClBC,EAAaJ,EAAKG,OACxB,IAAK,IAAIE,EAAI,EAAGA,EAAIN,EAAKE,OAAQI,IAC/B,GAAIH,EAAWG,KAAOD,EAAWC,GAC/B,OAAO,EAGX,OAAO,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";var t=require("timeago.js");function e(t){const e=r(t.getUTCMonth()+1),n=r(t.getUTCDate());return`${t.getUTCFullYear()}-${e}-${n}`}function n(t){const e=t.getUTCHours(),n=t.getUTCMinutes();return`${r(e)}:${r(n)}`}function r(t){return t<10?`0${t}`:String(t)}function o(){return new Date(Date.now())}exports.areTimeAgosEqual=function(e,n){return t.format(e)===t.format(n)},exports.convertToUTCDate=function(t){const e=new Date(t);return e.setUTCFullYear(t.getFullYear()),e.setUTCMonth(t.getMonth()),e.setUTCDate(t.getDate()),e.setUTCHours(t.getHours()),e.setUTCMinutes(t.getMinutes()),e.setUTCSeconds(t.getSeconds()),e},exports.getDateMinusHours=function(t,e){return 0===e||t.setHours(t.getHours()-e),t},exports.getDateString=function(t){const e=r(t.getMonth()+1),n=r(t.getDate());return`${t.getFullYear()}-${e}-${n}`},exports.getLongDateTimeString=function(t){const[e,n,r]=t.toLocaleString().split(" "),o=r?` ${r}`:"";return`${e} ${n.slice(0,-3)}${o}`},exports.getNow=o,exports.getTimeAgoString=function(e){return t.format(new Date(e))},exports.getTimeWithSeconds=function(t){return`${function(t){return`${r(t.getHours())}:${r(t.getMinutes())}`}(t)}:${r(t.getSeconds())}`},exports.getUTCDateAndTimeString=function(t){return`${e(t)} ${`${n(t)}:${r(t.getUTCSeconds())}`}`},exports.getUTCDateString=e,exports.getUTCNowDateString=function(){return e(o())},exports.getUTCTimeString=n,exports.oneHour=36e5;
2
+ //# sourceMappingURL=dateConversions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateConversions.js","sources":["../../../src/dateConversions.ts"],"sourcesContent":["import { format } from \"timeago.js\";\n\n// TIME IN MS\nconst oneSecond = 1000;\nconst oneMinute = oneSecond * 60;\nexport const oneHour = oneMinute * 60;\n\n// Gets UTC date in format YYYY-MM-DD HH:MM:SS\nexport function getUTCDateAndTimeString(date: Date): string {\n const d = getUTCDateString(date);\n const t = `${getUTCTimeString(date)}:${zeroPadNumber(date.getUTCSeconds())}`;\n return `${d} ${t}`;\n}\n\n// Gets date in format YYYY-MM-DD\nexport function getDateString(date: Date): string {\n const month = zeroPadNumber(date.getMonth() + 1); // January is 0\n const day = zeroPadNumber(date.getDate());\n const year = date.getFullYear();\n return `${year}-${month}-${day}`;\n}\n\n// Gets UTC date in format YYYY-MM-DD\nexport function getUTCDateString(date: Date): string {\n const month = zeroPadNumber(date.getUTCMonth() + 1); // January is 0\n const day = zeroPadNumber(date.getUTCDate());\n const year = date.getUTCFullYear();\n return `${year}-${month}-${day}`;\n}\n\n// Gets UTC time in format HH:MM:SS\nexport function getUTCTimeString(date: Date): string {\n const hour = date.getUTCHours();\n const mins = date.getUTCMinutes();\n return `${zeroPadNumber(hour)}:${zeroPadNumber(mins)}`;\n}\n\nfunction zeroPadNumber(num: number): string {\n if (num < 10) {\n return `0${num}`;\n }\n return String(num);\n}\n\nexport function getNow(): Date {\n return new Date(Date.now());\n}\n\nexport function getDateMinusHours(date: Date, hours: number): Date {\n if (hours === 0) return date;\n date.setHours(date.getHours() - hours);\n return date;\n}\n\nexport function getUTCNowDateString(): string {\n return getUTCDateString(getNow());\n}\n\n// Gets local time in format \"M/DD/YYYY, HH:MM [AM|PM]\"\nexport function getLongDateTimeString(d: Date): string {\n const [date, time, period] = d.toLocaleString().split(\" \");\n const per = period ? ` ${period}` : \"\";\n return `${date} ${time.slice(0, -3)}${per}`;\n}\n\nfunction getTime(date: Date): string {\n const hour = zeroPadNumber(date.getHours());\n const mins = zeroPadNumber(date.getMinutes());\n return `${hour}:${mins}`;\n}\n\nexport function getTimeWithSeconds(date: Date): string {\n const t = getTime(date);\n return `${t}:${zeroPadNumber(date.getSeconds())}`;\n}\n\nexport function getTimeAgoString(oldDateTime: number): string {\n return format(new Date(oldDateTime));\n}\n\nexport function areTimeAgosEqual(a: Date, b: Date): boolean {\n return format(a) === format(b);\n}\n\n// Manually convert local date to UTC\nexport function convertToUTCDate(d: Date): Date {\n const utcDate = new Date(d);\n utcDate.setUTCFullYear(d.getFullYear());\n utcDate.setUTCMonth(d.getMonth());\n utcDate.setUTCDate(d.getDate());\n utcDate.setUTCHours(d.getHours());\n utcDate.setUTCMinutes(d.getMinutes());\n utcDate.setUTCSeconds(d.getSeconds());\n return utcDate;\n}\n"],"names":["getUTCDateString","date","month","zeroPadNumber","getUTCMonth","day","getUTCDate","getUTCFullYear","getUTCTimeString","hour","getUTCHours","mins","getUTCMinutes","num","String","getNow","Date","now","a","b","format","d","utcDate","setUTCFullYear","getFullYear","setUTCMonth","getMonth","setUTCDate","getDate","setUTCHours","getHours","setUTCMinutes","getMinutes","setUTCSeconds","getSeconds","hours","setHours","time","period","toLocaleString","split","per","slice","oldDateTime","getTime","getUTCSeconds","oneMinute"],"mappings":"yCAuBM,SAAUA,EAAiBC,GAC/B,MAAMC,EAAQC,EAAcF,EAAKG,cAAgB,GAC3CC,EAAMF,EAAcF,EAAKK,cAE/B,MAAO,GADML,EAAKM,oBACAL,KAASG,GAC7B,CAGM,SAAUG,EAAiBP,GAC/B,MAAMQ,EAAOR,EAAKS,cACZC,EAAOV,EAAKW,gBAClB,MAAO,GAAGT,EAAcM,MAASN,EAAcQ,IACjD,CAEA,SAASR,EAAcU,GACrB,OAAIA,EAAM,GACD,IAAIA,IAENC,OAAOD,EAChB,UAEgBE,IACd,OAAO,IAAIC,KAAKA,KAAKC,MACvB,0BAkCM,SAA2BC,EAASC,GACxC,OAAOC,SAAOF,KAAOE,EAAAA,OAAOD,EAC9B,2BAGM,SAA2BE,GAC/B,MAAMC,EAAU,IAAIN,KAAKK,GAOzB,OANAC,EAAQC,eAAeF,EAAEG,eACzBF,EAAQG,YAAYJ,EAAEK,YACtBJ,EAAQK,WAAWN,EAAEO,WACrBN,EAAQO,YAAYR,EAAES,YACtBR,EAAQS,cAAcV,EAAEW,cACxBV,EAAQW,cAAcZ,EAAEa,cACjBZ,CACT,4BA9CM,SAA4BrB,EAAYkC,GAC5C,OAAc,IAAVA,GACJlC,EAAKmC,SAASnC,EAAK6B,WAAaK,GADRlC,CAG1B,wBArCM,SAAwBA,GAC5B,MAAMC,EAAQC,EAAcF,EAAKyB,WAAa,GACxCrB,EAAMF,EAAcF,EAAK2B,WAE/B,MAAO,GADM3B,EAAKuB,iBACAtB,KAASG,GAC7B,gCAuCM,SAAgCgB,GACpC,MAAOpB,EAAMoC,EAAMC,GAAUjB,EAAEkB,iBAAiBC,MAAM,KAChDC,EAAMH,EAAS,IAAIA,IAAW,GACpC,MAAO,GAAGrC,KAAQoC,EAAKK,MAAM,GAAG,KAAMD,GACxC,4CAaM,SAA2BE,GAC/B,OAAOvB,SAAO,IAAIJ,KAAK2B,GACzB,6BAPM,SAA6B1C,GAEjC,MAAO,GART,SAAiBA,GAGf,MAAO,GAFME,EAAcF,EAAK6B,eACnB3B,EAAcF,EAAK+B,eAElC,CAGYY,CAAQ3C,MACHE,EAAcF,EAAKiC,eACpC,kCAlEM,SAAkCjC,GAGtC,MAAO,GAFGD,EAAiBC,MACjB,GAAGO,EAAiBP,MAASE,EAAcF,EAAK4C,oBAE5D,oEA2CE,OAAO7C,EAAiBe,IAC1B,6CAnDuB+B"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(r){return Array.from(new Set(r))};
2
+ //# sourceMappingURL=dedupe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupe.js","sources":["../../../src/dedupe.ts"],"sourcesContent":["// Removes duplicates from array for primitive types\nexport default function dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n"],"names":["arr","Array","from","Set"],"mappings":"4BACc,SAAoBA,GAChC,OAAOC,MAAMC,KAAK,IAAIC,IAAIH,GAC5B"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(e){return Object.keys(e).filter((e=>Number.isNaN(+e))).map((e=>e))};
2
+ //# sourceMappingURL=enumKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumKeys.js","sources":["../../../src/enumKeys.ts"],"sourcesContent":["/**\n * enumKeys takes an enum and returns an array of strongly typed keys. Useful to iterate over string enums.\n * @param obj The enum\n * @returns An array of strong typed keys\n * @example\n *\n * enum MyEnum {\n * Key1 = \"value1\",\n * Key2 = \"value2\",\n * Key3 = \"value3\"\n * }\n *\n * // ks's type is (\"Key1\" || \"Key2\" || \"Key3\")[]\n * const ks = enumKeys(MyEnum);\n *\n * // keys' type is MyEnum[]\n * // Unfortunately, we can't do this inside enumKeys because there is no generic type constraint for enums.\n * const keys = ks.map(k => MyEnum[k])\n */\nfunction enumKeys<O extends object, K extends keyof O = keyof O>(obj: O): K[] {\n return Object.keys(obj)\n .filter(k => Number.isNaN(+k))\n .map(k => k as K);\n}\n\nexport default enumKeys;\n"],"names":["obj","Object","keys","filter","k","Number","isNaN","map"],"mappings":"4BAmBA,SAAiEA,GAC/D,OAAOC,OAAOC,KAAKF,GAChBG,QAAOC,GAAKC,OAAOC,OAAOF,KAC1BG,KAAIH,GAAKA,GACd"}
@@ -0,0 +1,2 @@
1
+ "use strict";const t=/[^\u0020-\u007E]/;module.exports=function(n,r=100){return function(n,r){let u="",e=0;for(const o of n){if(e+=t.test(o)?2:1,e>r-1)return`${u}…`;u+=o}return u}(n,r)};
2
+ //# sourceMappingURL=excerpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excerpt.js","sources":["../../../src/excerpt.ts"],"sourcesContent":["const fullWidthRegex = /[^\\u0020-\\u007E]/;\n\n// Half-width characters have a width of 1, while full-width characters, like those in Japanese and Chinese, have a width of 2.\nfunction truncate(str: string, len: number): string {\n let truncated = \"\";\n let width = 0;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const char of str) {\n width += fullWidthRegex.test(char) ? 2 : 1;\n\n if (width > len - 1) {\n return `${truncated}…`;\n }\n\n truncated += char;\n }\n\n return truncated;\n}\n\nexport default function excerpt(str: string, len = 100): string {\n return truncate(str, len);\n}\n"],"names":["fullWidthRegex","str","len","truncated","width","char","test","truncate"],"mappings":"aAAA,MAAMA,EAAiB,kCAqBT,SAAkBC,EAAaC,EAAM,KACjD,OAnBF,SAAkBD,EAAaC,GAC7B,IAAIC,EAAY,GACZC,EAAQ,EAGZ,IAAK,MAAMC,KAAQJ,EAAK,CAGtB,GAFAG,GAASJ,EAAeM,KAAKD,GAAQ,EAAI,EAErCD,EAAQF,EAAM,EAChB,MAAO,GAAGC,KAGZA,GAAaE,CACf,CAEA,OAAOF,CACT,CAGSI,CAASN,EAAKC,EACvB"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(){document.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"})),document.dispatchEvent(new KeyboardEvent("keyup",{key:"Escape"}))};
2
+ //# sourceMappingURL=fakeEscapePress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakeEscapePress.js","sources":["../../../src/fakeEscapePress.ts"],"sourcesContent":["/* \nreactjs-popup stays in it's absolute position when scrolled, \nthis is a workaround until the issue is fixed \nhttps://github.com/yjose/reactjs-popup/issues/208\n\nMake sure to include the following in your react component\n useEffectOnMount(() => {\n document.addEventListener(\"wheel\", fakeEscapePress);\n return () => document.removeEventListener(\"wheel\", fakeEscapePress);\n });\n*/\n\nexport default function fakeEscapePress() {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: \"Escape\",\n }),\n );\n document.dispatchEvent(\n new KeyboardEvent(\"keyup\", {\n key: \"Escape\",\n }),\n );\n}\n"],"names":["document","dispatchEvent","KeyboardEvent","key"],"mappings":"4BAYc,WACZA,SAASC,cACP,IAAIC,cAAc,UAAW,CAC3BC,IAAK,YAGTH,SAASC,cACP,IAAIC,cAAc,QAAS,CACzBC,IAAK,WAGX"}
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("timeago.js"),t=require("node-sql-parser");function r(e){const t=o(e.getUTCMonth()+1),r=o(e.getUTCDate());return`${e.getUTCFullYear()}-${t}-${r}`}function n(e){const t=e.getUTCHours(),r=e.getUTCMinutes();return`${o(t)}:${o(r)}`}function o(e){return e<10?`0${e}`:String(e)}function s(){return new Date(Date.now())}const a=/[^\u0020-\u007E]/;function i(e){const[t,...r]=e;return[t.toLocaleUpperCase(),...r].join("")}var u;function c(e,t,r=[]){const n=[];for(let o=0;o<e;o++)n.push(t(...r));return n}function l(e){if(0===e.length)throw new Error("Can't take random element of empty array");return e[Math.floor(Math.random()*e.length)]}exports.KeyCodes=void 0,(u=exports.KeyCodes||(exports.KeyCodes={}))[u.BACKSPACE=8]="BACKSPACE",u[u.TAB=9]="TAB",u[u.ENTER=13]="ENTER",u[u.SHIFT=16]="SHIFT",u[u.CTRL=17]="CTRL",u[u.ALT=18]="ALT",u[u.PAUSE=19]="PAUSE",u[u.CAPS_LOCK=20]="CAPS_LOCK",u[u.ESCAPE=27]="ESCAPE",u[u.SPACE=32]="SPACE",u[u.PAGE_UP=33]="PAGE_UP",u[u.PAGE_DOWN=34]="PAGE_DOWN",u[u.END=35]="END",u[u.HOME=36]="HOME",u[u.LEFT_ARROW=37]="LEFT_ARROW",u[u.UP_ARROW=38]="UP_ARROW",u[u.RIGHT_ARROW=39]="RIGHT_ARROW",u[u.DOWN_ARROW=40]="DOWN_ARROW",u[u.INSERT=45]="INSERT",u[u.DELETE=46]="DELETE",u[u.KEY_0=48]="KEY_0",u[u.KEY_1=49]="KEY_1",u[u.KEY_2=50]="KEY_2",u[u.KEY_3=51]="KEY_3",u[u.KEY_4=52]="KEY_4",u[u.KEY_5=53]="KEY_5",u[u.KEY_6=54]="KEY_6",u[u.KEY_7=55]="KEY_7",u[u.KEY_8=56]="KEY_8",u[u.KEY_9=57]="KEY_9",u[u.KEY_A=65]="KEY_A",u[u.KEY_B=66]="KEY_B",u[u.KEY_C=67]="KEY_C",u[u.KEY_D=68]="KEY_D",u[u.KEY_E=69]="KEY_E",u[u.KEY_F=70]="KEY_F",u[u.KEY_G=71]="KEY_G",u[u.KEY_H=72]="KEY_H",u[u.KEY_I=73]="KEY_I",u[u.KEY_J=74]="KEY_J",u[u.KEY_K=75]="KEY_K",u[u.KEY_L=76]="KEY_L",u[u.KEY_M=77]="KEY_M",u[u.KEY_N=78]="KEY_N",u[u.KEY_O=79]="KEY_O",u[u.KEY_P=80]="KEY_P",u[u.KEY_Q=81]="KEY_Q",u[u.KEY_R=82]="KEY_R",u[u.KEY_S=83]="KEY_S",u[u.KEY_T=84]="KEY_T",u[u.KEY_U=85]="KEY_U",u[u.KEY_V=86]="KEY_V",u[u.KEY_W=87]="KEY_W",u[u.KEY_X=88]="KEY_X",u[u.KEY_Y=89]="KEY_Y",u[u.KEY_Z=90]="KEY_Z",u[u.LEFT_META=91]="LEFT_META",u[u.RIGHT_META=92]="RIGHT_META",u[u.SELECT=93]="SELECT",u[u.NUMPAD_0=96]="NUMPAD_0",u[u.NUMPAD_1=97]="NUMPAD_1",u[u.NUMPAD_2=98]="NUMPAD_2",u[u.NUMPAD_3=99]="NUMPAD_3",u[u.NUMPAD_4=100]="NUMPAD_4",u[u.NUMPAD_5=101]="NUMPAD_5",u[u.NUMPAD_6=102]="NUMPAD_6",u[u.NUMPAD_7=103]="NUMPAD_7",u[u.NUMPAD_8=104]="NUMPAD_8",u[u.NUMPAD_9=105]="NUMPAD_9",u[u.MULTIPLY=106]="MULTIPLY",u[u.ADD=107]="ADD",u[u.SUBTRACT=109]="SUBTRACT",u[u.DECIMAL=110]="DECIMAL",u[u.DIVIDE=111]="DIVIDE",u[u.F1=112]="F1",u[u.F2=113]="F2",u[u.F3=114]="F3",u[u.F4=115]="F4",u[u.F5=116]="F5",u[u.F6=117]="F6",u[u.F7=118]="F7",u[u.F8=119]="F8",u[u.F9=120]="F9",u[u.F10=121]="F10",u[u.F11=122]="F11",u[u.F12=123]="F12",u[u.NUM_LOCK=144]="NUM_LOCK",u[u.SCROLL_LOCK=145]="SCROLL_LOCK",u[u.SEMICOLON=186]="SEMICOLON",u[u.EQUALS=187]="EQUALS",u[u.COMMA=188]="COMMA",u[u.DASH=189]="DASH",u[u.PERIOD=190]="PERIOD",u[u.FORWARD_SLASH=191]="FORWARD_SLASH",u[u.GRAVE_ACCENT=192]="GRAVE_ACCENT",u[u.OPEN_BRACKET=219]="OPEN_BRACKET",u[u.BACK_SLASH=220]="BACK_SLASH",u[u.CLOSE_BRACKET=221]="CLOSE_BRACKET",u[u.SINGLE_QUOTE=222]="SINGLE_QUOTE";const h=["is","a","the","we","but","and","this","that","in","to","of","have","not","with"],p=["accelerometer","ADSL","android","archive","ATX","backup","bandwidth","benchmark","barcode","booting","bios","bitmap","Bitcoin","BitTorrent","blacklist","bluetooth","binary","backlink","bloatware","burn","cache","compression","content","CMOS","cookie","cybercrime","cybersecurity","daemon","debug","dock","DOS","driver","device driver","DPI","DRM","encryption","emulator","ethernet","end user","fat32","framework","freeware","firewall","FTP","gif","Git","GPS","GUI","HTML","https","IEEE","ISO","IMEI","ISP","Java","JavaScript","jpeg","kernel","LAN","LCD","LED","Macintosh","mp3","malware","MMS","MIDI","newbie","OEM","OS","OCR","overclock","pdf","phishing","Python","plug-in","qwerty","remote access","registry","read-only","RAID","rooting","Safe Mode","SSID","SEO","service pack","server","source code","spam","search engine","Swype","trash","underclock","Unix","virus","VGA","web","wifi","Wikipedia","Windows","wireless LAN","World Wide Web","WYSIWYG","WPA","wumpus","zip"],f=["accelerator","incubator","accredited investor","advertorials","advertainment","bleeding edge","bootstrapping","B2B","B2C","burn rate","capital","churn rate","cliff","pitch deck","disrupt","disruptive","exit","freemium","gamify","growth hacking","growth hacker","hockey stick","IP","iterate","launch","lean","leverage","loss leader","market penetration","monetize","MVP","pivot","ramen","responsive design","ROI","runway","SAAS","scaleable","sweat equity","term sheet","traction","valuation","value prop","vaporware","VC","venture"],m=["Adobe","Airbnb","Amazon","Apple","Facebook","Google","Instagram","Microsoft","Netflix","Oracle","Salesforce","Snapchat","Telegram","Twitter","Uber","WeChat","WhatsApp"],d=["0-day","exploit","hacker","virus","vulnerability","warez"],E=["Dolt","DoltHub","database","version control","MySQL","Git","GitHub","rollback","collaborate","clone","branch","merge","commit","repository","pull request","schema","data","command line","diff","commit log","lineage","time travel","community","data bounty","open source","query","workflow","script"];function g(e,t){const[r,n]=e<t?[e,t]:[t,e],o=n-r;return Math.floor(Math.random()*o)+r}const _=function(e){const t="string"==typeof e.words?function(e){return e.split(/[\s,]+/)}(e.words):e.words;if(0===t.length)throw new Error("Loremer refuses to be initialized with an empty dictionary. Try again and give him some damn words this time.");function r({trueSingleWord:e,minLength:r,maxLength:n,matchRegex:o}={}){const s=e||r||n||o?t.filter((t=>!(o&&!t.match(o)||e&&t.indexOf(" ")>-1||r&&r>0&&t.length<r||n&&n>0&&t.length>n))):t;if(!s.length)throw new Error(`Loremer's dictionary doesn't contain any words that satisfy the given constraints: ${JSON.stringify({maxLength:n,minLength:r,trueSingleWord:e,matchRegex:String(o)})}`);return l(s)}function n(e){return c(e,r)}const o={min:8,max:13};function s(e={}){const t=Object.assign(Object.assign({},o),e),[r,...s]=n(g(t.min,t.max));return[i(r),...s].join(" ")+l([".",".",".",".","!","?"])}function a(e){return c(e,s)}return{word:r,words:n,resourceNameSegment:function(){return r({matchRegex:/^[-a-zA-Z_]{3,32}$/,trueSingleWord:!0})},sentence:s,sentences:a,paragraph:function(){return a(g(2,5)).join(" ")}}}({words:[...h,...h,...h,...h,...h,...E,...p,...f,...m,...d]}),y="NULL";function A(e){return e===y}const S=new t.Parser,b={database:"MYSQL"};function K(e,t){return`query: ${e}\nerror: ${t}`}function T(e){let t={};try{t=S.astify(e,b)}catch(t){console.error(K(e,t))}const r=Array.isArray(t)?t[0]:t;return"select"===r.type?r:null}function x(e){try{return S.tableList(e,b).map((e=>e.split("::")[2]))}catch(t){return void console.error(K(e,t))}}function w(e){return{expr:{type:"column_ref",table:null,column:e},as:null}}function Y(e){return S.sqlify(e,b)}function C(e,t,r){const n=T(e),o=function(e,t){return"*"===e?[w("*")]:e.map((e=>({expr:{type:"column_ref",table:t&&e.sourceTable?e.sourceTable:null,column:e.name},as:null})))}(t,!!(r&&r.length>1));if(!n)return"";if(!r||0===r.length)return Y(Object.assign(Object.assign({},n),{columns:o,where:D(n.where)}));return Y(Object.assign(Object.assign({},n),{columns:o,from:r.map((e=>({db:null,table:e,as:null}))),where:D(n.where)}))}function D(e){return e?(e.args&&D(e.args),e.expr&&D(e.expr),e.left&&D(e.left),e.value&&("string"==typeof e.value&&(e.value=U(e.value)),Array.isArray(e.value)&&e.value.forEach((e=>D(e)))),e.right&&D(e.right),e):null}function O(e){let t={};try{t=S.astify(e,b)}catch(t){return void console.error(K(e,t))}const r=Array.isArray(t)?t[0]:t;if(r)return r.type}function U(e){return e.includes("\\'")?e:e.replace(/'/g,"\\'")}const M=(e,...t)=>t.length?M(e=e.replace("$",t.shift()),...t):e;class N{constructor(e,t){this.href=e,this.as=null!=t?t:e}hrefPathname(e){const t=L(this.href);return e?`${t}/${e}`:t}asPathname(e){const t=L(this.as);return e?`${t}/${e}`:t}getQuery(){if("string"!=typeof this.href)return this.href.query}getHash(){var e;return"string"==typeof this.href?"":null!==(e=this.href.hash)&&void 0!==e?e:""}addStatic(e){return new N(this.hrefPathname(e),this.asPathname(e))}maybeAddStatic(e){return new N(this.hrefPathname(e),this.asPathname(e))}addDynamic(e,t,r=!1){const n=r?encodeURIComponent(t):t;return new N(this.hrefPathname(`[${e}]`),this.asPathname(n))}withQuery(e){const t=function(e){return Object.keys(e).reduce(((t,r)=>{const n=e[r];return null!=n&&n.length>0?Object.assign(Object.assign({},t),{[r]:n}):t}),{})}(e);return new N({pathname:this.hrefPathname(),query:t,hash:this.getHash()},{pathname:this.asPathname(),query:t,hash:this.getHash()})}withHash(e){return new N({pathname:this.hrefPathname(),query:this.getQuery(),hash:e},{pathname:this.asPathname(),query:this.getQuery(),hash:e})}}function L(e){var t;return e?"string"==typeof e?e:null!==(t=e.pathname)&&void 0!==t?t:"":""}const P=/\S+@\S+\.\S+/;const v=/^[-a-z0-9_]{3,32}$/g,R=/^-|^_|-$|_$|--|__|-_|_-/;function F(e){return e.length<3?"Username too short":e.length>32?"Username too long":e.toLowerCase()!==e?"Username cannot have uppercase letters":e.match(v)?e.match(R)?"Username invalid":"":"Username invalid"}exports.NULL_VALUE=y,exports.Route=N,exports.areTimeAgosEqual=function(t,r){return e.format(t)===e.format(r)},exports.compareArray=function(e,t){if(e.length!==t.length)return!1;const r=e.sort(),n=t.sort();for(let t=0;t<e.length;t++)if(r[t]!==n[t])return!1;return!0},exports.convertToSqlWithNewColNames=function(e,t,r){const n=T(e),o=function(e){return"*"===e?[w("*")]:e.map((e=>w(e)))}(t);return n?Y(Object.assign(Object.assign({},n),{columns:o,from:[{db:null,table:r,as:null}],where:D(n.where)})):""},exports.convertToSqlWithNewCols=C,exports.convertToSqlWithNewCondition=function(e,t,r){const n=T(e);if(!n)return e;const o=function(e,t,r){const n=A(t),o=U(t),s={type:"binary_expr",operator:n?"IS":"=",left:{type:"column_ref",table:null,column:e},right:{type:n?"null":"string",value:n?null:o}};if(!r.where)return s;const a={type:"binary_expr",operator:"AND",left:Object.assign({},D(r.where)),right:s};return a}(t,r,n);return Y(Object.assign(Object.assign({},n),{where:o}))},exports.convertToSqlWithOrderBy=function(e,t,r){const n=T(e);if(!n)return e;const o=function(e,t,r){var n;if(!r)return e.orderby?e.orderby.filter((e=>e.expr.column!==t)):null;const o=null===(n=e.orderby)||void 0===n?void 0:n.find((e=>e.expr.column===t));if(o)return o.type=r,e.orderby;const s={expr:{type:"column_ref",column:t},type:r};return e.orderby?[...e.orderby,s]:[s]}(n,t,r);return Y(Object.assign(Object.assign({},n),{orderby:o}))},exports.convertToUTCDate=function(e){const t=new Date(e);return t.setUTCFullYear(e.getFullYear()),t.setUTCMonth(e.getMonth()),t.setUTCDate(e.getDate()),t.setUTCHours(e.getHours()),t.setUTCMinutes(e.getMinutes()),t.setUTCSeconds(e.getSeconds()),t},exports.dedupe=function(e){return Array.from(new Set(e))},exports.emailValidator=function(e){return{isValid:!!e.match(P),errorMsg:"Email format invalid"}},exports.enumKeys=function(e){return Object.keys(e).filter((e=>Number.isNaN(+e))).map((e=>e))},exports.excerpt=function(e,t=100){return function(e,t){let r="",n=0;for(const o of e){if(n+=a.test(o)?2:1,n>t-1)return`${r}…`;r+=o}return r}(e,t)},exports.fakeEscapePress=function(){document.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"})),document.dispatchEvent(new KeyboardEvent("keyup",{key:"Escape"}))},exports.formatNumber=function(e){return new Intl.NumberFormat("en-US").format(e)},exports.formatToRoundedUsd=function(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0}).format(e)},exports.formatToUsd=function(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(e)},exports.getColumns=function(e){const t=T(e);return null==t?void 0:t.columns},exports.getDateMinusHours=function(e,t){return 0===t||e.setHours(e.getHours()-t),e},exports.getDateString=function(e){const t=o(e.getMonth()+1),r=o(e.getDate());return`${e.getFullYear()}-${t}-${r}`},exports.getDisplayValue=function(e){return A(e)?"NULL":e},exports.getDisplayValueForApi=function(e){return A(e)?null:e},exports.getLongDateTimeString=function(e){const[t,r,n]=e.toLocaleString().split(" "),o=n?` ${n}`:"";return`${t} ${r.slice(0,-3)}${o}`},exports.getNow=s,exports.getTableName=function(e){if(!e)return;const t=x(e);return t&&0!==t.length?t[0]:void 0},exports.getTimeAgoString=function(t){return e.format(new Date(t))},exports.getTimeWithSeconds=function(e){return`${function(e){return`${o(e.getHours())}:${o(e.getMinutes())}`}(e)}:${o(e.getSeconds())}`},exports.getUTCDateAndTimeString=function(e){return`${r(e)} ${`${n(e)}:${o(e.getUTCSeconds())}`}`},exports.getUTCDateString=r,exports.getUTCNowDateString=function(){return r(s())},exports.getUTCTimeString=n,exports.initialUppercase=i,exports.isMultipleQueries=function(e){try{const{ast:t}=S.parse(e);return Array.isArray(t)&&t.length>1}catch(e){return!1}},exports.isMutation=function(e){if(!e)return!1;const t=O(e);if(!t){const t=e.toLowerCase();if(t.startsWith("insert")||t.startsWith("alter")||t.startsWith("create")||t.startsWith("drop")||t.startsWith("update")||t.startsWith("revoke")||t.startsWith("grant")||t.startsWith("flush")||t.startsWith("with")&&(t.includes("update")&&t.includes("set")||t.includes("delete from")))return!0}return!!t&&"select"!==t&&"desc"!==t&&"show"!==t},exports.isNullValue=A,exports.isReadQuery=function(e){if(!e)return!1;const t=O(e);if(!t){const t=e.toLowerCase();if(t.startsWith("select")||t.startsWith("desc")||t.startsWith("show"))return!0}return!!t&&("select"===t||"desc"===t||"show"===t)},exports.loremer=_,exports.makeQueryExecutable=function(e){return e.replace(/'/g,"\\'").replace(/\r\n|\n|\r/gm," ").trim()},exports.nTimes=c,exports.nTimesWithIndex=function(e,t){const r=[];for(let n=0;n<e;n++)r.push(t(n));return r},exports.oneHour=36e5,exports.parseSelectQuery=T,exports.pluralize=function(e,t){return 1===e?t:function(e){switch(e){case"person":return"people";case"repository":return"repositories";case"repository updated today":return"repositories updated today";case"database":return"databases";case"database updated today":return"databases updated today";case"branch":return"branches";default:return`${e}s`}}(t)},exports.prettyJSON=function(e){try{return JSON.stringify(e,null,2)}catch(t){return console.error(t),`${e}`}},exports.prettyJSONText=function(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch(t){return console.error(t),e}},exports.queryHasOrderBy=function(e,t,r){const n=T(e);return!!n&&(n.orderby?r?n.orderby.some((e=>e.expr.column===t&&e.type===r)):!n.orderby.some((e=>e.expr.column===t)):!r)},exports.randomArrayItem=l,exports.randomNum=function(e,t){return Math.floor(Math.random()*(t-e)+e)},exports.removeColumnFromQuery=function(e,t,r){return C(e,r.filter((e=>e.name!==t)),x(e))},exports.requireTableNameForSelect=function(e){var t;return null!==(t=x(e))&&void 0!==t?t:function(e){const t=/\b(?:from|join)\s+`?(\w+)`?(?:\s*(?:join|,)\s+`?(\w+)`?)*\b/gi,r=[...e.matchAll(t)];return r.flatMap((e=>e.slice(1).filter(Boolean)))}(e)},exports.safeJSONParse=function(e){try{return JSON.parse(e)}catch(t){return e}},exports.sprintf=M,exports.toOrdinal=function(e){return e%10==1&&e%100!=11?`${e}st`:e%10==2&&e%100!=12?`${e}nd`:e%10==3&&e%100!=13?`${e}rd`:`${e}th`},exports.tuplify=function(...e){return e},exports.usernameValidator=function(e){return{isValid:!!e.match(v)&&!e.match(R),errorMsg:"Username can only contain lowercase letters, dashes, and underscores and be between 3 and 32 characters",detailedErrorMsg:F(e)}};
1
+ "use strict";var e=require("./compareArray.js"),r=require("./dateConversions.js"),t=require("./dedupe.js"),s=require("./enumKeys.js"),o=require("./excerpt.js"),i=require("./fakeEscapePress.js"),a=require("./initialUppercase.js"),p=require("./keycodes.js"),u=require("./loremer/index.js"),n=require("./nTimes.js"),x=require("./null.js"),m=require("./numberFormat.js"),g=require("./pluralize.js"),l=require("./prettyJSON.js"),d=require("./randomArrayItem.js"),T=require("./randomNum.js"),q=require("./safeJSONParse.js"),j=require("./sprintf.js"),S=require("./toOrdinal.js"),U=require("./tuplify.js"),y=require("./urlUtils.js"),f=require("./validators.js");exports.compareArray=e,exports.areTimeAgosEqual=r.areTimeAgosEqual,exports.convertToUTCDate=r.convertToUTCDate,exports.getDateMinusHours=r.getDateMinusHours,exports.getDateString=r.getDateString,exports.getLongDateTimeString=r.getLongDateTimeString,exports.getNow=r.getNow,exports.getTimeAgoString=r.getTimeAgoString,exports.getTimeWithSeconds=r.getTimeWithSeconds,exports.getUTCDateAndTimeString=r.getUTCDateAndTimeString,exports.getUTCDateString=r.getUTCDateString,exports.getUTCNowDateString=r.getUTCNowDateString,exports.getUTCTimeString=r.getUTCTimeString,exports.oneHour=r.oneHour,exports.dedupe=t,exports.enumKeys=s,exports.excerpt=o,exports.fakeEscapePress=i,exports.initialUppercase=a,Object.defineProperty(exports,"KeyCodes",{enumerable:!0,get:function(){return p.KeyCodes}}),exports.loremer=u.loremer,exports.nTimes=n.default,exports.nTimesWithIndex=n.nTimesWithIndex,exports.NULL_VALUE=x.NULL_VALUE,exports.getDisplayValue=x.getDisplayValue,exports.getDisplayValueForApi=x.getDisplayValueForApi,exports.isNullValue=x.isNullValue,exports.formatNumber=m.formatNumber,exports.formatToRoundedUsd=m.formatToRoundedUsd,exports.formatToUsd=m.formatToUsd,exports.pluralize=g,exports.prettyJSON=l.default,exports.prettyJSONText=l.prettyJSONText,exports.randomArrayItem=d,exports.randomNum=T,exports.safeJSONParse=q,exports.sprintf=j.sprintf,exports.toOrdinal=S,exports.tuplify=U,exports.Route=y.Route,exports.emailValidator=f.emailValidator,exports.usernameValidator=f.usernameValidator;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/dateConversions.ts","../../src/excerpt.ts","../../src/initialUppercase.ts","../../src/keycodes.ts","../../src/nTimes.ts","../../src/randomArrayItem.ts","../../src/loremer/words.ts","../../src/loremer/index.ts","../../src/null.ts","../../src/parseSqlQuery.ts","../../src/sprintf.ts","../../src/urlUtils.ts","../../src/validators.ts","../../src/compareArray.ts","../../src/dedupe.ts","../../src/enumKeys.ts","../../src/fakeEscapePress.ts","../../src/numberFormat.ts","../../src/pluralize.ts","../../src/prettyJSON.ts","../../src/randomNum.ts","../../src/safeJSONParse.ts","../../src/toOrdinal.ts","../../src/tuplify.ts"],"sourcesContent":["import { format } from \"timeago.js\";\n\n// TIME IN MS\nconst oneSecond = 1000;\nconst oneMinute = oneSecond * 60;\nexport const oneHour = oneMinute * 60;\n\n// Gets UTC date in format YYYY-MM-DD HH:MM:SS\nexport function getUTCDateAndTimeString(date: Date): string {\n const d = getUTCDateString(date);\n const t = `${getUTCTimeString(date)}:${zeroPadNumber(date.getUTCSeconds())}`;\n return `${d} ${t}`;\n}\n\n// Gets date in format YYYY-MM-DD\nexport function getDateString(date: Date): string {\n const month = zeroPadNumber(date.getMonth() + 1); // January is 0\n const day = zeroPadNumber(date.getDate());\n const year = date.getFullYear();\n return `${year}-${month}-${day}`;\n}\n\n// Gets UTC date in format YYYY-MM-DD\nexport function getUTCDateString(date: Date): string {\n const month = zeroPadNumber(date.getUTCMonth() + 1); // January is 0\n const day = zeroPadNumber(date.getUTCDate());\n const year = date.getUTCFullYear();\n return `${year}-${month}-${day}`;\n}\n\n// Gets UTC time in format HH:MM:SS\nexport function getUTCTimeString(date: Date): string {\n const hour = date.getUTCHours();\n const mins = date.getUTCMinutes();\n return `${zeroPadNumber(hour)}:${zeroPadNumber(mins)}`;\n}\n\nfunction zeroPadNumber(num: number): string {\n if (num < 10) {\n return `0${num}`;\n }\n return String(num);\n}\n\nexport function getNow(): Date {\n return new Date(Date.now());\n}\n\nexport function getDateMinusHours(date: Date, hours: number): Date {\n if (hours === 0) return date;\n date.setHours(date.getHours() - hours);\n return date;\n}\n\nexport function getUTCNowDateString(): string {\n return getUTCDateString(getNow());\n}\n\n// Gets local time in format \"M/DD/YYYY, HH:MM [AM|PM]\"\nexport function getLongDateTimeString(d: Date): string {\n const [date, time, period] = d.toLocaleString().split(\" \");\n const per = period ? ` ${period}` : \"\";\n return `${date} ${time.slice(0, -3)}${per}`;\n}\n\nfunction getTime(date: Date): string {\n const hour = zeroPadNumber(date.getHours());\n const mins = zeroPadNumber(date.getMinutes());\n return `${hour}:${mins}`;\n}\n\nexport function getTimeWithSeconds(date: Date): string {\n const t = getTime(date);\n return `${t}:${zeroPadNumber(date.getSeconds())}`;\n}\n\nexport function getTimeAgoString(oldDateTime: number): string {\n return format(new Date(oldDateTime));\n}\n\nexport function areTimeAgosEqual(a: Date, b: Date): boolean {\n return format(a) === format(b);\n}\n\n// Manually convert local date to UTC\nexport function convertToUTCDate(d: Date): Date {\n const utcDate = new Date(d);\n utcDate.setUTCFullYear(d.getFullYear());\n utcDate.setUTCMonth(d.getMonth());\n utcDate.setUTCDate(d.getDate());\n utcDate.setUTCHours(d.getHours());\n utcDate.setUTCMinutes(d.getMinutes());\n utcDate.setUTCSeconds(d.getSeconds());\n return utcDate;\n}\n","const fullWidthRegex = /[^\\u0020-\\u007E]/;\n\n// Half-width characters have a width of 1, while full-width characters, like those in Japanese and Chinese, have a width of 2.\nfunction truncate(str: string, len: number): string {\n let truncated = \"\";\n let width = 0;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const char of str) {\n width += fullWidthRegex.test(char) ? 2 : 1;\n\n if (width > len - 1) {\n return `${truncated}…`;\n }\n\n truncated += char;\n }\n\n return truncated;\n}\n\nexport default function excerpt(str: string, len = 100): string {\n return truncate(str, len);\n}\n","export default function initialUppercase(s: string): string {\n const [first, ...rest] = s;\n return [first.toLocaleUpperCase(), ...rest].join(\"\");\n}\n","export enum KeyCodes {\n BACKSPACE = 8,\n TAB = 9,\n ENTER = 13,\n SHIFT = 16,\n CTRL = 17,\n ALT = 18,\n PAUSE = 19,\n CAPS_LOCK = 20,\n ESCAPE = 27,\n SPACE = 32,\n PAGE_UP = 33,\n PAGE_DOWN = 34,\n END = 35,\n HOME = 36,\n LEFT_ARROW = 37,\n UP_ARROW = 38,\n RIGHT_ARROW = 39,\n DOWN_ARROW = 40,\n INSERT = 45,\n DELETE = 46,\n KEY_0 = 48,\n KEY_1 = 49,\n KEY_2 = 50,\n KEY_3 = 51,\n KEY_4 = 52,\n KEY_5 = 53,\n KEY_6 = 54,\n KEY_7 = 55,\n KEY_8 = 56,\n KEY_9 = 57,\n KEY_A = 65,\n KEY_B = 66,\n KEY_C = 67,\n KEY_D = 68,\n KEY_E = 69,\n KEY_F = 70,\n KEY_G = 71,\n KEY_H = 72,\n KEY_I = 73,\n KEY_J = 74,\n KEY_K = 75,\n KEY_L = 76,\n KEY_M = 77,\n KEY_N = 78,\n KEY_O = 79,\n KEY_P = 80,\n KEY_Q = 81,\n KEY_R = 82,\n KEY_S = 83,\n KEY_T = 84,\n KEY_U = 85,\n KEY_V = 86,\n KEY_W = 87,\n KEY_X = 88,\n KEY_Y = 89,\n KEY_Z = 90,\n LEFT_META = 91,\n RIGHT_META = 92,\n SELECT = 93,\n NUMPAD_0 = 96,\n NUMPAD_1 = 97,\n NUMPAD_2 = 98,\n NUMPAD_3 = 99,\n NUMPAD_4 = 100,\n NUMPAD_5 = 101,\n NUMPAD_6 = 102,\n NUMPAD_7 = 103,\n NUMPAD_8 = 104,\n NUMPAD_9 = 105,\n MULTIPLY = 106,\n ADD = 107,\n SUBTRACT = 109,\n DECIMAL = 110,\n DIVIDE = 111,\n F1 = 112,\n F2 = 113,\n F3 = 114,\n F4 = 115,\n F5 = 116,\n F6 = 117,\n F7 = 118,\n F8 = 119,\n F9 = 120,\n F10 = 121,\n F11 = 122,\n F12 = 123,\n NUM_LOCK = 144,\n SCROLL_LOCK = 145,\n SEMICOLON = 186,\n EQUALS = 187,\n COMMA = 188,\n DASH = 189,\n PERIOD = 190,\n FORWARD_SLASH = 191,\n GRAVE_ACCENT = 192,\n OPEN_BRACKET = 219,\n BACK_SLASH = 220,\n CLOSE_BRACKET = 221,\n SINGLE_QUOTE = 222,\n}\n","export default function nTimes<T>(\n n: number,\n operation: (...args: any[]) => T,\n args: Parameters<typeof operation> = [],\n): T[] {\n const collection = [];\n for (let i = 0; i < n; i++) {\n collection.push(operation(...args));\n }\n return collection;\n}\n\nexport function nTimesWithIndex<T>(n: number, operation: (n: number) => T) {\n const collection = [];\n for (let i = 0; i < n; i++) {\n collection.push(operation(i));\n }\n return collection;\n}\n","export default function randomArrayItem<T>(arr: T[]): T {\n if (arr.length === 0) {\n throw new Error(\"Can't take random element of empty array\");\n }\n return arr[Math.floor(Math.random() * arr.length)];\n}\n","const commonWords = [\n \"is\",\n \"a\",\n \"the\",\n \"we\",\n \"but\",\n \"and\",\n \"this\",\n \"that\",\n \"in\",\n \"to\",\n \"of\",\n \"have\",\n \"not\",\n \"with\",\n];\nconst fromWikipedia = [\n \"accelerometer\",\n \"ADSL\",\n \"android\",\n \"archive\",\n \"ATX\",\n \"backup\",\n \"bandwidth\",\n \"benchmark\",\n \"barcode\",\n \"booting\",\n \"bios\",\n \"bitmap\",\n \"Bitcoin\",\n \"BitTorrent\",\n \"blacklist\",\n \"bluetooth\",\n \"binary\",\n \"backlink\",\n \"bloatware\",\n \"burn\",\n \"cache\",\n \"compression\",\n \"content\",\n \"CMOS\",\n \"cookie\",\n \"cybercrime\",\n \"cybersecurity\",\n \"daemon\",\n \"debug\",\n \"dock\",\n \"DOS\",\n \"driver\",\n \"device driver\",\n \"DPI\",\n \"DRM\",\n \"encryption\",\n \"emulator\",\n \"ethernet\",\n \"end user\",\n \"fat32\",\n \"framework\",\n \"freeware\",\n \"firewall\",\n \"FTP\",\n \"gif\",\n \"Git\",\n \"GPS\",\n \"GUI\",\n \"HTML\",\n \"https\",\n \"IEEE\",\n \"ISO\",\n \"IMEI\",\n \"ISP\",\n \"Java\",\n \"JavaScript\",\n \"jpeg\",\n \"kernel\",\n \"LAN\",\n \"LCD\",\n \"LED\",\n \"Macintosh\",\n \"mp3\",\n \"malware\",\n \"MMS\",\n \"MIDI\",\n \"newbie\",\n \"OEM\",\n \"OS\",\n \"OCR\",\n \"overclock\",\n \"pdf\",\n \"phishing\",\n \"Python\",\n \"plug-in\",\n \"qwerty\",\n \"remote access\",\n \"registry\",\n \"read-only\",\n \"RAID\",\n \"rooting\",\n \"Safe Mode\",\n \"SSID\",\n \"SEO\",\n \"service pack\",\n \"server\",\n \"source code\",\n \"spam\",\n \"search engine\",\n \"Swype\",\n \"trash\",\n \"underclock\",\n \"Unix\",\n \"virus\",\n \"VGA\",\n \"web\",\n \"wifi\",\n \"Wikipedia\",\n \"Windows\",\n \"wireless LAN\",\n \"World Wide Web\",\n \"WYSIWYG\",\n \"WPA\",\n \"wumpus\",\n \"zip\",\n];\nconst startupJargon = [\n \"accelerator\",\n \"incubator\",\n \"accredited investor\",\n \"advertorials\",\n \"advertainment\",\n \"bleeding edge\",\n \"bootstrapping\",\n \"B2B\",\n \"B2C\",\n \"burn rate\",\n \"capital\",\n \"churn rate\",\n \"cliff\",\n \"pitch deck\",\n \"disrupt\",\n \"disruptive\",\n \"exit\",\n \"freemium\",\n \"gamify\",\n \"growth hacking\",\n \"growth hacker\",\n \"hockey stick\",\n \"IP\",\n \"iterate\",\n \"launch\",\n \"lean\",\n \"leverage\",\n \"loss leader\",\n \"market penetration\",\n \"monetize\",\n \"MVP\",\n \"pivot\",\n \"ramen\",\n \"responsive design\",\n \"ROI\",\n \"runway\",\n \"SAAS\",\n \"scaleable\",\n \"sweat equity\",\n \"term sheet\",\n \"traction\",\n \"valuation\",\n \"value prop\",\n \"vaporware\",\n \"VC\",\n \"venture\",\n];\nconst appsAndCompanies = [\n \"Adobe\",\n \"Airbnb\",\n \"Amazon\",\n \"Apple\",\n \"Facebook\",\n \"Google\",\n \"Instagram\",\n \"Microsoft\",\n \"Netflix\",\n \"Oracle\",\n \"Salesforce\",\n \"Snapchat\",\n \"Telegram\",\n \"Twitter\",\n \"Uber\",\n \"WeChat\",\n \"WhatsApp\",\n];\nconst security = [\n \"0-day\",\n \"exploit\",\n \"hacker\",\n \"virus\",\n \"vulnerability\",\n \"warez\",\n];\nconst dolthubWords = [\n \"Dolt\",\n \"DoltHub\",\n \"database\",\n \"version control\",\n \"MySQL\",\n \"Git\",\n \"GitHub\",\n \"rollback\",\n \"collaborate\",\n \"clone\",\n \"branch\",\n \"merge\",\n \"commit\",\n \"repository\",\n \"pull request\",\n \"schema\",\n \"data\",\n \"command line\",\n \"diff\",\n \"commit log\",\n \"lineage\",\n \"time travel\",\n \"community\",\n \"data bounty\",\n \"open source\",\n \"query\",\n \"workflow\",\n \"script\",\n];\nexport default () => [\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...dolthubWords,\n ...fromWikipedia,\n ...startupJargon,\n ...appsAndCompanies,\n ...security,\n];\n","import initialUppercase from \"../initialUppercase\";\nimport nTimes from \"../nTimes\";\nimport randomArrayItem from \"../randomArrayItem\";\nimport defaultWords from \"./words\";\n\ntype LoremerOptions = { words: string[] | string };\n\n// custom lorem ipsum generator: https://en.wikipedia.org/wiki/Lorem_ipsum\nexport default function Loremer(opts: LoremerOptions) {\n const _words =\n typeof opts.words === \"string\" ? parseWords(opts.words) : opts.words;\n\n if (_words.length === 0) {\n throw new Error(\n \"Loremer refuses to be initialized with an empty dictionary. Try again and give him some damn words this time.\",\n );\n }\n\n type WordOptions = {\n // Some of the \"words\" in the default dictionary are actually more than one word.\n // Accept an option to _actually_ limit the generator to a single word.\n trueSingleWord?: boolean;\n matchRegex?: RegExp;\n minLength?: number;\n maxLength?: number;\n };\n function word({\n trueSingleWord,\n minLength,\n maxLength,\n matchRegex,\n }: WordOptions = {}): string {\n const hasCriteria = trueSingleWord || minLength || maxLength || matchRegex;\n\n // Filter words by criteria:\n const matchingWords = hasCriteria\n ? _words.filter(\n w =>\n // If there's a regex specified, reject non-matches\n !(matchRegex && !w.match(matchRegex)) &&\n // If we want a trueSingleWord, reject words with spaces\n !(trueSingleWord && w.indexOf(\" \") > -1) &&\n // If min or max lengths are specified, enforce them\n !(minLength && minLength > 0 && w.length < minLength) &&\n !(maxLength && maxLength > 0 && w.length > maxLength),\n )\n : _words;\n\n if (!matchingWords.length) {\n throw new Error(\n `Loremer's dictionary doesn't contain any words that satisfy the given constraints: ${JSON.stringify(\n {\n maxLength,\n minLength,\n trueSingleWord,\n matchRegex: String(matchRegex),\n },\n )}`,\n );\n }\n\n return randomArrayItem(matchingWords);\n }\n\n function resourceNameSegment() {\n return word({\n matchRegex: /^[-a-zA-Z_]{3,32}$/,\n trueSingleWord: true,\n });\n }\n\n function words(n: number) {\n return nTimes(n, word);\n }\n\n type SentenceOptions = {\n max?: number;\n min?: number;\n };\n const defaultOptions = { min: 8, max: 13 };\n function sentence(options: SentenceOptions = {}) {\n const o = { ...defaultOptions, ...options };\n const [first, ...rest] = words(randomInRange(o.min, o.max));\n return (\n [initialUppercase(first), ...rest].join(\" \") + randomEndingPunctuation()\n );\n }\n\n function sentences(n: number) {\n return nTimes(n, sentence);\n }\n\n function paragraph() {\n return sentences(randomInRange(2, 5)).join(\" \");\n }\n\n return { word, words, resourceNameSegment, sentence, sentences, paragraph };\n}\n\nfunction randomInRange(a: number, b: number) {\n const [lower, upper] = a < b ? [a, b] : [b, a];\n\n const range = upper - lower;\n return Math.floor(Math.random() * range) + lower;\n}\n\nfunction randomEndingPunctuation() {\n return randomArrayItem([\".\", \".\", \".\", \".\", \"!\", \"?\"]);\n}\n\nexport function parseWords(words: string): string[] {\n return words.split(/[\\s,]+/);\n}\n\nexport const loremer = Loremer({ words: defaultWords() });\n","// Using an unprintable string for null values so we can distinguish between\n// string \"null\" and null\nexport const NULL_VALUE = \"\\uf5f2\\ueb94NULL\\uf5a8\\ue6ff\";\n\nexport function isNullValue(dv: string): boolean {\n return dv === NULL_VALUE;\n}\n\nexport function getDisplayValue(dv: string): string {\n return isNullValue(dv) ? \"NULL\" : dv;\n}\n\nexport function getDisplayValueForApi(dv: string): string | null {\n return isNullValue(dv) ? null : dv;\n}\n","import {\n AST,\n Binary,\n ColumnRef,\n OrderBy,\n Parser,\n Select,\n} from \"node-sql-parser\";\nimport Maybe from \"./Maybe\";\nimport { isNullValue } from \"./null\";\n\nexport type TableColumn = {\n name: string;\n sourceTable?: Maybe<string>;\n};\n\nconst parser = new Parser();\nconst opt = {\n database: \"MYSQL\",\n};\n\nfunction getQueryError(q: string, err: unknown): string {\n return `query: ${q}\\nerror: ${err}`;\n}\n\nexport function parseSelectQuery(q: string): Select | null {\n let ast = {};\n try {\n ast = parser.astify(q, opt);\n } catch (err) {\n console.error(getQueryError(q, err));\n }\n const obj: AST = Array.isArray(ast) ? ast[0] : ast;\n return obj.type === \"select\" ? obj : null;\n}\n\n// Gets table names as array `{type}::{dbName}::{tableName}` and converts to array of tableNames\nexport function getTableNames(q: string): string[] | undefined {\n try {\n return parser.tableList(q, opt).map(tn => tn.split(\"::\")[2]);\n } catch (err) {\n console.error(getQueryError(q, err));\n return undefined;\n }\n}\n\nexport function requireTableNameForSelect(q: string): string[] {\n return getTableNames(q) ?? fallbackGetTableNamesForSelect(q);\n}\n\n// Extracts tableName from query\nexport function getTableName(q?: string): Maybe<string> {\n if (!q) return undefined;\n const tns = getTableNames(q);\n if (!tns || tns.length === 0) return undefined;\n return tns[0];\n}\n\n// Uses regex to match table names in query \"SELECT [columns] FROM [tableName] ...\"\n// does not work on more than 2 tables. but better than just extract 1 table\nexport function fallbackGetTableNamesForSelect(query: string): string[] {\n const tableNameRegex =\n /\\b(?:from|join)\\s+`?(\\w+)`?(?:\\s*(?:join|,)\\s+`?(\\w+)`?)*\\b/gi;\n const matches = [...query.matchAll(tableNameRegex)];\n const tableNames = matches.flatMap(match => match.slice(1).filter(Boolean));\n return tableNames;\n}\n\ntype Column = {\n expr: ColumnRef;\n as: string | null;\n};\n\ntype Columns = any[] | \"*\" | Column[];\n\n// Extracts columns from query string\nexport function getColumns(q: string): Columns | undefined {\n const ast = parseSelectQuery(q);\n return ast?.columns;\n}\n\nfunction getSqlColumn(name: string): Column {\n return {\n expr: {\n type: \"column_ref\",\n table: null,\n column: name,\n },\n as: null,\n };\n}\n\nfunction mapColsToColumnNames(cols: string[] | \"*\"): Column[] {\n if (cols === \"*\") {\n return [getSqlColumn(\"*\")];\n }\n return cols.map(c => getSqlColumn(c));\n}\n\nfunction mapColsToColumnRef(\n cols: TableColumn[] | \"*\",\n isJoinClause: boolean,\n): Column[] {\n if (cols === \"*\") {\n return [getSqlColumn(\"*\")];\n }\n return cols.map(c => {\n return {\n expr: {\n type: \"column_ref\",\n table: isJoinClause && c.sourceTable ? c.sourceTable : null,\n column: c.name,\n },\n as: null,\n };\n });\n}\n\nexport function convertToSql(select: Select): string {\n return parser.sqlify(select, opt);\n}\n\n// Converts query string to sql with new table name and columns\nexport function convertToSqlWithNewColNames(\n q: string,\n cols: string[] | \"*\",\n tableName: string,\n): string {\n const ast = parseSelectQuery(q);\n const columns = mapColsToColumnNames(cols);\n if (!ast) return \"\";\n const newAst: Select = {\n ...ast,\n columns,\n from: [{ db: null, table: tableName, as: null }],\n where: escapeSingleQuotesInWhereObj(ast.where),\n };\n return convertToSql(newAst);\n}\n\n// Converts query string to sql with new table name and columns\nexport function convertToSqlWithNewCols(\n q: string,\n cols: TableColumn[] | \"*\",\n tableNames?: string[],\n): string {\n const ast = parseSelectQuery(q);\n const isJoinClause = tableNames && tableNames.length > 1;\n const columns = mapColsToColumnRef(cols, !!isJoinClause);\n\n if (!ast) return \"\";\n if (!tableNames || tableNames.length === 0) {\n return convertToSql({\n ...ast,\n columns,\n where: escapeSingleQuotesInWhereObj(ast.where),\n });\n }\n const newAst: Select = {\n ...ast,\n columns,\n from: tableNames.map(table => {\n return { db: null, table, as: null };\n }),\n where: escapeSingleQuotesInWhereObj(ast.where),\n };\n return convertToSql(newAst);\n}\n\n// Adds condition to query string\nexport function convertToSqlWithNewCondition(\n query: string,\n column: string,\n value: string,\n): string {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return query;\n }\n const where = getWhereObj(column, value, parsed);\n return convertToSql({\n ...parsed,\n where,\n });\n}\n\n// Adds order by clause to query string\nexport function convertToSqlWithOrderBy(\n query: string,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): string {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return query;\n }\n const orderby = getOrderByArr(parsed, column, type);\n return convertToSql({ ...parsed, orderby });\n}\n\n// Check if query has order by clause for column and type\nexport function queryHasOrderBy(\n query: string,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): boolean {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return false;\n }\n // If no order by, return true for default and false otherwise\n if (!parsed.orderby) {\n return !type;\n }\n // If default, check if order by for column exists\n if (!type) {\n return !parsed.orderby.some(o => o.expr.column === column);\n }\n // Check if column and type match\n return parsed.orderby.some(o => o.expr.column === column && o.type === type);\n}\n\n// Creates where object from conditions or adds conditions to existing where object\nfunction getWhereObj(column: string, value: string, parsed: Select) {\n const valIsNull = isNullValue(value);\n const escapedVal = escapeSingleQuotes(value);\n const newCondition: Binary = {\n type: \"binary_expr\",\n operator: valIsNull ? \"IS\" : \"=\",\n left: {\n type: \"column_ref\",\n table: null,\n column,\n },\n right: {\n type: valIsNull ? \"null\" : \"string\",\n value: valIsNull ? null : escapedVal,\n },\n };\n\n if (!parsed.where) {\n return newCondition;\n }\n const condition: Binary = {\n type: \"binary_expr\",\n operator: \"AND\",\n left: { ...escapeSingleQuotesInWhereObj(parsed.where) },\n right: newCondition,\n };\n return condition;\n}\n\n// The where object is a binary tree with 'left' and 'right' nodes\nfunction escapeSingleQuotesInWhereObj(where: any): any {\n if (!where) return null;\n\n if (where.args) {\n escapeSingleQuotesInWhereObj(where.args);\n }\n\n if (where.expr) {\n escapeSingleQuotesInWhereObj(where.expr);\n }\n\n if (where.left) {\n escapeSingleQuotesInWhereObj(where.left);\n }\n\n if (where.value) {\n if (typeof where.value === \"string\") {\n // eslint-disable-next-line no-param-reassign\n where.value = escapeSingleQuotes(where.value);\n }\n if (Array.isArray(where.value)) {\n where.value.forEach((val: any) => escapeSingleQuotesInWhereObj(val));\n }\n }\n\n if (where.right) {\n escapeSingleQuotesInWhereObj(where.right);\n }\n\n return where;\n}\n\nfunction getOrderByArr(\n parsed: Select,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): OrderBy[] | null {\n // If default, remove order by clause for column\n if (!type) {\n return parsed.orderby\n ? parsed.orderby.filter(o => o.expr.column !== column)\n : null;\n }\n // If order by clause for column exists, update type\n const colInOrderBy = parsed.orderby?.find(o => o.expr.column === column);\n if (colInOrderBy) {\n colInOrderBy.type = type;\n return parsed.orderby;\n }\n // Otherwise, add new order by clause\n const newOrderby = {\n expr: { type: \"column_ref\", column },\n type,\n };\n return parsed.orderby ? [...parsed.orderby, newOrderby] : [newOrderby];\n}\n\n// Gets the type of query\nexport function getQueryType(q: string): string | undefined {\n let ast = {};\n try {\n ast = parser.astify(q, opt);\n } catch (err) {\n console.error(getQueryError(q, err));\n return undefined;\n }\n const obj: AST | undefined = Array.isArray(ast) ? ast[0] : ast;\n if (!obj) return undefined;\n return obj.type;\n}\n\nexport function isMutation(q?: string): boolean {\n if (!q) return false;\n const type = getQueryType(q);\n if (!type) {\n const lower = q.toLowerCase();\n if (\n lower.startsWith(\"insert\") ||\n lower.startsWith(\"alter\") ||\n lower.startsWith(\"create\") ||\n lower.startsWith(\"drop\") ||\n lower.startsWith(\"update\") ||\n lower.startsWith(\"revoke\") ||\n lower.startsWith(\"grant\") ||\n lower.startsWith(\"flush\") ||\n // lower.startsWith(\"replace into\") ||\n (lower.startsWith(\"with\") &&\n ((lower.includes(\"update\") && lower.includes(\"set\")) ||\n lower.includes(\"delete from\")))\n ) {\n return true;\n }\n }\n return !!type && type !== \"select\" && type !== \"desc\" && type !== \"show\";\n}\n\nexport function isReadQuery(q?: string): boolean {\n if (!q) return false;\n const type = getQueryType(q);\n if (!type) {\n const lower = q.toLowerCase();\n if (\n lower.startsWith(\"select\") ||\n lower.startsWith(\"desc\") ||\n lower.startsWith(\"show\")\n ) {\n return true;\n }\n }\n return !!type && (type === \"select\" || type === \"desc\" || type === \"show\");\n}\n\n// Removes a column from a select query\nexport function removeColumnFromQuery(\n q: string,\n colNameToRemove: string,\n cols: TableColumn[],\n): string {\n const newCols = cols.filter(c => c.name !== colNameToRemove);\n const tableName = getTableNames(q);\n return convertToSqlWithNewCols(q, newCols, tableName);\n}\n\nfunction escapeSingleQuotes(value: string): string {\n if (value.includes(\"\\\\'\")) return value;\n return value.replace(/'/g, \"\\\\'\");\n}\n\n// Query should be wrapped in single quotes\nexport function makeQueryExecutable(q: string): string {\n return (\n q\n // Escape single quotes\n .replace(/'/g, \"\\\\'\")\n // Remove newlines and carriage returns\n .replace(/\\r\\n|\\n|\\r/gm, \" \")\n // Remove whitespace from beginning/end\n .trim()\n );\n}\n\nexport function isMultipleQueries(queryString: string): boolean {\n try {\n const { ast } = parser.parse(queryString);\n return Array.isArray(ast) && ast.length > 1;\n } catch (_err) {\n return false;\n }\n}\n","const replaceToken = \"$\";\n\n// sprintf takes a string and replaces all instances of `replaceToken` with the provided arguments\nexport const sprintf = (str: string, ...argv: any[]): string => {\n if (!argv.length) return str;\n // eslint-disable-next-line no-return-assign, no-param-reassign\n return sprintf((str = str.replace(replaceToken, argv.shift())), ...argv);\n};\n","import { ParsedUrlQueryInput } from \"querystring\";\nimport { UrlObject } from \"url\";\n\ntype Url = string | UrlObject;\n\nexport type LinkObject = {\n href: Url;\n as?: Url;\n};\n\n/**\n * __Route__\n *\n * `Route` class that handles adding static and dynamic route segments to\n * existing routes. `Route` can be initialized with a \"href\" string or\n * `UrlObject` and optional \"as\" string or `UrlObject`.\n *\n * @example\n * const routeA = new Route(\"/repositories\");\n * routeA.hrefPathname() // \"/repositories\"\n * routeA.addDynamic(\"ownerName\", \"my-owner\")\n * routeA.hrefPathname() // \"repositories/[ownerName]\"\n * routeA.asPathname() // \"repositories/my-owner\"\n *\n * const routeB = new Route(\n * { pathname: \"/repositories/[ownerName]\", query: { refName: \"main\" } },\n * { pathname: \"/repositories/my-owner\", query: { refName: \"main\" } },\n * )\n * routeB.hrefPathname() // \"/repositories/[ownerName]\"\n * routeB.asPathname() // \"repositories/my-owner\"\n * routeB.getQuery() // { refName: \"main\" }\n */\nexport class Route {\n href: Url;\n\n as: Url;\n\n constructor(href: Url, as?: Url) {\n this.href = href;\n this.as = as ?? href;\n }\n\n /**\n * __hrefPathname__\n *\n * Gets pathname string from href string or `UrlObject`.\n *\n * @param addFrag Optional route fragment string to add to `href` pathname\n *\n * @returns `href` pathname string, with added route fragment if provided\n *\n * @example\n * const routeA = new Route(\"/repositories\");\n * routeA.hrefPathname() // \"/repositories\"\n * routeA.hrefPathname(\"[ownerName]\") // \"repositories/[ownerName]\"\n *\n * const routeB = new Route({ pathname: \"/repositories\" })\n * routeB.hrefPathname() // \"/repositories\"\n * routeB.hrefPathname(\"[ownerName]\") // \"repositories/[ownerName]\"\n */\n hrefPathname(addFrag?: string): string {\n const href = getPathname(this.href);\n if (!addFrag) return href;\n return `${href}/${addFrag}`;\n }\n\n /**\n * __asPathname__\n *\n * Gets pathname string from as string or `UrlObject`.\n *\n * @param addFrag Optional route fragment string to add to `as` pathname\n *\n * @returns `as` pathname string, with added route fragment if provided\n *\n * @example\n * const routeA = new Route(\"/repositories\");\n * routeA.asPathname() // \"/repositories\"\n * routeA.asPathname(\"my-username\") // \"repositories/my-username\"\n *\n * const routeB = new Route(\n * { pathname: \"/repositories/[ownerName]\" },\n * { pathname: \"/repositories/my-username\" },\n * );\n * routeB.asPathname() // \"/repositories/my-username\"\n * routeB.asPathname(\"data\") // \"repositories/my-username/data\"\n */\n asPathname(addFrag?: string): string {\n const as = getPathname(this.as);\n if (!addFrag) return as;\n return `${as}/${addFrag}`;\n }\n\n /**\n * __getQuery__\n *\n * Gets query object from the href `UrlObject`.\n *\n * @returns query object\n *\n * @example\n * const route = new Route(\"/repositories\");\n * route.withQuery({ refName: \"main\" })\n * route.getQuery() // { refName: \"main\" }\n */\n getQuery(): string | ParsedUrlQueryInput | undefined | null {\n if (typeof this.href === \"string\") return undefined;\n return this.href.query;\n }\n\n /**\n * __getHash__\n *\n * Gets hash string from the href `UrlObject`.\n *\n * @returns hash string\n *\n * @example\n * const route = new Route(\"/repositories\");\n * route.withHash(\"commitA\")\n * route.getHash() // \"commitA\"\n */\n getHash(): string {\n if (typeof this.href === \"string\") return \"\";\n return this.href.hash ?? \"\";\n }\n\n /**\n * __addStatic__\n *\n * Adds static route fragment string to a `Route`. Static route fragments look like:\n * ```ts\n * { href: \"/repositories\", as: \"/repositories\" }\n * ```\n * As opposed to dynamic route fragments which look like:\n * ```ts\n * { href: \"/[ownerName]\", as: \"/owner-value\" }\n * ```\n *\n * @param pathFrag Route fragment string to add to the url. \"/\" is automatically prepended.\n *\n * @returns new instance of `Route`\n *\n * @example\n * const route = new Route(\"/repositories\");\n * route.addStatic(\"data\")\n * route.hrefPathname() // \"/repositories/data\"\n * route.asPathname() // \"/repositories/data\"\n */\n addStatic(pathFrag: string): Route {\n return new Route(this.hrefPathname(pathFrag), this.asPathname(pathFrag));\n }\n\n /**\n * __maybeAddStatic__\n *\n * Maybe adds static route fragment string to a `Route`.\n *\n * @see this.addStatic\n *\n * @param pathFrag Optional route fragment string to add to the url. \"/\" is automatically prepended.\n *\n * @example\n * const route = new Route(\"/repositories\");\n * route.maybeAddStatic(\"data\")\n * route.hrefPathname() // \"/repositories/data\"\n * route.maybeAddStatic()\n * route.hrefPathname() // \"/repositories\"\n */\n maybeAddStatic(pathFrag?: string): Route {\n return new Route(this.hrefPathname(pathFrag), this.asPathname(pathFrag));\n }\n\n /**\n * __addDynamic__\n *\n * Adds dynamic route fragment string to a Route.\n * Dynamic route fragments look like:\n * ```ts\n * { href: \"/[ownerName]\", as: \"/owner-value\" }\n * ```\n * As opposed to static route fragments which look like:\n *\n * ```ts\n * { href: \"/repositories\", as: \"/repositories\" }\n * ```\n *\n * @param param String fragment to add to the href path. This value will be wrapped in square brackets. \"/\" is automatically prepended.\n * @param as Value of the `param` to be added to the `as` path. \"/\" is automatically prepended.\n * @param encode Default false. If true, encodes a `as` param value string as a valid component of a Uniform Resource Identifier (URI).\n *\n * @returns new instance of `Route`\n *\n * @example\n * const route = new Route(\"/repositories\");\n * route.addDynamic(\"ownerName\", \"my-owner-name\")\n * route.hrefPathname() // \"/repositories/[ownerName]\"\n * route.asPathname() // \"/repositories/my-owner-name\"\n */\n addDynamic(param: string, as: string, encode = false): Route {\n const asStr = encode ? encodeURIComponent(as) : as;\n return new Route(this.hrefPathname(`[${param}]`), this.asPathname(asStr));\n }\n\n /**\n * __withQuery__\n *\n * Adds query object to a `Route`. Looks like \"?refName=main&active=Tables\"\n * when url is formatted.\n *\n * @param q Record with fields that will be added to the query string.\n *\n * @returns new instance of `Route`\n *\n * @example\n * const route = new Route(\"/repositories/[ownerName]\", \"/repositories/my-owner\");\n * route.withQuery({ refName: \"main\", active: undefined })\n * route.hrefPathname() // { pathname: \"/repositories/[ownerName]\", query: { refName: \"main\" } }\n * route.asPathname() // { pathname: \"/repositories/my-owner\", query: { refName: \"main\" } }\n */\n withQuery(q: Record<string, string | undefined | null>): Route {\n const query = queryHandler(q);\n return new Route(\n { pathname: this.hrefPathname(), query, hash: this.getHash() },\n { pathname: this.asPathname(), query, hash: this.getHash() },\n );\n }\n\n /**\n * __withHash__\n *\n * Adds hash string to a `Route`. Looks like \"#hash-value\" when url is formatted.\n *\n * @param hash Optional hash string\n *\n * @returns new instance of Route\n *\n * @example\n * const route = new Route(\"/repositories/[ownerName]\", \"/repositories/my-owner\");\n * route.withHash({ commitId: \"commitA\" })\n * route.hrefPathname() // { pathname: \"/repositories/[ownerName]\", hash: { commitId: \"commitA\" } }\n * route.asPathname() // { pathname: \"/repositories/my-owner\", hash: { commitId: \"commitA\" } }\n */\n withHash(hash?: string): Route {\n return new Route(\n { pathname: this.hrefPathname(), query: this.getQuery(), hash },\n { pathname: this.asPathname(), query: this.getQuery(), hash },\n );\n }\n}\n\n// Gets pathname from url string or object\nfunction getPathname(as?: string | UrlObject): string {\n if (!as) return \"\";\n if (typeof as === \"string\") return as;\n return as.pathname ?? \"\";\n}\n\n// Returns query object with undefined or empty values removed\nexport function queryHandler(\n q: Record<string, string | undefined | null>,\n): string | null | ParsedUrlQueryInput | undefined {\n return Object.keys(q).reduce((prev, key) => {\n const currVal = q[key];\n if (currVal !== undefined && currVal !== null && currVal.length > 0) {\n return { ...prev, [key]: currVal };\n }\n return prev;\n }, {} as NodeJS.Dict<string>);\n}\n","const emailRegex = /\\S+@\\S+\\.\\S+/;\n\nexport function emailValidator(s: string) {\n return {\n isValid: !!s.match(emailRegex),\n errorMsg: \"Email format invalid\",\n };\n}\n\nconst usernameRegex = /^[-a-z0-9_]{3,32}$/g;\nconst invalidRegex = /^-|^_|-$|_$|--|__|-_|_-/;\n\nexport function usernameValidator(s: string) {\n return {\n isValid: !!s.match(usernameRegex) && !s.match(invalidRegex),\n errorMsg:\n \"Username can only contain lowercase letters, dashes, and underscores and be between 3 and 32 characters\",\n detailedErrorMsg: getUsernameErrorMsg(s),\n };\n}\n\nfunction getUsernameErrorMsg(s: string) {\n if (s.length < 3) {\n return \"Username too short\";\n }\n if (s.length > 32) {\n return \"Username too long\";\n }\n if (s.toLowerCase() !== s) {\n return \"Username cannot have uppercase letters\";\n }\n if (!s.match(usernameRegex)) {\n return \"Username invalid\";\n }\n if (s.match(invalidRegex)) {\n return \"Username invalid\";\n }\n return \"\";\n}\n","export default function compareArray(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) return false;\n const sortedArr1 = arr1.sort();\n const sortedArr2 = arr2.sort();\n for (let i = 0; i < arr1.length; i++) {\n if (sortedArr1[i] !== sortedArr2[i]) {\n return false;\n }\n }\n return true;\n}\n","// Removes duplicates from array for primitive types\nexport default function dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n","/**\n * enumKeys takes an enum and returns an array of strongly typed keys. Useful to iterate over string enums.\n * @param obj The enum\n * @returns An array of strong typed keys\n * @example\n *\n * enum MyEnum {\n * Key1 = \"value1\",\n * Key2 = \"value2\",\n * Key3 = \"value3\"\n * }\n *\n * // ks's type is (\"Key1\" || \"Key2\" || \"Key3\")[]\n * const ks = enumKeys(MyEnum);\n *\n * // keys' type is MyEnum[]\n * // Unfortunately, we can't do this inside enumKeys because there is no generic type constraint for enums.\n * const keys = ks.map(k => MyEnum[k])\n */\nfunction enumKeys<O extends object, K extends keyof O = keyof O>(obj: O): K[] {\n return Object.keys(obj)\n .filter(k => Number.isNaN(+k))\n .map(k => k as K);\n}\n\nexport default enumKeys;\n","/* \nreactjs-popup stays in it's absolute position when scrolled, \nthis is a workaround until the issue is fixed \nhttps://github.com/yjose/reactjs-popup/issues/208\n\nMake sure to include the following in your react component\n useEffectOnMount(() => {\n document.addEventListener(\"wheel\", fakeEscapePress);\n return () => document.removeEventListener(\"wheel\", fakeEscapePress);\n });\n*/\n\nexport default function fakeEscapePress() {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: \"Escape\",\n }),\n );\n document.dispatchEvent(\n new KeyboardEvent(\"keyup\", {\n key: \"Escape\",\n }),\n );\n}\n","export function formatNumber(num: number): string {\n return new Intl.NumberFormat(\"en-US\").format(num);\n}\n\nexport function formatToUsd(num: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(num);\n}\n\nexport function formatToRoundedUsd(num: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(num);\n}\n","export default function pluralize(num: number, str: string): string {\n if (num === 1) {\n return str;\n }\n return getPlural(str);\n}\n\nfunction getPlural(s: string): string {\n switch (s) {\n case \"person\":\n return \"people\";\n case \"repository\":\n return \"repositories\";\n case \"repository updated today\":\n return \"repositories updated today\";\n case \"database\":\n return \"databases\";\n case \"database updated today\":\n return \"databases updated today\";\n case \"branch\":\n return \"branches\";\n default:\n return `${s}s`;\n }\n}\n","export default function prettyJSON(data: any): string {\n try {\n return JSON.stringify(data, null, 2);\n } catch (err) {\n console.error(err);\n return `${data}`;\n }\n}\n\nexport function prettyJSONText(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text), null, 2);\n } catch (err) {\n console.error(err);\n return text;\n }\n}\n","export default function randomNum(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min) + min);\n}\n","// safeJSONParse attempts to parse a JSON string, and if it fails returns the\n// original string instead of throwing an error\nexport default function safeJSONParse(text: string): any {\n try {\n return JSON.parse(text);\n } catch (_) {\n return text;\n }\n}\n","export default function toOrdinal(n: number): string {\n if (n % 10 === 1 && n % 100 !== 11) return `${n}st`;\n\n if (n % 10 === 2 && n % 100 !== 12) return `${n}nd`;\n\n if (n % 10 === 3 && n % 100 !== 13) return `${n}rd`;\n\n return `${n}th`;\n}\n","export default function tuplify<T extends any[]>(...elements: T) {\n return elements;\n}\n"],"names":["getUTCDateString","date","month","zeroPadNumber","getUTCMonth","day","getUTCDate","getUTCFullYear","getUTCTimeString","hour","getUTCHours","mins","getUTCMinutes","num","String","getNow","Date","now","fullWidthRegex","initialUppercase","s","first","rest","toLocaleUpperCase","join","KeyCodes","nTimes","n","operation","args","collection","i","push","randomArrayItem","arr","length","Error","Math","floor","random","commonWords","fromWikipedia","startupJargon","appsAndCompanies","security","dolthubWords","randomInRange","a","b","lower","upper","range","loremer","opts","_words","words","split","parseWords","word","trueSingleWord","minLength","maxLength","matchRegex","matchingWords","filter","w","match","indexOf","JSON","stringify","defaultOptions","min","max","sentence","options","o","Object","assign","sentences","resourceNameSegment","paragraph","Loremer","NULL_VALUE","isNullValue","dv","parser","Parser","opt","database","getQueryError","q","err","parseSelectQuery","ast","astify","console","error","obj","Array","isArray","type","getTableNames","tableList","map","tn","getSqlColumn","name","expr","table","column","as","convertToSql","select","sqlify","convertToSqlWithNewCols","cols","tableNames","columns","isJoinClause","c","sourceTable","mapColsToColumnRef","where","escapeSingleQuotesInWhereObj","from","db","left","value","escapeSingleQuotes","forEach","val","right","getQueryType","includes","replace","sprintf","str","argv","shift","Route","constructor","href","this","hrefPathname","addFrag","getPathname","asPathname","getQuery","query","getHash","_a","hash","addStatic","pathFrag","maybeAddStatic","addDynamic","param","encode","asStr","encodeURIComponent","withQuery","keys","reduce","prev","key","currVal","queryHandler","pathname","withHash","emailRegex","usernameRegex","invalidRegex","getUsernameErrorMsg","toLowerCase","format","arr1","arr2","sortedArr1","sort","sortedArr2","tableName","mapColsToColumnNames","parsed","valIsNull","escapedVal","newCondition","operator","condition","getWhereObj","orderby","colInOrderBy","find","newOrderby","getOrderByArr","d","utcDate","setUTCFullYear","getFullYear","setUTCMonth","getMonth","setUTCDate","getDate","setUTCHours","getHours","setUTCMinutes","getMinutes","setUTCSeconds","getSeconds","Set","isValid","errorMsg","k","Number","isNaN","len","truncated","width","char","test","truncate","document","dispatchEvent","KeyboardEvent","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","hours","setHours","time","period","toLocaleString","per","slice","tns","oldDateTime","getTime","getUTCSeconds","queryString","parse","_err","startsWith","trim","oneMinute","getPlural","data","text","some","colNameToRemove","tableNameRegex","matches","matchAll","flatMap","Boolean","fallbackGetTableNamesForSelect","_","elements","detailedErrorMsg"],"mappings":"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A,YACA,YACA,SACA,WACA,YACA,OACA,QACA,cACA,UACA,OACA,SACA,aACA,gBACA,SACA,QACA,OACA,MACA,SACA,gBACA,MACA,MACA,aACA,WACA,WACA,WACA,QACA,YACA,WACA,WACA,MACA,MACA,MACA,MACA,MACA,OACA,QACA,OACA,MACA,OACA,MACA,OACA,aACA,OACA,SACA,MACA,MACA,MACA,YACA,MACA,UACA,MACA,OACA,SACA,MACA,KACA,MACA,YACA,MACA,WACA,SACA,UACA,SACA,gBACA,WACA,YACA,OACA,UACA,YACA,OACA,MACA,eACA,SACA,cACA,OACA,gBACA,QACA,QACA,aACA,OACA,QACA,MACA,MACA,OACA,YACA,UACA,eACA,iBACA,UACA,MACA,SACA,OAEIC,EAAgB,CACpB,cACA,YACA,sBACA,eACA,gBACA,gBACA,gBACA,MACA,MACA,YACA,UACA,aACA,QACA,aACA,UACA,aACA,OACA,WACA,SACA,iBACA,gBACA,eACA,KACA,UACA,SACA,OACA,WACA,cACA,qBACA,WACA,MACA,QACA,QACA,oBACA,MACA,SACA,OACA,YACA,eACA,aACA,WACA,YACA,aACA,YACA,KACA,WAEIC,EAAmB,CACvB,QACA,SACA,SACA,QACA,WACA,SACA,YACA,YACA,UACA,SACA,aACA,WACA,WACA,UACA,OACA,SACA,YAEIC,EAAW,CACf,QACA,UACA,SACA,QACA,gBACA,SAEIC,EAAe,CACnB,OACA,UACA,WACA,kBACA,QACA,MACA,SACA,WACA,cACA,QACA,SACA,QACA,SACA,aACA,eACA,SACA,OACA,eACA,OACA,aACA,UACA,cACA,YACA,cACA,cACA,QACA,WACA,UC/HF,SAASC,EAAcC,EAAWC,GAChC,MAAOC,EAAOC,GAASH,EAAIC,EAAI,CAACD,EAAGC,GAAK,CAACA,EAAGD,GAEtCI,EAAQD,EAAQD,EACtB,OAAOZ,KAAKC,MAAMD,KAAKE,SAAWY,GAASF,CAC7C,CAUO,MAAMG,EA1GC,SAAkBC,GAC9B,MAAMC,EACkB,iB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"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(e){const[o,...t]=e;return[o.toLocaleUpperCase(),...t].join("")};
2
+ //# sourceMappingURL=initialUppercase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialUppercase.js","sources":["../../../src/initialUppercase.ts"],"sourcesContent":["export default function initialUppercase(s: string): string {\n const [first, ...rest] = s;\n return [first.toLocaleUpperCase(), ...rest].join(\"\");\n}\n"],"names":["s","first","rest","toLocaleUpperCase","join"],"mappings":"4BAAc,SAA2BA,GACvC,MAAOC,KAAUC,GAAQF,EACzB,MAAO,CAACC,EAAME,uBAAwBD,GAAME,KAAK,GACnD"}
@@ -0,0 +1,2 @@
1
+ "use strict";var E;exports.KeyCodes=void 0,(E=exports.KeyCodes||(exports.KeyCodes={}))[E.BACKSPACE=8]="BACKSPACE",E[E.TAB=9]="TAB",E[E.ENTER=13]="ENTER",E[E.SHIFT=16]="SHIFT",E[E.CTRL=17]="CTRL",E[E.ALT=18]="ALT",E[E.PAUSE=19]="PAUSE",E[E.CAPS_LOCK=20]="CAPS_LOCK",E[E.ESCAPE=27]="ESCAPE",E[E.SPACE=32]="SPACE",E[E.PAGE_UP=33]="PAGE_UP",E[E.PAGE_DOWN=34]="PAGE_DOWN",E[E.END=35]="END",E[E.HOME=36]="HOME",E[E.LEFT_ARROW=37]="LEFT_ARROW",E[E.UP_ARROW=38]="UP_ARROW",E[E.RIGHT_ARROW=39]="RIGHT_ARROW",E[E.DOWN_ARROW=40]="DOWN_ARROW",E[E.INSERT=45]="INSERT",E[E.DELETE=46]="DELETE",E[E.KEY_0=48]="KEY_0",E[E.KEY_1=49]="KEY_1",E[E.KEY_2=50]="KEY_2",E[E.KEY_3=51]="KEY_3",E[E.KEY_4=52]="KEY_4",E[E.KEY_5=53]="KEY_5",E[E.KEY_6=54]="KEY_6",E[E.KEY_7=55]="KEY_7",E[E.KEY_8=56]="KEY_8",E[E.KEY_9=57]="KEY_9",E[E.KEY_A=65]="KEY_A",E[E.KEY_B=66]="KEY_B",E[E.KEY_C=67]="KEY_C",E[E.KEY_D=68]="KEY_D",E[E.KEY_E=69]="KEY_E",E[E.KEY_F=70]="KEY_F",E[E.KEY_G=71]="KEY_G",E[E.KEY_H=72]="KEY_H",E[E.KEY_I=73]="KEY_I",E[E.KEY_J=74]="KEY_J",E[E.KEY_K=75]="KEY_K",E[E.KEY_L=76]="KEY_L",E[E.KEY_M=77]="KEY_M",E[E.KEY_N=78]="KEY_N",E[E.KEY_O=79]="KEY_O",E[E.KEY_P=80]="KEY_P",E[E.KEY_Q=81]="KEY_Q",E[E.KEY_R=82]="KEY_R",E[E.KEY_S=83]="KEY_S",E[E.KEY_T=84]="KEY_T",E[E.KEY_U=85]="KEY_U",E[E.KEY_V=86]="KEY_V",E[E.KEY_W=87]="KEY_W",E[E.KEY_X=88]="KEY_X",E[E.KEY_Y=89]="KEY_Y",E[E.KEY_Z=90]="KEY_Z",E[E.LEFT_META=91]="LEFT_META",E[E.RIGHT_META=92]="RIGHT_META",E[E.SELECT=93]="SELECT",E[E.NUMPAD_0=96]="NUMPAD_0",E[E.NUMPAD_1=97]="NUMPAD_1",E[E.NUMPAD_2=98]="NUMPAD_2",E[E.NUMPAD_3=99]="NUMPAD_3",E[E.NUMPAD_4=100]="NUMPAD_4",E[E.NUMPAD_5=101]="NUMPAD_5",E[E.NUMPAD_6=102]="NUMPAD_6",E[E.NUMPAD_7=103]="NUMPAD_7",E[E.NUMPAD_8=104]="NUMPAD_8",E[E.NUMPAD_9=105]="NUMPAD_9",E[E.MULTIPLY=106]="MULTIPLY",E[E.ADD=107]="ADD",E[E.SUBTRACT=109]="SUBTRACT",E[E.DECIMAL=110]="DECIMAL",E[E.DIVIDE=111]="DIVIDE",E[E.F1=112]="F1",E[E.F2=113]="F2",E[E.F3=114]="F3",E[E.F4=115]="F4",E[E.F5=116]="F5",E[E.F6=117]="F6",E[E.F7=118]="F7",E[E.F8=119]="F8",E[E.F9=120]="F9",E[E.F10=121]="F10",E[E.F11=122]="F11",E[E.F12=123]="F12",E[E.NUM_LOCK=144]="NUM_LOCK",E[E.SCROLL_LOCK=145]="SCROLL_LOCK",E[E.SEMICOLON=186]="SEMICOLON",E[E.EQUALS=187]="EQUALS",E[E.COMMA=188]="COMMA",E[E.DASH=189]="DASH",E[E.PERIOD=190]="PERIOD",E[E.FORWARD_SLASH=191]="FORWARD_SLASH",E[E.GRAVE_ACCENT=192]="GRAVE_ACCENT",E[E.OPEN_BRACKET=219]="OPEN_BRACKET",E[E.BACK_SLASH=220]="BACK_SLASH",E[E.CLOSE_BRACKET=221]="CLOSE_BRACKET",E[E.SINGLE_QUOTE=222]="SINGLE_QUOTE";
2
+ //# sourceMappingURL=keycodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keycodes.js","sources":["../../../src/keycodes.ts"],"sourcesContent":["export enum KeyCodes {\n BACKSPACE = 8,\n TAB = 9,\n ENTER = 13,\n SHIFT = 16,\n CTRL = 17,\n ALT = 18,\n PAUSE = 19,\n CAPS_LOCK = 20,\n ESCAPE = 27,\n SPACE = 32,\n PAGE_UP = 33,\n PAGE_DOWN = 34,\n END = 35,\n HOME = 36,\n LEFT_ARROW = 37,\n UP_ARROW = 38,\n RIGHT_ARROW = 39,\n DOWN_ARROW = 40,\n INSERT = 45,\n DELETE = 46,\n KEY_0 = 48,\n KEY_1 = 49,\n KEY_2 = 50,\n KEY_3 = 51,\n KEY_4 = 52,\n KEY_5 = 53,\n KEY_6 = 54,\n KEY_7 = 55,\n KEY_8 = 56,\n KEY_9 = 57,\n KEY_A = 65,\n KEY_B = 66,\n KEY_C = 67,\n KEY_D = 68,\n KEY_E = 69,\n KEY_F = 70,\n KEY_G = 71,\n KEY_H = 72,\n KEY_I = 73,\n KEY_J = 74,\n KEY_K = 75,\n KEY_L = 76,\n KEY_M = 77,\n KEY_N = 78,\n KEY_O = 79,\n KEY_P = 80,\n KEY_Q = 81,\n KEY_R = 82,\n KEY_S = 83,\n KEY_T = 84,\n KEY_U = 85,\n KEY_V = 86,\n KEY_W = 87,\n KEY_X = 88,\n KEY_Y = 89,\n KEY_Z = 90,\n LEFT_META = 91,\n RIGHT_META = 92,\n SELECT = 93,\n NUMPAD_0 = 96,\n NUMPAD_1 = 97,\n NUMPAD_2 = 98,\n NUMPAD_3 = 99,\n NUMPAD_4 = 100,\n NUMPAD_5 = 101,\n NUMPAD_6 = 102,\n NUMPAD_7 = 103,\n NUMPAD_8 = 104,\n NUMPAD_9 = 105,\n MULTIPLY = 106,\n ADD = 107,\n SUBTRACT = 109,\n DECIMAL = 110,\n DIVIDE = 111,\n F1 = 112,\n F2 = 113,\n F3 = 114,\n F4 = 115,\n F5 = 116,\n F6 = 117,\n F7 = 118,\n F8 = 119,\n F9 = 120,\n F10 = 121,\n F11 = 122,\n F12 = 123,\n NUM_LOCK = 144,\n SCROLL_LOCK = 145,\n SEMICOLON = 186,\n EQUALS = 187,\n COMMA = 188,\n DASH = 189,\n PERIOD = 190,\n FORWARD_SLASH = 191,\n GRAVE_ACCENT = 192,\n OPEN_BRACKET = 219,\n BACK_SLASH = 220,\n CLOSE_BRACKET = 221,\n SINGLE_QUOTE = 222,\n}\n"],"names":["KeyCodes"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("../initialUppercase.js"),n=require("../nTimes.js"),r=require("../randomArrayItem.js");function t(e,n){const[r,t]=e<n?[e,n]:[n,e],i=t-r;return Math.floor(Math.random()*i)+r}function i(e){return e.split(/[\s,]+/)}const o=function(o){const s="string"==typeof o.words?i(o.words):o.words;if(0===s.length)throw new Error("Loremer refuses to be initialized with an empty dictionary. Try again and give him some damn words this time.");function a({trueSingleWord:e,minLength:n,maxLength:t,matchRegex:i}={}){const o=e||n||t||i?s.filter((r=>!(i&&!r.match(i)||e&&r.indexOf(" ")>-1||n&&n>0&&r.length<n||t&&t>0&&r.length>t))):s;if(!o.length)throw new Error(`Loremer's dictionary doesn't contain any words that satisfy the given constraints: ${JSON.stringify({maxLength:t,minLength:n,trueSingleWord:e,matchRegex:String(i)})}`);return r(o)}function c(e){return n.default(e,a)}const u={min:8,max:13};function m(n={}){const i=Object.assign(Object.assign({},u),n),[o,...s]=c(t(i.min,i.max));return[e(o),...s].join(" ")+r([".",".",".",".","!","?"])}function d(e){return n.default(e,m)}return{word:a,words:c,resourceNameSegment:function(){return a({matchRegex:/^[-a-zA-Z_]{3,32}$/,trueSingleWord:!0})},sentence:m,sentences:d,paragraph:function(){return d(t(2,5)).join(" ")}}}({words:require("./words.js")()});exports.loremer=o,exports.parseWords=i;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/loremer/index.ts"],"sourcesContent":["import initialUppercase from \"../initialUppercase\";\nimport nTimes from \"../nTimes\";\nimport randomArrayItem from \"../randomArrayItem\";\nimport defaultWords from \"./words\";\n\ntype LoremerOptions = { words: string[] | string };\n\n// custom lorem ipsum generator: https://en.wikipedia.org/wiki/Lorem_ipsum\nexport default function Loremer(opts: LoremerOptions) {\n const _words =\n typeof opts.words === \"string\" ? parseWords(opts.words) : opts.words;\n\n if (_words.length === 0) {\n throw new Error(\n \"Loremer refuses to be initialized with an empty dictionary. Try again and give him some damn words this time.\",\n );\n }\n\n type WordOptions = {\n // Some of the \"words\" in the default dictionary are actually more than one word.\n // Accept an option to _actually_ limit the generator to a single word.\n trueSingleWord?: boolean;\n matchRegex?: RegExp;\n minLength?: number;\n maxLength?: number;\n };\n function word({\n trueSingleWord,\n minLength,\n maxLength,\n matchRegex,\n }: WordOptions = {}): string {\n const hasCriteria = trueSingleWord || minLength || maxLength || matchRegex;\n\n // Filter words by criteria:\n const matchingWords = hasCriteria\n ? _words.filter(\n w =>\n // If there's a regex specified, reject non-matches\n !(matchRegex && !w.match(matchRegex)) &&\n // If we want a trueSingleWord, reject words with spaces\n !(trueSingleWord && w.indexOf(\" \") > -1) &&\n // If min or max lengths are specified, enforce them\n !(minLength && minLength > 0 && w.length < minLength) &&\n !(maxLength && maxLength > 0 && w.length > maxLength),\n )\n : _words;\n\n if (!matchingWords.length) {\n throw new Error(\n `Loremer's dictionary doesn't contain any words that satisfy the given constraints: ${JSON.stringify(\n {\n maxLength,\n minLength,\n trueSingleWord,\n matchRegex: String(matchRegex),\n },\n )}`,\n );\n }\n\n return randomArrayItem(matchingWords);\n }\n\n function resourceNameSegment() {\n return word({\n matchRegex: /^[-a-zA-Z_]{3,32}$/,\n trueSingleWord: true,\n });\n }\n\n function words(n: number) {\n return nTimes(n, word);\n }\n\n type SentenceOptions = {\n max?: number;\n min?: number;\n };\n const defaultOptions = { min: 8, max: 13 };\n function sentence(options: SentenceOptions = {}) {\n const o = { ...defaultOptions, ...options };\n const [first, ...rest] = words(randomInRange(o.min, o.max));\n return (\n [initialUppercase(first), ...rest].join(\" \") + randomEndingPunctuation()\n );\n }\n\n function sentences(n: number) {\n return nTimes(n, sentence);\n }\n\n function paragraph() {\n return sentences(randomInRange(2, 5)).join(\" \");\n }\n\n return { word, words, resourceNameSegment, sentence, sentences, paragraph };\n}\n\nfunction randomInRange(a: number, b: number) {\n const [lower, upper] = a < b ? [a, b] : [b, a];\n\n const range = upper - lower;\n return Math.floor(Math.random() * range) + lower;\n}\n\nfunction randomEndingPunctuation() {\n return randomArrayItem([\".\", \".\", \".\", \".\", \"!\", \"?\"]);\n}\n\nexport function parseWords(words: string): string[] {\n return words.split(/[\\s,]+/);\n}\n\nexport const loremer = Loremer({ words: defaultWords() });\n"],"names":["randomInRange","a","b","lower","upper","range","Math","floor","random","parseWords","words","split","loremer","opts","_words","length","Error","word","trueSingleWord","minLength","maxLength","matchRegex","matchingWords","filter","w","match","indexOf","JSON","stringify","String","randomArrayItem","n","nTimes","defaultOptions","min","max","sentence","options","o","Object","assign","first","rest","initialUppercase","join","sentences","resourceNameSegment","paragraph","Loremer","defaultWords"],"mappings":"kHAmGA,SAASA,EAAcC,EAAWC,GAChC,MAAOC,EAAOC,GAASH,EAAIC,EAAI,CAACD,EAAGC,GAAK,CAACA,EAAGD,GAEtCI,EAAQD,EAAQD,EACtB,OAAOG,KAAKC,MAAMD,KAAKE,SAAWH,GAASF,CAC7C,CAMM,SAAUM,EAAWC,GACzB,OAAOA,EAAMC,MAAM,SACrB,CAEO,MAAMC,EA1GC,SAAkBC,GAC9B,MAAMC,EACkB,iBAAfD,EAAKH,MAAqBD,EAAWI,EAAKH,OAASG,EAAKH,MAEjE,GAAsB,IAAlBI,EAAOC,OACT,MAAM,IAAIC,MACR,iHAYJ,SAASC,GAAKC,eACZA,EAAcC,UACdA,EAASC,UACTA,EAASC,WACTA,GACe,IACf,MAGMC,EAHcJ,GAAkBC,GAAaC,GAAaC,EAI5DP,EAAOS,QACLC,KAEIH,IAAeG,EAAEC,MAAMJ,IAEvBH,GAAkBM,EAAEE,QAAQ,MAAO,GAEnCP,GAAaA,EAAY,GAAKK,EAAET,OAASI,GACzCC,GAAaA,EAAY,GAAKI,EAAET,OAASK,KAE/CN,EAEJ,IAAKQ,EAAcP,OACjB,MAAM,IAAIC,MACR,sFAAsFW,KAAKC,UACzF,CACER,YACAD,YACAD,iBACAG,WAAYQ,OAAOR,QAM3B,OAAOS,EAAgBR,EACzB,CASA,SAASZ,EAAMqB,GACb,OAAOC,EAAAA,QAAOD,EAAGd,EACnB,CAMA,MAAMgB,EAAiB,CAAEC,IAAK,EAAGC,IAAK,IACtC,SAASC,EAASC,EAA2B,IAC3C,MAAMC,EAACC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAQP,GAAmBI,IAC3BI,KAAUC,GAAQhC,EAAMV,EAAcsC,EAAEJ,IAAKI,EAAEH,MACtD,MACE,CAACQ,EAAiBF,MAAWC,GAAME,KAAK,KAuBrCd,EAAgB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,KArBjD,CAEA,SAASe,EAAUd,GACjB,OAAOC,EAAAA,QAAOD,EAAGK,EACnB,CAMA,MAAO,CAAEnB,OAAMP,QAAOoC,oBAhCtB,WACE,OAAO7B,EAAK,CACVI,WAAY,qBACZH,gBAAgB,GAEpB,EA2B2CkB,WAAUS,YAAWE,UAJhE,WACE,OAAOF,EAAU7C,EAAc,EAAG,IAAI4C,KAAK,IAC7C,EAGF,CAiBuBI,CAAQ,CAAEtC,2BAAOuC"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=["is","a","the","we","but","and","this","that","in","to","of","have","not","with"],r=["accelerometer","ADSL","android","archive","ATX","backup","bandwidth","benchmark","barcode","booting","bios","bitmap","Bitcoin","BitTorrent","blacklist","bluetooth","binary","backlink","bloatware","burn","cache","compression","content","CMOS","cookie","cybercrime","cybersecurity","daemon","debug","dock","DOS","driver","device driver","DPI","DRM","encryption","emulator","ethernet","end user","fat32","framework","freeware","firewall","FTP","gif","Git","GPS","GUI","HTML","https","IEEE","ISO","IMEI","ISP","Java","JavaScript","jpeg","kernel","LAN","LCD","LED","Macintosh","mp3","malware","MMS","MIDI","newbie","OEM","OS","OCR","overclock","pdf","phishing","Python","plug-in","qwerty","remote access","registry","read-only","RAID","rooting","Safe Mode","SSID","SEO","service pack","server","source code","spam","search engine","Swype","trash","underclock","Unix","virus","VGA","web","wifi","Wikipedia","Windows","wireless LAN","World Wide Web","WYSIWYG","WPA","wumpus","zip"],t=["accelerator","incubator","accredited investor","advertorials","advertainment","bleeding edge","bootstrapping","B2B","B2C","burn rate","capital","churn rate","cliff","pitch deck","disrupt","disruptive","exit","freemium","gamify","growth hacking","growth hacker","hockey stick","IP","iterate","launch","lean","leverage","loss leader","market penetration","monetize","MVP","pivot","ramen","responsive design","ROI","runway","SAAS","scaleable","sweat equity","term sheet","traction","valuation","value prop","vaporware","VC","venture"],a=["Adobe","Airbnb","Amazon","Apple","Facebook","Google","Instagram","Microsoft","Netflix","Oracle","Salesforce","Snapchat","Telegram","Twitter","Uber","WeChat","WhatsApp"],i=["0-day","exploit","hacker","virus","vulnerability","warez"],o=["Dolt","DoltHub","database","version control","MySQL","Git","GitHub","rollback","collaborate","clone","branch","merge","commit","repository","pull request","schema","data","command line","diff","commit log","lineage","time travel","community","data bounty","open source","query","workflow","script"];module.exports=()=>[...e,...e,...e,...e,...e,...o,...r,...t,...a,...i];
2
+ //# sourceMappingURL=words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"words.js","sources":["../../../../src/loremer/words.ts"],"sourcesContent":["const commonWords = [\n \"is\",\n \"a\",\n \"the\",\n \"we\",\n \"but\",\n \"and\",\n \"this\",\n \"that\",\n \"in\",\n \"to\",\n \"of\",\n \"have\",\n \"not\",\n \"with\",\n];\nconst fromWikipedia = [\n \"accelerometer\",\n \"ADSL\",\n \"android\",\n \"archive\",\n \"ATX\",\n \"backup\",\n \"bandwidth\",\n \"benchmark\",\n \"barcode\",\n \"booting\",\n \"bios\",\n \"bitmap\",\n \"Bitcoin\",\n \"BitTorrent\",\n \"blacklist\",\n \"bluetooth\",\n \"binary\",\n \"backlink\",\n \"bloatware\",\n \"burn\",\n \"cache\",\n \"compression\",\n \"content\",\n \"CMOS\",\n \"cookie\",\n \"cybercrime\",\n \"cybersecurity\",\n \"daemon\",\n \"debug\",\n \"dock\",\n \"DOS\",\n \"driver\",\n \"device driver\",\n \"DPI\",\n \"DRM\",\n \"encryption\",\n \"emulator\",\n \"ethernet\",\n \"end user\",\n \"fat32\",\n \"framework\",\n \"freeware\",\n \"firewall\",\n \"FTP\",\n \"gif\",\n \"Git\",\n \"GPS\",\n \"GUI\",\n \"HTML\",\n \"https\",\n \"IEEE\",\n \"ISO\",\n \"IMEI\",\n \"ISP\",\n \"Java\",\n \"JavaScript\",\n \"jpeg\",\n \"kernel\",\n \"LAN\",\n \"LCD\",\n \"LED\",\n \"Macintosh\",\n \"mp3\",\n \"malware\",\n \"MMS\",\n \"MIDI\",\n \"newbie\",\n \"OEM\",\n \"OS\",\n \"OCR\",\n \"overclock\",\n \"pdf\",\n \"phishing\",\n \"Python\",\n \"plug-in\",\n \"qwerty\",\n \"remote access\",\n \"registry\",\n \"read-only\",\n \"RAID\",\n \"rooting\",\n \"Safe Mode\",\n \"SSID\",\n \"SEO\",\n \"service pack\",\n \"server\",\n \"source code\",\n \"spam\",\n \"search engine\",\n \"Swype\",\n \"trash\",\n \"underclock\",\n \"Unix\",\n \"virus\",\n \"VGA\",\n \"web\",\n \"wifi\",\n \"Wikipedia\",\n \"Windows\",\n \"wireless LAN\",\n \"World Wide Web\",\n \"WYSIWYG\",\n \"WPA\",\n \"wumpus\",\n \"zip\",\n];\nconst startupJargon = [\n \"accelerator\",\n \"incubator\",\n \"accredited investor\",\n \"advertorials\",\n \"advertainment\",\n \"bleeding edge\",\n \"bootstrapping\",\n \"B2B\",\n \"B2C\",\n \"burn rate\",\n \"capital\",\n \"churn rate\",\n \"cliff\",\n \"pitch deck\",\n \"disrupt\",\n \"disruptive\",\n \"exit\",\n \"freemium\",\n \"gamify\",\n \"growth hacking\",\n \"growth hacker\",\n \"hockey stick\",\n \"IP\",\n \"iterate\",\n \"launch\",\n \"lean\",\n \"leverage\",\n \"loss leader\",\n \"market penetration\",\n \"monetize\",\n \"MVP\",\n \"pivot\",\n \"ramen\",\n \"responsive design\",\n \"ROI\",\n \"runway\",\n \"SAAS\",\n \"scaleable\",\n \"sweat equity\",\n \"term sheet\",\n \"traction\",\n \"valuation\",\n \"value prop\",\n \"vaporware\",\n \"VC\",\n \"venture\",\n];\nconst appsAndCompanies = [\n \"Adobe\",\n \"Airbnb\",\n \"Amazon\",\n \"Apple\",\n \"Facebook\",\n \"Google\",\n \"Instagram\",\n \"Microsoft\",\n \"Netflix\",\n \"Oracle\",\n \"Salesforce\",\n \"Snapchat\",\n \"Telegram\",\n \"Twitter\",\n \"Uber\",\n \"WeChat\",\n \"WhatsApp\",\n];\nconst security = [\n \"0-day\",\n \"exploit\",\n \"hacker\",\n \"virus\",\n \"vulnerability\",\n \"warez\",\n];\nconst dolthubWords = [\n \"Dolt\",\n \"DoltHub\",\n \"database\",\n \"version control\",\n \"MySQL\",\n \"Git\",\n \"GitHub\",\n \"rollback\",\n \"collaborate\",\n \"clone\",\n \"branch\",\n \"merge\",\n \"commit\",\n \"repository\",\n \"pull request\",\n \"schema\",\n \"data\",\n \"command line\",\n \"diff\",\n \"commit log\",\n \"lineage\",\n \"time travel\",\n \"community\",\n \"data bounty\",\n \"open source\",\n \"query\",\n \"workflow\",\n \"script\",\n];\nexport default () => [\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...commonWords,\n ...dolthubWords,\n ...fromWikipedia,\n ...startupJargon,\n ...appsAndCompanies,\n ...security,\n];\n"],"names":["commonWords","fromWikipedia","startupJargon","appsAndCompanies","security","dolthubWords"],"mappings":"aAAA,MAAMA,EAAc,CAClB,KACA,IACA,MACA,KACA,MACA,MACA,OACA,OACA,KACA,KACA,KACA,OACA,MACA,QAEIC,EAAgB,CACpB,gBACA,OACA,UACA,UACA,MACA,SACA,YACA,YACA,UACA,UACA,OACA,SACA,UACA,aACA,YACA,YACA,SACA,WACA,YACA,OACA,QACA,cACA,UACA,OACA,SACA,aACA,gBACA,SACA,QACA,OACA,MACA,SACA,gBACA,MACA,MACA,aACA,WACA,WACA,WACA,QACA,YACA,WACA,WACA,MACA,MACA,MACA,MACA,MACA,OACA,QACA,OACA,MACA,OACA,MACA,OACA,aACA,OACA,SACA,MACA,MACA,MACA,YACA,MACA,UACA,MACA,OACA,SACA,MACA,KACA,MACA,YACA,MACA,WACA,SACA,UACA,SACA,gBACA,WACA,YACA,OACA,UACA,YACA,OACA,MACA,eACA,SACA,cACA,OACA,gBACA,QACA,QACA,aACA,OACA,QACA,MACA,MACA,OACA,YACA,UACA,eACA,iBACA,UACA,MACA,SACA,OAEIC,EAAgB,CACpB,cACA,YACA,sBACA,eACA,gBACA,gBACA,gBACA,MACA,MACA,YACA,UACA,aACA,QACA,aACA,UACA,aACA,OACA,WACA,SACA,iBACA,gBACA,eACA,KACA,UACA,SACA,OACA,WACA,cACA,qBACA,WACA,MACA,QACA,QACA,oBACA,MACA,SACA,OACA,YACA,eACA,aACA,WACA,YACA,aACA,YACA,KACA,WAEIC,EAAmB,CACvB,QACA,SACA,SACA,QACA,WACA,SACA,YACA,YACA,UACA,SACA,aACA,WACA,WACA,UACA,OACA,SACA,YAEIC,EAAW,CACf,QACA,UACA,SACA,QACA,gBACA,SAEIC,EAAe,CACnB,OACA,UACA,WACA,kBACA,QACA,MACA,SACA,WACA,cACA,QACA,SACA,QACA,SACA,aACA,eACA,SACA,OACA,eACA,OACA,aACA,UACA,cACA,YACA,cACA,cACA,QACA,WACA,yBAEa,IAAM,IAChBL,KACAA,KACAA,KACAA,KACAA,KACAK,KACAJ,KACAC,KACAC,KACAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function(e,t,r=[]){const n=[];for(let o=0;o<e;o++)n.push(t(...r));return n},exports.nTimesWithIndex=function(e,t){const r=[];for(let n=0;n<e;n++)r.push(t(n));return r};
2
+ //# sourceMappingURL=nTimes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nTimes.js","sources":["../../../src/nTimes.ts"],"sourcesContent":["export default function nTimes<T>(\n n: number,\n operation: (...args: any[]) => T,\n args: Parameters<typeof operation> = [],\n): T[] {\n const collection = [];\n for (let i = 0; i < n; i++) {\n collection.push(operation(...args));\n }\n return collection;\n}\n\nexport function nTimesWithIndex<T>(n: number, operation: (n: number) => T) {\n const collection = [];\n for (let i = 0; i < n; i++) {\n collection.push(operation(i));\n }\n return collection;\n}\n"],"names":["n","operation","args","collection","i","push"],"mappings":"oFAAc,SACZA,EACAC,EACAC,EAAqC,IAErC,MAAMC,EAAa,GACnB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAGI,IACrBD,EAAWE,KAAKJ,KAAaC,IAE/B,OAAOC,CACT,0BAEM,SAA6BH,EAAWC,GAC5C,MAAME,EAAa,GACnB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAGI,IACrBD,EAAWE,KAAKJ,EAAUG,IAE5B,OAAOD,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";const t="NULL";function e(e){return e===t}exports.NULL_VALUE=t,exports.getDisplayValue=function(t){return e(t)?"NULL":t},exports.getDisplayValueForApi=function(t){return e(t)?null:t},exports.isNullValue=e;
2
+ //# sourceMappingURL=null.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null.js","sources":["../../../src/null.ts"],"sourcesContent":["// Using an unprintable string for null values so we can distinguish between\n// string \"null\" and null\nexport const NULL_VALUE = \"\\uf5f2\\ueb94NULL\\uf5a8\\ue6ff\";\n\nexport function isNullValue(dv: string): boolean {\n return dv === NULL_VALUE;\n}\n\nexport function getDisplayValue(dv: string): string {\n return isNullValue(dv) ? \"NULL\" : dv;\n}\n\nexport function getDisplayValueForApi(dv: string): string | null {\n return isNullValue(dv) ? null : dv;\n}\n"],"names":["NULL_VALUE","isNullValue","dv"],"mappings":"aAEO,MAAMA,EAAa,WAEpB,SAAUC,EAAYC,GAC1B,OAAOA,IAAOF,CAChB,8CAEM,SAA0BE,GAC9B,OAAOD,EAAYC,GAAM,OAASA,CACpC,gCAEM,SAAgCA,GACpC,OAAOD,EAAYC,GAAM,KAAOA,CAClC"}
@@ -0,0 +1,2 @@
1
+ "use strict";exports.formatNumber=function(r){return new Intl.NumberFormat("en-US").format(r)},exports.formatToRoundedUsd=function(r){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0}).format(r)},exports.formatToUsd=function(r){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(r)};
2
+ //# sourceMappingURL=numberFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numberFormat.js","sources":["../../../src/numberFormat.ts"],"sourcesContent":["export function formatNumber(num: number): string {\n return new Intl.NumberFormat(\"en-US\").format(num);\n}\n\nexport function formatToUsd(num: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(num);\n}\n\nexport function formatToRoundedUsd(num: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(num);\n}\n"],"names":["num","Intl","NumberFormat","format","style","currency","minimumFractionDigits","maximumFractionDigits"],"mappings":"kCAAM,SAAuBA,GAC3B,OAAO,IAAIC,KAAKC,aAAa,SAASC,OAAOH,EAC/C,6BASM,SAA6BA,GACjC,OAAO,IAAIC,KAAKC,aAAa,QAAS,CACpCE,MAAO,WACPC,SAAU,MACVC,sBAAuB,EACvBC,sBAAuB,IACtBJ,OAAOH,EACZ,sBAdM,SAAsBA,GAC1B,OAAO,IAAIC,KAAKC,aAAa,QAAS,CACpCE,MAAO,WACPC,SAAU,QACTF,OAAOH,EACZ"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("node-sql-parser"),r=require("./null.js");const t=new e.Parser,n={database:"MYSQL"};function o(e,r){return`query: ${e}\nerror: ${r}`}function s(e){let r={};try{r=t.astify(e,n)}catch(r){console.error(o(e,r))}const s=Array.isArray(r)?r[0]:r;return"select"===s.type?s:null}function u(e){try{return t.tableList(e,n).map((e=>e.split("::")[2]))}catch(r){return void console.error(o(e,r))}}function l(e){return[...e.matchAll(/\b(?:from|join)\s+`?(\w+)`?(?:\s*(?:join|,)\s+`?(\w+)`?)*\b/gi)].flatMap((e=>e.slice(1).filter(Boolean)))}function i(e){return{expr:{type:"column_ref",table:null,column:e},as:null}}function c(e){return t.sqlify(e,n)}function a(e,r,t){const n=s(e),o=function(e,r){return"*"===e?[i("*")]:e.map((e=>({expr:{type:"column_ref",table:r&&e.sourceTable?e.sourceTable:null,column:e.name},as:null})))}(r,!!(t&&t.length>1));if(!n)return"";if(!t||0===t.length)return c(Object.assign(Object.assign({},n),{columns:o,where:f(n.where)}));return c(Object.assign(Object.assign({},n),{columns:o,from:t.map((e=>({db:null,table:e,as:null}))),where:f(n.where)}))}function f(e){return e?(e.args&&f(e.args),e.expr&&f(e.expr),e.left&&f(e.left),e.value&&("string"==typeof e.value&&(e.value=y(e.value)),Array.isArray(e.value)&&e.value.forEach((e=>f(e)))),e.right&&f(e.right),e):null}function p(e){let r={};try{r=t.astify(e,n)}catch(r){return void console.error(o(e,r))}const s=Array.isArray(r)?r[0]:r;if(s)return s.type}function y(e){return e.includes("\\'")?e:e.replace(/'/g,"\\'")}exports.convertToSql=c,exports.convertToSqlWithNewColNames=function(e,r,t){const n=s(e),o=function(e){return"*"===e?[i("*")]:e.map((e=>i(e)))}(r);return n?c(Object.assign(Object.assign({},n),{columns:o,from:[{db:null,table:t,as:null}],where:f(n.where)})):""},exports.convertToSqlWithNewCols=a,exports.convertToSqlWithNewCondition=function(e,t,n){const o=s(e);if(!o)return e;const u=function(e,t,n){const o=r.isNullValue(t),s=y(t),u={type:"binary_expr",operator:o?"IS":"=",left:{type:"column_ref",table:null,column:e},right:{type:o?"null":"string",value:o?null:s}};if(!n.where)return u;const l={type:"binary_expr",operator:"AND",left:Object.assign({},f(n.where)),right:u};return l}(t,n,o);return c(Object.assign(Object.assign({},o),{where:u}))},exports.convertToSqlWithOrderBy=function(e,r,t){const n=s(e);if(!n)return e;const o=function(e,r,t){var n;if(!t)return e.orderby?e.orderby.filter((e=>e.expr.column!==r)):null;const o=null===(n=e.orderby)||void 0===n?void 0:n.find((e=>e.expr.column===r));if(o)return o.type=t,e.orderby;const s={expr:{type:"column_ref",column:r},type:t};return e.orderby?[...e.orderby,s]:[s]}(n,r,t);return c(Object.assign(Object.assign({},n),{orderby:o}))},exports.fallbackGetTableNamesForSelect=l,exports.getColumns=function(e){const r=s(e);return null==r?void 0:r.columns},exports.getQueryType=p,exports.getTableName=function(e){if(!e)return;const r=u(e);return r&&0!==r.length?r[0]:void 0},exports.getTableNames=u,exports.isMultipleQueries=function(e){try{const{ast:r}=t.parse(e);return Array.isArray(r)&&r.length>1}catch(e){return!1}},exports.isMutation=function(e){if(!e)return!1;const r=p(e);if(!r){const r=e.toLowerCase();if(r.startsWith("insert")||r.startsWith("alter")||r.startsWith("create")||r.startsWith("drop")||r.startsWith("update")||r.startsWith("revoke")||r.startsWith("grant")||r.startsWith("flush")||r.startsWith("with")&&(r.includes("update")&&r.includes("set")||r.includes("delete from")))return!0}return!!r&&"select"!==r&&"desc"!==r&&"show"!==r},exports.isReadQuery=function(e){if(!e)return!1;const r=p(e);if(!r){const r=e.toLowerCase();if(r.startsWith("select")||r.startsWith("desc")||r.startsWith("show"))return!0}return!!r&&("select"===r||"desc"===r||"show"===r)},exports.makeQueryExecutable=function(e){return e.replace(/'/g,"\\'").replace(/\r\n|\n|\r/gm," ").trim()},exports.parseSelectQuery=s,exports.queryHasOrderBy=function(e,r,t){const n=s(e);return!!n&&(n.orderby?t?n.orderby.some((e=>e.expr.column===r&&e.type===t)):!n.orderby.some((e=>e.expr.column===r)):!t)},exports.removeColumnFromQuery=function(e,r,t){return a(e,t.filter((e=>e.name!==r)),u(e))},exports.requireTableNameForSelect=function(e){var r;return null!==(r=u(e))&&void 0!==r?r:l(e)};
2
+ //# sourceMappingURL=parseSqlQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseSqlQuery.js","sources":["../../../src/parseSqlQuery.ts"],"sourcesContent":["import {\n AST,\n Binary,\n ColumnRef,\n OrderBy,\n Parser,\n Select,\n} from \"node-sql-parser\";\nimport Maybe from \"./Maybe\";\nimport { isNullValue } from \"./null\";\n\nexport type TableColumn = {\n name: string;\n sourceTable?: Maybe<string>;\n};\n\nconst parser = new Parser();\nconst opt = {\n database: \"MYSQL\",\n};\n\nfunction getQueryError(q: string, err: unknown): string {\n return `query: ${q}\\nerror: ${err}`;\n}\n\nexport function parseSelectQuery(q: string): Select | null {\n let ast = {};\n try {\n ast = parser.astify(q, opt);\n } catch (err) {\n console.error(getQueryError(q, err));\n }\n const obj: AST = Array.isArray(ast) ? ast[0] : ast;\n return obj.type === \"select\" ? obj : null;\n}\n\n// Gets table names as array `{type}::{dbName}::{tableName}` and converts to array of tableNames\nexport function getTableNames(q: string): string[] | undefined {\n try {\n return parser.tableList(q, opt).map(tn => tn.split(\"::\")[2]);\n } catch (err) {\n console.error(getQueryError(q, err));\n return undefined;\n }\n}\n\nexport function requireTableNameForSelect(q: string): string[] {\n return getTableNames(q) ?? fallbackGetTableNamesForSelect(q);\n}\n\n// Extracts tableName from query\nexport function getTableName(q?: string): Maybe<string> {\n if (!q) return undefined;\n const tns = getTableNames(q);\n if (!tns || tns.length === 0) return undefined;\n return tns[0];\n}\n\n// Uses regex to match table names in query \"SELECT [columns] FROM [tableName] ...\"\n// does not work on more than 2 tables. but better than just extract 1 table\nexport function fallbackGetTableNamesForSelect(query: string): string[] {\n const tableNameRegex =\n /\\b(?:from|join)\\s+`?(\\w+)`?(?:\\s*(?:join|,)\\s+`?(\\w+)`?)*\\b/gi;\n const matches = [...query.matchAll(tableNameRegex)];\n const tableNames = matches.flatMap(match => match.slice(1).filter(Boolean));\n return tableNames;\n}\n\ntype Column = {\n expr: ColumnRef;\n as: string | null;\n};\n\ntype Columns = any[] | \"*\" | Column[];\n\n// Extracts columns from query string\nexport function getColumns(q: string): Columns | undefined {\n const ast = parseSelectQuery(q);\n return ast?.columns;\n}\n\nfunction getSqlColumn(name: string): Column {\n return {\n expr: {\n type: \"column_ref\",\n table: null,\n column: name,\n },\n as: null,\n };\n}\n\nfunction mapColsToColumnNames(cols: string[] | \"*\"): Column[] {\n if (cols === \"*\") {\n return [getSqlColumn(\"*\")];\n }\n return cols.map(c => getSqlColumn(c));\n}\n\nfunction mapColsToColumnRef(\n cols: TableColumn[] | \"*\",\n isJoinClause: boolean,\n): Column[] {\n if (cols === \"*\") {\n return [getSqlColumn(\"*\")];\n }\n return cols.map(c => {\n return {\n expr: {\n type: \"column_ref\",\n table: isJoinClause && c.sourceTable ? c.sourceTable : null,\n column: c.name,\n },\n as: null,\n };\n });\n}\n\nexport function convertToSql(select: Select): string {\n return parser.sqlify(select, opt);\n}\n\n// Converts query string to sql with new table name and columns\nexport function convertToSqlWithNewColNames(\n q: string,\n cols: string[] | \"*\",\n tableName: string,\n): string {\n const ast = parseSelectQuery(q);\n const columns = mapColsToColumnNames(cols);\n if (!ast) return \"\";\n const newAst: Select = {\n ...ast,\n columns,\n from: [{ db: null, table: tableName, as: null }],\n where: escapeSingleQuotesInWhereObj(ast.where),\n };\n return convertToSql(newAst);\n}\n\n// Converts query string to sql with new table name and columns\nexport function convertToSqlWithNewCols(\n q: string,\n cols: TableColumn[] | \"*\",\n tableNames?: string[],\n): string {\n const ast = parseSelectQuery(q);\n const isJoinClause = tableNames && tableNames.length > 1;\n const columns = mapColsToColumnRef(cols, !!isJoinClause);\n\n if (!ast) return \"\";\n if (!tableNames || tableNames.length === 0) {\n return convertToSql({\n ...ast,\n columns,\n where: escapeSingleQuotesInWhereObj(ast.where),\n });\n }\n const newAst: Select = {\n ...ast,\n columns,\n from: tableNames.map(table => {\n return { db: null, table, as: null };\n }),\n where: escapeSingleQuotesInWhereObj(ast.where),\n };\n return convertToSql(newAst);\n}\n\n// Adds condition to query string\nexport function convertToSqlWithNewCondition(\n query: string,\n column: string,\n value: string,\n): string {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return query;\n }\n const where = getWhereObj(column, value, parsed);\n return convertToSql({\n ...parsed,\n where,\n });\n}\n\n// Adds order by clause to query string\nexport function convertToSqlWithOrderBy(\n query: string,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): string {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return query;\n }\n const orderby = getOrderByArr(parsed, column, type);\n return convertToSql({ ...parsed, orderby });\n}\n\n// Check if query has order by clause for column and type\nexport function queryHasOrderBy(\n query: string,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): boolean {\n const parsed = parseSelectQuery(query);\n if (!parsed) {\n return false;\n }\n // If no order by, return true for default and false otherwise\n if (!parsed.orderby) {\n return !type;\n }\n // If default, check if order by for column exists\n if (!type) {\n return !parsed.orderby.some(o => o.expr.column === column);\n }\n // Check if column and type match\n return parsed.orderby.some(o => o.expr.column === column && o.type === type);\n}\n\n// Creates where object from conditions or adds conditions to existing where object\nfunction getWhereObj(column: string, value: string, parsed: Select) {\n const valIsNull = isNullValue(value);\n const escapedVal = escapeSingleQuotes(value);\n const newCondition: Binary = {\n type: \"binary_expr\",\n operator: valIsNull ? \"IS\" : \"=\",\n left: {\n type: \"column_ref\",\n table: null,\n column,\n },\n right: {\n type: valIsNull ? \"null\" : \"string\",\n value: valIsNull ? null : escapedVal,\n },\n };\n\n if (!parsed.where) {\n return newCondition;\n }\n const condition: Binary = {\n type: \"binary_expr\",\n operator: \"AND\",\n left: { ...escapeSingleQuotesInWhereObj(parsed.where) },\n right: newCondition,\n };\n return condition;\n}\n\n// The where object is a binary tree with 'left' and 'right' nodes\nfunction escapeSingleQuotesInWhereObj(where: any): any {\n if (!where) return null;\n\n if (where.args) {\n escapeSingleQuotesInWhereObj(where.args);\n }\n\n if (where.expr) {\n escapeSingleQuotesInWhereObj(where.expr);\n }\n\n if (where.left) {\n escapeSingleQuotesInWhereObj(where.left);\n }\n\n if (where.value) {\n if (typeof where.value === \"string\") {\n // eslint-disable-next-line no-param-reassign\n where.value = escapeSingleQuotes(where.value);\n }\n if (Array.isArray(where.value)) {\n where.value.forEach((val: any) => escapeSingleQuotesInWhereObj(val));\n }\n }\n\n if (where.right) {\n escapeSingleQuotesInWhereObj(where.right);\n }\n\n return where;\n}\n\nfunction getOrderByArr(\n parsed: Select,\n column: string,\n type?: \"ASC\" | \"DESC\",\n): OrderBy[] | null {\n // If default, remove order by clause for column\n if (!type) {\n return parsed.orderby\n ? parsed.orderby.filter(o => o.expr.column !== column)\n : null;\n }\n // If order by clause for column exists, update type\n const colInOrderBy = parsed.orderby?.find(o => o.expr.column === column);\n if (colInOrderBy) {\n colInOrderBy.type = type;\n return parsed.orderby;\n }\n // Otherwise, add new order by clause\n const newOrderby = {\n expr: { type: \"column_ref\", column },\n type,\n };\n return parsed.orderby ? [...parsed.orderby, newOrderby] : [newOrderby];\n}\n\n// Gets the type of query\nexport function getQueryType(q: string): string | undefined {\n let ast = {};\n try {\n ast = parser.astify(q, opt);\n } catch (err) {\n console.error(getQueryError(q, err));\n return undefined;\n }\n const obj: AST | undefined = Array.isArray(ast) ? ast[0] : ast;\n if (!obj) return undefined;\n return obj.type;\n}\n\nexport function isMutation(q?: string): boolean {\n if (!q) return false;\n const type = getQueryType(q);\n if (!type) {\n const lower = q.toLowerCase();\n if (\n lower.startsWith(\"insert\") ||\n lower.startsWith(\"alter\") ||\n lower.startsWith(\"create\") ||\n lower.startsWith(\"drop\") ||\n lower.startsWith(\"update\") ||\n lower.startsWith(\"revoke\") ||\n lower.startsWith(\"grant\") ||\n lower.startsWith(\"flush\") ||\n // lower.startsWith(\"replace into\") ||\n (lower.startsWith(\"with\") &&\n ((lower.includes(\"update\") && lower.includes(\"set\")) ||\n lower.includes(\"delete from\")))\n ) {\n return true;\n }\n }\n return !!type && type !== \"select\" && type !== \"desc\" && type !== \"show\";\n}\n\nexport function isReadQuery(q?: string): boolean {\n if (!q) return false;\n const type = getQueryType(q);\n if (!type) {\n const lower = q.toLowerCase();\n if (\n lower.startsWith(\"select\") ||\n lower.startsWith(\"desc\") ||\n lower.startsWith(\"show\")\n ) {\n return true;\n }\n }\n return !!type && (type === \"select\" || type === \"desc\" || type === \"show\");\n}\n\n// Removes a column from a select query\nexport function removeColumnFromQuery(\n q: string,\n colNameToRemove: string,\n cols: TableColumn[],\n): string {\n const newCols = cols.filter(c => c.name !== colNameToRemove);\n const tableName = getTableNames(q);\n return convertToSqlWithNewCols(q, newCols, tableName);\n}\n\nfunction escapeSingleQuotes(value: string): string {\n if (value.includes(\"\\\\'\")) return value;\n return value.replace(/'/g, \"\\\\'\");\n}\n\n// Query should be wrapped in single quotes\nexport function makeQueryExecutable(q: string): string {\n return (\n q\n // Escape single quotes\n .replace(/'/g, \"\\\\'\")\n // Remove newlines and carriage returns\n .replace(/\\r\\n|\\n|\\r/gm, \" \")\n // Remove whitespace from beginning/end\n .trim()\n );\n}\n\nexport function isMultipleQueries(queryString: string): boolean {\n try {\n const { ast } = parser.parse(queryString);\n return Array.isArray(ast) && ast.length > 1;\n } catch (_err) {\n return false;\n }\n}\n"],"names":["parser","Parser","opt","database","getQueryError","q","err","parseSelectQuery","ast","astify","console","error","obj","Array","isArray","type","getTableNames","tableList","map","tn","split","fallbackGetTableNamesForSelect","query","matchAll","flatMap","match","slice","filter","Boolean","getSqlColumn","name","expr","table","column","as","convertToSql","select","sqlify","convertToSqlWithNewCols","cols","tableNames","columns","isJoinClause","c","sourceTable","mapColsToColumnRef","length","Object","assign","where","escapeSingleQuotesInWhereObj","from","db","args","left","value","escapeSingleQuotes","forEach","val","right","getQueryType","includes","replace","tableName","mapColsToColumnNames","parsed","valIsNull","isNullValue","escapedVal","newCondition","operator","condition","getWhereObj","orderby","o","colInOrderBy","_a","find","newOrderby","getOrderByArr","tns","queryString","parse","_err","lower","toLowerCase","startsWith","trim","some","colNameToRemove"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(e,t){return 1===e?t:function(e){switch(e){case"person":return"people";case"repository":return"repositories";case"repository updated today":return"repositories updated today";case"database":return"databases";case"database updated today":return"databases updated today";case"branch":return"branches";default:return`${e}s`}}(t)};
2
+ //# sourceMappingURL=pluralize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluralize.js","sources":["../../../src/pluralize.ts"],"sourcesContent":["export default function pluralize(num: number, str: string): string {\n if (num === 1) {\n return str;\n }\n return getPlural(str);\n}\n\nfunction getPlural(s: string): string {\n switch (s) {\n case \"person\":\n return \"people\";\n case \"repository\":\n return \"repositories\";\n case \"repository updated today\":\n return \"repositories updated today\";\n case \"database\":\n return \"databases\";\n case \"database updated today\":\n return \"databases updated today\";\n case \"branch\":\n return \"branches\";\n default:\n return `${s}s`;\n }\n}\n"],"names":["num","str","s","getPlural"],"mappings":"4BAAc,SAAoBA,EAAaC,GAC7C,OAAY,IAARD,EACKC,EAKX,SAAmBC,GACjB,OAAQA,GACN,IAAK,SACH,MAAO,SACT,IAAK,aACH,MAAO,eACT,IAAK,2BACH,MAAO,6BACT,IAAK,WACH,MAAO,YACT,IAAK,yBACH,MAAO,0BACT,IAAK,SACH,MAAO,WACT,QACE,MAAO,GAAGA,KAEhB,CApBSC,CAAUF,EACnB"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function(r){try{return JSON.stringify(r,null,2)}catch(e){return console.error(e),`${r}`}},exports.prettyJSONText=function(r){try{return JSON.stringify(JSON.parse(r),null,2)}catch(e){return console.error(e),r}};
2
+ //# sourceMappingURL=prettyJSON.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prettyJSON.js","sources":["../../../src/prettyJSON.ts"],"sourcesContent":["export default function prettyJSON(data: any): string {\n try {\n return JSON.stringify(data, null, 2);\n } catch (err) {\n console.error(err);\n return `${data}`;\n }\n}\n\nexport function prettyJSONText(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text), null, 2);\n } catch (err) {\n console.error(err);\n return text;\n }\n}\n"],"names":["data","JSON","stringify","err","console","error","text","parse"],"mappings":"oFAAc,SAAqBA,GACjC,IACE,OAAOC,KAAKC,UAAUF,EAAM,KAAM,EACpC,CAAE,MAAOG,GAEP,OADAC,QAAQC,MAAMF,GACP,GAAGH,GACZ,CACF,yBAEM,SAAyBM,GAC7B,IACE,OAAOL,KAAKC,UAAUD,KAAKM,MAAMD,GAAO,KAAM,EAChD,CAAE,MAAOH,GAEP,OADAC,QAAQC,MAAMF,GACPG,CACT,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(t){if(0===t.length)throw new Error("Can't take random element of empty array");return t[Math.floor(Math.random()*t.length)]};
2
+ //# sourceMappingURL=randomArrayItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randomArrayItem.js","sources":["../../../src/randomArrayItem.ts"],"sourcesContent":["export default function randomArrayItem<T>(arr: T[]): T {\n if (arr.length === 0) {\n throw new Error(\"Can't take random element of empty array\");\n }\n return arr[Math.floor(Math.random() * arr.length)];\n}\n"],"names":["arr","length","Error","Math","floor","random"],"mappings":"4BAAc,SAA6BA,GACzC,GAAmB,IAAfA,EAAIC,OACN,MAAM,IAAIC,MAAM,4CAElB,OAAOF,EAAIG,KAAKC,MAAMD,KAAKE,SAAWL,EAAIC,QAC5C"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(t,o){return Math.floor(Math.random()*(o-t)+t)};
2
+ //# sourceMappingURL=randomNum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randomNum.js","sources":["../../../src/randomNum.ts"],"sourcesContent":["export default function randomNum(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min) + min);\n}\n"],"names":["min","max","Math","floor","random"],"mappings":"4BAAc,SAAoBA,EAAaC,GAC7C,OAAOC,KAAKC,MAAMD,KAAKE,UAAYH,EAAMD,GAAOA,EAClD"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(r){try{return JSON.parse(r)}catch(t){return r}};
2
+ //# sourceMappingURL=safeJSONParse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeJSONParse.js","sources":["../../../src/safeJSONParse.ts"],"sourcesContent":["// safeJSONParse attempts to parse a JSON string, and if it fails returns the\n// original string instead of throwing an error\nexport default function safeJSONParse(text: string): any {\n try {\n return JSON.parse(text);\n } catch (_) {\n return text;\n }\n}\n"],"names":["text","JSON","parse","_"],"mappings":"4BAEc,SAAwBA,GACpC,IACE,OAAOC,KAAKC,MAAMF,EACpB,CAAE,MAAOG,GACP,OAAOH,CACT,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const t=(s,...e)=>e.length?t(s=s.replace("$",e.shift()),...e):s;exports.sprintf=t;
2
+ //# sourceMappingURL=sprintf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprintf.js","sources":["../../../src/sprintf.ts"],"sourcesContent":["const replaceToken = \"$\";\n\n// sprintf takes a string and replaces all instances of `replaceToken` with the provided arguments\nexport const sprintf = (str: string, ...argv: any[]): string => {\n if (!argv.length) return str;\n // eslint-disable-next-line no-return-assign, no-param-reassign\n return sprintf((str = str.replace(replaceToken, argv.shift())), ...argv);\n};\n"],"names":["sprintf","str","argv","length","replace","shift"],"mappings":"aAAA,MAGaA,EAAU,CAACC,KAAgBC,IACjCA,EAAKC,OAEHH,EAASC,EAAMA,EAAIG,QANP,IAM6BF,EAAKG,YAAcH,GAF1CD"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(t){return t%10==1&&t%100!=11?`${t}st`:t%10==2&&t%100!=12?`${t}nd`:t%10==3&&t%100!=13?`${t}rd`:`${t}th`};
2
+ //# sourceMappingURL=toOrdinal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toOrdinal.js","sources":["../../../src/toOrdinal.ts"],"sourcesContent":["export default function toOrdinal(n: number): string {\n if (n % 10 === 1 && n % 100 !== 11) return `${n}st`;\n\n if (n % 10 === 2 && n % 100 !== 12) return `${n}nd`;\n\n if (n % 10 === 3 && n % 100 !== 13) return `${n}rd`;\n\n return `${n}th`;\n}\n"],"names":["n"],"mappings":"4BAAc,SAAoBA,GAChC,OAAIA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAW,GAAGA,MAE1CA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAW,GAAGA,MAE1CA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAW,GAAGA,MAEvC,GAAGA,KACZ"}
@@ -0,0 +1,2 @@
1
+ "use strict";module.exports=function(...t){return t};
2
+ //# sourceMappingURL=tuplify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuplify.js","sources":["../../../src/tuplify.ts"],"sourcesContent":["export default function tuplify<T extends any[]>(...elements: T) {\n return elements;\n}\n"],"names":["elements"],"mappings":"4BAAc,YAAsCA,GAClD,OAAOA,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";class t{constructor(t,e){this.href=t,this.as=null!=e?e:t}hrefPathname(t){const h=e(this.href);return t?`${h}/${t}`:h}asPathname(t){const h=e(this.as);return t?`${h}/${t}`:h}getQuery(){if("string"!=typeof this.href)return this.href.query}getHash(){var t;return"string"==typeof this.href?"":null!==(t=this.href.hash)&&void 0!==t?t:""}addStatic(e){return new t(this.hrefPathname(e),this.asPathname(e))}maybeAddStatic(e){return new t(this.hrefPathname(e),this.asPathname(e))}addDynamic(e,h,a=!1){const n=a?encodeURIComponent(h):h;return new t(this.hrefPathname(`[${e}]`),this.asPathname(n))}withQuery(e){const a=h(e);return new t({pathname:this.hrefPathname(),query:a,hash:this.getHash()},{pathname:this.asPathname(),query:a,hash:this.getHash()})}withHash(e){return new t({pathname:this.hrefPathname(),query:this.getQuery(),hash:e},{pathname:this.asPathname(),query:this.getQuery(),hash:e})}}function e(t){var e;return t?"string"==typeof t?t:null!==(e=t.pathname)&&void 0!==e?e:"":""}function h(t){return Object.keys(t).reduce(((e,h)=>{const a=t[h];return null!=a&&a.length>0?Object.assign(Object.assign({},e),{[h]:a}):e}),{})}exports.Route=t,exports.queryHandler=h;
2
+ //# sourceMappingURL=urlUtils.js.map