feathers-utils 1.9.5 → 1.10.0-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.
@@ -0,0 +1,3 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import type { CreateRelatedOptions } from "../types";
3
+ export declare function createRelated<S = Record<string, any>>({ service, multi, data }: CreateRelatedOptions<S>): (context: HookContext) => Promise<HookContext>;
@@ -0,0 +1,22 @@
1
+ import { checkContext } from "feathers-hooks-common";
2
+ import { getItemsIsArray } from "../utils/getItemsIsArray";
3
+ export function createRelated({ service, multi = true, data }) {
4
+ if (!service || !data) {
5
+ throw "initialize hook 'createRelated' completely!";
6
+ }
7
+ return async (context) => {
8
+ checkContext(context, "after", undefined, "createRelated");
9
+ const { items } = getItemsIsArray(context);
10
+ const dataToCreate = await Promise.all(items.map(async (item) => data(item, context)));
11
+ if (!dataToCreate || dataToCreate.length <= 0) {
12
+ return context;
13
+ }
14
+ if (multi) {
15
+ await context.app.service(service).create(dataToCreate);
16
+ }
17
+ else {
18
+ await Promise.all(dataToCreate.map(async (item) => context.app.service(service).create(item)));
19
+ }
20
+ return context;
21
+ };
22
+ }
@@ -0,0 +1,3 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import type { RemoveRelatedOptions } from "../types";
3
+ export declare function removeRelated<S = Record<string, any>>({ service, keyThere, keyHere, blocking }: RemoveRelatedOptions<S>): (context: HookContext) => Promise<HookContext>;
@@ -0,0 +1,28 @@
1
+ import { checkContext } from "feathers-hooks-common";
2
+ import { getItemsIsArray } from "../utils/getItemsIsArray";
3
+ export function removeRelated({ service, keyThere, keyHere = "id", blocking = true }) {
4
+ if (!service || !keyThere) {
5
+ throw "initialize hook 'removeRelated' completely!";
6
+ }
7
+ return async (context) => {
8
+ checkContext(context, "after", "remove", "removeRelated");
9
+ const { items } = getItemsIsArray(context);
10
+ let ids = items.map(x => x[keyHere]).filter(x => !!x);
11
+ ids = [...new Set(ids)];
12
+ if (!ids || ids.length <= 0) {
13
+ return context;
14
+ }
15
+ const promise = context.app.service(service).remove(null, {
16
+ query: {
17
+ [keyThere]: {
18
+ $in: ids
19
+ }
20
+ },
21
+ paginate: false
22
+ });
23
+ if (blocking) {
24
+ await promise;
25
+ }
26
+ return context;
27
+ };
28
+ }
@@ -7,7 +7,9 @@ export declare const hooks: {
7
7
  runPerItem: (actionPerItem: (item: any, context: import("@feathersjs/feathers").HookContext<any, import("@feathersjs/feathers").Service<any>>) => any, _options?: import("./types").HookRunPerItemOptions | undefined) => import("./types").ReturnAsyncHook;
8
8
  };
9
9
  export { checkMulti };
10
+ export { createRelated } from "./hooks/createRelated";
10
11
  export { setData };
12
+ export { removeRelated } from "./hooks/removeRelated";
11
13
  export { runPerItem };
12
14
  import { debounceMixin, DebouncedStore } from "./mixins/debounce-mixin";
