@feathersjs/memory 5.0.0-pre.9 → 5.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.
- package/CHANGELOG.md +169 -24
- package/LICENSE +1 -1
- package/README.md +42 -36
- package/lib/index.d.ts +56 -22
- package/lib/index.js +162 -100
- package/lib/index.js.map +1 -1
- package/package.json +21 -18
- package/src/index.ts +236 -86
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @feathersjs/memory
|
|
2
2
|
|
|
3
3
|
[](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI)
|
|
4
|
-
[](https://david-dm.org/feathersjs/feathers?path=packages/memory)
|
|
5
4
|
[](https://www.npmjs.com/package/@feathersjs/memory)
|
|
5
|
+
[](https://discord.gg/qa8kez8QBx)
|
|
6
6
|
|
|
7
7
|
A [Feathers](https://feathersjs.com) service adapter for in-memory data storage that works on all platforms.
|
|
8
8
|
|
|
@@ -10,8 +10,7 @@ A [Feathers](https://feathersjs.com) service adapter for in-memory data storage
|
|
|
10
10
|
$ npm install --save @feathersjs/memory
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
>
|
|
14
|
-
|
|
13
|
+
> **Important:** `@feathersjs/memory` implements the [Feathers Common database adapter API](https://docs.feathersjs.com/api/databases/common.html) and [querying syntax](https://docs.feathersjs.com/api/databases/querying.html).
|
|
15
14
|
|
|
16
15
|
## API
|
|
17
16
|
|
|
@@ -20,21 +19,22 @@ $ npm install --save @feathersjs/memory
|
|
|
20
19
|
Returns a new service instance initialized with the given options.
|
|
21
20
|
|
|
22
21
|
```js
|
|
23
|
-
const service = require('@feathersjs/memory')
|
|
22
|
+
const service = require('@feathersjs/memory')
|
|
24
23
|
|
|
25
|
-
app.use('/messages', service())
|
|
26
|
-
app.use('/messages', service({ id, startId, store, events, paginate }))
|
|
24
|
+
app.use('/messages', service())
|
|
25
|
+
app.use('/messages', service({ id, startId, store, events, paginate }))
|
|
27
26
|
```
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
**Options:**
|
|
30
29
|
|
|
31
|
-
- `id` (
|
|
32
|
-
- `startId` (
|
|
33
|
-
- `store` (
|
|
34
|
-
- `events` (
|
|
35
|
-
- `paginate` (
|
|
36
|
-
- `whitelist` (
|
|
37
|
-
- `
|
|
30
|
+
- `id` (_optional_, default: `'id'`) - The name of the id field property.
|
|
31
|
+
- `startId` (_optional_, default: `0`) - An id number to start with that will be incremented for every new record (unless it is already set).
|
|
32
|
+
- `store` (_optional_) - An object with id to item assignments to pre-initialize the data store
|
|
33
|
+
- `events` (_optional_) - A list of [custom service events](https://docs.feathersjs.com/api/events.html#custom-events) sent by this service
|
|
34
|
+
- `paginate` (_optional_) - A [pagination object](https://docs.feathersjs.com/api/databases/common.html#pagination) containing a `default` and `max` page size
|
|
35
|
+
- `whitelist` (_DEPRECATED_) - renamed to `allow`
|
|
36
|
+
- `allow` (_optional_) - A list of additional query parameters to allow
|
|
37
|
+
- `multi` (_optional_) - Allow `create` with arrays and `update` and `remove` with `id` `null` to change multiple items. Can be `true` for all methods or an array of allowed methods (e.g. `[ 'remove', 'create' ]`)
|
|
38
38
|
|
|
39
39
|
## Example
|
|
40
40
|
|
|
@@ -47,50 +47,56 @@ $ npm install @feathersjs/feathers @feathersjs/express @feathersjs/socketio @fea
|
|
|
47
47
|
In `app.js`:
|
|
48
48
|
|
|
49
49
|
```js
|
|
50
|
-
const feathers = require('@feathersjs/feathers')
|
|
51
|
-
const express = require('@feathersjs/express')
|
|
52
|
-
const socketio = require('@feathersjs/socketio')
|
|
50
|
+
const feathers = require('@feathersjs/feathers')
|
|
51
|
+
const express = require('@feathersjs/express')
|
|
52
|
+
const socketio = require('@feathersjs/socketio')
|
|
53
53
|
|
|
54
|
-
const memory = require('@feathersjs/memory')
|
|
54
|
+
const memory = require('@feathersjs/memory')
|
|
55
55
|
|
|
56
56
|
// Create an Express compatible Feathers application instance.
|
|
57
|
-
const app = express(feathers())
|
|
57
|
+
const app = express(feathers())
|
|
58
58
|
// Turn on JSON parser for REST services
|
|
59
|
-
app.use(express.json())
|
|
59
|
+
app.use(express.json())
|
|
60
60
|
// Turn on URL-encoded parser for REST services
|
|
61
|
-
app.use(express.urlencoded({ extended: true }))
|
|
61
|
+
app.use(express.urlencoded({ extended: true }))
|
|
62
62
|
// Enable REST services
|
|
63
|
-
app.configure(express.rest())
|
|
63
|
+
app.configure(express.rest())
|
|
64
64
|
// Enable REST services
|
|
65
|
-
app.configure(socketio())
|
|
65
|
+
app.configure(socketio())
|
|
66
66
|
// Create an in-memory Feathers service with a default page size of 2 items
|
|
67
67
|
// and a maximum size of 4
|
|
68
|
-
app.use(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
app.use(
|
|
69
|
+
'/messages',
|
|
70
|
+
memory({
|
|
71
|
+
paginate: {
|
|
72
|
+
default: 2,
|
|
73
|
+
max: 4
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
)
|
|
74
77
|
// Set up default error handler
|
|
75
|
-
app.use(express.errorHandler())
|
|
78
|
+
app.use(express.errorHandler())
|
|
76
79
|
|
|
77
80
|
// Create a dummy Message
|
|
78
|
-
app
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
app
|
|
82
|
+
.service('messages')
|
|
83
|
+
.create({
|
|
84
|
+
text: 'Message created on server'
|
|
85
|
+
})
|
|
86
|
+
.then((message) => console.log('Created message', message))
|
|
81
87
|
|
|
82
88
|
// Start the server.
|
|
83
|
-
const port = 3030
|
|
89
|
+
const port = 3030
|
|
84
90
|
|
|
85
91
|
app.listen(port, () => {
|
|
86
92
|
console.log(`Feathers server listening on port ${port}`)
|
|
87
|
-
})
|
|
93
|
+
})
|
|
88
94
|
```
|
|
89
95
|
|
|
90
96
|
Run the example with `node app` and go to [localhost:3030/messages](http://localhost:3030/messages).
|
|
91
97
|
|
|
92
98
|
## License
|
|
93
99
|
|
|
94
|
-
Copyright (c)
|
|
100
|
+
Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors)
|
|
95
101
|
|
|
96
102
|
Licensed under the [MIT license](LICENSE).
|
package/lib/index.d.ts
CHANGED
|
@@ -1,30 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { NullableId, Id } from '@feathersjs/feathers';
|
|
1
|
+
import { AdapterBase, AdapterServiceOptions, PaginationOptions, AdapterParams } from '@feathersjs/adapter-commons';
|
|
2
|
+
import { NullableId, Id, Params, Paginated } from '@feathersjs/feathers';
|
|
3
3
|
export interface MemoryServiceStore<T> {
|
|
4
4
|
[key: string]: T;
|
|
5
5
|
}
|
|
6
|
-
export interface MemoryServiceOptions<T = any> extends
|
|
7
|
-
store
|
|
8
|
-
startId
|
|
6
|
+
export interface MemoryServiceOptions<T = any> extends AdapterServiceOptions {
|
|
7
|
+
store?: MemoryServiceStore<T>;
|
|
8
|
+
startId?: number;
|
|
9
9
|
matcher?: (query: any) => any;
|
|
10
10
|
sorter?: (sort: any) => any;
|
|
11
11
|
}
|
|
12
|
-
export declare class
|
|
13
|
-
|
|
14
|
-
store: MemoryServiceStore<T>;
|
|
12
|
+
export declare class MemoryAdapter<Result = any, Data = Partial<Result>, ServiceParams extends Params = Params, PatchData = Partial<Data>> extends AdapterBase<Result, Data, PatchData, ServiceParams, MemoryServiceOptions<Result>> {
|
|
13
|
+
store: MemoryServiceStore<Result>;
|
|
15
14
|
_uId: number;
|
|
16
|
-
constructor(options?:
|
|
17
|
-
getEntries(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
constructor(options?: MemoryServiceOptions<Result>);
|
|
16
|
+
getEntries(_params?: ServiceParams): Promise<Result[]>;
|
|
17
|
+
getQuery(params: ServiceParams): {
|
|
18
|
+
query: {
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
};
|
|
21
|
+
filters: {
|
|
22
|
+
$skip: any;
|
|
23
|
+
$sort: any;
|
|
24
|
+
$limit: any;
|
|
25
|
+
$select: any;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
_find(_params?: ServiceParams & {
|
|
29
|
+
paginate?: PaginationOptions;
|
|
30
|
+
}): Promise<Paginated<Result>>;
|
|
31
|
+
_find(_params?: ServiceParams & {
|
|
32
|
+
paginate: false;
|
|
33
|
+
}): Promise<Result[]>;
|
|
34
|
+
_find(_params?: ServiceParams): Promise<Paginated<Result> | Result[]>;
|
|
35
|
+
_get(id: Id, params?: ServiceParams): Promise<Result>;
|
|
36
|
+
_create(data: Partial<Data>, params?: ServiceParams): Promise<Result>;
|
|
37
|
+
_create(data: Partial<Data>[], params?: ServiceParams): Promise<Result[]>;
|
|
38
|
+
_create(data: Partial<Data> | Partial<Data>[], _params?: ServiceParams): Promise<Result | Result[]>;
|
|
39
|
+
_update(id: Id, data: Data, params?: ServiceParams): Promise<Result>;
|
|
40
|
+
_patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>;
|
|
41
|
+
_patch(id: Id, data: PatchData, params?: ServiceParams): Promise<Result>;
|
|
42
|
+
_patch(id: NullableId, data: PatchData, _params?: ServiceParams): Promise<Result | Result[]>;
|
|
43
|
+
_remove(id: null, params?: ServiceParams): Promise<Result[]>;
|
|
44
|
+
_remove(id: Id, params?: ServiceParams): Promise<Result>;
|
|
45
|
+
_remove(id: NullableId, _params?: ServiceParams): Promise<Result | Result[]>;
|
|
29
46
|
}
|
|
30
|
-
export declare
|
|
47
|
+
export declare class MemoryService<Result = any, Data = Partial<Result>, ServiceParams extends AdapterParams = AdapterParams, PatchData = Partial<Data>> extends MemoryAdapter<Result, Data, ServiceParams, PatchData> {
|
|
48
|
+
find(params?: ServiceParams & {
|
|
49
|
+
paginate?: PaginationOptions;
|
|
50
|
+
}): Promise<Paginated<Result>>;
|
|
51
|
+
find(params?: ServiceParams & {
|
|
52
|
+
paginate: false;
|
|
53
|
+
}): Promise<Result[]>;
|
|
54
|
+
find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>;
|
|
55
|
+
get(id: Id, params?: ServiceParams): Promise<Result>;
|
|
56
|
+
create(data: Data, params?: ServiceParams): Promise<Result>;
|
|
57
|
+
create(data: Data[], params?: ServiceParams): Promise<Result[]>;
|
|
58
|
+
update(id: Id, data: Data, params?: ServiceParams): Promise<Result>;
|
|
59
|
+
patch(id: Id, data: PatchData, params?: ServiceParams): Promise<Result>;
|
|
60
|
+
patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>;
|
|
61
|
+
remove(id: Id, params?: ServiceParams): Promise<Result>;
|
|
62
|
+
remove(id: null, params?: ServiceParams): Promise<Result[]>;
|
|
63
|
+
}
|
|
64
|
+
export declare function memory<T = any, D = Partial<T>, P extends Params = Params>(options?: Partial<MemoryServiceOptions<T>>): MemoryService<T, D, P, Partial<D>>;
|
package/lib/index.js
CHANGED
|
@@ -1,136 +1,198 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
14
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.memory = exports.
|
|
6
|
+
exports.memory = exports.MemoryService = exports.MemoryAdapter = void 0;
|
|
16
7
|
const errors_1 = require("@feathersjs/errors");
|
|
17
8
|
const commons_1 = require("@feathersjs/commons");
|
|
18
9
|
const adapter_commons_1 = require("@feathersjs/adapter-commons");
|
|
19
10
|
const sift_1 = __importDefault(require("sift"));
|
|
20
11
|
const _select = (data, params, ...args) => {
|
|
21
|
-
const base = adapter_commons_1.select(params, ...args);
|
|
12
|
+
const base = (0, adapter_commons_1.select)(params, ...args);
|
|
22
13
|
return base(JSON.parse(JSON.stringify(data)));
|
|
23
14
|
};
|
|
24
|
-
class
|
|
15
|
+
class MemoryAdapter extends adapter_commons_1.AdapterBase {
|
|
25
16
|
constructor(options = {}) {
|
|
26
|
-
super(
|
|
17
|
+
super({
|
|
27
18
|
id: 'id',
|
|
28
19
|
matcher: sift_1.default,
|
|
29
|
-
sorter: adapter_commons_1.sorter
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
getEntries(params = {}) {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
const { query } = this.filterQuery(params);
|
|
37
|
-
return this._find(Object.assign({}, params, {
|
|
38
|
-
paginate: false,
|
|
39
|
-
query
|
|
40
|
-
}));
|
|
20
|
+
sorter: adapter_commons_1.sorter,
|
|
21
|
+
store: {},
|
|
22
|
+
startId: 0,
|
|
23
|
+
...options
|
|
41
24
|
});
|
|
25
|
+
this._uId = this.options.startId;
|
|
26
|
+
this.store = { ...this.options.store };
|
|
42
27
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (filters.$sort !== undefined) {
|
|
49
|
-
values.sort(this.options.sorter(filters.$sort));
|
|
50
|
-
}
|
|
51
|
-
if (filters.$skip !== undefined) {
|
|
52
|
-
values = values.slice(filters.$skip);
|
|
53
|
-
}
|
|
54
|
-
if (filters.$limit !== undefined) {
|
|
55
|
-
values = values.slice(0, filters.$limit);
|
|
56
|
-
}
|
|
57
|
-
const result = {
|
|
58
|
-
total,
|
|
59
|
-
limit: filters.$limit,
|
|
60
|
-
skip: filters.$skip || 0,
|
|
61
|
-
data: values.map(value => _select(value, params))
|
|
62
|
-
};
|
|
63
|
-
if (!(paginate && (paginate).default)) {
|
|
64
|
-
return result.data;
|
|
65
|
-
}
|
|
66
|
-
return result;
|
|
28
|
+
async getEntries(_params) {
|
|
29
|
+
const params = _params || {};
|
|
30
|
+
return this._find({
|
|
31
|
+
...params,
|
|
32
|
+
paginate: false
|
|
67
33
|
});
|
|
68
34
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
35
|
+
getQuery(params) {
|
|
36
|
+
const { $skip, $sort, $limit, $select, ...query } = params.query || {};
|
|
37
|
+
return {
|
|
38
|
+
query,
|
|
39
|
+
filters: { $skip, $sort, $limit, $select }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async _find(params = {}) {
|
|
43
|
+
const { paginate } = this.getOptions(params);
|
|
44
|
+
const { query, filters } = this.getQuery(params);
|
|
45
|
+
let values = commons_1._.values(this.store);
|
|
46
|
+
const total = values.length;
|
|
47
|
+
const hasSkip = filters.$skip !== undefined;
|
|
48
|
+
const hasSort = filters.$sort !== undefined;
|
|
49
|
+
const hasLimit = filters.$limit !== undefined;
|
|
50
|
+
const hasQuery = commons_1._.keys(query).length > 0;
|
|
51
|
+
if (hasSort) {
|
|
52
|
+
values.sort(this.options.sorter(filters.$sort));
|
|
53
|
+
}
|
|
54
|
+
if (hasQuery || hasLimit || hasSkip) {
|
|
55
|
+
let skipped = 0;
|
|
56
|
+
const matcher = this.options.matcher(query);
|
|
57
|
+
const matched = [];
|
|
58
|
+
for (let index = 0, length = values.length; index < length; index++) {
|
|
59
|
+
const value = values[index];
|
|
60
|
+
if (hasQuery && !matcher(value, index, values)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (hasSkip && filters.$skip > skipped) {
|
|
64
|
+
skipped++;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
matched.push(_select(value, params));
|
|
68
|
+
if (hasLimit && filters.$limit === matched.length) {
|
|
69
|
+
break;
|
|
76
70
|
}
|
|
77
71
|
}
|
|
78
|
-
|
|
79
|
-
}
|
|
72
|
+
values = matched;
|
|
73
|
+
}
|
|
74
|
+
const result = {
|
|
75
|
+
total: hasQuery ? values.length : total,
|
|
76
|
+
limit: filters.$limit,
|
|
77
|
+
skip: filters.$skip || 0,
|
|
78
|
+
data: filters.$limit === 0 ? [] : values
|
|
79
|
+
};
|
|
80
|
+
if (!paginate) {
|
|
81
|
+
return result.data;
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
80
84
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
async _get(id, params = {}) {
|
|
86
|
+
const { query } = this.getQuery(params);
|
|
87
|
+
if (id in this.store) {
|
|
88
|
+
const value = this.store[id];
|
|
89
|
+
if (this.options.matcher(query)(value)) {
|
|
90
|
+
return _select(value, params, this.id);
|
|
86
91
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
92
|
+
}
|
|
93
|
+
throw new errors_1.NotFound(`No record found for id '${id}'`);
|
|
94
|
+
}
|
|
95
|
+
async _create(data, params = {}) {
|
|
96
|
+
if (Array.isArray(data)) {
|
|
97
|
+
return Promise.all(data.map((current) => this._create(current, params)));
|
|
98
|
+
}
|
|
99
|
+
const id = data[this.id] || this._uId++;
|
|
100
|
+
const current = commons_1._.extend({}, data, { [this.id]: id });
|
|
101
|
+
const result = (this.store[id] = current);
|
|
102
|
+
return _select(result, params, this.id);
|
|
103
|
+
}
|
|
104
|
+
async _update(id, data, params = {}) {
|
|
105
|
+
if (id === null || Array.isArray(data)) {
|
|
106
|
+
throw new errors_1.BadRequest("You can not replace multiple instances. Did you mean 'patch'?");
|
|
107
|
+
}
|
|
108
|
+
const oldEntry = await this._get(id);
|
|
109
|
+
// We don't want our id to change type if it can be coerced
|
|
110
|
+
const oldId = oldEntry[this.id];
|
|
111
|
+
// eslint-disable-next-line eqeqeq
|
|
112
|
+
id = oldId == id ? oldId : id;
|
|
113
|
+
this.store[id] = commons_1._.extend({}, data, { [this.id]: id });
|
|
114
|
+
return this._get(id, params);
|
|
115
|
+
}
|
|
116
|
+
async _patch(id, data, params = {}) {
|
|
117
|
+
if (id === null && !this.allowsMulti('patch', params)) {
|
|
118
|
+
throw new errors_1.MethodNotAllowed('Can not patch multiple entries');
|
|
119
|
+
}
|
|
120
|
+
const { query } = this.getQuery(params);
|
|
121
|
+
const patchEntry = (entry) => {
|
|
122
|
+
const currentId = entry[this.id];
|
|
123
|
+
this.store[currentId] = commons_1._.extend(this.store[currentId], commons_1._.omit(data, this.id));
|
|
124
|
+
return _select(this.store[currentId], params, this.id);
|
|
125
|
+
};
|
|
126
|
+
if (id === null) {
|
|
127
|
+
const entries = await this.getEntries({
|
|
128
|
+
...params,
|
|
129
|
+
query
|
|
130
|
+
});
|
|
131
|
+
return entries.map(patchEntry);
|
|
132
|
+
}
|
|
133
|
+
return patchEntry(await this._get(id, params)); // Will throw an error if not found
|
|
134
|
+
}
|
|
135
|
+
async _remove(id, params = {}) {
|
|
136
|
+
if (id === null && !this.allowsMulti('remove', params)) {
|
|
137
|
+
throw new errors_1.MethodNotAllowed('Can not remove multiple entries');
|
|
138
|
+
}
|
|
139
|
+
const { query } = this.getQuery(params);
|
|
140
|
+
if (id === null) {
|
|
141
|
+
const entries = await this.getEntries({
|
|
142
|
+
...params,
|
|
143
|
+
query
|
|
144
|
+
});
|
|
145
|
+
return Promise.all(entries.map((current) => this._remove(current[this.id], params)));
|
|
146
|
+
}
|
|
147
|
+
const entry = await this._get(id, params);
|
|
148
|
+
delete this.store[id];
|
|
149
|
+
return entry;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.MemoryAdapter = MemoryAdapter;
|
|
153
|
+
class MemoryService extends MemoryAdapter {
|
|
154
|
+
async find(params) {
|
|
155
|
+
return this._find({
|
|
156
|
+
...params,
|
|
157
|
+
query: await this.sanitizeQuery(params)
|
|
91
158
|
});
|
|
92
159
|
}
|
|
93
|
-
|
|
94
|
-
return
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const oldId = oldEntry[this.id];
|
|
98
|
-
// eslint-disable-next-line eqeqeq
|
|
99
|
-
id = oldId == id ? oldId : id;
|
|
100
|
-
this.store[id] = commons_1._.extend({}, data, { [this.id]: id });
|
|
101
|
-
return this._get(id, params);
|
|
160
|
+
async get(id, params) {
|
|
161
|
+
return this._get(id, {
|
|
162
|
+
...params,
|
|
163
|
+
query: await this.sanitizeQuery(params)
|
|
102
164
|
});
|
|
103
165
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
return patchEntry(yield this._get(id, params)); // Will throw an error if not found
|
|
166
|
+
async create(data, params) {
|
|
167
|
+
if (Array.isArray(data) && !this.allowsMulti('create', params)) {
|
|
168
|
+
throw new errors_1.MethodNotAllowed('Can not create multiple entries');
|
|
169
|
+
}
|
|
170
|
+
return this._create(data, params);
|
|
171
|
+
}
|
|
172
|
+
async update(id, data, params) {
|
|
173
|
+
return this._update(id, data, {
|
|
174
|
+
...params,
|
|
175
|
+
query: await this.sanitizeQuery(params)
|
|
116
176
|
});
|
|
117
177
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
178
|
+
async patch(id, data, params) {
|
|
179
|
+
const { $limit, ...query } = await this.sanitizeQuery(params);
|
|
180
|
+
return this._patch(id, data, {
|
|
181
|
+
...params,
|
|
182
|
+
query
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async remove(id, params) {
|
|
186
|
+
const { $limit, ...query } = await this.sanitizeQuery(params);
|
|
187
|
+
return this._remove(id, {
|
|
188
|
+
...params,
|
|
189
|
+
query
|
|
128
190
|
});
|
|
129
191
|
}
|
|
130
192
|
}
|
|
131
|
-
exports.
|
|
193
|
+
exports.MemoryService = MemoryService;
|
|
132
194
|
function memory(options = {}) {
|
|
133
|
-
return new
|
|
195
|
+
return new MemoryService(options);
|
|
134
196
|
}
|
|
135
197
|
exports.memory = memory;
|
|
136
198
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feathersjs/memory",
|
|
3
3
|
"description": "An in memory service store",
|
|
4
|
-
"version": "5.0.0
|
|
4
|
+
"version": "5.0.0",
|
|
5
5
|
"homepage": "https://github.com/feathersjs/feathers",
|
|
6
6
|
"main": "lib/",
|
|
7
|
+
"types": "lib/",
|
|
7
8
|
"keywords": [
|
|
8
9
|
"feathers",
|
|
9
10
|
"feathers-plugin"
|
|
@@ -11,7 +12,8 @@
|
|
|
11
12
|
"license": "MIT",
|
|
12
13
|
"repository": {
|
|
13
14
|
"type": "git",
|
|
14
|
-
"url": "git://github.com/feathersjs/feathers.git"
|
|
15
|
+
"url": "git://github.com/feathersjs/feathers.git",
|
|
16
|
+
"directory": "packages/memory"
|
|
15
17
|
},
|
|
16
18
|
"author": {
|
|
17
19
|
"name": "Feathers contributors",
|
|
@@ -29,15 +31,16 @@
|
|
|
29
31
|
"CHANGELOG.md",
|
|
30
32
|
"LICENSE",
|
|
31
33
|
"README.md",
|
|
34
|
+
"_templates/**",
|
|
32
35
|
"src/**",
|
|
33
36
|
"lib/**",
|
|
34
37
|
"*.js"
|
|
35
38
|
],
|
|
36
39
|
"scripts": {
|
|
37
40
|
"prepublish": "npm run compile",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
+
"pack": "npm pack --pack-destination ../generators/test/build",
|
|
42
|
+
"compile": "shx rm -rf lib/ && tsc && npm run pack",
|
|
43
|
+
"test": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts"
|
|
41
44
|
},
|
|
42
45
|
"publishConfig": {
|
|
43
46
|
"access": "public"
|
|
@@ -46,20 +49,20 @@
|
|
|
46
49
|
"lib": "lib"
|
|
47
50
|
},
|
|
48
51
|
"dependencies": {
|
|
49
|
-
"@feathersjs/adapter-commons": "^5.0.0
|
|
50
|
-
"@feathersjs/commons": "^5.0.0
|
|
51
|
-
"@feathersjs/errors": "^5.0.0
|
|
52
|
-
"sift": "^
|
|
52
|
+
"@feathersjs/adapter-commons": "^5.0.0",
|
|
53
|
+
"@feathersjs/commons": "^5.0.0",
|
|
54
|
+
"@feathersjs/errors": "^5.0.0",
|
|
55
|
+
"sift": "^16.0.1"
|
|
53
56
|
},
|
|
54
57
|
"devDependencies": {
|
|
55
|
-
"@feathersjs/adapter-tests": "^5.0.0
|
|
56
|
-
"@feathersjs/feathers": "^5.0.0
|
|
57
|
-
"@types/mocha": "^
|
|
58
|
-
"@types/node": "^
|
|
59
|
-
"mocha": "^
|
|
60
|
-
"shx": "^0.3.
|
|
61
|
-
"ts-node": "^10.1
|
|
62
|
-
"typescript": "^4.
|
|
58
|
+
"@feathersjs/adapter-tests": "^5.0.0",
|
|
59
|
+
"@feathersjs/feathers": "^5.0.0",
|
|
60
|
+
"@types/mocha": "^10.0.1",
|
|
61
|
+
"@types/node": "^18.14.1",
|
|
62
|
+
"mocha": "^10.2.0",
|
|
63
|
+
"shx": "^0.3.4",
|
|
64
|
+
"ts-node": "^10.9.1",
|
|
65
|
+
"typescript": "^4.9.5"
|
|
63
66
|
},
|
|
64
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5"
|
|
65
68
|
}
|