From 3ad413f60fb715a83b793e6df22435e4974b1110 Mon Sep 17 00:00:00 2001 From: wll8 Date: Mon, 25 Jul 2022 10:41:39 +0800 Subject: [PATCH 01/10] feat: Add _noDataNext option --- __tests__/cli/index.js | 2 +- src/server/router/index.js | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/__tests__/cli/index.js b/__tests__/cli/index.js index 69ac1bcd4..ae7861504 100644 --- a/__tests__/cli/index.js +++ b/__tests__/cli/index.js @@ -99,7 +99,7 @@ describe('cli', () => { }) }) - describe('remote db', () => { + describe.skip('remote db', () => { beforeEach((done) => { child = cli(['https://jsonplaceholder.typicode.com/db']) serverReady(PORT, done) diff --git a/src/server/router/index.js b/src/server/router/index.js index 8a246b1bc..5a246caa3 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -13,7 +13,14 @@ const singular = require('./singular') const mixins = require('../mixins') module.exports = (db, opts) => { - opts = Object.assign({ foreignKeySuffix: 'Id', _isFake: false }, opts) + opts = Object.assign( + { + foreignKeySuffix: 'Id', + _isFake: false, + _noDataNext: false, + }, + opts + ) if (typeof db === 'string') { db = low(new FileSync(db)) @@ -50,7 +57,10 @@ module.exports = (db, opts) => { }) // Handle /:parent/:parentId/:resource - router.use(nested(opts)) + const keys = Object.keys(db.value()).map((key) => `/${key}`) + opts._noDataNext && keys.length + ? router.use(keys, nested(opts)) + : router.use(nested(opts)) // Create routes db.forEach((value, key) => { @@ -76,15 +86,18 @@ module.exports = (db, opts) => { throw new Error(msg) }).value() - router.use((req, res) => { + const render = (req, res) => { if (!res.locals.data) { res.status(404) res.locals.data = {} } router.render(req, res) - }) + } + opts._noDataNext && keys.length + ? router.use(keys, render) + : router.use(render) router.use((err, req, res, next) => { console.error(err.stack) res.status(500).send(err.stack) From 6efa065bb919b86acdf2280a27d766d1b597ebf2 Mon Sep 17 00:00:00 2001 From: wll8 Date: Fri, 27 May 2022 14:47:32 +0800 Subject: [PATCH 02/10] feat: Add _noDbRoute option --- src/server/router/index.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/server/router/index.js b/src/server/router/index.js index 5a246caa3..977b94e04 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -18,6 +18,7 @@ module.exports = (db, opts) => { foreignKeySuffix: 'Id', _isFake: false, _noDataNext: false, + _noDbRoute: false, }, opts ) @@ -52,9 +53,10 @@ module.exports = (db, opts) => { } // GET /db - router.get('/db', (req, res) => { - res.jsonp(db.getState()) - }) + !opts._noDbRoute && + router.get('/db', (req, res) => { + res.jsonp(db.getState()) + }) // Handle /:parent/:parentId/:resource const keys = Object.keys(db.value()).map((key) => `/${key}`) From 480776731e0e3a38f3d82dbbaa6b47b6e9692c78 Mon Sep 17 00:00:00 2001 From: wll8 Date: Mon, 25 Jul 2022 09:59:43 +0800 Subject: [PATCH 03/10] feat: export express --- .gitignore | 3 +++ src/server/index.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 38c350585..76d9dbdd5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ lib .DS_Store .idea db.json + +.history +*.tgz \ No newline at end of file diff --git a/src/server/index.js b/src/server/index.js index 1f2933d8b..2750ef8b0 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -1,6 +1,9 @@ const express = require('express') module.exports = { + lib: { + express, + }, create: () => express().set('json spaces', 2), defaults: require('./defaults'), router: require('./router'), From 361867ff49a181ea24938f0fffe03abdfc84c8f4 Mon Sep 17 00:00:00 2001 From: wll8 Date: Mon, 25 Jul 2022 15:06:15 +0800 Subject: [PATCH 04/10] fix: Server with custom foreign key commit: 75917f8 Need to run `router.use(nested(opts))` when `_noDataNext` is false. --- package.json | 4 ++-- src/server/router/index.js | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 3db9200d3..1b9695812 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "json-server", - "version": "0.17.0", + "name": "@wll8/json-server", + "version": "0.17.2-alpha.2", "description": "Get a full fake REST API with zero coding in less than 30 seconds", "main": "./lib/server/index.js", "bin": "./lib/cli/bin.js", diff --git a/src/server/router/index.js b/src/server/router/index.js index 977b94e04..799a11a8e 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -60,9 +60,8 @@ module.exports = (db, opts) => { // Handle /:parent/:parentId/:resource const keys = Object.keys(db.value()).map((key) => `/${key}`) - opts._noDataNext && keys.length - ? router.use(keys, nested(opts)) - : router.use(nested(opts)) + opts._noDataNext && keys.length && router.use(keys, nested(opts)) + !opts._noDataNext && router.use(nested(opts)) // Create routes db.forEach((value, key) => { @@ -97,9 +96,8 @@ module.exports = (db, opts) => { router.render(req, res) } - opts._noDataNext && keys.length - ? router.use(keys, render) - : router.use(render) + opts._noDataNext && keys.length && router.use(keys, render) + !opts._noDataNext && router.use(render) router.use((err, req, res, next) => { console.error(err.stack) res.status(500).send(err.stack) From 0ee71223282d67fd038dc3908322e593f61cdf2a Mon Sep 17 00:00:00 2001 From: wll8 Date: Tue, 30 Aug 2022 15:26:54 +0800 Subject: [PATCH 05/10] refactor: Optimize options for jsonServer.defaults --- src/server/defaults.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/server/defaults.js b/src/server/defaults.js index a0a8b7a7a..9e636ee18 100644 --- a/src/server/defaults.js +++ b/src/server/defaults.js @@ -12,7 +12,17 @@ module.exports = function (opts) { const defaultDir = path.join(__dirname, '../../public') const staticDir = fs.existsSync(userDir) ? userDir : defaultDir - opts = Object.assign({ logger: true, static: staticDir }, opts) + opts = Object.assign( + { + noGzip: undefined, + noCors: undefined, + readOnly: undefined, + bodyParser: undefined, + logger: true, + static: staticDir, + }, + opts + ) const arr = [] From 0e843ada46eef8c74517b096353494a6d95ba994 Mon Sep 17 00:00:00 2001 From: wll8 Date: Tue, 30 Aug 2022 15:45:42 +0800 Subject: [PATCH 06/10] feat: Allow custom bodyParser in jsonServer.router --- package.json | 2 +- src/server/defaults.js | 7 +++++-- src/server/router/index.js | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1b9695812..e603edf1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wll8/json-server", - "version": "0.17.2-alpha.2", + "version": "0.17.2-alpha.3", "description": "Get a full fake REST API with zero coding in less than 30 seconds", "main": "./lib/server/index.js", "bin": "./lib/cli/bin.js", diff --git a/src/server/defaults.js b/src/server/defaults.js index 9e636ee18..72acdb5b9 100644 --- a/src/server/defaults.js +++ b/src/server/defaults.js @@ -17,7 +17,7 @@ module.exports = function (opts) { noGzip: undefined, noCors: undefined, readOnly: undefined, - bodyParser: undefined, + bodyParser: undefined, // true / false / object logger: true, static: staticDir, }, @@ -75,9 +75,12 @@ module.exports = function (opts) { } // Add middlewares - if (opts.bodyParser) { + if (opts.bodyParser && typeof opts.bodyParser !== `object`) { arr.push(bodyParser) } + if (opts.bodyParser && typeof opts.bodyParser === `object`) { + arr.push(opts.bodyParser) + } return arr } diff --git a/src/server/router/index.js b/src/server/router/index.js index 799a11a8e..99fa19132 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -19,6 +19,7 @@ module.exports = (db, opts) => { _isFake: false, _noDataNext: false, _noDbRoute: false, + bodyParser: undefined, }, opts ) @@ -34,7 +35,7 @@ module.exports = (db, opts) => { // Add middlewares router.use(methodOverride()) - router.use(bodyParser) + router.use(typeof opts.bodyParser === `object` ? opts.bodyParser : bodyParser) validateData(db.getState()) From 098dd656c6c33056ed4d5f9ab5a191217f7e0131 Mon Sep 17 00:00:00 2001 From: wll8 Date: Tue, 8 Nov 2022 16:14:27 +0800 Subject: [PATCH 07/10] fix: The nested function should not fail --- .gitignore | 1 + __tests__/arg.js.run | 15 +++++++++++++++ __tests__/server/plural.js | 17 +++++++++++------ package.json | 2 +- src/cli/index.js | 10 ++++++++++ src/cli/run.js | 9 +++------ src/server/router/index.js | 25 ++++++++++++------------- src/server/utils.js | 20 ++++++++++++++++++++ 8 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 __tests__/arg.js.run diff --git a/.gitignore b/.gitignore index 76d9dbdd5..986b5dd13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/*.log +__tests__/**/db-*.json node_modules tmp lib diff --git a/__tests__/arg.js.run b/__tests__/arg.js.run new file mode 100644 index 000000000..c29075017 --- /dev/null +++ b/__tests__/arg.js.run @@ -0,0 +1,15 @@ +const cp = require('child_process') +test({ _noDataNext: true }) +test({ _noDbRoute: true }) + +function test(obj) { + const arg = Object.entries(obj).reduce((acc, [key, val]) => { + return `${acc} ${key}=${val}` + }, ``) + cp.execSync( + `npm run build && npx cross-env NODE_ENV=test arg="${arg}" jest && npm run lint`, + { + stdio: 'inherit', + } + ) +} diff --git a/__tests__/server/plural.js b/__tests__/server/plural.js index 67043cc9b..209847555 100644 --- a/__tests__/server/plural.js +++ b/__tests__/server/plural.js @@ -2,6 +2,8 @@ const assert = require('assert') const _ = require('lodash') const request = require('supertest') const jsonServer = require('../../src/server') +const { parseArgv } = require('../../src/server/utils') +const cliArg = parseArgv(process.env.arg) describe('Server', () => { let server @@ -87,7 +89,7 @@ describe('Server', () => { ] server = jsonServer.create() - router = jsonServer.router(db) + router = jsonServer.router(db, cliArg) server.use(jsonServer.defaults()) server.use(jsonServer.rewriter(rewriterRules)) server.use(router) @@ -95,7 +97,10 @@ describe('Server', () => { describe('GET /db', () => { test('should respond with json and full database', () => - request(server).get('/db').expect('Content-Type', /json/).expect(200, db)) + request(server) + .get('/db') + .expect('Content-Type', /json/) + .expect(...(cliArg._noDbRoute ? [404, {}] : [200, db]))) }) describe('GET /:resource', () => { @@ -370,7 +375,7 @@ describe('Server', () => { test('should respond with 404 if resource is not found', () => request(server) .get('/posts/9001') - .expect('Content-Type', /json/) + .expect('Content-Type', cliArg._noDataNext ? /html/ : /json/) .expect(404, {})) }) @@ -567,7 +572,7 @@ describe('Server', () => { request(server) .put('/posts/9001') .send({ id: 1, body: 'bar' }) - .expect('Content-Type', /json/) + .expect('Content-Type', cliArg._noDataNext ? /html/ : /json/) .expect(404, {})) }) @@ -603,7 +608,7 @@ describe('Server', () => { request(server) .patch('/posts/9001') .send({ body: 'bar' }) - .expect('Content-Type', /json/) + .expect('Content-Type', cliArg._noDataNext ? /html/ : /json/) .expect(404, {})) }) @@ -631,7 +636,7 @@ describe('Server', () => { test('should respond with 404 if resource is not found', () => request(server) .del('/posts/9001') - .expect('Content-Type', /json/) + .expect('Content-Type', cliArg._noDataNext ? /html/ : /json/) .expect(404, {})) }) diff --git a/package.json b/package.json index e603edf1e..595e92880 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ ], "scripts": { "prepare": "husky install", - "test": "npm run build && cross-env NODE_ENV=test jest && npm run lint", + "test": "npm run build && cross-env NODE_ENV=test jest && node __tests__/arg.js.run && npm run lint", "start": "babel-node -- src/cli/bin db.json -r routes.json", "lint": "eslint . --ignore-path .gitignore", "fix": "npm run lint -- --fix", diff --git a/src/cli/index.js b/src/cli/index.js index e703cede2..2b9e940db 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -77,6 +77,16 @@ module.exports = function () { description: 'Path to config file', default: 'json-server.json', }, + _noDbRoute: { + type: 'boolean', + description: 'Do not use the /db route', + default: false, + }, + _noDataNext: { + type: 'boolean', + description: 'Enter a middleware when there is no data', + default: false, + }, }) .boolean('watch') .boolean('read-only') diff --git a/src/cli/run.js b/src/cli/run.js index 294145e33..4d8968c8d 100644 --- a/src/cli/run.js +++ b/src/cli/run.js @@ -35,14 +35,11 @@ function prettyPrint(argv, object, rules) { function createApp(db, routes, middlewares, argv) { const app = jsonServer.create() - const { foreignKeySuffix } = argv - - const router = jsonServer.router( - db, - foreignKeySuffix ? { foreignKeySuffix } : undefined - ) + const router = jsonServer.router(db, argv) const defaultsOpts = { + _noDataNext: argv._noDataNext, + _noDbRoute: argv._noDbRoute, logger: !argv.quiet, readOnly: argv.readOnly, noCors: argv.noCors, diff --git a/src/server/router/index.js b/src/server/router/index.js index 99fa19132..f107a5714 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -49,7 +49,11 @@ module.exports = (db, opts) => { router.db = db // Expose render - router.render = (req, res) => { + router.render = (req, res, next) => { + if (!res.locals.data) { + res.status(404) + res.locals.data = {} + } res.jsonp(res.locals.data) } @@ -60,9 +64,7 @@ module.exports = (db, opts) => { }) // Handle /:parent/:parentId/:resource - const keys = Object.keys(db.value()).map((key) => `/${key}`) - opts._noDataNext && keys.length && router.use(keys, nested(opts)) - !opts._noDataNext && router.use(nested(opts)) + router.use(nested(opts)) // Create routes db.forEach((value, key) => { @@ -88,17 +90,14 @@ module.exports = (db, opts) => { throw new Error(msg) }).value() - const render = (req, res) => { - if (!res.locals.data) { - res.status(404) - res.locals.data = {} + router.use((req, res, next) => { + if (opts._noDataNext && !res.locals.data) { + next() + } else { + router.render(req, res, next) } + }) - router.render(req, res) - } - - opts._noDataNext && keys.length && router.use(keys, render) - !opts._noDataNext && router.use(render) router.use((err, req, res, next) => { console.error(err.stack) res.status(500).send(err.stack) diff --git a/src/server/utils.js b/src/server/utils.js index c84b36af9..2b5877134 100644 --- a/src/server/utils.js +++ b/src/server/utils.js @@ -1,7 +1,27 @@ module.exports = { + parseArgv, getPage, } +function parseArgv(arr) { + arr = typeof arr === 'string' ? arr.trim().split(/\s+/) : arr + return (arr || process.argv.slice(2)).reduce((acc, arg) => { + let [k, ...v] = arg.split(`=`) + v = v.join(`=`) + acc[k] = + v === `` + ? true + : /^(true|false)$/.test(v) + ? v === `true` + : /[\d|.]+/.test(v) + ? isNaN(Number(v)) + ? v + : Number(v) + : v + return acc + }, {}) +} + function getPage(array, page, perPage) { const obj = {} const start = (page - 1) * perPage From c270d9c4db513e7c83a6746eea7be02fb1d08373 Mon Sep 17 00:00:00 2001 From: wll8 Date: Tue, 8 Nov 2022 16:19:33 +0800 Subject: [PATCH 08/10] build: update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 595e92880..240d14394 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wll8/json-server", - "version": "0.17.2-alpha.3", + "version": "0.17.2-alpha.4", "description": "Get a full fake REST API with zero coding in less than 30 seconds", "main": "./lib/server/index.js", "bin": "./lib/cli/bin.js", From 5fd88ab492cf476e37d9828056d70f4822dab2f8 Mon Sep 17 00:00:00 2001 From: wll8 Date: Tue, 8 Nov 2022 17:07:25 +0800 Subject: [PATCH 09/10] chore: remove scope --- __tests__/cli/index.js | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/__tests__/cli/index.js b/__tests__/cli/index.js index ae7861504..69ac1bcd4 100644 --- a/__tests__/cli/index.js +++ b/__tests__/cli/index.js @@ -99,7 +99,7 @@ describe('cli', () => { }) }) - describe.skip('remote db', () => { + describe('remote db', () => { beforeEach((done) => { child = cli(['https://jsonplaceholder.typicode.com/db']) serverReady(PORT, done) diff --git a/package-lock.json b/package-lock.json index d0fb44eec..171a24711 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@wll8/json-server", + "name": "json-server", "version": "0.17.2-alpha.5", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@wll8/json-server", + "name": "json-server", "version": "0.17.2-alpha.5", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b56478b06..462e9fb9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@wll8/json-server", - "version": "0.17.2-alpha.5", + "name": "json-server", + "version": "0.17.1", "description": "Get a full fake REST API with zero coding in less than 30 seconds", "main": "./lib/server/index.js", "bin": "./lib/cli/bin.js", From a0b69cd58f6688aea5aaf3b4d0c3c70a0accdd3e Mon Sep 17 00:00:00 2001 From: wll8 Date: Wed, 9 Nov 2022 18:41:40 +0800 Subject: [PATCH 10/10] feat: add _noRemoveDependents options --- README.md | 56 +++++++++++++++++++++++++++++++++++++ __tests__/arg.js.run | 1 + __tests__/server/plural.js | 2 +- src/cli/index.js | 5 ++++ src/cli/run.js | 1 + src/server/router/index.js | 1 + src/server/router/plural.js | 10 ++++--- 7 files changed, 71 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a8763cbfc..3fd390ce8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,59 @@ +This code is modified based on [typicode/json-server](https://github.com/typicode/json-server). Used to change some features, if these features are liked, they will apply to typicode for a merge. + +### Install + +``` sh +npm i @wll8/json-server +# or npm i -g @wll8/json-server +``` + +### jsonServer.defaults +Now you can customize the size of the request body + +``` js +jsonServer.defaults({ + bodyParser: [ + bodyParser.json({ + limit: `100mb`, + extended: false, + }), + bodyParser.urlencoded({ + extended: false, + }), + ] +}) +``` + +- issues: [#38](https://github.com/typicode/json-server/pull/38), [#37](https://github.com/typicode/json-server/pull/37) + +### express +At present, it seems that json-server relies heavily on express and is inconvenient to upgrade, so using its dependencies directly will make me install one less package + +``` js +const {lib: { express }} = jsonServer +``` + + +### options._noRemoveDependents +After deleting data, do not clean up data that are not related to each other + +- type: boolean +- Defaults: false +- issues: [#885](https://github.com/typicode/json-server/issues/885) + +### options._noDataNext +Allows entry to the next route when there is no data, which makes it work seamlessly with other programs + +- type: boolean +- Defaults: false +- issues: [#1330](https://github.com/typicode/json-server/issues/1330) + +### options._noDbRoute +Assuming a db.json data breach poses a risk, it can be turned off with this option + +- type: boolean +- Defaults: false + # JSON Server [![Node.js CI](https://github.com/typicode/json-server/actions/workflows/node.js.yml/badge.svg?branch=master)](https://github.com/typicode/json-server/actions/workflows/node.js.yml) Get a full fake REST API with __zero coding__ in __less than 30 seconds__ (seriously) diff --git a/__tests__/arg.js.run b/__tests__/arg.js.run index c29075017..4f8a229b4 100644 --- a/__tests__/arg.js.run +++ b/__tests__/arg.js.run @@ -1,6 +1,7 @@ const cp = require('child_process') test({ _noDataNext: true }) test({ _noDbRoute: true }) +test({ _noRemoveDependents: true }) function test(obj) { const arg = Object.entries(obj).reduce((acc, [key, val]) => { diff --git a/__tests__/server/plural.js b/__tests__/server/plural.js index 209847555..316471807 100644 --- a/__tests__/server/plural.js +++ b/__tests__/server/plural.js @@ -630,7 +630,7 @@ describe('Server', () => { test('should respond with empty data, destroy resource and dependent resources', async () => { await request(server).del('/posts/1').expect(200, {}) assert.strictEqual(db.posts.length, 1) - assert.strictEqual(db.comments.length, 3) + assert.strictEqual(db.comments.length, cliArg._noRemoveDependents ? 5 : 3) }) test('should respond with 404 if resource is not found', () => diff --git a/src/cli/index.js b/src/cli/index.js index f18beb1e5..80919e85a 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -84,6 +84,11 @@ module.exports = function () { description: 'Enter a middleware when there is no data', default: false, }, + _noRemoveDependents: { + type: 'boolean', + description: 'Do not clear data without dependencies', + default: false, + }, }) .boolean('watch') .boolean('read-only') diff --git a/src/cli/run.js b/src/cli/run.js index 4d8968c8d..8c88c1ef0 100644 --- a/src/cli/run.js +++ b/src/cli/run.js @@ -38,6 +38,7 @@ function createApp(db, routes, middlewares, argv) { const router = jsonServer.router(db, argv) const defaultsOpts = { + _noRemoveDependents: argv._noRemoveDependents, _noDataNext: argv._noDataNext, _noDbRoute: argv._noDbRoute, logger: !argv.quiet, diff --git a/src/server/router/index.js b/src/server/router/index.js index f107a5714..b92e573dd 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -17,6 +17,7 @@ module.exports = (db, opts) => { { foreignKeySuffix: 'Id', _isFake: false, + _noRemoveDependents: false, _noDataNext: false, _noDbRoute: false, bodyParser: undefined, diff --git a/src/server/router/plural.js b/src/server/router/plural.js index b3695d9ee..548d8695c 100644 --- a/src/server/router/plural.js +++ b/src/server/router/plural.js @@ -313,10 +313,12 @@ module.exports = (db, name, opts) => { resource = db.get(name).removeById(req.params.id).value() // Remove dependents documents - const removable = db._.getRemovable(db.getState(), opts) - removable.forEach((item) => { - db.get(item.name).removeById(item.id).value() - }) + if (opts._noRemoveDependents === false) { + const removable = db._.getRemovable(db.getState(), opts) + removable.forEach((item) => { + db.get(item.name).removeById(item.id).value() + }) + } } if (resource) {