UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 6.84 kB
{"version":3,"file":"querystring.mjs","names":[],"sources":["../../../src/schemas/helpers/querystring.ts"],"sourcesContent":["import z from \"zod\";\n\nexport const filterOperators = z\n\t.enum([\n\t\t\"=\",\n\t\t\"!=\",\n\t\t\">\",\n\t\t\">=\",\n\t\t\"<\",\n\t\t\"<=\",\n\t\t\"in\",\n\t\t\"not-in\",\n\t\t\"is\",\n\t\t\"is-not\",\n\t\t\"contains\",\n\t\t\"not-contains\",\n\t\t\"starts-with\",\n\t\t\"not-starts-with\",\n\t\t\"ends-with\",\n\t\t\"not-ends-with\",\n\t])\n\t.optional();\n\nexport const queryString = {\n\tschema: {\n\t\tfilter: (\n\t\t\tmultiple = false,\n\t\t\toptions?: {\n\t\t\t\texample?: string;\n\t\t\t\tdescription?: string;\n\t\t\t\t/**\n\t\t\t\t * When true, if the filter value is empty it will be treated as you querying for the column being equal to null.\n\t\t\t\t * You'll also need to mark the column as nullable in the buildFormattedQuery helper in your controller.\n\t\t\t\t */\n\t\t\t\tnullable?: boolean;\n\t\t\t},\n\t\t) =>\n\t\t\tz\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription: multiple\n\t\t\t\t\t\t? options?.description ||\n\t\t\t\t\t\t\t\"Accepts multiple values separated by commas.\"\n\t\t\t\t\t\t: (options?.description || \"Accepts a single value only.\") +\n\t\t\t\t\t\t\t(options?.nullable ? \" Leave empty for null comparison\" : \"\"),\n\t\t\t\t\texample: options?.example,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\tsort: (example: string) =>\n\t\t\tz\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t// .regex(/^-?[a-zA-Z0-9_]+(,-?[a-zA-Z0-9_]+)*$/)\n\t\t\t\t.meta({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Orders results using comma-separated field names. Prefix with - for descending order.\",\n\t\t\t\t\texample: example,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\tinclude: (example: string) =>\n\t\t\tz\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Specifies related resources to include in response as comma-separated values\",\n\t\t\t\t\texample: example,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\texclude: (example: string) =>\n\t\t\tz\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Defines fields to exclude from response as comma-separated values\",\n\t\t\t\t\texample: example,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\tpage: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.regex(/^[1-9][0-9]*$/)\n\t\t\t.describe(\n\t\t\t\t\"Specifies the page number for pagination (must be a positive integer)\",\n\t\t\t)\n\t\t\t.optional(),\n\t\tperPage: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.regex(/^([1-9][0-9]*|-1)$/)\n\t\t\t.describe(\n\t\t\t\t\"Sets the number of items per page (use positive integer or -1 for all items)\",\n\t\t\t)\n\t\t\t.optional(),\n\t},\n\tmeta: {\n\t\tpatternProperties: {\n\t\t\t\"^filter\\\\[([^\\\\]:]+):?([^\\\\]]*)\\\\]$\": {\n\t\t\t\ttype: [\"string\", \"null\"],\n\t\t\t\tdescription:\n\t\t\t\t\t\"Dynamic filter parameter in format filter[fieldName:operator]. Supported operators include: '=', '!=', '>', '>=', '<', '<=', 'in', 'not-in', 'is', 'is-not', 'contains', 'not-contains', 'starts-with', 'not-starts-with', 'ends-with' and 'not-ends-with'. Text-filter values are literal, including '%', '_' and backslashes. Text matching is case-insensitive according to the database adapter and collation.\",\n\t\t\t},\n\t\t\t\"^filter\\\\[or\\\\]\\\\[[0-9]+\\\\]\\\\[([^\\\\]:]+):?([^\\\\]]*)\\\\]$\": {\n\t\t\t\ttype: [\"string\", \"null\"],\n\t\t\t\tdescription:\n\t\t\t\t\t\"Grouped OR filter parameter in format filter[or][groupIndex][fieldName:operator]. Conditions within a group are ANDed, groups are ORed.\",\n\t\t\t},\n\t\t},\n\t\tadditionalProperties: false,\n\t},\n};\n\n/**\n * @description The entire queryFromatted schema\n * ```typescript\n * filter: z.object({}).optional(),\n * sort: z\n * .array(\n * z.object({\n * key: z.string(),\n * direction: z.enum([\"asc\", \"desc\"]),\n * }),\n * )\n * .optional(),\n * include: z.array(z.string()).optional(),\n * exclude: z.array(z.string()).optional(),\n * page: z.number(),\n * perPage: z.number(),\n * ```\n */\nexport const queryFormatted = {\n\tschema: {\n\t\tfilters: {\n\t\t\tsingle: z.object({\n\t\t\t\tvalue: z.union([z.string(), z.number(), z.boolean(), z.null()]),\n\t\t\t\toperator: filterOperators,\n\t\t\t}),\n\t\t\tunion: z.object({\n\t\t\t\tvalue: z.union([\n\t\t\t\t\tz.string(),\n\t\t\t\t\tz.array(z.string()),\n\t\t\t\t\tz.number(),\n\t\t\t\t\tz.array(z.number()),\n\t\t\t\t\tz.boolean(),\n\t\t\t\t\tz.array(z.boolean()),\n\t\t\t\t]),\n\t\t\t\toperator: filterOperators,\n\t\t\t}),\n\t\t},\n\t\tfilterOr: z\n\t\t\t.array(\n\t\t\t\tz.array(\n\t\t\t\t\tz.object({\n\t\t\t\t\t\tkey: z.string(),\n\t\t\t\t\t\tvalue: z.union([\n\t\t\t\t\t\t\tz.string(),\n\t\t\t\t\t\t\tz.array(z.string()),\n\t\t\t\t\t\t\tz.number(),\n\t\t\t\t\t\t\tz.array(z.number()),\n\t\t\t\t\t\t\tz.boolean(),\n\t\t\t\t\t\t\tz.array(z.boolean()),\n\t\t\t\t\t\t\tz.null(),\n\t\t\t\t\t\t]),\n\t\t\t\t\t\toperator: filterOperators,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.optional(),\n\t\tpage: z.number(),\n\t\tperPage: z.number(),\n\t},\n};\n"],"mappings":"mBAEA,MAAa,EAAkB,EAC7B,KAAK,CACL,IACA,KACA,IACA,KACA,IACA,KACA,KACA,SACA,KACA,SACA,WACA,eACA,cACA,kBACA,YACA,eACD,CAAC,CAAC,CACD,SAAS,EAEE,EAAc,CAC1B,OAAQ,CACP,QACC,EAAW,GACX,IAUA,EACE,OAAO,CAAC,CACR,KAAK,CAAC,CACN,KAAK,CACL,YAAa,EACV,GAAS,aACV,gDACE,GAAS,aAAe,iCACzB,GAAS,SAAW,mCAAqC,IAC5D,QAAS,GAAS,OACnB,CAAC,CAAC,CACD,SAAS,EACZ,KAAO,GACN,EACE,OAAO,CAAC,CACR,KAAK,CAAC,CAEN,KAAK,CACL,YACC,wFACQ,SACV,CAAC,CAAC,CACD,SAAS,EACZ,QAAU,GACT,EACE,OAAO,CAAC,CACR,KAAK,CAAC,CACN,KAAK,CACL,YACC,+EACQ,SACV,CAAC,CAAC,CACD,SAAS,EACZ,QAAU,GACT,EACE,OAAO,CAAC,CACR,KAAK,CAAC,CACN,KAAK,CACL,YACC,oEACQ,SACV,CAAC,CAAC,CACD,SAAS,EACZ,KAAM,EACJ,OAAO,CAAC,CACR,KAAK,CAAC,CACN,MAAM,eAAe,CAAC,CACtB,SACA,uEACD,CAAC,CACA,SAAS,EACX,QAAS,EACP,OAAO,CAAC,CACR,KAAK,CAAC,CACN,MAAM,oBAAoB,CAAC,CAC3B,SACA,8EACD,CAAC,CACA,SAAS,CACZ,EACA,KAAM,CACL,kBAAmB,CAClB,sCAAuC,CACtC,KAAM,CAAC,SAAU,MAAM,EACvB,YACC,oZACF,EACA,0DAA2D,CAC1D,KAAM,CAAC,SAAU,MAAM,EACvB,YACC,yIACF,CACD,EACA,qBAAsB,EACvB,CACD,EAoBa,EAAiB,CAC7B,OAAQ,CACP,QAAS,CACR,OAAQ,EAAE,OAAO,CAChB,MAAO,EAAE,MAAM,CAAC,EAAE,OAAO,EAAG,EAAE,OAAO,EAAG,EAAE,QAAQ,EAAG,EAAE,KAAK,CAAC,CAAC,EAC9D,SAAU,CACX,CAAC,EACD,MAAO,EAAE,OAAO,CACf,MAAO,EAAE,MAAM,CACd,EAAE,OAAO,EACT,EAAE,MAAM,EAAE,OAAO,CAAC,EAClB,EAAE,OAAO,EACT,EAAE,MAAM,EAAE,OAAO,CAAC,EAClB,EAAE,QAAQ,EACV,EAAE,MAAM,EAAE,QAAQ,CAAC,CACpB,CAAC,EACD,SAAU,CACX,CAAC,CACF,EACA,SAAU,EACR,MACA,EAAE,MACD,EAAE,OAAO,CACR,IAAK,EAAE,OAAO,EACd,MAAO,EAAE,MAAM,CACd,EAAE,OAAO,EACT,EAAE,MAAM,EAAE,OAAO,CAAC,EAClB,EAAE,OAAO,EACT,EAAE,MAAM,EAAE,OAAO,CAAC,EAClB,EAAE,QAAQ,EACV,EAAE,MAAM,EAAE,QAAQ,CAAC,EACnB,EAAE,KAAK,CACR,CAAC,EACD,SAAU,CACX,CAAC,CACF,CACD,CAAC,CACA,SAAS,EACX,KAAM,EAAE,OAAO,EACf,QAAS,EAAE,OAAO,CACnB,CACD"}