13
15
  export declare const mixins: {
package/dist/esm/index.js CHANGED
@@ -8,7 +8,9 @@ export const hooks = {
8
8
  runPerItem
9
9
  };
10
10
  export { checkMulti };
11
+ export { createRelated } from "./hooks/createRelated";
11
12
  export { setData };
13
+ export { removeRelated } from "./hooks/removeRelated";
12
14
  export { runPerItem };
13
15
  import { debounceMixin, DebouncedStore } from "./mixins/debounce-mixin";
14
16
  export const mixins = {
@@ -24,6 +24,17 @@ export interface AddHookOptions {
24
24
  export interface HookRunPerItemOptions {
25
25
  wait?: boolean;
26
26
  }
27
+ export interface RemoveRelatedOptions<S = Record<string, any>> {
28
+ service: keyof S;
29
+ keyThere: string;
30
+ keyHere: string;
31
+ blocking?: boolean;
32
+ }
33
+ export interface CreateRelatedOptions<S = Record<string, any>> {
34
+ service: keyof S;
35
+ multi?: boolean;
36
+ data: (item: any, context: HookContext) => Promisable<Record<string, any>>;
37
+ }
27
38
  export interface InitDebounceMixinOptions {
28
39
  default: Partial<DebouncedStoreOptions>;
29
40
  blacklist: string[];
@@ -0,0 +1,3 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import type { CreateRelatedOptions } from "../types";
3
+ export declare function createRelated<S = Record<string, any>>({ service, multi, data }: CreateRelatedOptions<S>): (context: HookContext) => Promise<HookContext>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createRelated = void 0;
13
+ const feathers_hooks_common_1 = require("feathers-hooks-common");
14
+ const getItemsIsArray_1 = require("../utils/getItemsIsArray");
15
+ function createRelated({ service, multi = true, data }) {
16
+ if (!service || !data) {
17
+ throw "initialize hook 'createRelated' completely!";
18
+ }
19
+ return (context) => __awaiter(this, void 0, void 0, function* () {
20
+ (0, feathers_hooks_common_1.checkContext)(context, "after", undefined, "createRelated");
21
+ const { items } = (0, getItemsIsArray_1.getItemsIsArray)(context);
22
+ const dataToCreate = yield Promise.all(items.map((item) => __awaiter(this, void 0, void 0, function* () { return data(item, context); })));
23
+ if (!dataToCreate || dataToCreate.length <= 0) {
24
+ return context;
25
+ }
26
+ if (multi) {
27
+ yield context.app.service(service).create(dataToCreate);
28
+ }
29
+ else {
30
+ yield Promise.all(dataToCreate.map((item) => __awaiter(this, void 0, void 0, function* () { return context.app.service(service).create(item); })));
31
+ }
32
+ return context;
33
+ });
34
+ }
35
+ exports.createRelated = createRelated;
@@ -0,0 +1,3 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import type { RemoveRelatedOptions } from "../types";
3
+ export declare function removeRelated<S = Record<string, any>>({ service, keyThere, keyHere, blocking }: RemoveRelatedOptions<S>): (context: HookContext) => Promise<HookContext>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.removeRelated = void 0;
13
+ const feathers_hooks_common_1 = require("feathers-hooks-common");
14
+ const getItemsIsArray_1 = require("../utils/getItemsIsArray");
15
+ function removeRelated({ service, keyThere, keyHere = "id", blocking = true }) {
16
+ if (!service || !keyThere) {
17
+ throw "initialize hook 'removeRelated' completely!";
18
+ }
19
+ return (context) => __awaiter(this, void 0, void 0, function* () {
20
+ (0, feathers_hooks_common_1.checkContext)(context, "after", "remove", "removeRelated");
21
+ const { items } = (0, getItemsIsArray_1.getItemsIsArray)(context);
22
+ let ids = items.map(x => x[keyHere]).filter(x => !!x);
23
+ ids = [...new Set(ids)];
24
+ if (!ids || ids.length <= 0) {
25
+ return context;
26
+ }
27
+ const promise = context.app.service(service).remove(null, {
28
+ query: {
29
+ [keyThere]: {
30
+ $in: ids
31
+ }
32
+ },
33
+ paginate: false
34
+ });
35
+ if (blocking) {
36
+ yield promise;
37
+ }
38
+ return context;
39
+ });
40
+ }
41
+ exports.removeRelated = removeRelated;
package/dist/index.d.ts CHANGED
@@ -7,7 +7,9 @@ export declare const hooks: {
7
7
  runPerItem: (actionPerItem: (item: any, context: import("@feathersjs/feathers").HookContext<any, import("@feathersjs/feathers").Service<any>>) => any, _options?: import("./types").HookRunPerItemOptions | undefined) => import("./types").ReturnAsyncHook;
8
8
  };
9
9
  export { checkMulti };
10
+ export { createRelated } from "./hooks/createRelated";
10
11
  export { setData };
12
+ export { removeRelated } from "./hooks/removeRelated";
11
13
  export { runPerItem };
12
14
  import { debounceMixin, DebouncedStore } from "./mixins/debounce-mixin";
13
15
  export declare const mixins: {
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.shouldSkip = exports.getItemsIsArray = exports.filterQuery = exports.markHookForSkip = exports.setResultEmpty = exports.pushSet = exports.mergeArrays = exports.mergeQuery = exports.isPaginated = exports.isMulti = exports.getPaginate = exports.addHook = exports.DebouncedStore = exports.debounceMixin = exports.mixins = exports.runPerItem = exports.setData = exports.checkMulti = exports.hooks = void 0;
17
+ exports.shouldSkip = exports.getItemsIsArray = exports.filterQuery = exports.markHookForSkip = exports.setResultEmpty = exports.pushSet = exports.mergeArrays = exports.mergeQuery = exports.isPaginated = exports.isMulti = exports.getPaginate = exports.addHook = exports.DebouncedStore = exports.debounceMixin = exports.mixins = exports.runPerItem = exports.removeRelated = exports.setData = exports.createRelated = exports.checkMulti = exports.hooks = void 0;
18
18
  // hooks
19
19
  const checkMulti_1 = require("./hooks/checkMulti");
20
20
  Object.defineProperty(exports, "checkMulti", { enumerable: true, get: function () { return checkMulti_1.checkMulti; } });
@@ -27,6 +27,10 @@ exports.hooks = {
27
27
  setData: setData_1.setData,
28
28
  runPerItem: runPerItem_1.runPerItem
29
29
  };
30
+ var createRelated_1 = require("./hooks/createRelated");
31
+ Object.defineProperty(exports, "createRelated", { enumerable: true, get: function () { return createRelated_1.createRelated; } });
32
+ var removeRelated_1 = require("./hooks/removeRelated");
33
+ Object.defineProperty(exports, "removeRelated", { enumerable: true, get: function () { return removeRelated_1.removeRelated; } });
30
34
  const debounce_mixin_1 = require("./mixins/debounce-mixin");
31
35
  Object.defineProperty(exports, "debounceMixin", { enumerable: true, get: function () { return debounce_mixin_1.debounceMixin; } });
32
36
  Object.defineProperty(exports, "DebouncedStore", { enumerable: true, get: function () { return debounce_mixin_1.DebouncedStore; } });
package/dist/types.d.ts CHANGED
@@ -24,6 +24,17 @@ export interface AddHookOptions {
24
24
  export interface HookRunPerItemOptions {
25
25
  wait?: boolean;
26
26
  }
27
+ export interface RemoveRelatedOptions<S = Record<string, any>> {
28
+ service: keyof S;
29
+ keyThere: string;
30
+ keyHere: string;
31
+ blocking?: boolean;
32
+ }
33
+ export interface CreateRelatedOptions<S = Record<string, any>> {
34
+ service: keyof S;
35
+ multi?: boolean;
36
+ data: (item: any, context: HookContext) => Promisable<Record<string, any>>;
37
+ }
27
38
  export interface InitDebounceMixinOptions {
28
39
  default: Partial<DebouncedStoreOptions>;
29
40
  blacklist: string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feathers-utils",
3
- "version": "1.9.5",
3
+ "version": "1.10.0-0",
4
4
  "description": "Some utils for projects using '@feathersjs/feathers'",
5
5
  "author": "fratzinger",
6
6
  "repository": {
@@ -42,6 +42,7 @@
42
42
  "@feathersjs/adapter-commons": "^4.5.12",
43
43
  "@feathersjs/errors": "^4.5.12",
44
44
  "@feathersjs/feathers": "^4.5.12",
45
+ "feathers-hooks-common": "^5.0.6",
45
46
  "lodash": "^4.17.21"
46
47
  },
47
48
  "devDependencies": {
@@ -0,0 +1,39 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import { checkContext } from "feathers-hooks-common";
3
+ import type { CreateRelatedOptions } from "../types";
4
+ import { getItemsIsArray } from "../utils/getItemsIsArray";
5
+
6
+ export function createRelated<S = Record<string, any>>({
7
+ service,
8
+ multi = true,
9
+ data
10
+ }: CreateRelatedOptions<S>) {
11
+ if (!service || !data) {
12
+ throw "initialize hook 'createRelated' completely!";
13
+ }
14
+ return async (context: HookContext): Promise<HookContext> => {
15
+ checkContext(context, "after", undefined, "createRelated");
16
+
17
+ const { items } = getItemsIsArray(context);
18
+
19
+ const dataToCreate = await Promise.all(
20
+ items.map(async item => data(item, context))
21
+ );
22
+
23
+ if (!dataToCreate || dataToCreate.length <= 0) {
24
+ return context;
25
+ }
26
+
27
+ if (multi) {
28
+ await context.app.service(service as string).create(dataToCreate);
29
+ } else {
30
+ await Promise.all(
31
+ dataToCreate.map(async item =>
32
+ context.app.service(service as string).create(item)
33
+ )
34
+ );
35
+ }
36
+
37
+ return context;
38
+ };
39
+ }
@@ -0,0 +1,40 @@
1
+ import type { HookContext } from "@feathersjs/feathers";
2
+ import { checkContext } from "feathers-hooks-common";
3
+ import type { RemoveRelatedOptions } from "../types";
4
+ import { getItemsIsArray } from "../utils/getItemsIsArray";
5
+
6
+ export function removeRelated<S = Record<string, any>>({
7
+ service,
8
+ keyThere,
9
+ keyHere = "id",
10
+ blocking = true
11
+ }: RemoveRelatedOptions<S>) {
12
+ if (!service || !keyThere) {
13
+ throw "initialize hook 'removeRelated' completely!";
14
+ }
15
+ return async (context: HookContext): Promise<HookContext> => {
16
+ checkContext(context, "after", "remove", "removeRelated");
17
+
18
+ const { items } = getItemsIsArray(context);
19
+
20
+ let ids = items.map(x => x[keyHere]).filter(x => !!x);
21
+ ids = [...new Set(ids)];
22
+
23
+ if (!ids || ids.length <= 0) { return context; }
24
+
25
+ const promise: Promise<any> = context.app.service(service as string).remove(null, {
26
+ query: {
27
+ [keyThere]: {
28
+ $in: ids
29
+ }
30
+ },
31
+ paginate: false
32
+ });
33
+
34
+ if (blocking) {
35
+ await promise;
36
+ }
37
+
38
+ return context;
39
+ };
40
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  // hooks
2
2
  import { checkMulti } from "./hooks/checkMulti";
3
3
  import { setData } from "./hooks/setData";
4
+
4
5
  import { runPerItem } from "./hooks/runPerItem";
5
6
 
6
7
  export const hooks = {
@@ -10,7 +11,9 @@ export const hooks = {
10
11
  };
11
12
 
12
13
  export { checkMulti };
14
+ export { createRelated } from "./hooks/createRelated";
13
15
  export { setData };
16
+ export { removeRelated } from "./hooks/removeRelated";
14
17
  export { runPerItem };
15
18
 
16
19
  import { debounceMixin, DebouncedStore } from "./mixins/debounce-mixin";
package/src/types.ts CHANGED
@@ -36,6 +36,19 @@ export interface HookRunPerItemOptions {
36
36
  wait?: boolean
37
37
  }
38
38
 
39
+ export interface RemoveRelatedOptions<S = Record<string, any>> {
40
+ service: keyof S
41
+ keyThere: string
42
+ keyHere: string
43
+ blocking?: boolean
44
+ }
45
+
46
+ export interface CreateRelatedOptions<S = Record<string, any>> {
47
+ service: keyof S
48
+ multi?: boolean
49
+ data: (item: any, context: HookContext) => Promisable<Record<string, any>>
50
+ }
51
+
39
52
  //#endregion
40
53
 
41
54
  //#region mixins