diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f06235c..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 7306dd9..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "env": { - "es6": true, - "node": true, - "jest": true, - "browser": true - }, - "globals": { - "globalThis": true, - "URLPattern": true - }, - "plugins": [], - "overrides": [], - "extends": ["eslint:recommended"], - "rules": { - "arrow-spacing": ["error", { "before": true, "after": true }], - "block-spacing": ["error", "always"], - "brace-style": ["error", "1tbs", { "allowSingleLine": true }], - "camelcase": ["error", { - "allow": ["^UNSAFE_"], - "properties": "never", - "ignoreGlobals": true - }], - "comma-dangle": ["error", { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "never", - "exports": "never", - "functions": "never" - }], - "comma-spacing": ["error", { "before": false, "after": true }], - "eol-last": "error", - "eqeqeq": ["error", "always", { "null": "ignore" }], - "func-call-spacing": ["error", "never"], - "indent": [ - "error", - 2, - { - "MemberExpression": 1, - "FunctionDeclaration": { - "body": 1, - "parameters": 2 - }, - "SwitchCase": 1 - } - ], - "key-spacing": ["error", { "beforeColon": false, "afterColon": true }], - "keyword-spacing": ["error", { "before": true, "after": true }], - "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], - "max-len": [ - "error", - { - "code": 120, - "ignoreTrailingComments": true, - "ignoreComments": true, - "ignoreUrls": true - } - ], - "max-lines": [ - "error", - { - "max": 360, - "skipBlankLines": true, - "skipComments": false - } - ], - "max-lines-per-function": [ - "error", - { - "max": 250, - "skipBlankLines": true - } - ], - "max-params": ["error", 4], - "no-array-constructor": "error", - "no-mixed-spaces-and-tabs": "error", - "no-multi-spaces": "error", - "no-multi-str": "error", - "no-multiple-empty-lines": [ - "error", - { - "max": 1, - "maxEOF": 0 - } - ], - "no-restricted-syntax": [ - "error", - "WithStatement", - "BinaryExpression[operator='in']" - ], - "no-trailing-spaces": "error", - "no-use-before-define": [ - "error", - { - "functions": true, - "classes": true, - "variables": false - } - ], - "no-var": "warn", - "object-curly-spacing": ["error", "always"], - "padded-blocks": [ - "error", - { - "blocks": "never", - "switches": "never", - "classes": "never" - } - ], - "quotes": ["error", "single"], - "space-before-blocks": ["error", "always"], - "space-before-function-paren": ["error", "always"], - "space-infix-ops": "error", - "space-unary-ops": ["error", { "words": true, "nonwords": false }], - "space-in-parens": ["error", "never"], - "semi": ["error", "never"] - } -} diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 508cf6f..bcb5b07 100755 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node_version: [18.x, 20.x, 21.x] + node_version: [18.x, 20.x, 22.x] steps: - uses: actions/checkout@v4 @@ -57,4 +57,4 @@ jobs: uses: coverallsapp/github-action@v2 with: parallel-finished: true - carryforward: "run-18.x,run-20.x,run-21.x" + carryforward: "run-18.x,run-20.x,run-22.x" diff --git a/README.md b/README.md index 224d3cc..c0ba8c8 100755 --- a/README.md +++ b/README.md @@ -4,10 +4,9 @@ BellaJS Lightweight util for handling data type, string... in your Node.js and browser apps. [![NPM](https://badge.fury.io/js/bellajs.svg)](https://badge.fury.io/js/bellajs) +![CodeQL](https://github.com/ndaidong/bellajs/workflows/CodeQL/badge.svg) ![CI test](https://github.com/ndaidong/bellajs/workflows/ci-test/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/ndaidong/bellajs/badge.svg)](https://coveralls.io/github/ndaidong/bellajs) -![CodeQL](https://github.com/ndaidong/bellajs/workflows/CodeQL/badge.svg) -[![CodeFactor](https://www.codefactor.io/repository/github/ndaidong/bellajs/badge)](https://www.codefactor.io/repository/github/ndaidong/bellajs) # Contents diff --git a/build.js b/build.js deleted file mode 100644 index f9f9c25..0000000 --- a/build.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * build.js - * @ndaidong - **/ - -import { mkdirSync, readFileSync, rmSync } from 'fs' - -import { buildSync } from 'esbuild' - -const pkg = JSON.parse(readFileSync('./package.json', { encoding: 'utf-8' })) - -rmSync('dist', { - force: true, - recursive: true, -}) -mkdirSync('dist') - -const buildTime = (new Date()).toISOString() -const comment = [ - `// ${pkg.name}@${pkg.version} ${pkg.repository.url}`, - `built with esbuild at ${buildTime}`, -].join(' - ') - -const baseOpt = { - entryPoints: ['src/main.js'], - bundle: true, - charset: 'utf8', - target: ['es2020', 'node14'], - minify: true, - write: true, - sourcemap: 'external', -} - -const esmVersion = { - ...baseOpt, - platform: 'browser', - format: 'esm', - outfile: 'dist/bella.esm.js', - banner: { - js: comment, - }, -} -buildSync(esmVersion) - -const cjsVersion = { - ...baseOpt, - platform: 'node', - format: 'cjs', - mainFields: ['main'], - outfile: 'dist/bella.js', - banner: { - js: comment, - }, -} - -buildSync(cjsVersion) diff --git a/build.test.js b/build.test.js deleted file mode 100644 index 2b6a80b..0000000 --- a/build.test.js +++ /dev/null @@ -1,28 +0,0 @@ -// release.test - -/* eslint-env jest */ - -import { - existsSync, - readFileSync -} from 'fs' - -const pkg = JSON.parse(readFileSync('./package.json')) - -const runtest = (fname) => { - const fpath = `./dist/${fname}` - describe(`Validate ${fname} version output`, () => { - test(`Check if ${fpath} file created`, () => { - expect(existsSync(fpath)).toBeTruthy() - }) - const constent = readFileSync(fpath, 'utf8') - const lines = constent.split('\n') - test('Check if file meta contains package info', () => { - expect(lines[0].includes(`${pkg.name}@${pkg.version}`)).toBeTruthy() - expect(lines[0].includes(pkg.repository.url)).toBeTruthy() - }) - }) - return fpath -} - -runtest('bella.esm.js') diff --git a/dist/bella.esm.js b/dist/bella.esm.js deleted file mode 100644 index 876188b..0000000 --- a/dist/bella.esm.js +++ /dev/null @@ -1,2 +0,0 @@ -// bellajs@11.1.3 https://github.com/ndaidong/bellajs - built with esbuild at 2024-02-23T04:18:36.140Z -var g=t=>({}).toString.call(t),U=t=>Number.isInteger(t),p=t=>Array.isArray(t),l=t=>String(t)===t,h=t=>Number(t)===t,k=t=>!!t===t,S=t=>g(t)==="[object Null]",M=t=>g(t)==="[object Undefined]",O=t=>M(t)||S(t),F=t=>g(t)==="[object Function]",a=t=>g(t)==="[object Object]"&&!p(t),w=t=>t instanceof Date&&!isNaN(t.valueOf()),q=t=>g(t).match(/^\[object HTML\w*Element]$/)!==null,z=t=>{let e=/^[a-z]+$/i;return l(t)&&e.test(t)},B=t=>{let e=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;return l(t)&&e.test(t)},H=t=>!t||O(t)||l(t)&&t===""||p(t)&&t.length===0||a(t)&&Object.keys(t).length===0,x=(t,e)=>!t||!e?!1:Object.prototype.hasOwnProperty.call(t,e);var f=t=>{let e=h(t)?String(t):t;if(!l(e))throw new Error("InvalidInput: String required.");return e},R=(t,e=140)=>{let r=f(t);if(r.length<=e)return r;let n=r.substring(0,e).trim(),s=n.split(" ");return s.length>1?(s.pop(),s.map(i=>i.trim()).join(" ")+"..."):n.substring(0,e-3)+"..."},V=t=>f(t).replace(/(<([^>]+)>)/ig,"").trim(),W=t=>f(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),G=t=>f(t).replace(/"/g,'"').replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),A=t=>{let e=f(t).toLowerCase();return e.length>1?e.charAt(0).toUpperCase()+e.slice(1):e.toUpperCase()},J=t=>f(t).split(" ").map(e=>A(e)).join(" "),b=(t,e,r)=>{let o=f(t),n=h(e)?String(e):e,s=h(r)?String(r):r;if(l(n)&&l(s))o=o.split(n).join(s);else if(p(n)&&l(s))n.forEach(c=>{o=b(o,c,s)});else if(p(n)&&p(s)&&n.length===s.length){let c=n.length;if(c>0)for(let i=0;i{let t={a:"á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä|æ",c:"ç",d:"đ|ð",e:"é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë",i:"í|ì|ỉ|ĩ|ị|ï|î",n:"ñ",o:"ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö|ø",s:"ß",u:"ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û",y:"ý|ỳ|ỷ|ỹ|ỵ|ÿ"},e={...t};return Object.keys(t).forEach(r=>{let o=r.toUpperCase();e[o]=t[r].toUpperCase()}),e},D=t=>{let e=f(t),r=(n,s)=>{e=b(e,n,s)},o=N();for(let n in o)x(o,n)&&o[n].split("|").forEach(c=>r(c,n));return e},Q=(t,e="-")=>D(t).trim().toLowerCase().replace(/\W+/g," ").replace(/\s+/g," ").replace(/\s/g,e);var Y=(t=0,e=1e6)=>Math.floor(Math.random()*(e-t+1))+t,Z=(t=32,e="")=>{let r=e;for(let o=0;o9&&n>.3&&n<.7?c.toUpperCase():c}return r.substring(0,t)};var L=()=>({dateStyle:"medium",timeStyle:"long"}),_=()=>({second:1e3,minute:60,hour:60,day:24,week:7,month:4,year:12}),C=t=>{try{return new Intl.Locale(t).language!==""}catch{return!1}},et=(...t)=>{let e=t[0],r=C(t[1])?t[1]:"en",o=L(),n=t.length>=3?t[2]:t.length===1?o:a(t[1])?t[1]:o;return new Intl.DateTimeFormat(r,n).format(new Date(e))},rt=(t,e="en",r="just now")=>{let o=new Date(t),n=Date.now()-o,s=_();if(n<=s.second)return r;let c="second";for(let u in s){if(n{let e=t.length,r=(o,n)=>o>0?(...s)=>r(o-s.length,[...n,...s]):t(...n);return r(e,[])};var ct=(...t)=>t.reduce((e,r)=>o=>e(r(o)));var ut=(...t)=>t.reduce((e,r)=>o=>r(e(o)));var m=(t,e,r,o={})=>{let{writable:n=!1,configurable:s=!1,enumerable:c=!1}=o;Object.defineProperty(t,e,{value:r,writable:n,configurable:s,enumerable:c})};var d=t=>{let e=t,r=()=>e==null,o=()=>e,n=u=>d(e||u()),s=u=>d(u(e)===!0?e:null),c=u=>d(r()?null:u(e)),i=Object.create({});return m(i,"__value__",e,{enumerable:!0}),m(i,"__type__","Maybe",{enumerable:!0}),m(i,"isNil",r),m(i,"value",o),m(i,"map",c),m(i,"if",s),m(i,"else",n),i};var y=(t,e=null)=>{let r=e||new Set;if(r.has(t))return t;if(r.add(t),w(t))return new Date(t.valueOf());let o=s=>{let c=Object.create({});for(let i in s)x(s,i)&&(c[i]=y(s[i],r));return c},n=s=>[...s].map(c=>p(c)?n(c):a(c)?o(c):y(c,r));return p(t)?n(t):a(t)?o(t):t},E=(t,e,r=!1,o=[])=>{for(let n in t)if(!(o.length>0&&o.includes(n))&&(!r||r&&x(e,n))){let s=t[n],c=e[n];a(c)&&a(s)||p(c)&&p(s)?e[n]=E(s,e[n],r,o):e[n]=y(s)}return e},xt=(t=[])=>[...new Set(t)],T=(t,e)=>t>e?1:t{let r=[...t],o=e||T;return r.sort(o),r},gt=(t=[],e=1,r="")=>!l(r)||!x(t[0],r)?t:I(t,(o,n)=>o[r]>n[r]?e:o[r]{let e=[...t],r=[],o=e.length;for(;o>0;){let n=Math.floor(Math.random()*o);r.push(e.splice(n,1)[0]),o--}return r},ht=(t=[],e=1)=>{let r=P(t),o=Math.max(1,e),n=Math.min(o,r.length-1);return r.splice(0,n)};export{y as clone,ct as compose,E as copies,ot as curry,W as escapeHTML,et as formatDateString,rt as formatTimeAgo,Z as genid,x as hasProperty,p as isArray,k as isBoolean,w as isDate,q as isElement,B as isEmail,H as isEmpty,F as isFunction,U as isInteger,z as isLetter,O as isNil,S as isNull,h as isNumber,a as isObject,l as isString,M as isUndefined,d as maybe,ht as pick,ut as pipe,Y as randint,b as replaceAll,P as shuffle,Q as slugify,I as sort,gt as sortBy,D as stripAccent,V as stripTags,R as truncate,A as ucfirst,J as ucwords,G as unescapeHTML,xt as unique}; diff --git a/dist/bella.esm.js.map b/dist/bella.esm.js.map deleted file mode 100644 index b4e5777..0000000 --- a/dist/bella.esm.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/utils/detection.js", "../src/utils/string.js", "../src/utils/random.js", "../src/utils/date.js", "../src/utils/curry.js", "../src/utils/compose.js", "../src/utils/pipe.js", "../src/utils/defineProp.js", "../src/utils/maybe.js", "../src/main.js"], - "sourcesContent": ["// utils / detection\n\nconst ob2Str = (val) => {\n return {}.toString.call(val)\n}\n\nexport const isInteger = (val) => {\n return Number.isInteger(val)\n}\n\nexport const isArray = (val) => {\n return Array.isArray(val)\n}\n\nexport const isString = (val) => {\n return String(val) === val\n}\n\nexport const isNumber = (val) => {\n return Number(val) === val\n}\n\nexport const isBoolean = (val) => {\n return Boolean(val) === val\n}\n\nexport const isNull = (val) => {\n return ob2Str(val) === '[object Null]'\n}\n\nexport const isUndefined = (val) => {\n return ob2Str(val) === '[object Undefined]'\n}\n\nexport const isNil = (val) => {\n return isUndefined(val) || isNull(val)\n}\n\nexport const isFunction = (val) => {\n return ob2Str(val) === '[object Function]'\n}\n\nexport const isObject = (val) => {\n return ob2Str(val) === '[object Object]' && !isArray(val)\n}\n\nexport const isDate = (val) => {\n return val instanceof Date && !isNaN(val.valueOf())\n}\n\nexport const isElement = (v) => {\n return ob2Str(v).match(/^\\[object HTML\\w*Element]$/) !== null\n}\n\nexport const isLetter = (val) => {\n const re = /^[a-z]+$/i\n return isString(val) && re.test(val)\n}\n\nexport const isEmail = (val) => {\n const re = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i\n return isString(val) && re.test(val)\n}\n\nexport const isEmpty = (val) => {\n return !val || isNil(val) ||\n (isString(val) && val === '') ||\n (isArray(val) && val.length === 0) ||\n (isObject(val) && Object.keys(val).length === 0)\n}\n\nexport const hasProperty = (ob, k) => {\n if (!ob || !k) {\n return false\n }\n return Object.prototype.hasOwnProperty.call(ob, k)\n}\n", "// utils / string\n\nimport {\n isArray,\n isString,\n isNumber,\n hasProperty\n} from './detection.js'\n\nconst toString = (input) => {\n const s = isNumber(input) ? String(input) : input\n if (!isString(s)) {\n throw new Error('InvalidInput: String required.')\n }\n return s\n}\n\nexport const truncate = (s, len = 140) => {\n const txt = toString(s)\n const txtlen = txt.length\n if (txtlen <= len) {\n return txt\n }\n const subtxt = txt.substring(0, len).trim()\n const subtxtArr = subtxt.split(' ')\n const subtxtLen = subtxtArr.length\n if (subtxtLen > 1) {\n subtxtArr.pop()\n return subtxtArr.map(word => word.trim()).join(' ') + '...'\n }\n return subtxt.substring(0, len - 3) + '...'\n}\n\nexport const stripTags = (s) => {\n return toString(s).replace(/(<([^>]+)>)/ig, '').trim()\n}\n\nexport const escapeHTML = (s) => {\n return toString(s)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n}\n\nexport const unescapeHTML = (s) => {\n return toString(s)\n .replace(/"/g, '\"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n}\n\nexport const ucfirst = (s) => {\n const x = toString(s).toLowerCase()\n return x.length > 1 ? x.charAt(0).toUpperCase() + x.slice(1) : x.toUpperCase()\n}\n\nexport const ucwords = (s) => {\n return toString(s).split(' ').map((w) => {\n return ucfirst(w)\n }).join(' ')\n}\n\nexport const replaceAll = (s, alpha, beta) => {\n let x = toString(s)\n const a = isNumber(alpha) ? String(alpha) : alpha\n const b = isNumber(beta) ? String(beta) : beta\n\n if (isString(a) && isString(b)) {\n const aa = x.split(a)\n x = aa.join(b)\n } else if (isArray(a) && isString(b)) {\n a.forEach((v) => {\n x = replaceAll(x, v, b)\n })\n } else if (isArray(a) && isArray(b) && a.length === b.length) {\n const k = a.length\n if (k > 0) {\n for (let i = 0; i < k; i++) {\n const aaa = a[i]\n const bb = b[i]\n x = replaceAll(x, aaa, bb)\n }\n }\n }\n return x\n}\n\nconst getCharMap = () => {\n const lmap = {\n a: 'á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä|æ',\n c: 'ç',\n d: 'đ|ð',\n e: 'é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë',\n i: 'í|ì|ỉ|ĩ|ị|ï|î',\n n: 'ñ',\n o: 'ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö|ø',\n s: 'ß',\n u: 'ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û',\n y: 'ý|ỳ|ỷ|ỹ|ỵ|ÿ',\n }\n\n const map = {\n ...lmap,\n }\n Object.keys(lmap).forEach((k) => {\n const K = k.toUpperCase()\n map[K] = lmap[k].toUpperCase()\n })\n\n return map\n}\n\nexport const stripAccent = (s) => {\n let x = toString(s)\n\n const updateS = (ai, key) => {\n x = replaceAll(x, ai, key)\n }\n\n const map = getCharMap()\n for (const key in map) {\n if (hasProperty(map, key)) {\n const a = map[key].split('|')\n a.forEach((item) => {\n return updateS(item, key)\n })\n }\n }\n return x\n}\n\nexport const slugify = (s, delimiter = '-') => {\n return stripAccent(s)\n .trim()\n .toLowerCase()\n .replace(/\\W+/g, ' ')\n .replace(/\\s+/g, ' ')\n .replace(/\\s/g, delimiter)\n}\n", "// utils / random\n\nexport const randint = (min = 0, max = 1e6) => {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport const genid = (len = 32, prefix = '') => {\n let s = prefix\n for (let i = 0; i < len; i++) {\n const r = Math.random()\n const k = Math.floor(r * 36)\n const c = k.toString(36)\n s += (k > 9 && r > 0.3 && r < 0.7) ? c.toUpperCase() : c\n }\n return s.substring(0, len)\n}\n", "// utils / date\n\nimport {\n isObject\n} from './detection.js'\n\nconst getDateFormat = () => {\n return {\n dateStyle: 'medium',\n timeStyle: 'long',\n }\n}\n\nconst getTimeConvers = () => {\n return {\n second: 1000,\n minute: 60,\n hour: 60,\n day: 24,\n week: 7,\n month: 4,\n year: 12,\n }\n}\n\nconst isValidLocal = (hl) => {\n try {\n const locale = new Intl.Locale(hl)\n return locale.language !== ''\n } catch (err) {\n return false\n }\n}\n\nexport const formatDateString = (...args) => {\n const input = args[0]\n const lang = isValidLocal(args[1]) ? args[1] : 'en'\n const dfmt = getDateFormat()\n const opt = args.length >= 3\n ? args[2]\n : args.length === 1\n ? dfmt\n : isObject(args[1])\n ? args[1]\n : dfmt\n const dtf = new Intl.DateTimeFormat(lang, opt)\n return dtf.format(new Date(input))\n}\n\nexport const formatTimeAgo = (input, lang = 'en', justnow = 'just now') => {\n const t = new Date(input)\n let delta = Date.now() - t\n const tcv = getTimeConvers()\n if (delta <= tcv.second) {\n return justnow\n }\n let unit = 'second'\n for (const key in tcv) {\n if (delta < tcv[key]) {\n break\n } else {\n unit = key\n delta /= tcv[key]\n }\n }\n delta = Math.floor(delta)\n const rel = new Intl.RelativeTimeFormat(lang)\n return rel.format(-delta, unit)\n}\n", "// utils / curry\n\nexport const curry = (fn) => {\n const totalArguments = fn.length\n const next = (argumentLength, rest) => {\n if (argumentLength > 0) {\n return (...args) => {\n return next(argumentLength - args.length, [...rest, ...args])\n }\n }\n return fn(...rest)\n }\n return next(totalArguments, [])\n}\n", "// utils / compose\n\nexport const compose = (...fns) => {\n return fns.reduce((f, g) => (x) => f(g(x)))\n}\n", "// utils / pipe\n\nexport const pipe = (...fns) => {\n return fns.reduce((f, g) => (x) => g(f(x)))\n}\n", "// utils / defineProp\n\nexport const defineProp = (ob, key, val, config = {}) => {\n const {\n writable = false,\n configurable = false,\n enumerable = false,\n } = config\n Object.defineProperty(ob, key, {\n value: val,\n writable,\n configurable,\n enumerable,\n })\n}\n", "// utils / maybe\n\nimport {\n defineProp\n} from './defineProp.js'\n\nexport const maybe = (val) => {\n const __val = val\n const isNil = () => {\n return __val === null || __val === undefined\n }\n const value = () => {\n return __val\n }\n const getElse = (fn) => {\n return maybe(__val || fn())\n }\n const filter = (fn) => {\n return maybe(fn(__val) === true ? __val : null)\n }\n const map = (fn) => {\n return maybe(isNil() ? null : fn(__val))\n }\n const output = Object.create({})\n defineProp(output, '__value__', __val, { enumerable: true })\n defineProp(output, '__type__', 'Maybe', { enumerable: true })\n defineProp(output, 'isNil', isNil)\n defineProp(output, 'value', value)\n defineProp(output, 'map', map)\n defineProp(output, 'if', filter)\n defineProp(output, 'else', getElse)\n return output\n}\n", "/**\n * bellajs\n * @ndaidong\n**/\n\nimport {\n isObject,\n isArray,\n isDate,\n isString,\n hasProperty\n} from './utils/detection.js'\n\nexport const clone = (val, history = null) => {\n const stack = history || new Set()\n\n if (stack.has(val)) {\n return val\n }\n\n stack.add(val)\n\n if (isDate(val)) {\n return new Date(val.valueOf())\n }\n\n const copyObject = (o) => {\n const oo = Object.create({})\n for (const k in o) {\n if (hasProperty(o, k)) {\n oo[k] = clone(o[k], stack)\n }\n }\n return oo\n }\n\n const copyArray = (a) => {\n return [...a].map((e) => {\n if (isArray(e)) {\n return copyArray(e)\n } else if (isObject(e)) {\n return copyObject(e)\n }\n return clone(e, stack)\n })\n }\n\n if (isArray(val)) {\n return copyArray(val)\n }\n\n if (isObject(val)) {\n return copyObject(val)\n }\n\n return val\n}\n\nexport const copies = (source, dest, matched = false, excepts = []) => {\n for (const k in source) {\n if (excepts.length > 0 && excepts.includes(k)) {\n continue // eslint-disable-line no-continue\n }\n if (!matched || (matched && hasProperty(dest, k))) {\n const oa = source[k]\n const ob = dest[k]\n if ((isObject(ob) && isObject(oa)) || (isArray(ob) && isArray(oa))) {\n dest[k] = copies(oa, dest[k], matched, excepts)\n } else {\n dest[k] = clone(oa)\n }\n }\n }\n return dest\n}\n\nexport const unique = (arr = []) => {\n return [...new Set(arr)]\n}\n\nconst fnSort = (a, b) => {\n return a > b ? 1 : (a < b ? -1 : 0)\n}\n\nexport const sort = (arr = [], sorting = null) => {\n const tmp = [...arr]\n const fn = sorting || fnSort\n tmp.sort(fn)\n return tmp\n}\n\nexport const sortBy = (arr = [], order = 1, key = '') => {\n if (!isString(key) || !hasProperty(arr[0], key)) {\n return arr\n }\n return sort(arr, (m, n) => {\n return m[key] > n[key] ? order : (m[key] < n[key] ? (-1 * order) : 0)\n })\n}\n\nexport const shuffle = (arr = []) => {\n const input = [...arr]\n const output = []\n let inputLen = input.length\n while (inputLen > 0) {\n const index = Math.floor(Math.random() * inputLen)\n output.push(input.splice(index, 1)[0])\n inputLen--\n }\n return output\n}\n\nexport const pick = (arr = [], count = 1) => {\n const a = shuffle(arr)\n const mc = Math.max(1, count)\n const c = Math.min(mc, a.length - 1)\n return a.splice(0, c)\n}\n\nexport * from './utils/detection.js'\nexport * from './utils/string.js'\nexport * from './utils/random.js'\nexport * from './utils/date.js'\n\nexport * from './utils/curry.js'\nexport * from './utils/compose.js'\nexport * from './utils/pipe.js'\nexport * from './utils/maybe.js'\n"], - "mappings": "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", - "names": ["ob2Str", "val", "isInteger", "isArray", "isString", "isNumber", "isBoolean", "isNull", "isUndefined", "isNil", "isFunction", "isObject", "isDate", "isElement", "v", "isLetter", "re", "isEmail", "isEmpty", "hasProperty", "ob", "k", "toString", "input", "s", "isNumber", "isString", "truncate", "len", "txt", "subtxt", "subtxtArr", "word", "stripTags", "escapeHTML", "unescapeHTML", "ucfirst", "x", "ucwords", "w", "replaceAll", "alpha", "beta", "a", "b", "isArray", "v", "k", "aaa", "bb", "getCharMap", "lmap", "map", "K", "stripAccent", "updateS", "ai", "key", "hasProperty", "item", "slugify", "delimiter", "randint", "min", "max", "genid", "len", "prefix", "s", "i", "r", "k", "getDateFormat", "getTimeConvers", "isValidLocal", "hl", "formatDateString", "args", "input", "lang", "dfmt", "opt", "isObject", "formatTimeAgo", "justnow", "t", "delta", "tcv", "unit", "key", "curry", "fn", "totalArguments", "next", "argumentLength", "rest", "args", "compose", "fns", "f", "g", "x", "pipe", "fns", "f", "g", "x", "defineProp", "ob", "key", "val", "config", "writable", "configurable", "enumerable", "maybe", "val", "__val", "isNil", "value", "getElse", "fn", "filter", "map", "output", "defineProp", "clone", "val", "history", "stack", "isDate", "copyObject", "o", "oo", "k", "hasProperty", "copyArray", "a", "e", "isArray", "isObject", "copies", "source", "dest", "matched", "excepts", "oa", "ob", "unique", "arr", "fnSort", "b", "sort", "sorting", "tmp", "fn", "sortBy", "order", "key", "isString", "m", "shuffle", "input", "output", "inputLen", "index", "pick", "count", "mc", "c"] -} diff --git a/dist/bella.js b/dist/bella.js deleted file mode 100644 index 20025c8..0000000 --- a/dist/bella.js +++ /dev/null @@ -1,2 +0,0 @@ -// bellajs@11.1.3 https://github.com/ndaidong/bellajs - built with esbuild at 2024-02-23T04:18:36.140Z -var w=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var P=(t,e)=>{for(var r in e)w(t,r,{get:e[r],enumerable:!0})},U=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!I.call(t,n)&&n!==r&&w(t,n,{get:()=>e[n],enumerable:!(o=E(e,n))||o.enumerable});return t};var k=t=>U(w({},"__esModule",{value:!0}),t);var at={};P(at,{clone:()=>y,compose:()=>st,copies:()=>D,curry:()=>ot,escapeHTML:()=>W,formatDateString:()=>rt,formatTimeAgo:()=>nt,genid:()=>Z,hasProperty:()=>x,isArray:()=>u,isBoolean:()=>q,isDate:()=>j,isElement:()=>B,isEmail:()=>$,isEmpty:()=>K,isFunction:()=>z,isInteger:()=>F,isLetter:()=>H,isNil:()=>O,isNull:()=>S,isNumber:()=>h,isObject:()=>a,isString:()=>l,isUndefined:()=>M,maybe:()=>d,pick:()=>lt,pipe:()=>ct,randint:()=>Y,replaceAll:()=>b,shuffle:()=>_,slugify:()=>X,sort:()=>L,sortBy:()=>pt,stripAccent:()=>N,stripTags:()=>V,truncate:()=>R,ucfirst:()=>A,ucwords:()=>J,unescapeHTML:()=>G,unique:()=>it});module.exports=k(at);var g=t=>({}).toString.call(t),F=t=>Number.isInteger(t),u=t=>Array.isArray(t),l=t=>String(t)===t,h=t=>Number(t)===t,q=t=>!!t===t,S=t=>g(t)==="[object Null]",M=t=>g(t)==="[object Undefined]",O=t=>M(t)||S(t),z=t=>g(t)==="[object Function]",a=t=>g(t)==="[object Object]"&&!u(t),j=t=>t instanceof Date&&!isNaN(t.valueOf()),B=t=>g(t).match(/^\[object HTML\w*Element]$/)!==null,H=t=>{let e=/^[a-z]+$/i;return l(t)&&e.test(t)},$=t=>{let e=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;return l(t)&&e.test(t)},K=t=>!t||O(t)||l(t)&&t===""||u(t)&&t.length===0||a(t)&&Object.keys(t).length===0,x=(t,e)=>!t||!e?!1:Object.prototype.hasOwnProperty.call(t,e);var f=t=>{let e=h(t)?String(t):t;if(!l(e))throw new Error("InvalidInput: String required.");return e},R=(t,e=140)=>{let r=f(t);if(r.length<=e)return r;let n=r.substring(0,e).trim(),s=n.split(" ");return s.length>1?(s.pop(),s.map(i=>i.trim()).join(" ")+"..."):n.substring(0,e-3)+"..."},V=t=>f(t).replace(/(<([^>]+)>)/ig,"").trim(),W=t=>f(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),G=t=>f(t).replace(/"/g,'"').replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),A=t=>{let e=f(t).toLowerCase();return e.length>1?e.charAt(0).toUpperCase()+e.slice(1):e.toUpperCase()},J=t=>f(t).split(" ").map(e=>A(e)).join(" "),b=(t,e,r)=>{let o=f(t),n=h(e)?String(e):e,s=h(r)?String(r):r;if(l(n)&&l(s))o=o.split(n).join(s);else if(u(n)&&l(s))n.forEach(c=>{o=b(o,c,s)});else if(u(n)&&u(s)&&n.length===s.length){let c=n.length;if(c>0)for(let i=0;i{let t={a:"á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä|æ",c:"ç",d:"đ|ð",e:"é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë",i:"í|ì|ỉ|ĩ|ị|ï|î",n:"ñ",o:"ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö|ø",s:"ß",u:"ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û",y:"ý|ỳ|ỷ|ỹ|ỵ|ÿ"},e={...t};return Object.keys(t).forEach(r=>{let o=r.toUpperCase();e[o]=t[r].toUpperCase()}),e},N=t=>{let e=f(t),r=(n,s)=>{e=b(e,n,s)},o=Q();for(let n in o)x(o,n)&&o[n].split("|").forEach(c=>r(c,n));return e},X=(t,e="-")=>N(t).trim().toLowerCase().replace(/\W+/g," ").replace(/\s+/g," ").replace(/\s/g,e);var Y=(t=0,e=1e6)=>Math.floor(Math.random()*(e-t+1))+t,Z=(t=32,e="")=>{let r=e;for(let o=0;o9&&n>.3&&n<.7?c.toUpperCase():c}return r.substring(0,t)};var v=()=>({dateStyle:"medium",timeStyle:"long"}),tt=()=>({second:1e3,minute:60,hour:60,day:24,week:7,month:4,year:12}),et=t=>{try{return new Intl.Locale(t).language!==""}catch{return!1}},rt=(...t)=>{let e=t[0],r=et(t[1])?t[1]:"en",o=v(),n=t.length>=3?t[2]:t.length===1?o:a(t[1])?t[1]:o;return new Intl.DateTimeFormat(r,n).format(new Date(e))},nt=(t,e="en",r="just now")=>{let o=new Date(t),n=Date.now()-o,s=tt();if(n<=s.second)return r;let c="second";for(let p in s){if(n{let e=t.length,r=(o,n)=>o>0?(...s)=>r(o-s.length,[...n,...s]):t(...n);return r(e,[])};var st=(...t)=>t.reduce((e,r)=>o=>e(r(o)));var ct=(...t)=>t.reduce((e,r)=>o=>r(e(o)));var m=(t,e,r,o={})=>{let{writable:n=!1,configurable:s=!1,enumerable:c=!1}=o;Object.defineProperty(t,e,{value:r,writable:n,configurable:s,enumerable:c})};var d=t=>{let e=t,r=()=>e==null,o=()=>e,n=p=>d(e||p()),s=p=>d(p(e)===!0?e:null),c=p=>d(r()?null:p(e)),i=Object.create({});return m(i,"__value__",e,{enumerable:!0}),m(i,"__type__","Maybe",{enumerable:!0}),m(i,"isNil",r),m(i,"value",o),m(i,"map",c),m(i,"if",s),m(i,"else",n),i};var y=(t,e=null)=>{let r=e||new Set;if(r.has(t))return t;if(r.add(t),j(t))return new Date(t.valueOf());let o=s=>{let c=Object.create({});for(let i in s)x(s,i)&&(c[i]=y(s[i],r));return c},n=s=>[...s].map(c=>u(c)?n(c):a(c)?o(c):y(c,r));return u(t)?n(t):a(t)?o(t):t},D=(t,e,r=!1,o=[])=>{for(let n in t)if(!(o.length>0&&o.includes(n))&&(!r||r&&x(e,n))){let s=t[n],c=e[n];a(c)&&a(s)||u(c)&&u(s)?e[n]=D(s,e[n],r,o):e[n]=y(s)}return e},it=(t=[])=>[...new Set(t)],ut=(t,e)=>t>e?1:t{let r=[...t],o=e||ut;return r.sort(o),r},pt=(t=[],e=1,r="")=>!l(r)||!x(t[0],r)?t:L(t,(o,n)=>o[r]>n[r]?e:o[r]{let e=[...t],r=[],o=e.length;for(;o>0;){let n=Math.floor(Math.random()*o);r.push(e.splice(n,1)[0]),o--}return r},lt=(t=[],e=1)=>{let r=_(t),o=Math.max(1,e),n=Math.min(o,r.length-1);return r.splice(0,n)};0&&(module.exports={clone,compose,copies,curry,escapeHTML,formatDateString,formatTimeAgo,genid,hasProperty,isArray,isBoolean,isDate,isElement,isEmail,isEmpty,isFunction,isInteger,isLetter,isNil,isNull,isNumber,isObject,isString,isUndefined,maybe,pick,pipe,randint,replaceAll,shuffle,slugify,sort,sortBy,stripAccent,stripTags,truncate,ucfirst,ucwords,unescapeHTML,unique}); diff --git a/dist/bella.js.map b/dist/bella.js.map deleted file mode 100644 index e58b0d1..0000000 --- a/dist/bella.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/main.js", "../src/utils/detection.js", "../src/utils/string.js", "../src/utils/random.js", "../src/utils/date.js", "../src/utils/curry.js", "../src/utils/compose.js", "../src/utils/pipe.js", "../src/utils/defineProp.js", "../src/utils/maybe.js"], - "sourcesContent": ["/**\n * bellajs\n * @ndaidong\n**/\n\nimport {\n isObject,\n isArray,\n isDate,\n isString,\n hasProperty\n} from './utils/detection.js'\n\nexport const clone = (val, history = null) => {\n const stack = history || new Set()\n\n if (stack.has(val)) {\n return val\n }\n\n stack.add(val)\n\n if (isDate(val)) {\n return new Date(val.valueOf())\n }\n\n const copyObject = (o) => {\n const oo = Object.create({})\n for (const k in o) {\n if (hasProperty(o, k)) {\n oo[k] = clone(o[k], stack)\n }\n }\n return oo\n }\n\n const copyArray = (a) => {\n return [...a].map((e) => {\n if (isArray(e)) {\n return copyArray(e)\n } else if (isObject(e)) {\n return copyObject(e)\n }\n return clone(e, stack)\n })\n }\n\n if (isArray(val)) {\n return copyArray(val)\n }\n\n if (isObject(val)) {\n return copyObject(val)\n }\n\n return val\n}\n\nexport const copies = (source, dest, matched = false, excepts = []) => {\n for (const k in source) {\n if (excepts.length > 0 && excepts.includes(k)) {\n continue // eslint-disable-line no-continue\n }\n if (!matched || (matched && hasProperty(dest, k))) {\n const oa = source[k]\n const ob = dest[k]\n if ((isObject(ob) && isObject(oa)) || (isArray(ob) && isArray(oa))) {\n dest[k] = copies(oa, dest[k], matched, excepts)\n } else {\n dest[k] = clone(oa)\n }\n }\n }\n return dest\n}\n\nexport const unique = (arr = []) => {\n return [...new Set(arr)]\n}\n\nconst fnSort = (a, b) => {\n return a > b ? 1 : (a < b ? -1 : 0)\n}\n\nexport const sort = (arr = [], sorting = null) => {\n const tmp = [...arr]\n const fn = sorting || fnSort\n tmp.sort(fn)\n return tmp\n}\n\nexport const sortBy = (arr = [], order = 1, key = '') => {\n if (!isString(key) || !hasProperty(arr[0], key)) {\n return arr\n }\n return sort(arr, (m, n) => {\n return m[key] > n[key] ? order : (m[key] < n[key] ? (-1 * order) : 0)\n })\n}\n\nexport const shuffle = (arr = []) => {\n const input = [...arr]\n const output = []\n let inputLen = input.length\n while (inputLen > 0) {\n const index = Math.floor(Math.random() * inputLen)\n output.push(input.splice(index, 1)[0])\n inputLen--\n }\n return output\n}\n\nexport const pick = (arr = [], count = 1) => {\n const a = shuffle(arr)\n const mc = Math.max(1, count)\n const c = Math.min(mc, a.length - 1)\n return a.splice(0, c)\n}\n\nexport * from './utils/detection.js'\nexport * from './utils/string.js'\nexport * from './utils/random.js'\nexport * from './utils/date.js'\n\nexport * from './utils/curry.js'\nexport * from './utils/compose.js'\nexport * from './utils/pipe.js'\nexport * from './utils/maybe.js'\n", "// utils / detection\n\nconst ob2Str = (val) => {\n return {}.toString.call(val)\n}\n\nexport const isInteger = (val) => {\n return Number.isInteger(val)\n}\n\nexport const isArray = (val) => {\n return Array.isArray(val)\n}\n\nexport const isString = (val) => {\n return String(val) === val\n}\n\nexport const isNumber = (val) => {\n return Number(val) === val\n}\n\nexport const isBoolean = (val) => {\n return Boolean(val) === val\n}\n\nexport const isNull = (val) => {\n return ob2Str(val) === '[object Null]'\n}\n\nexport const isUndefined = (val) => {\n return ob2Str(val) === '[object Undefined]'\n}\n\nexport const isNil = (val) => {\n return isUndefined(val) || isNull(val)\n}\n\nexport const isFunction = (val) => {\n return ob2Str(val) === '[object Function]'\n}\n\nexport const isObject = (val) => {\n return ob2Str(val) === '[object Object]' && !isArray(val)\n}\n\nexport const isDate = (val) => {\n return val instanceof Date && !isNaN(val.valueOf())\n}\n\nexport const isElement = (v) => {\n return ob2Str(v).match(/^\\[object HTML\\w*Element]$/) !== null\n}\n\nexport const isLetter = (val) => {\n const re = /^[a-z]+$/i\n return isString(val) && re.test(val)\n}\n\nexport const isEmail = (val) => {\n const re = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i\n return isString(val) && re.test(val)\n}\n\nexport const isEmpty = (val) => {\n return !val || isNil(val) ||\n (isString(val) && val === '') ||\n (isArray(val) && val.length === 0) ||\n (isObject(val) && Object.keys(val).length === 0)\n}\n\nexport const hasProperty = (ob, k) => {\n if (!ob || !k) {\n return false\n }\n return Object.prototype.hasOwnProperty.call(ob, k)\n}\n", "// utils / string\n\nimport {\n isArray,\n isString,\n isNumber,\n hasProperty\n} from './detection.js'\n\nconst toString = (input) => {\n const s = isNumber(input) ? String(input) : input\n if (!isString(s)) {\n throw new Error('InvalidInput: String required.')\n }\n return s\n}\n\nexport const truncate = (s, len = 140) => {\n const txt = toString(s)\n const txtlen = txt.length\n if (txtlen <= len) {\n return txt\n }\n const subtxt = txt.substring(0, len).trim()\n const subtxtArr = subtxt.split(' ')\n const subtxtLen = subtxtArr.length\n if (subtxtLen > 1) {\n subtxtArr.pop()\n return subtxtArr.map(word => word.trim()).join(' ') + '...'\n }\n return subtxt.substring(0, len - 3) + '...'\n}\n\nexport const stripTags = (s) => {\n return toString(s).replace(/(<([^>]+)>)/ig, '').trim()\n}\n\nexport const escapeHTML = (s) => {\n return toString(s)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n}\n\nexport const unescapeHTML = (s) => {\n return toString(s)\n .replace(/"/g, '\"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n}\n\nexport const ucfirst = (s) => {\n const x = toString(s).toLowerCase()\n return x.length > 1 ? x.charAt(0).toUpperCase() + x.slice(1) : x.toUpperCase()\n}\n\nexport const ucwords = (s) => {\n return toString(s).split(' ').map((w) => {\n return ucfirst(w)\n }).join(' ')\n}\n\nexport const replaceAll = (s, alpha, beta) => {\n let x = toString(s)\n const a = isNumber(alpha) ? String(alpha) : alpha\n const b = isNumber(beta) ? String(beta) : beta\n\n if (isString(a) && isString(b)) {\n const aa = x.split(a)\n x = aa.join(b)\n } else if (isArray(a) && isString(b)) {\n a.forEach((v) => {\n x = replaceAll(x, v, b)\n })\n } else if (isArray(a) && isArray(b) && a.length === b.length) {\n const k = a.length\n if (k > 0) {\n for (let i = 0; i < k; i++) {\n const aaa = a[i]\n const bb = b[i]\n x = replaceAll(x, aaa, bb)\n }\n }\n }\n return x\n}\n\nconst getCharMap = () => {\n const lmap = {\n a: 'á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä|æ',\n c: 'ç',\n d: 'đ|ð',\n e: 'é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë',\n i: 'í|ì|ỉ|ĩ|ị|ï|î',\n n: 'ñ',\n o: 'ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö|ø',\n s: 'ß',\n u: 'ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û',\n y: 'ý|ỳ|ỷ|ỹ|ỵ|ÿ',\n }\n\n const map = {\n ...lmap,\n }\n Object.keys(lmap).forEach((k) => {\n const K = k.toUpperCase()\n map[K] = lmap[k].toUpperCase()\n })\n\n return map\n}\n\nexport const stripAccent = (s) => {\n let x = toString(s)\n\n const updateS = (ai, key) => {\n x = replaceAll(x, ai, key)\n }\n\n const map = getCharMap()\n for (const key in map) {\n if (hasProperty(map, key)) {\n const a = map[key].split('|')\n a.forEach((item) => {\n return updateS(item, key)\n })\n }\n }\n return x\n}\n\nexport const slugify = (s, delimiter = '-') => {\n return stripAccent(s)\n .trim()\n .toLowerCase()\n .replace(/\\W+/g, ' ')\n .replace(/\\s+/g, ' ')\n .replace(/\\s/g, delimiter)\n}\n", "// utils / random\n\nexport const randint = (min = 0, max = 1e6) => {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport const genid = (len = 32, prefix = '') => {\n let s = prefix\n for (let i = 0; i < len; i++) {\n const r = Math.random()\n const k = Math.floor(r * 36)\n const c = k.toString(36)\n s += (k > 9 && r > 0.3 && r < 0.7) ? c.toUpperCase() : c\n }\n return s.substring(0, len)\n}\n", "// utils / date\n\nimport {\n isObject\n} from './detection.js'\n\nconst getDateFormat = () => {\n return {\n dateStyle: 'medium',\n timeStyle: 'long',\n }\n}\n\nconst getTimeConvers = () => {\n return {\n second: 1000,\n minute: 60,\n hour: 60,\n day: 24,\n week: 7,\n month: 4,\n year: 12,\n }\n}\n\nconst isValidLocal = (hl) => {\n try {\n const locale = new Intl.Locale(hl)\n return locale.language !== ''\n } catch (err) {\n return false\n }\n}\n\nexport const formatDateString = (...args) => {\n const input = args[0]\n const lang = isValidLocal(args[1]) ? args[1] : 'en'\n const dfmt = getDateFormat()\n const opt = args.length >= 3\n ? args[2]\n : args.length === 1\n ? dfmt\n : isObject(args[1])\n ? args[1]\n : dfmt\n const dtf = new Intl.DateTimeFormat(lang, opt)\n return dtf.format(new Date(input))\n}\n\nexport const formatTimeAgo = (input, lang = 'en', justnow = 'just now') => {\n const t = new Date(input)\n let delta = Date.now() - t\n const tcv = getTimeConvers()\n if (delta <= tcv.second) {\n return justnow\n }\n let unit = 'second'\n for (const key in tcv) {\n if (delta < tcv[key]) {\n break\n } else {\n unit = key\n delta /= tcv[key]\n }\n }\n delta = Math.floor(delta)\n const rel = new Intl.RelativeTimeFormat(lang)\n return rel.format(-delta, unit)\n}\n", "// utils / curry\n\nexport const curry = (fn) => {\n const totalArguments = fn.length\n const next = (argumentLength, rest) => {\n if (argumentLength > 0) {\n return (...args) => {\n return next(argumentLength - args.length, [...rest, ...args])\n }\n }\n return fn(...rest)\n }\n return next(totalArguments, [])\n}\n", "// utils / compose\n\nexport const compose = (...fns) => {\n return fns.reduce((f, g) => (x) => f(g(x)))\n}\n", "// utils / pipe\n\nexport const pipe = (...fns) => {\n return fns.reduce((f, g) => (x) => g(f(x)))\n}\n", "// utils / defineProp\n\nexport const defineProp = (ob, key, val, config = {}) => {\n const {\n writable = false,\n configurable = false,\n enumerable = false,\n } = config\n Object.defineProperty(ob, key, {\n value: val,\n writable,\n configurable,\n enumerable,\n })\n}\n", "// utils / maybe\n\nimport {\n defineProp\n} from './defineProp.js'\n\nexport const maybe = (val) => {\n const __val = val\n const isNil = () => {\n return __val === null || __val === undefined\n }\n const value = () => {\n return __val\n }\n const getElse = (fn) => {\n return maybe(__val || fn())\n }\n const filter = (fn) => {\n return maybe(fn(__val) === true ? __val : null)\n }\n const map = (fn) => {\n return maybe(isNil() ? null : fn(__val))\n }\n const output = Object.create({})\n defineProp(output, '__value__', __val, { enumerable: true })\n defineProp(output, '__type__', 'Maybe', { enumerable: true })\n defineProp(output, 'isNil', isNil)\n defineProp(output, 'value', value)\n defineProp(output, 'map', map)\n defineProp(output, 'if', filter)\n defineProp(output, 'else', getElse)\n return output\n}\n"], - "mappings": "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", - "names": ["main_exports", "__export", "clone", "compose", "copies", "curry", "escapeHTML", "formatDateString", "formatTimeAgo", "genid", "hasProperty", "isArray", "isBoolean", "isDate", "isElement", "isEmail", "isEmpty", "isFunction", "isInteger", "isLetter", "isNil", "isNull", "isNumber", "isObject", "isString", "isUndefined", "maybe", "pick", "pipe", "randint", "replaceAll", "shuffle", "slugify", "sort", "sortBy", "stripAccent", "stripTags", "truncate", "ucfirst", "ucwords", "unescapeHTML", "unique", "__toCommonJS", "ob2Str", "val", "isInteger", "isArray", "isString", "isNumber", "isBoolean", "isNull", "isUndefined", "isNil", "isFunction", "isObject", "isDate", "isElement", "v", "isLetter", "re", "isEmail", "isEmpty", "hasProperty", "ob", "k", "toString", "input", "s", "isNumber", "isString", "truncate", "len", "txt", "subtxt", "subtxtArr", "word", "stripTags", "escapeHTML", "unescapeHTML", "ucfirst", "x", "ucwords", "w", "replaceAll", "alpha", "beta", "a", "b", "isArray", "v", "k", "aaa", "bb", "getCharMap", "lmap", "map", "K", "stripAccent", "updateS", "ai", "key", "hasProperty", "item", "slugify", "delimiter", "randint", "min", "max", "genid", "len", "prefix", "s", "i", "r", "k", "getDateFormat", "getTimeConvers", "isValidLocal", "hl", "formatDateString", "args", "input", "lang", "dfmt", "opt", "isObject", "formatTimeAgo", "justnow", "t", "delta", "tcv", "unit", "key", "curry", "fn", "totalArguments", "next", "argumentLength", "rest", "args", "compose", "fns", "f", "g", "x", "pipe", "fns", "f", "g", "x", "defineProp", "ob", "key", "val", "config", "writable", "configurable", "enumerable", "maybe", "val", "__val", "isNil", "value", "getElse", "fn", "filter", "map", "output", "defineProp", "clone", "val", "history", "stack", "isDate", "copyObject", "o", "oo", "k", "hasProperty", "copyArray", "a", "e", "isArray", "isObject", "copies", "source", "dest", "matched", "excepts", "oa", "ob", "unique", "arr", "fnSort", "b", "sort", "sorting", "tmp", "fn", "sortBy", "order", "key", "isString", "m", "shuffle", "input", "output", "inputLen", "index", "pick", "count", "mc", "c"] -} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..1bef40a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,133 @@ +// eslint.config.js + +import eslintjs from '@eslint/js' +import globals from 'globals' + +const ignores = [ + 'node_modules/*', + 'dist/*', +] + +export default [ + { + ignores, + ...eslintjs.configs.recommended, + }, + { + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.node, + ...globals.browser, + ...globals.jest, + Intl: 'readonly', + }, + }, + ignores, + rules: { + 'arrow-spacing': ['error', { 'before': true, 'after': true }], + 'block-spacing': ['error', 'always'], + 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }], + 'camelcase': ['error', { + 'allow': ['^UNSAFE_'], + 'properties': 'never', + 'ignoreGlobals': true, + }], + 'comma-dangle': ['error', { + 'arrays': 'always-multiline', + 'objects': 'always-multiline', + 'imports': 'never', + 'exports': 'never', + 'functions': 'never', + }], + 'comma-spacing': ['error', { 'before': false, 'after': true }], + 'eol-last': 'error', + 'eqeqeq': ['error', 'always', { 'null': 'ignore' }], + 'func-call-spacing': ['error', 'never'], + 'indent': [ + 'error', + 2, + { + 'MemberExpression': 1, + 'FunctionDeclaration': { + 'body': 1, + 'parameters': 2, + }, + 'SwitchCase': 1, + 'ignoredNodes': ['TemplateLiteral > *'], + }, + ], + 'key-spacing': ['error', { 'beforeColon': false, 'afterColon': true }], + 'keyword-spacing': ['error', { 'before': true, 'after': true }], + 'lines-between-class-members': ['error', 'always', { 'exceptAfterSingleLine': true }], + 'max-len': [ + 'error', + { + 'code': 120, + 'ignoreTrailingComments': true, + 'ignoreComments': true, + 'ignoreUrls': true, + }, + ], + 'max-lines': [ + 'error', + { + 'max': 450, + 'skipBlankLines': true, + 'skipComments': false, + }, + ], + 'max-lines-per-function': [ + 'error', + { + 'max': 150, + 'skipBlankLines': true, + }, + ], + 'max-params': ['error', 4], + 'no-array-constructor': 'error', + 'no-mixed-spaces-and-tabs': 'error', + 'no-multi-spaces': 'error', + 'no-multi-str': 'error', + 'no-multiple-empty-lines': [ + 'error', + { + 'max': 1, + 'maxEOF': 0, + }, + ], + 'no-restricted-syntax': [ + 'error', + 'WithStatement', + 'BinaryExpression[operator=\'in\']', + ], + 'no-trailing-spaces': 'error', + 'no-use-before-define': [ + 'error', + { + 'functions': true, + 'classes': true, + 'variables': false, + }, + ], + 'no-var': 'warn', + 'object-curly-spacing': ['error', 'always'], + 'padded-blocks': [ + 'error', + { + 'blocks': 'never', + 'switches': 'never', + 'classes': 'never', + }, + ], + 'quotes': ['error', 'single'], + 'space-before-blocks': ['error', 'always'], + 'space-before-function-paren': ['error', 'always'], + 'space-infix-ops': 'error', + 'space-unary-ops': ['error', { 'words': true, 'nonwords': false }], + 'space-in-parens': ['error', 'never'], + 'semi': ['error', 'never'], + }, + }, +] diff --git a/package.json b/package.json index 2929d19..5f23078 100755 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "11.1.3", + "version": "11.2.0", "name": "bellajs", "description": "A useful helper for any javascript program", "homepage": "https://www.npmjs.com/package/bellajs", @@ -9,25 +9,20 @@ }, "author": "@ndaidong", "main": "./src/main.js", - "exports": { - "import": "./src/main.js", - "require": "./dist/bella.js" - }, "type": "module", "engines": { - "node": ">= 18" + "node": ">= 18.4" }, "scripts": { "lint": "eslint .", "lint:fix": "eslint --fix .", "pretest": "npm run lint", "test": "NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose --coverage=true --env=jsdom", - "build": "node build.js src/main.js", "reset": "node reset" }, "devDependencies": { - "esbuild": "^0.20.1", - "eslint": "^8.56.0", + "eslint": "^9.2.0", + "globals": "^15.2.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0" }, diff --git a/src/browser/crypto.js b/src/browser/crypto.js deleted file mode 100644 index 4e18a82..0000000 --- a/src/browser/crypto.js +++ /dev/null @@ -1 +0,0 @@ -export default crypto diff --git a/src/browser/txtutil.js b/src/browser/txtutil.js deleted file mode 100644 index 974c5ff..0000000 --- a/src/browser/txtutil.js +++ /dev/null @@ -1,2 +0,0 @@ -export const TextEncoder = window.TextEncoder -export const TextDecoder = window.TextDecoder diff --git a/src/main.js b/src/main.js index 7b7f7bb..f400bf3 100755 --- a/src/main.js +++ b/src/main.js @@ -59,7 +59,7 @@ export const clone = (val, history = null) => { export const copies = (source, dest, matched = false, excepts = []) => { for (const k in source) { if (excepts.length > 0 && excepts.includes(k)) { - continue // eslint-disable-line no-continue + continue } if (!matched || (matched && hasProperty(dest, k))) { const oa = source[k] diff --git a/src/utils/date.js b/src/utils/date.js index 276e014..52aa31f 100755 --- a/src/utils/date.js +++ b/src/utils/date.js @@ -27,7 +27,7 @@ const isValidLocal = (hl) => { try { const locale = new Intl.Locale(hl) return locale.language !== '' - } catch (err) { + } catch { return false } } diff --git a/src/utils/random.js b/src/utils/random.js index 31d8568..fc7cbf1 100755 --- a/src/utils/random.js +++ b/src/utils/random.js @@ -1,16 +1,22 @@ // utils / random -export const randint = (min = 0, max = 1e6) => { - return Math.floor(Math.random() * (max - min + 1)) + min -} +const crypto = globalThis.crypto export const genid = (len = 32, prefix = '') => { let s = prefix - for (let i = 0; i < len; i++) { + const nums = crypto.getRandomValues(new Uint32Array(len)) + for (let i = 0; i < nums.length; i++) { + const n = nums[i].toString(36) const r = Math.random() - const k = Math.floor(r * 36) - const c = k.toString(36) - s += (k > 9 && r > 0.3 && r < 0.7) ? c.toUpperCase() : c + const c = n.charAt(Math.floor(r * n.length)) + s += (r > 0.3 && r < 0.7) ? c.toUpperCase() : c } return s.substring(0, len) } + +export const randint = (min = 0, max = 1e6) => { + const byteArray = new Uint8Array(1) + crypto.getRandomValues(byteArray) + const floatNum = '0.' + byteArray[0].toString() + return Math.floor(floatNum * (max - min + 1)) + min +} diff --git a/src/utils/string.js b/src/utils/string.js index 741aad8..0438690 100755 --- a/src/utils/string.js +++ b/src/utils/string.js @@ -133,9 +133,11 @@ export const stripAccent = (s) => { export const slugify = (s, delimiter = '-') => { return stripAccent(s) + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, '') .trim() .toLowerCase() - .replace(/\W+/g, ' ') - .replace(/\s+/g, ' ') - .replace(/\s/g, delimiter) + .replace(/[^a-z0-9 -]/g, '') + .replace(/\s+/g, delimiter) + .replace(new RegExp(`${delimiter}+`, 'g'), delimiter) } diff --git a/src/utils/string.test.js b/src/utils/string.test.js index 0a7713c..27202a0 100755 --- a/src/utils/string.test.js +++ b/src/utils/string.test.js @@ -237,10 +237,10 @@ describe('test .slugify() method:', () => { const inputs = [ { text: 'Sur l\'année 2015', - expectation: 'sur-l-annee-2015', + expectation: 'sur-lannee-2015', }, { - text: 'Nghị luận tác phẩm "Đường kách mệnh" của Hồ Chí Minh', + text: 'Nghị luận tác phẩm "Đường kách mệnh" của Hồ Chí Minh?!', expectation: 'nghi-luan-tac-pham-duong-kach-menh-cua-ho-chi-minh', }, ] diff --git a/tea.yaml b/tea.yaml deleted file mode 100644 index 0f1c155..0000000 --- a/tea.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# https://tea.xyz/what-is-this-file ---- -version: 1.0.0 -codeOwners: - - '0x81df41500FCaBa6a87b20e7EeF1a65d081DE9189' -quorum: 1