UNPKG

7.57 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.mjs","sources":["../src/lib/normalize.js","../src/lib/denormalize.js","../src/koa/index.js"],"sourcesContent":["import { pickBy, startsWith, isNil, isEmpty } from \"lodash\";\nimport { camelizeKeys } from \"humps\";\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 = Number(_limit);\n if (!isNil(_offset)) ret.offset = Number(_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 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 }\n\n if (key === \"q\") acc[\"$text\"] = { $search: val };\n else if (val === \"true\") acc[key] = true;\n else if (val === \"false\") acc[key] = false;\n else if (val === \"*\") acc[key] = { $ne: [] };\n else if (val === \"none\") acc[key] = { $eq: [] };\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\";\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 = Number(limit);\n if (!isNil(offset)) ret._offset = Number(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 // full text search\n if (key === \"$text\") {\n ret[\"q\"] = val.$search;\n continue;\n }\n\n if (typeof val !== \"object\") {\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 ret[keyWithOperator(key, operator)] = val[operator];\n break;\n case \"$in\":\n ret[key] = val[operator];\n break;\n case \"$ne\":\n // Array wildcard *\n if (Array.isArray(val[operator]) && val[operator].length === 0) {\n ret[key] = \"*\";\n } else {\n ret[keyWithOperator(key, operator)] = val[operator];\n }\n break;\n case \"$eq\":\n // Array wildcard none\n if (Array.isArray(val[operator]) && val[operator].length === 0) {\n ret[key] = \"none\";\n } else {\n ret[keyWithOperator(key, operator)] = val[operator];\n }\n break;\n // like\n case \"$regex\":\n ret[keyWithOperator(key, \"$like\")] = val[operator].source;\n break;\n\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":["normalize","fromUrl","const","filters","pickBy","_","key","startsWith","others","ret","isNil","_limit","limit","Number","_offset","offset","_sort","sort","_populate","populate","_select","select","_group","group","filter","Object","keys","reduce","acc","let","val","Array","isArray","$in","match","exec","path","op","trim","$regex","RegExp","$search","$ne","$eq","isEmpty","camelizeKeys","convert","custom","keyWithOperator","operator","replace","denormalize","queryObj","length","source","opts","ctx","next","querystring","rawQuery","query"],"mappings":"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"}
\No newline at end of file