UNPKG

6.47 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sources":["../src/lib/util.js","../src/lib/normalize.js","../src/lib/denormalize.js","../src/koa/index.js"],"sourcesContent":["export function isNumeric(num) {\n return !isNaN(num);\n}\n\nexport function safeToNumber(num) {\n if (isNumeric(num)) {\n return Number(num);\n }\n\n return num;\n}\n","import { pickBy, startsWith, isNil, isEmpty } from \"lodash\";\nimport { camelizeKeys } from \"humps\";\nimport { safeToNumber } from \"./util\";\n\n/**\n * 将标准url中的query 格式转换成 标准 query object\n * @param {object} fromUrl query object from url\n */\nexport default function normalize(fromUrl) {\n const filters = pickBy(fromUrl, (_, key) => !startsWith(key, \"_\"));\n const others = pickBy(fromUrl, (_, key) => startsWith(key, \"_\"));\n\n const ret = {};\n const {\n _limit,\n _offset,\n _sort,\n _populate,\n _select,\n _group,\n ...custom\n } = others;\n\n if (!isNil(_limit)) ret.limit = safeToNumber(_limit);\n if (!isNil(_offset)) ret.offset = safeToNumber(_offset);\n if (!isNil(_sort)) ret.sort = _sort;\n if (!isNil(_populate)) ret.populate = _populate;\n if (!isNil(_select)) ret.select = _select;\n if (!isNil(_group)) ret.group = _group;\n\n // handle filters\n const filter = Object.keys(filters).reduce((acc, key) => {\n let val = filters[key];\n\n if (!val) return acc;\n\n if (Array.isArray(val)) {\n // acc[key] = { $in: val };\n acc[key] = val;\n return acc;\n }\n\n // `_gt`, `_lt`, `_gte` `_lte` or `_ne`\n let match = /(.+)_(gt|lt|gte|lte|ne)$/.exec(key);\n if (match) {\n const path = match[1];\n const op = match[2];\n acc[path] = acc[path] || {};\n acc[path][`$${op}`] = val;\n return acc;\n }\n // other not string\n if (typeof val !== \"string\") {\n acc[key] = val;\n return acc;\n }\n // remove end space\n val = val.trim();\n\n // `_like`\n match = /(.+)_like/.exec(key);\n if (match) {\n const path = match[1];\n acc[path] = { $regex: new RegExp(val, \"i\") };\n return acc;\n } else if (val === \"true\") acc[key] = true;\n else if (val === \"false\") acc[key] = false;\n else acc[key] = val;\n\n return acc;\n }, {});\n\n if (!isEmpty(filter)) {\n ret.filter = camelizeKeys(filter, (key, convert) =>\n key === \"id\" ? \"_id\" : convert(key)\n );\n }\n\n return {\n ...ret,\n ...custom,\n };\n}\n","import { isNil } from \"lodash\";\nimport { safeToNumber } from \"./util\";\n\n/**\n * 根据key 和 operator 生成 key\n * @param {string} key\n * @param {string} operator\n */\nfunction keyWithOperator(key, operator) {\n return `${key}_${operator.replace(\"$\", \"\")}`;\n}\n\nexport default function denormalize(queryObj = {}) {\n const {\n limit,\n offset,\n sort,\n populate,\n select,\n group,\n filter = {},\n ...custom\n } = queryObj;\n\n const ret = {};\n\n if (!isNil(limit)) ret._limit = safeToNumber(limit);\n if (!isNil(offset)) ret._offset = safeToNumber(offset);\n if (!isNil(sort)) ret._sort = sort;\n if (!isNil(populate)) ret._populate = populate;\n if (!isNil(select)) ret._select = select;\n if (!isNil(group)) ret._group = group;\n\n for (const key in filter) {\n const val = filter[key];\n\n if (typeof val !== \"object\" || Array.isArray(val)) {\n ret[key] = val;\n } else {\n // handle operator\n for (const operator in val) {\n switch (operator) {\n case \"$lt\":\n case \"$gt\":\n case \"$lte\":\n case \"$gte\":\n case \"$ne\":\n ret[keyWithOperator(key, operator)] = val[operator];\n break;\n case \"$regex\":\n ret[keyWithOperator(key, \"$like\")] = val[operator].source;\n break;\n default:\n break;\n }\n }\n }\n }\n\n return {\n ...ret,\n ...custom,\n };\n}\n","// use query-string\nimport normalize from \"../lib/normalize\";\n\nexport default function normalizor(opts = {}) {\n return function(ctx, next) {\n const queryStr = ctx.querystring;\n\n if (queryStr) {\n ctx.rawQuery = ctx.query;\n ctx.query = normalize(ctx.rawQuery);\n }\n\n return next();\n };\n}\n"],"names":["safeToNumber","num","isNaN","isNumeric","Number","normalize","fromUrl","filters","pickBy","_","key","startsWith","others","ret","isNil","_limit","limit","_offset","offset","_sort","sort","_populate","populate","_select","select","_group","group","filter","Object","keys","reduce","acc","val","Array","isArray","match","exec","path","op","trim","$regex","RegExp","isEmpty","camelizeKeys","convert","keyWithOperator","operator","replace","opts","ctx","next","querystring","rawQuery","query","queryObj","const","source"],"mappings":"2CAIO,SAASA,EAAaC,UAJtB,SAAmBA,UAChBC,MAAMD,GAIVE,CAAUF,GACLG,OAAOH,GAGTA,ECDM,SAASI,EAAUC,OAC1BC,EAAUC,SAAOF,WAAUG,EAAGC,UAASC,aAAWD,EAAK,OACvDE,EAASJ,SAAOF,WAAUG,EAAGC,UAAQC,aAAWD,EAAK,OAErDG,EAAM,oQAWPC,QAAMC,KAASF,EAAIG,MAAQhB,EAAae,IACxCD,QAAMG,KAAUJ,EAAIK,OAASlB,EAAaiB,IAC1CH,QAAMK,KAAQN,EAAIO,KAAOD,GACzBL,QAAMO,KAAYR,EAAIS,SAAWD,GACjCP,QAAMS,KAAUV,EAAIW,OAASD,GAC7BT,QAAMW,KAASZ,EAAIa,MAAQD,OAG1BE,EAASC,OAAOC,KAAKtB,GAASuB,gBAAQC,EAAKrB,OAC3CsB,EAAMzB,EAAQG,OAEbsB,EAAK,OAAOD,KAEbE,MAAMC,QAAQF,UAEhBD,EAAIrB,GAAOsB,EACJD,MAILI,EAAQ,2BAA2BC,KAAK1B,MACxCyB,EAAO,KACHE,EAAOF,EAAM,GACbG,EAAKH,EAAM,UACjBJ,EAAIM,GAAQN,EAAIM,IAAS,GACzBN,EAAIM,OAAUC,GAAQN,EACfD,QAGU,iBAARC,GACTD,EAAIrB,GAAOsB,EACJD,IAGTC,EAAMA,EAAIO,QAGVJ,EAAQ,YAAYC,KAAK1B,KAGvBqB,EADaI,EAAM,IACP,CAAEK,OAAQ,IAAIC,OAAOT,EAAK,MAC/BD,IACkBA,EAAIrB,GAAZ,SAARsB,GACM,UAARA,GACOA,EAETD,KACN,WAEEW,UAAQf,KACXd,EAAIc,OAASgB,eAAahB,WAASjB,EAAKkC,SAC9B,OAARlC,EAAe,MAAQkC,EAAQlC,MAI5BkB,iBACFf,KCvEP,SAASgC,EAAgBnC,EAAKoC,UAClBpC,MAAOoC,EAASC,QAAQ,IAAK,2BCN1B,SAAoBC,yBAAO,IACjC,SAASC,EAAKC,UACFD,EAAIE,cAGnBF,EAAIG,SAAWH,EAAII,MACnBJ,EAAII,MAAQhD,EAAU4C,EAAIG,WAGrBF,8CDAI,SAAqBI,kBAAW,kGAQlC,sMAILzC,EAAM,OASP0C,IAAM7C,KAPNI,QAAME,KAAQH,EAAIE,OAASf,EAAagB,IACxCF,QAAMI,KAASL,EAAII,QAAUjB,EAAakB,IAC1CJ,QAAMM,KAAOP,EAAIM,MAAQC,GACzBN,QAAMQ,KAAWT,EAAIQ,UAAYC,GACjCR,QAAMU,KAASX,EAAIU,QAAUC,GAC7BV,QAAMY,KAAQb,EAAIY,OAASC,GAEdC,EAAQ,KAClBK,EAAML,EAAOjB,MAEA,iBAARsB,GAAoBC,MAAMC,QAAQF,GAC3CnB,EAAIH,GAAOsB,WAGNuB,IAAMT,KAAYd,SACbc,OACD,UACA,UACA,WACA,WACA,MACHjC,EAAIgC,EAAgBnC,EAAKoC,IAAad,EAAIc,aAEvC,SACHjC,EAAIgC,EAAgBnC,EAAK,UAAYsB,EAAIc,GAAUU,eAStD5B,iBACFf"}
\No newline at end of file