@webiny/db-dynamodb 6.0.0 → 6.1.0-beta.0
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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/db-dynamodb",
|
|
3
|
-
"version": "6.0.0",
|
|
3
|
+
"version": "6.1.0-beta.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -11,30 +11,30 @@
|
|
|
11
11
|
"author": "Webiny Ltd",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@webiny/api": "6.0.0",
|
|
15
|
-
"@webiny/aws-sdk": "6.0.0",
|
|
16
|
-
"@webiny/db": "6.0.0",
|
|
17
|
-
"@webiny/error": "6.0.0",
|
|
18
|
-
"@webiny/plugins": "6.0.0",
|
|
19
|
-
"@webiny/utils": "6.0.0",
|
|
20
|
-
"date-fns": "
|
|
21
|
-
"dot-prop": "
|
|
14
|
+
"@webiny/api": "6.1.0-beta.0",
|
|
15
|
+
"@webiny/aws-sdk": "6.1.0-beta.0",
|
|
16
|
+
"@webiny/db": "6.1.0-beta.0",
|
|
17
|
+
"@webiny/error": "6.1.0-beta.0",
|
|
18
|
+
"@webiny/plugins": "6.1.0-beta.0",
|
|
19
|
+
"@webiny/utils": "6.1.0-beta.0",
|
|
20
|
+
"date-fns": "4.1.0",
|
|
21
|
+
"dot-prop": "10.1.0",
|
|
22
22
|
"dynamodb-toolbox": "0.9.5",
|
|
23
23
|
"fuse.js": "7.1.0",
|
|
24
24
|
"lodash": "4.17.23"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/is-number": "7.0.5",
|
|
28
|
-
"@webiny/build-tools": "6.0.0",
|
|
29
|
-
"@webiny/project-utils": "6.0.0",
|
|
28
|
+
"@webiny/build-tools": "6.1.0-beta.0",
|
|
29
|
+
"@webiny/project-utils": "6.1.0-beta.0",
|
|
30
30
|
"jest-dynalite": "3.6.1",
|
|
31
31
|
"rimraf": "6.1.3",
|
|
32
32
|
"typescript": "5.9.3",
|
|
33
|
-
"vitest": "4.
|
|
33
|
+
"vitest": "4.1.2"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public",
|
|
37
37
|
"directory": "dist"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "a3bd3695c66c79238e380d7360d9731b5fcf9c87"
|
|
40
40
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ValueTransformPlugin } from "./ValueTransformPlugin.js";
|
|
2
|
-
import WebinyError from "@webiny/error";
|
|
3
2
|
import { parseISO } from "date-fns";
|
|
4
3
|
const transformDateTime = params => {
|
|
5
4
|
const {
|
|
@@ -18,9 +17,13 @@ const transformDateTime = params => {
|
|
|
18
17
|
*/
|
|
19
18
|
return value.getTime();
|
|
20
19
|
}
|
|
21
|
-
|
|
20
|
+
/**
|
|
21
|
+
* No point in throwing an error here, as this would cause the entire transformation to fail. Instead, we just log a warning and return null.
|
|
22
|
+
*/
|
|
23
|
+
console.warn("Could not parse given dateTime value.", "PARSE_DATE_ERROR", {
|
|
22
24
|
value
|
|
23
25
|
});
|
|
26
|
+
return null;
|
|
24
27
|
};
|
|
25
28
|
export class DateTimeTransformPlugin extends ValueTransformPlugin {
|
|
26
29
|
constructor(params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ValueTransformPlugin","
|
|
1
|
+
{"version":3,"names":["ValueTransformPlugin","parseISO","transformDateTime","params","value","undefined","parsedDateTime","getTime","isNaN","Date","console","warn","DateTimeTransformPlugin","constructor","transform"],"sources":["DateTimeTransformPlugin.ts"],"sourcesContent":["import type {\n ValueTransformPluginParams,\n ValueTransformPluginParamsTransformParams\n} from \"./ValueTransformPlugin.js\";\nimport { ValueTransformPlugin } from \"./ValueTransformPlugin.js\";\nimport { parseISO } from \"date-fns\";\n\nconst transformDateTime = (params: ValueTransformPluginParamsTransformParams): number | null => {\n const { value } = params;\n if (value === null || value === undefined) {\n return null;\n } else if (typeof value === \"string\") {\n const parsedDateTime = parseISO(value).getTime();\n if (isNaN(parsedDateTime) === false) {\n return parsedDateTime;\n }\n } else if (value instanceof Date || typeof (value as unknown as Date)?.getTime === \"function\") {\n /**\n * In this case we assume this is a date object, and we just get the time.\n */\n return value.getTime();\n }\n /**\n * No point in throwing an error here, as this would cause the entire transformation to fail. Instead, we just log a warning and return null.\n */\n console.warn(\"Could not parse given dateTime value.\", \"PARSE_DATE_ERROR\", {\n value\n });\n return null;\n};\n\nexport class DateTimeTransformPlugin extends ValueTransformPlugin {\n public constructor(params: Omit<ValueTransformPluginParams, \"transform\">) {\n super({\n transform: transformDateTime,\n ...params\n });\n }\n}\n"],"mappings":"AAIA,SAASA,oBAAoB;AAC7B,SAASC,QAAQ,QAAQ,UAAU;AAEnC,MAAMC,iBAAiB,GAAIC,MAAiD,IAAoB;EAC5F,MAAM;IAAEC;EAAM,CAAC,GAAGD,MAAM;EACxB,IAAIC,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;IACvC,OAAO,IAAI;EACf,CAAC,MAAM,IAAI,OAAOD,KAAK,KAAK,QAAQ,EAAE;IAClC,MAAME,cAAc,GAAGL,QAAQ,CAACG,KAAK,CAAC,CAACG,OAAO,CAAC,CAAC;IAChD,IAAIC,KAAK,CAACF,cAAc,CAAC,KAAK,KAAK,EAAE;MACjC,OAAOA,cAAc;IACzB;EACJ,CAAC,MAAM,IAAIF,KAAK,YAAYK,IAAI,IAAI,OAAQL,KAAK,EAAsBG,OAAO,KAAK,UAAU,EAAE;IAC3F;AACR;AACA;IACQ,OAAOH,KAAK,CAACG,OAAO,CAAC,CAAC;EAC1B;EACA;AACJ;AACA;EACIG,OAAO,CAACC,IAAI,CAAC,uCAAuC,EAAE,kBAAkB,EAAE;IACtEP;EACJ,CAAC,CAAC;EACF,OAAO,IAAI;AACf,CAAC;AAED,OAAO,MAAMQ,uBAAuB,SAASZ,oBAAoB,CAAC;EACvDa,WAAWA,CAACV,MAAqD,EAAE;IACtE,KAAK,CAAC;MACFW,SAAS,EAAEZ,iBAAiB;MAC5B,GAAGC;IACP,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
package/utils/filter.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import dotProp from "dot-prop";
|
|
1
|
+
import * as dotProp from "dot-prop";
|
|
2
2
|
import WebinyError from "@webiny/error";
|
|
3
3
|
import { ValueFilterPlugin } from "../plugins/definitions/ValueFilterPlugin.js";
|
|
4
4
|
const getMappedPlugins = params => {
|
|
@@ -145,7 +145,7 @@ const createFilterCallable = params => {
|
|
|
145
145
|
return item => {
|
|
146
146
|
for (const filter of filters) {
|
|
147
147
|
const result = filter.paths.some(path => {
|
|
148
|
-
const value = transform(dotProp.
|
|
148
|
+
const value = transform(dotProp.getProperty(item, path), filter.transformValue);
|
|
149
149
|
const compareValue = transform(filter.compareValue, filter.transformValue);
|
|
150
150
|
const matched = filter.filterPlugin.matches({
|
|
151
151
|
value,
|
package/utils/filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["dotProp","WebinyError","ValueFilterPlugin","getMappedPlugins","params","plugins","byType","type","reduce","plugin","op","property","extractWhereArgs","key","result","split","field","shift","rawOp","length","join","operation","negate","match","replace","findFilterPlugin","multiSearchFieldOperations","createFilters","where","fields","keys","Object","filterPlugins","filters","compareValue","undefined","includes","data","transformValue","paths","map","fieldPlugin","find","getField","value","getPath","filterPlugin","push","path","transform","Array","isArray","v","createFilterCallable","item","filter","some","get","matched","matches","filterItems","items"],"sources":["filter.ts"],"sourcesContent":["import dotProp from \"dot-prop\";\nimport WebinyError from \"@webiny/error\";\nimport type { Plugin, PluginsContainer } from \"@webiny/plugins\";\nimport { ValueFilterPlugin } from \"~/plugins/definitions/ValueFilterPlugin.js\";\nimport type { FieldPlugin } from \"~/plugins/definitions/FieldPlugin.js\";\nimport type { DynamoDbContainsFilter } from \"~/types.js\";\n\ntype TransformValue = (value: any) => any;\n\nexport interface Params<T = any> {\n plugins: PluginsContainer;\n items: T[];\n where: Record<string, any>;\n /**\n * An array of fields that require some special operation.\n */\n fields: FieldPlugin[];\n}\n\ninterface MappedPluginParams<T extends Plugin = Plugin> {\n plugins: PluginsContainer;\n type: string;\n property: keyof T;\n}\n\ninterface Filter {\n operation: string;\n compareValue: any;\n filterPlugin: ValueFilterPlugin;\n transformValue?: TransformValue;\n paths: string[];\n negate: boolean;\n}\n\nconst getMappedPlugins = <T extends Plugin>(params: MappedPluginParams<T>): Record<string, T> => {\n return params.plugins.byType<T>(params.type).reduce(\n (plugins, plugin) => {\n /**\n * We expect op to be a string, that is why we cast.\n */\n const op = plugin[params.property] as unknown as string;\n plugins[op] = plugin;\n return plugins;\n },\n {} as Record<string, T>\n );\n};\n\ninterface ExtractWhereArgsResult {\n field: string;\n operation: string;\n negate: boolean;\n}\nconst extractWhereArgs = (key: string): ExtractWhereArgsResult => {\n const result = key.split(\"_\");\n const field = result.shift() as string;\n const rawOp = result.length === 0 ? \"eq\" : result.join(\"_\");\n /**\n * When rawOp is not, it means it is equal negated so just return that.\n */\n if (rawOp === \"not\") {\n return {\n field,\n operation: \"eq\",\n negate: true\n };\n }\n const negate = rawOp.match(\"not_\") !== null;\n const operation = rawOp.replace(\"not_\", \"\");\n return {\n field,\n operation,\n negate\n };\n};\n\nconst findFilterPlugin = (\n plugins: Record<string, ValueFilterPlugin>,\n operation: string\n): ValueFilterPlugin => {\n if (plugins[operation]) {\n return plugins[operation];\n }\n throw new WebinyError(`Missing filter plugin definition.`, \"FILTER_PLUGIN_ERROR\", {\n operation\n });\n};\n\nconst multiSearchFieldOperations = [\"contains\", \"fuzzy\"];\n\nconst createFilters = (params: Omit<Params, \"items\">): Filter[] => {\n const { plugins, where, fields } = params;\n\n const keys = Object.keys(where);\n /**\n * Skip everything if there are no conditions to be applied.\n */\n if (keys.length === 0) {\n return [];\n }\n const filterPlugins = getMappedPlugins<ValueFilterPlugin>({\n plugins,\n type: ValueFilterPlugin.type,\n property: \"operation\"\n });\n\n return keys.reduce((filters, key) => {\n const compareValue = where[key];\n if (compareValue === undefined) {\n return filters;\n }\n /**\n * @see DynamoDbContainsFilter\n */\n if (multiSearchFieldOperations.includes(key) === true) {\n const data: DynamoDbContainsFilter = compareValue;\n let transformValue: TransformValue | undefined = undefined;\n const paths = data.fields.map(field => {\n const fieldPlugin = fields.find(plugin => plugin.getField() === field);\n if (fieldPlugin) {\n transformValue = (value: any) => {\n return fieldPlugin.transformValue(value);\n };\n return fieldPlugin.getPath();\n }\n return field;\n });\n\n const filterPlugin = findFilterPlugin(filterPlugins, key);\n filters.push({\n operation: filterPlugin.operation,\n compareValue: data.value,\n filterPlugin,\n transformValue,\n paths,\n negate: false\n });\n return filters;\n }\n\n const { field, operation, negate } = extractWhereArgs(key);\n\n const filterPlugin = findFilterPlugin(filterPlugins, operation);\n\n const fieldPlugin = fields.find(plugin => plugin.getField() === field);\n let path: string = field;\n let transformValue: TransformValue | undefined = undefined;\n if (fieldPlugin) {\n transformValue = (value: any) => {\n return fieldPlugin.transformValue(value);\n };\n path = fieldPlugin.getPath();\n }\n\n filters.push({\n operation: filterPlugin.operation,\n compareValue,\n filterPlugin,\n transformValue,\n paths: [path],\n negate\n });\n\n return filters;\n }, [] as Filter[]);\n};\n/**\n * Transforms the value with given transformer callable.\n */\nconst transform = (value: any, transformValue?: TransformValue): any => {\n if (!transformValue) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(v => transformValue(v));\n }\n return transformValue(value);\n};\n/**\n * Creates a filter callable that we can send to the .filter() method of the array.\n */\nconst createFilterCallable = (params: Omit<Params, \"items\">): ((item: any) => boolean) | null => {\n const filters = createFilters(params);\n /**\n * Just return null so there are no filters to be applied.\n * Later in the code we check for null so we do not loop through the items.\n */\n if (filters.length === 0) {\n return null;\n }\n\n return (item: any) => {\n for (const filter of filters) {\n const result = filter.paths.some(path => {\n const value = transform(dotProp.get(item, path), filter.transformValue);\n const compareValue = transform(filter.compareValue, filter.transformValue);\n const matched = filter.filterPlugin.matches({\n value,\n compareValue\n });\n\n return filter.negate ? !matched : matched;\n });\n if (result === false) {\n return false;\n }\n }\n return true;\n };\n};\n\nexport function filterItems<T = any>(params: Params<T>): T[] {\n const filter = createFilterCallable(params);\n /**\n * No point in going through all the items when there are no filters to be applied.\n */\n if (!filter) {\n return params.items;\n }\n return params.items.filter(filter);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["dotProp","WebinyError","ValueFilterPlugin","getMappedPlugins","params","plugins","byType","type","reduce","plugin","op","property","extractWhereArgs","key","result","split","field","shift","rawOp","length","join","operation","negate","match","replace","findFilterPlugin","multiSearchFieldOperations","createFilters","where","fields","keys","Object","filterPlugins","filters","compareValue","undefined","includes","data","transformValue","paths","map","fieldPlugin","find","getField","value","getPath","filterPlugin","push","path","transform","Array","isArray","v","createFilterCallable","item","filter","some","getProperty","matched","matches","filterItems","items"],"sources":["filter.ts"],"sourcesContent":["import * as dotProp from \"dot-prop\";\nimport WebinyError from \"@webiny/error\";\nimport type { Plugin, PluginsContainer } from \"@webiny/plugins\";\nimport { ValueFilterPlugin } from \"~/plugins/definitions/ValueFilterPlugin.js\";\nimport type { FieldPlugin } from \"~/plugins/definitions/FieldPlugin.js\";\nimport type { DynamoDbContainsFilter } from \"~/types.js\";\n\ntype TransformValue = (value: any) => any;\n\nexport interface Params<T = any> {\n plugins: PluginsContainer;\n items: T[];\n where: Record<string, any>;\n /**\n * An array of fields that require some special operation.\n */\n fields: FieldPlugin[];\n}\n\ninterface MappedPluginParams<T extends Plugin = Plugin> {\n plugins: PluginsContainer;\n type: string;\n property: keyof T;\n}\n\ninterface Filter {\n operation: string;\n compareValue: any;\n filterPlugin: ValueFilterPlugin;\n transformValue?: TransformValue;\n paths: string[];\n negate: boolean;\n}\n\nconst getMappedPlugins = <T extends Plugin>(params: MappedPluginParams<T>): Record<string, T> => {\n return params.plugins.byType<T>(params.type).reduce(\n (plugins, plugin) => {\n /**\n * We expect op to be a string, that is why we cast.\n */\n const op = plugin[params.property] as unknown as string;\n plugins[op] = plugin;\n return plugins;\n },\n {} as Record<string, T>\n );\n};\n\ninterface ExtractWhereArgsResult {\n field: string;\n operation: string;\n negate: boolean;\n}\nconst extractWhereArgs = (key: string): ExtractWhereArgsResult => {\n const result = key.split(\"_\");\n const field = result.shift() as string;\n const rawOp = result.length === 0 ? \"eq\" : result.join(\"_\");\n /**\n * When rawOp is not, it means it is equal negated so just return that.\n */\n if (rawOp === \"not\") {\n return {\n field,\n operation: \"eq\",\n negate: true\n };\n }\n const negate = rawOp.match(\"not_\") !== null;\n const operation = rawOp.replace(\"not_\", \"\");\n return {\n field,\n operation,\n negate\n };\n};\n\nconst findFilterPlugin = (\n plugins: Record<string, ValueFilterPlugin>,\n operation: string\n): ValueFilterPlugin => {\n if (plugins[operation]) {\n return plugins[operation];\n }\n throw new WebinyError(`Missing filter plugin definition.`, \"FILTER_PLUGIN_ERROR\", {\n operation\n });\n};\n\nconst multiSearchFieldOperations = [\"contains\", \"fuzzy\"];\n\nconst createFilters = (params: Omit<Params, \"items\">): Filter[] => {\n const { plugins, where, fields } = params;\n\n const keys = Object.keys(where);\n /**\n * Skip everything if there are no conditions to be applied.\n */\n if (keys.length === 0) {\n return [];\n }\n const filterPlugins = getMappedPlugins<ValueFilterPlugin>({\n plugins,\n type: ValueFilterPlugin.type,\n property: \"operation\"\n });\n\n return keys.reduce((filters, key) => {\n const compareValue = where[key];\n if (compareValue === undefined) {\n return filters;\n }\n /**\n * @see DynamoDbContainsFilter\n */\n if (multiSearchFieldOperations.includes(key) === true) {\n const data: DynamoDbContainsFilter = compareValue;\n let transformValue: TransformValue | undefined = undefined;\n const paths = data.fields.map(field => {\n const fieldPlugin = fields.find(plugin => plugin.getField() === field);\n if (fieldPlugin) {\n transformValue = (value: any) => {\n return fieldPlugin.transformValue(value);\n };\n return fieldPlugin.getPath();\n }\n return field;\n });\n\n const filterPlugin = findFilterPlugin(filterPlugins, key);\n filters.push({\n operation: filterPlugin.operation,\n compareValue: data.value,\n filterPlugin,\n transformValue,\n paths,\n negate: false\n });\n return filters;\n }\n\n const { field, operation, negate } = extractWhereArgs(key);\n\n const filterPlugin = findFilterPlugin(filterPlugins, operation);\n\n const fieldPlugin = fields.find(plugin => plugin.getField() === field);\n let path: string = field;\n let transformValue: TransformValue | undefined = undefined;\n if (fieldPlugin) {\n transformValue = (value: any) => {\n return fieldPlugin.transformValue(value);\n };\n path = fieldPlugin.getPath();\n }\n\n filters.push({\n operation: filterPlugin.operation,\n compareValue,\n filterPlugin,\n transformValue,\n paths: [path],\n negate\n });\n\n return filters;\n }, [] as Filter[]);\n};\n/**\n * Transforms the value with given transformer callable.\n */\nconst transform = (value: any, transformValue?: TransformValue): any => {\n if (!transformValue) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(v => transformValue(v));\n }\n return transformValue(value);\n};\n/**\n * Creates a filter callable that we can send to the .filter() method of the array.\n */\nconst createFilterCallable = (params: Omit<Params, \"items\">): ((item: any) => boolean) | null => {\n const filters = createFilters(params);\n /**\n * Just return null so there are no filters to be applied.\n * Later in the code we check for null so we do not loop through the items.\n */\n if (filters.length === 0) {\n return null;\n }\n\n return (item: any) => {\n for (const filter of filters) {\n const result = filter.paths.some(path => {\n const value = transform(dotProp.getProperty(item, path), filter.transformValue);\n const compareValue = transform(filter.compareValue, filter.transformValue);\n const matched = filter.filterPlugin.matches({\n value,\n compareValue\n });\n\n return filter.negate ? !matched : matched;\n });\n if (result === false) {\n return false;\n }\n }\n return true;\n };\n};\n\nexport function filterItems<T = any>(params: Params<T>): T[] {\n const filter = createFilterCallable(params);\n /**\n * No point in going through all the items when there are no filters to be applied.\n */\n if (!filter) {\n return params.items;\n }\n return params.items.filter(filter);\n}\n"],"mappings":"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","ignoreList":[]}
|