nitro-web 0.2.4 → 0.2.6
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.
- package/package.json +2 -2
- package/server/router.js +10 -17
- package/types/server/router.d.ts.map +1 -1
- package/types/util.d.ts +26 -6
- package/types/util.d.ts.map +1 -1
- package/util.js +56 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nitro-web",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"repository": "github:boycce/nitro-web",
|
|
5
5
|
"homepage": "https://boycce.github.io/nitro-web/",
|
|
6
6
|
"description": "Nitro is a battle-tested, modular base project to turbocharge your projects, styled using Tailwind 🚀",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
66
|
"@stripe/stripe-js": "^1.34.0",
|
|
67
|
-
"monastery": "^4.0.
|
|
67
|
+
"monastery": "^4.0.6",
|
|
68
68
|
"stripe": "^9.16.0"
|
|
69
69
|
},
|
|
70
70
|
"_peers-are-packages-that-will-be-used-in-the-host-repo-too": "",
|
package/server/router.js
CHANGED
|
@@ -9,7 +9,7 @@ import expressFileUpload from 'express-fileupload'
|
|
|
9
9
|
import express from 'express'
|
|
10
10
|
import bodyParser from 'body-parser'
|
|
11
11
|
import sortRouteAddressesNodeps from 'sort-route-addresses-nodeps'
|
|
12
|
-
|
|
12
|
+
import { formatDuplicateKeyError } from 'monastery'
|
|
13
13
|
import { sendEmail } from 'nitro-web/server'
|
|
14
14
|
import * as util from 'nitro-web/util'
|
|
15
15
|
|
|
@@ -177,17 +177,6 @@ function setupErrorResponses (expressApp) {
|
|
|
177
177
|
serverError: function(a, b) { error.call(this, a, b, 500) },
|
|
178
178
|
})
|
|
179
179
|
|
|
180
|
-
function duplicateKeyIndexAndValue(error) {
|
|
181
|
-
// https://github.com/Automattic/mongoose/issues/2129#issuecomment-280507821
|
|
182
|
-
// E.g. E11000 duplicate key error collection: anamata-production.person index:
|
|
183
|
-
// email_1 dup key: { email: "person1@gmail.com" }
|
|
184
|
-
let regex = /index: (?:.*\.)?\$?(?:([_a-z0-9]*)(?:_\d*)|([_a-z0-9]*))\s*dup key/i
|
|
185
|
-
let match = error.message.match(regex)
|
|
186
|
-
let index = match[1] || match[2]
|
|
187
|
-
let value = (error.message.match(/.*{.*?: (.*) }/i)[1]||'').replace(/"/g, '')
|
|
188
|
-
return [index, value]
|
|
189
|
-
}
|
|
190
|
-
|
|
191
180
|
function error(error, detail, status) {
|
|
192
181
|
/**
|
|
193
182
|
* Returns a formatted error
|
|
@@ -218,11 +207,15 @@ function setupErrorResponses (expressApp) {
|
|
|
218
207
|
else errors = [{ detail: error || _detail }]
|
|
219
208
|
|
|
220
209
|
// Mongo error
|
|
221
|
-
} else if (util.isObject(error) && (error.name||'').match(/Mongo|BulkWriteError/)) {
|
|
222
|
-
if
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
210
|
+
} else if (util.isObject(error) && (error.name || '').match(/Mongo|BulkWriteError/)) {
|
|
211
|
+
// Below is thrown by Monastery if a custom message is not used, e.g. `{ ..., messages : { email: { unique: '...' } } }`
|
|
212
|
+
const formattedDuplicateKeyError = formatDuplicateKeyError(undefined, error)
|
|
213
|
+
if (formattedDuplicateKeyError) {
|
|
214
|
+
errors = formattedDuplicateKeyError
|
|
215
|
+
const hasRawMessage = errors[0].detail.includes('E11000 duplicate key')
|
|
216
|
+
// Add default messages if no custom message is used from definition.messages
|
|
217
|
+
if (hasRawMessage && errors[0].title == 'email') errors[0].detail = 'That email is already linked to an account.'
|
|
218
|
+
else if (hasRawMessage) errors[0].detail = `Cannot insert duplicate values for "${errors[0].title}".`
|
|
226
219
|
} else {
|
|
227
220
|
errors = [{ title: 'mongo', detail: error.message }]
|
|
228
221
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../server/router.js"],"names":[],"mappings":"AAoCA,uGAAuG;AACvG,0CADc,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,SAAS,EAAE,WAAW,CAAA;CAAE,CAAC,CA+HlG;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../server/router.js"],"names":[],"mappings":"AAoCA,uGAAuG;AACvG,0CADc,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,SAAS,EAAE,WAAW,CAAA;CAAE,CAAC,CA+HlG;AAkPD,+CAEC;AAED,kEAYC;AAzGD,+BAA+B;AAC/B,yBADW,gBAAgB,CAuF1B;sBAnYY,OAAO,CAAC,OAAO,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAoB,CAAC;CAC7B;uBACS,OAAO,CAAC,QAAQ,GAAG;IAC3B,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;IACpD,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;CACvD;+BACS;IACR,KAAK,EAAE,MAAM,EAAE,CAAC;IACpB,CAAK,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;CACnF;oBAtBgB,SAAS"}
|
package/types/util.d.ts
CHANGED
|
@@ -565,10 +565,17 @@ export function onChange<T>(eventOrPathValue: EventOrPathValue, setState: React.
|
|
|
565
565
|
* @returns {string}
|
|
566
566
|
*/
|
|
567
567
|
export function pad(num?: number, padLeft?: number, fixedRight?: number): string;
|
|
568
|
+
/**
|
|
569
|
+
* Escapes a string for use in a regex
|
|
570
|
+
* @param {string} str
|
|
571
|
+
* @returns {string}
|
|
572
|
+
*/
|
|
573
|
+
export function escapeRegex(str: string): string;
|
|
568
574
|
/**
|
|
569
575
|
* Validates req.query "filters" against a config object, and returns a MongoDB-compatible query object.
|
|
570
576
|
* - `{ rule: 'search' }` is only supported with supported $search operations (e.g. aggregate).
|
|
571
|
-
* - `{ rule: 'text', numberFields
|
|
577
|
+
* - `{ rule: 'text', numberFields?: string[] }` number fields require indexes to work.
|
|
578
|
+
* - `{ rule: 'regex', fields: string[] }` case-insensitive regex against string fields.
|
|
572
579
|
* @param {{ [key: string]: unknown }} query - req.query
|
|
573
580
|
* @param {{ [key: string]: (
|
|
574
581
|
* 'string'
|
|
@@ -578,8 +585,10 @@ export function pad(num?: number, padLeft?: number, fixedRight?: number): string
|
|
|
578
585
|
* | EnumArray
|
|
579
586
|
* | { rule: 'ids', parseId: parseId }
|
|
580
587
|
* | 'text'
|
|
581
|
-
* | { rule: 'text', numberFields
|
|
588
|
+
* | { rule: 'text', numberFields?: string[] }
|
|
589
|
+
* | { rule: 'regex', fields: string[] }
|
|
582
590
|
* | { rule: 'search' } & SearchOperators
|
|
591
|
+
* | 'search_wildcard'
|
|
583
592
|
* )}} config - object of allowed filter/rule pairs.
|
|
584
593
|
*
|
|
585
594
|
* Examples:
|
|
@@ -603,8 +612,11 @@ export function pad(num?: number, padLeft?: number, fixedRight?: number): string
|
|
|
603
612
|
* status: ['incomplete', 'complete'], // EnumArray [string|boolean|number]
|
|
604
613
|
* customer: { rule: 'ids', ObjectId: ObjectIdConstructor },
|
|
605
614
|
* text: 'text',
|
|
606
|
-
* text: { rule: 'text', numberFields: ['age'] },
|
|
615
|
+
* text: { rule: 'text', numberFields: ['age'] },
|
|
616
|
+
* search: { rule: 'regex', fields: ['name', 'email'] },
|
|
607
617
|
* search: { rule: 'search', text: { query: "{VALUE}", path: ['firstName'] } },
|
|
618
|
+
* search: { rule: 'search', wildcard: { query: "*{VALUE}*", path: { wildcard: '*' }, allowAnalyzedField: true } }
|
|
619
|
+
* search: 'search_wildcard', // same as above
|
|
608
620
|
* }
|
|
609
621
|
* @example returned MongoDB query object = {
|
|
610
622
|
* location: '10-RS',
|
|
@@ -626,10 +638,13 @@ export function parseFilters(query: {
|
|
|
626
638
|
parseId: parseId;
|
|
627
639
|
} | "text" | {
|
|
628
640
|
rule: "text";
|
|
629
|
-
numberFields
|
|
641
|
+
numberFields?: string[];
|
|
642
|
+
} | {
|
|
643
|
+
rule: "regex";
|
|
644
|
+
fields: string[];
|
|
630
645
|
} | ({
|
|
631
646
|
rule: "search";
|
|
632
|
-
} & SearchOperators));
|
|
647
|
+
} & SearchOperators) | "search_wildcard");
|
|
633
648
|
}): {
|
|
634
649
|
[key: string]: string | number | boolean | SearchOperators | {
|
|
635
650
|
$gte?: number;
|
|
@@ -646,7 +661,12 @@ export function parseFilters(query: {
|
|
|
646
661
|
};
|
|
647
662
|
} | {
|
|
648
663
|
[key: string]: number;
|
|
649
|
-
})[]
|
|
664
|
+
})[] | {
|
|
665
|
+
[key: string]: {
|
|
666
|
+
$regex: string;
|
|
667
|
+
$options: string;
|
|
668
|
+
};
|
|
669
|
+
}[];
|
|
650
670
|
};
|
|
651
671
|
/**
|
|
652
672
|
* Parses req.query "pagination" and "sorting" fields and returns a monastery-compatible options object.
|
package/types/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../util.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../util.js"],"names":[],"mappings":"AAoDA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCC;AAED;;;;;;;;;;;;GAYG;AACH,yCAVG;IAAsD,YAAY,GAA1D,OAAO,OAAO,EAAE,mBAAmB;CAE3C,GAAU,sBAAsB,CA6BlC;AAED;;;;;GAKG;AACH,8BAJW,MAAM,cACN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,GACrB,MAAM,CAKlB;AAED;;;;;;GAMG;AACH,+BALW,MAAM,oBACN,OAAO,gBACP,OAAO,GACL,MAAM,CAelB;AAED;;;;;GAKG;AACH,sCAJW,MAAM,wBACN,OAAO,GACL,MAAM,CAMlB;AAED;;;;GAIG;AACH,sCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;GAKG;AACH,sCAJW,MAAM,wBACN,OAAO,GACL,MAAM,CAKlB;AAED;;;;GAIG;AACH,iCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,gCATW,MAAM,YAEd;IAAyB,QAAQ,GAAzB,MAAM;IACW,QAAQ,GAAzB,MAAM;IACW,eAAe,GAAhC,MAAM;IACW,MAAM,GAAvB,MAAM;IACW,MAAM,GAAvB,MAAM;CACd,GAAU,MAAM,CAqBlB;AAED;;;;GAIG;AACH,0CAHW,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;;GAMG;AACH,4BALW,MAAM,GAAC,IAAI,YACX,MAAM,aACN,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;GAOG;AACH,qCANW,MAAM,GAAC,IAAI,aACX,MAAM,eACN,MAAM,UA0ChB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,yBAnBuC,CAAC,SAA3B,CAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAI,QAI3B,CAAC,SACD,MAAM,YACN;IACN,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACS,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACpD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAA;CAC7B,CAwKH;AAED;;;;;GAKG;AACH,yBAJa,CAAC,OACH,CAAC,GACC,CAAC,CAgBb;AAED;;;;;GAKG;AACH,8BAJW,MAAM,GAAC,GAAG,EAAE,QACZ,MAAM,GACJ,OAAO,CAgBnB;AAED;;;;;;;GAOG;AACH,wBANa,CAAC,OACH,CAAC,QACD,MAAM,SACN,OAAO,WAAS,GACd,CAAC,CAKb;AAED;;;;;;;GAOG;AACH,gCANa,CAAC,QACH,CAAC,QACD,MAAM,SACN,OAAO,WAAS,GACd;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAgCpD;AAED;;;;;;;;;;;;;;GAcG;AACH,iCAPa,CAAC,SACH,CAAC,iBACD,GAAG,SACH,GAAG,GACD,CAAC,CAoCb;AAED;;;;;;GAMG;AACH,0BALW;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,GAAC,EAAE,GAAC,IAAI,gCAE5B,MAAM,GACJ,MAAM,GAAC,EAAE,GAAC,IAAI,CAmB1B;AAED;;;;;;;;;GASG;AACH,mCARW,MAAM,GAAC,IAAI,GAAC,IAAI,GAAC,UAAU,CAAC,WAAW,CAAC,YACxC,MAAM,SACN,MAAM,QACN,MAAM,GACJ,IAAI,CA+BhB;AAED;;;;;GAKG;AACH,mCAJW,MAAM,iBACN,OAAO,GACL,MAAM,CAMlB;AAED;;;;GAIG;AACH,mCAHW,MAAM,GACJ,MAAM,CAWlB;AAED;;;;;;;;GAQG;AACH,8BAPW,MAAM,QACN;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,qBAC5G,QAAQ,cACR,MAAM,GACJ,QAAQ,CAwEpB;AAED;;;;GAIG;AACH,iCAHW;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACnC,MAAM,CAIlB;AAED;;;;GAIG;AACH,sCAHW,MAAM,GACJ,MAAM,EAAE,CASpB;AAED;;;;GAIG;AACH,6CAHW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACjC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAS5D;AAED;;;;GAIG;AACH,+CAHW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACjC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAS9C;AAED;;;;;GAKG;AACH,yCAJW;IAAE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAC,SAAS,QAC1D,MAAM,GAAC,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAC,SAAS,CAQvD;AAWD;;;;;GAKG;AACH,uCAJW,MAAM,iBACN,MAAM,GACJ,MAAM,CAYlB;AAED;;;;;GAKG;AACH,qCAJW;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE,QACvC,MAAM,GACJ,MAAM,CAalB;AAED;;;;GAIG;AACH,6DAHW,MAAM,GACJ,OAAO,CAAC,OAAO,mBAAmB,EAAE,MAAM,GAAC,IAAI,CAAC,CAI5D;AAED;;;;;;GAMG;AACH,wCAHW,aAAa,GACX,UAAU,EAAE,CAmCxB;AAED;;;;GAIG;AACH,4CAHW,UAAU,EAAE,GAAC,SAAS,GACpB,MAAM,CAMlB;AAED;;;;;;GAMG;AACH,+BALW,GAAG,EAAE,UACL,OAAO,QACP,MAAM,GACJ,OAAO,CAcnB;AAED;;;;GAIG;AACH,kCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,iCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,oCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,+BAHW,MAAM,GACJ,OAAO,CAMnB;AAED;;;;;GAKG;AACH,8BAJW;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAC,GAAC,IAAI,qBAC7B,OAAO,GACL,OAAO,CASnB;AAED;;;;GAIG;AACH,qCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,+BAHW,OAAO,GACL,OAAO,CAmBnB;AAED;;;;GAIG;AACH,mCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,mCAHW,OAAO,GACL,OAAO,CAKnB;AAED;;;;GAIG;AACH,kCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,mCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,gCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AACH,kCALW,MAAM,QACN,MAAM,iBACN,OAAO,GACL,MAAM,CAalB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qCAxBW,MAAM,mBACN,KAAK,GAAC,GAAG,aACT,KAAK,GACH,CAAC,KAAK,EAAE,KAAK,CAAC,GAAC,IAAI,CAuC/B;AAED;;;;;;;;;GASG;AACH,qDARW;IACN,IAAI,CAAC,EAAE;QAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAC,CAAA;IACjE,QAAQ,CAAC,EAAE;QAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAC,CAAA;CAC3C,MACO,MAAM,UACN,MAAM,OA+ChB;AAED;;;;;GAKG;AACH,6CAJW,MAAM,EAAE,UACR,MAAM,EAAE,GACP,MAAM,CAgBjB;AAED;;;;GAIG;AACH,kCAHW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,MACtB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG;;EAS1C;AAED;;;;;GAKG;AACH,0BAJW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,UAC1B,MAAM,EAAE,GACN;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAStC;AAED;;GAEG;AAEH;;;;;;;;;;;;;GAaG;AACH,yBAXa,CAAC,oBACH,gBAAgB,YAChB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,mBACvC,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,mBAC3B,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK,CAAC,GACpD,OAAO,CAAC,CAAC,CAAC,CA+CtB;AAED;;;;;;GAMG;AACH,0BALW,MAAM,YACN,MAAM,eACN,MAAM,GACJ,MAAM,CAUlB;AAED;;;;GAIG;AACH,iCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,oCAtDW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,UAC1B;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAC3B,QAAc,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,SAAS,GACT;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GACjC,MAAM,GACN;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACzC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,IACnC;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,eAAe,IACpC,iBAAiB,CACpB,CAAA;CAAC;;eAiDa,MAAM;cAAQ,MAAM;eAAS,MAAM;cAAQ,MAAM;;aAEnD,QAAQ,EAAE;;iBACN,MAAM;;eACP;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE;;;;;oBACF,MAAM;sBAAY,MAAM;;;EAmI7D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wCAhBW;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,GAAC,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,SAMnD;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,UACzC,MAAM,YACN,OAAO;;;;;;EAgCjB;AAED;;;;GAIG;AACH,0BAHW;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,QACtB,MAAM,GAAC,MAAM,GAAC,MAAM,EAAE,GAAC,MAAM,EAAE;;EAiBzC;AAWD;;;;;;;;;;;;GAYG;AACH,0CAVW,MAAM,YAEd;IAA0B,iBAAiB,GAAnC,OAAO;IACW,mBAAmB,GAArC,OAAO;IACW,iBAAiB,GAAnC,OAAO;CAEf,GAAU;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAC,IAAI,GAAC,CAAC,MAAM,GAAC,IAAI,CAAC,EAAE,CAAA;CAAC,CAyCxD;AAED;;;;GAIG;AACH,yCAHW,MAAM,GACJ,MAAM,EAAE,CAOpB;AAED;;;;;;;;;GASG;AACH,iCARW;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAC,UACxB,MAAM,YACN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,YAE/B;IAA0B,iBAAiB,GAAnC,OAAO;CAEf,GAAU,MAAM,CAkBlB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,+BAnBW,MAAM,SACN;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,UACtB;IAAC,cAAc,CAAC,WAAU;CAAC,iBAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,aACzC,QAAQ,YAEhB;IAAqC,WAAW,GAAxC,kBAAkB;CAC1B,GAAU,OAAO,CAAC,GAAG,CAAC,CA8DxB;AAED;;;;GAIG;AACH,0CAHW,EAAE,GAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,GACrB,EAAE,GAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,CAcnC;AAED;;;;;;;;GAQG;AACH,gCANW,MAAM,gBACN,KAAK,EAAE,GAAC,KAAK,SACb,MAAM,MACN,MAAM,GACJ,MAAM,CAclB;AAED;;;;GAIG;AACH,qCAHW,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;;;;GAQG;AACH,yCAPW,MAAM,gBACN,MAAM,wBAEN,MAAM,aADN,MAAM,GAEJ,MAAM,CA8ClB;AAED;;;;;GAKG;AACH,uCAJW,MAAM,cACN,OAAO,GACL,MAAM,CAelB;AAED;;;;;GAKG;AACH,gEAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAMzB;AAED;;;;GAIG;AACH,oDAFW,aAAa,QAKvB;AAED;;;;;GAKG;AACH,sCAJW;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,EAAE,OACtB,MAAM,GACJ,MAAM,EAAE,CAQpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,yBAhBuC,CAAC,SAA3B,CAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAI,QAG3B,CAAC,SACD,MAAM,YACN;IACL,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACrB,GACS,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACpD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAA;CAC7B,CAmBH;AAED;;;;;GAKG;AACH,wBAJa,CAAC,YACH,CAAC,GAAG,SAAS,GACX,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CASvC;AAED;;;;GAIG;AACH,6BAHW,MAAM,GACJ,MAAM,CAKlB;AA4DD;;;;GAIG;AACH,iCAHW,CAAC,MAAM,GAAC,IAAI,GAAC,SAAS,GAAC,KAAK,GAAC,CAAC,GAAC,EAAE,CAAC,EAAE,GAClC,MAAM,CAuElB;AAED;;;;GAIG;AACH,gCAHW,MAAM,GACJ,MAAM,CAKlB;;AAjzCM,wCAHI;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAC,GAAC,MAAM,GAAC,SAAS,GAC7B,MAAM,CAIlB;;;;4BAkDY,KAAK,GAAC,UAAU,EAAE,GAAC,UAAU,GAAC,eAAe,GAAC,MAAM,GAAC,GAAG;;;;oBAkOxD,CAAC,MAAM,EAAE,MAAM,CAAC;;;;kBAChB;IAAC,UAAU,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAA;CAAC;+BA0JpC,CAAC;IAAC,MAAM,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;oBAwiB9D;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC;uBAh0D7D,OAAO,OAAO,EAAE,QAAQ,CAAC,OAAO,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;;;;4BAI9D,OAAO,OAAO,EAAE,aAAa;;;;iCAC7B,OAAO,OAAO,EAAE,kBAAkB;;;;4BAClC,OAAO,OAAO,EAAE,aAAa;;;;wCAC7B,OAAO,aAAa,EAAE,yBAAyB;;;;0CAG/C,kBAAkB,GAAG;IAAE,aAAa,CAAC,EAAE,yBAAyB,CAAA;CAAE;;;;qCAGlE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG;IACrC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACzG;uBAGW,MAAM;sBACN,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ;;;;wBAC3B,CAAC,MAAM,GAAC,MAAM,GAAC,OAAO,CAAC,EAAE;;;;8BACzB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;yBACtB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;yBACjC;IAAE,MAAM,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;8BACrC;IAAE,QAAQ,EAAE;QAAE,IAAI,EAAE;YAAE,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE"}
|
package/util.js
CHANGED
|
@@ -1390,10 +1390,20 @@ export function pad (num=0, padLeft=0, fixedRight) {
|
|
|
1390
1390
|
}
|
|
1391
1391
|
}
|
|
1392
1392
|
|
|
1393
|
+
/**
|
|
1394
|
+
* Escapes a string for use in a regex
|
|
1395
|
+
* @param {string} str
|
|
1396
|
+
* @returns {string}
|
|
1397
|
+
*/
|
|
1398
|
+
export function escapeRegex(str) {
|
|
1399
|
+
return ((str || '') + '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1393
1402
|
/**
|
|
1394
1403
|
* Validates req.query "filters" against a config object, and returns a MongoDB-compatible query object.
|
|
1395
1404
|
* - `{ rule: 'search' }` is only supported with supported $search operations (e.g. aggregate).
|
|
1396
|
-
* - `{ rule: 'text', numberFields
|
|
1405
|
+
* - `{ rule: 'text', numberFields?: string[] }` number fields require indexes to work.
|
|
1406
|
+
* - `{ rule: 'regex', fields: string[] }` case-insensitive regex against string fields.
|
|
1397
1407
|
* @param {{ [key: string]: unknown }} query - req.query
|
|
1398
1408
|
* @param {{ [key: string]: (
|
|
1399
1409
|
* 'string'
|
|
@@ -1403,8 +1413,10 @@ export function pad (num=0, padLeft=0, fixedRight) {
|
|
|
1403
1413
|
* | EnumArray
|
|
1404
1414
|
* | { rule: 'ids', parseId: parseId }
|
|
1405
1415
|
* | 'text'
|
|
1406
|
-
* | { rule: 'text', numberFields
|
|
1416
|
+
* | { rule: 'text', numberFields?: string[] }
|
|
1417
|
+
* | { rule: 'regex', fields: string[] }
|
|
1407
1418
|
* | { rule: 'search' } & SearchOperators
|
|
1419
|
+
* | 'search_wildcard'
|
|
1408
1420
|
* )}} config - object of allowed filter/rule pairs.
|
|
1409
1421
|
*
|
|
1410
1422
|
* Examples:
|
|
@@ -1428,8 +1440,11 @@ export function pad (num=0, padLeft=0, fixedRight) {
|
|
|
1428
1440
|
* status: ['incomplete', 'complete'], // EnumArray [string|boolean|number]
|
|
1429
1441
|
* customer: { rule: 'ids', ObjectId: ObjectIdConstructor },
|
|
1430
1442
|
* text: 'text',
|
|
1431
|
-
* text: { rule: 'text', numberFields: ['age'] },
|
|
1443
|
+
* text: { rule: 'text', numberFields: ['age'] },
|
|
1444
|
+
* search: { rule: 'regex', fields: ['name', 'email'] },
|
|
1432
1445
|
* search: { rule: 'search', text: { query: "{VALUE}", path: ['firstName'] } },
|
|
1446
|
+
* search: { rule: 'search', wildcard: { query: "*{VALUE}*", path: { wildcard: '*' }, allowAnalyzedField: true } }
|
|
1447
|
+
* search: 'search_wildcard', // same as above
|
|
1433
1448
|
* }
|
|
1434
1449
|
* @example returned MongoDB query object = {
|
|
1435
1450
|
* location: '10-RS',
|
|
@@ -1454,9 +1469,10 @@ export function parseFilters(query, config) {
|
|
|
1454
1469
|
* | { $gte?: number; $gt?: number; $lte?: number; $lt?: number; }
|
|
1455
1470
|
* | (string|number|boolean)
|
|
1456
1471
|
* | { $in: ObjectId[] }
|
|
1457
|
-
* | { $search: string }
|
|
1458
|
-
* | ({ $text: { $search: string } } | { [key: string]: number })[]
|
|
1459
|
-
* |
|
|
1472
|
+
* | { $search: string } // key=$text
|
|
1473
|
+
* | ({ $text: { $search: string } } | { [key: string]: number })[] // key=$or (text rule)
|
|
1474
|
+
* | { [key: string]: { $regex: string, $options: string } }[] // key=$or (regex rule)
|
|
1475
|
+
* | SearchOperators // key=$search
|
|
1460
1476
|
* )
|
|
1461
1477
|
* }} */
|
|
1462
1478
|
const returnedMongoQuery = {}
|
|
@@ -1480,20 +1496,24 @@ export function parseFilters(query, config) {
|
|
|
1480
1496
|
if (!rule) {
|
|
1481
1497
|
continue
|
|
1482
1498
|
|
|
1499
|
+
// String
|
|
1483
1500
|
} else if (rule === 'string') {
|
|
1484
1501
|
if (typeof val !== 'string') throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1485
1502
|
returnedMongoQuery[key] = val
|
|
1486
1503
|
|
|
1504
|
+
// Number
|
|
1487
1505
|
} else if (rule === 'number') {
|
|
1488
1506
|
const num = parseFloat(val)
|
|
1489
1507
|
if (isNaN(num)) throw new Error(`The "${key}" filter should be a number, but received "${val}".`)
|
|
1490
1508
|
returnedMongoQuery[key] = num
|
|
1491
1509
|
|
|
1510
|
+
// Boolean
|
|
1492
1511
|
} else if (rule === 'boolean') {
|
|
1493
1512
|
const bool = val === 'true' ? true : val === 'false' ? false : undefined
|
|
1494
1513
|
if (bool === undefined) throw new Error(`The "${key}" filter should be a boolean, but received "${val}".`)
|
|
1495
1514
|
returnedMongoQuery[key] = bool
|
|
1496
1515
|
|
|
1516
|
+
// Date range
|
|
1497
1517
|
} else if (rule === 'dateRange') {
|
|
1498
1518
|
const [start, end] = val.split(',').map(Number)
|
|
1499
1519
|
if (isNaN(start) && isNaN(end)) throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a date range.`)
|
|
@@ -1501,7 +1521,8 @@ export function parseFilters(query, config) {
|
|
|
1501
1521
|
else if (isNaN(end)) returnedMongoQuery[key] = { $gte: start }
|
|
1502
1522
|
else returnedMongoQuery[key] = { $gte: start, $lte: end }
|
|
1503
1523
|
|
|
1504
|
-
|
|
1524
|
+
// Enum
|
|
1525
|
+
} else if (Array.isArray(rule)) {
|
|
1505
1526
|
// Detetect the entire array's type from the first item
|
|
1506
1527
|
const type = typeof rule[0]
|
|
1507
1528
|
if (!['string', 'number', 'boolean'].includes(type)) {
|
|
@@ -1515,7 +1536,8 @@ export function parseFilters(query, config) {
|
|
|
1515
1536
|
if (valParsed === ruleItem) returnedMongoQuery[key] = valParsed
|
|
1516
1537
|
}
|
|
1517
1538
|
|
|
1518
|
-
|
|
1539
|
+
// IDs
|
|
1540
|
+
} else if (typeof rule === 'object' && 'rule' in rule && rule.rule === 'ids') {
|
|
1519
1541
|
if (!rule.parseId) {
|
|
1520
1542
|
throw new Error(`The "${key}" filter has an invalid rule. Expected a parseId function.`)
|
|
1521
1543
|
}
|
|
@@ -1526,31 +1548,54 @@ export function parseFilters(query, config) {
|
|
|
1526
1548
|
if (!ids.length) throw new Error(`Please pass at least one id to the "${key}" filter.`)
|
|
1527
1549
|
returnedMongoQuery[key] = { $in: ids }
|
|
1528
1550
|
|
|
1551
|
+
// Text
|
|
1529
1552
|
} else if (rule === 'text') {
|
|
1530
1553
|
if (typeof val !== 'string') throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1531
1554
|
returnedMongoQuery['$text'] = { $search: '"' + val + '"' }
|
|
1532
1555
|
|
|
1556
|
+
// Text rule with numberFields
|
|
1533
1557
|
} else if (typeof rule === 'object' && 'rule' in rule && rule.rule === 'text') {
|
|
1534
1558
|
if (typeof val !== 'string') {
|
|
1535
1559
|
throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1536
|
-
} else if (
|
|
1537
|
-
throw new Error(`The "${key}" filter has an invalid rule. Expected
|
|
1560
|
+
} else if (Array.isArray(rule.numberFields) && !rule.numberFields.length) {
|
|
1561
|
+
throw new Error(`The "${key}" filter has an invalid rule. Expected numberFields to be a non-empty array.`)
|
|
1538
1562
|
}
|
|
1539
1563
|
const ors = []
|
|
1540
1564
|
const num = parseFloat(val)
|
|
1541
1565
|
ors.push({ $text: { $search: val } })
|
|
1542
|
-
if (!isNaN(num)) {
|
|
1566
|
+
if (!isNaN(num) && Array.isArray(rule.numberFields)) {
|
|
1543
1567
|
for (const field of rule.numberFields) {
|
|
1544
1568
|
ors.push({ [field]: num })
|
|
1545
1569
|
}
|
|
1546
1570
|
}
|
|
1547
1571
|
returnedMongoQuery.$or = ors
|
|
1548
1572
|
|
|
1573
|
+
// Regex
|
|
1574
|
+
} else if (typeof rule === 'object' && 'rule' in rule && rule.rule === 'regex') {
|
|
1575
|
+
if (typeof val !== 'string') {
|
|
1576
|
+
throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1577
|
+
} else if (!Array.isArray(rule.fields) || !rule.fields.length) {
|
|
1578
|
+
throw new Error(`The "${key}" filter has an invalid rule. Expected fields to be a non-empty array.`)
|
|
1579
|
+
}
|
|
1580
|
+
const ors = []
|
|
1581
|
+
for (const field of rule.fields) {
|
|
1582
|
+
ors.push({ [field]: { $regex: escapeRegex(val), $options: 'i' } })
|
|
1583
|
+
}
|
|
1584
|
+
returnedMongoQuery.$or = ors
|
|
1585
|
+
|
|
1586
|
+
// Atlas Search
|
|
1549
1587
|
} else if (typeof rule === 'object' && 'rule' in rule && rule.rule === 'search') {
|
|
1550
1588
|
if (typeof val !== 'string') throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1551
1589
|
const output = /** @type {SearchOperators} */(deepSetWithMatch(rule, '{VALUE}', val)) // replace {VALUE} with the value
|
|
1552
1590
|
delete output.rule // need to remove rule from the object
|
|
1553
1591
|
returnedMongoQuery['$search'] = output
|
|
1592
|
+
|
|
1593
|
+
// Atlas Search wildcard
|
|
1594
|
+
} else if (rule === 'search_wildcard') {
|
|
1595
|
+
if (typeof val !== 'string') throw new Error(`The "${key}" filter has an invalid value "${val}". Expected a string.`)
|
|
1596
|
+
returnedMongoQuery['$search'] = { wildcard: { query: `*${val}*`, path: { wildcard: '*' }, allowAnalyzedField: true } }
|
|
1597
|
+
|
|
1598
|
+
// Unknown filter type
|
|
1554
1599
|
} else {
|
|
1555
1600
|
throw new Error(`Unknown filter type "${rule}" in the config.`)
|
|
1556
1601
|
}
|