Update sealious and adjust roles policy to match
This commit is contained in:
parent
261c126496
commit
3636261ed5
332
package-lock.json
generated
332
package-lock.json
generated
@ -15,9 +15,9 @@
|
|||||||
"@sealcode/add-to-head": "^1.0.0",
|
"@sealcode/add-to-head": "^1.0.0",
|
||||||
"@sealcode/crud-ui": "^0.0.17",
|
"@sealcode/crud-ui": "^0.0.17",
|
||||||
"@sealcode/file-manager": "^1.0.2",
|
"@sealcode/file-manager": "^1.0.2",
|
||||||
"@sealcode/jdd": "^0.7.7",
|
"@sealcode/jdd": "^0.8.0",
|
||||||
"@sealcode/jdd-editor": "^0.1.23",
|
"@sealcode/jdd-editor": "^0.2.0",
|
||||||
"@sealcode/sealgen": "^0.17.35",
|
"@sealcode/sealgen": "^0.18.0",
|
||||||
"@sealcode/simplemde": "^1.12.1",
|
"@sealcode/simplemde": "^1.12.1",
|
||||||
"@sealcode/ts-predicates": "^0.6.2",
|
"@sealcode/ts-predicates": "^0.6.2",
|
||||||
"@types/kill-port": "^2.0.0",
|
"@types/kill-port": "^2.0.0",
|
||||||
@ -40,7 +40,7 @@
|
|||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"object-path": "^0.11.8",
|
"object-path": "^0.11.8",
|
||||||
"qs": "^6.12.0",
|
"qs": "^6.12.0",
|
||||||
"sealious": "^0.20.1",
|
"sealious": "^0.21.2",
|
||||||
"slug": "^9.1.0",
|
"slug": "^9.1.0",
|
||||||
"stimulus": "^3.2.2",
|
"stimulus": "^3.2.2",
|
||||||
"tempstream": "^0.4.6",
|
"tempstream": "^0.4.6",
|
||||||
@ -1261,6 +1261,279 @@
|
|||||||
"node": ">= 18"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/@sealcode/sealgen": {
|
||||||
|
"version": "0.17.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.17.35.tgz",
|
||||||
|
"integrity": "sha512-gbh9r2KtZFMrzPuley1SSfRC4C+3gOGf7v1PewgaPFBZHsfP7D2Bsgs8Gp0kgf2eWGcBvm1RECLn82p5w67r6g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@koa/router": "^12.0.1",
|
||||||
|
"@sealcode/file-manager": "^1.0.2",
|
||||||
|
"@sealcode/ts-predicates": "^0.4.3",
|
||||||
|
"chokidar": "^3.6.0",
|
||||||
|
"colord": "^2.9.3",
|
||||||
|
"deepmerge": "^4.3.1",
|
||||||
|
"esbuild": "^0.20.0",
|
||||||
|
"escape-goat": "^4.0.0",
|
||||||
|
"fonsta": "^1.1.1",
|
||||||
|
"google-fonts-helper": "^3.4.1",
|
||||||
|
"husky": "^9.1.7",
|
||||||
|
"is-what": "^4.1.16",
|
||||||
|
"js-convert-case": "^4.2.0",
|
||||||
|
"json5": "^2.2.3",
|
||||||
|
"locreq": "^3.0.0",
|
||||||
|
"md5": "^2.3.0",
|
||||||
|
"merge": "^2.1.1",
|
||||||
|
"prettier": "^2.7.1",
|
||||||
|
"prompts": "^2.4.2",
|
||||||
|
"recursive-readdir": "^2.2.3",
|
||||||
|
"tempfile": "^5.0.0",
|
||||||
|
"tempstream": "^0.4.6",
|
||||||
|
"tiny-glob": "^0.2.9",
|
||||||
|
"ws": "^8.16.0",
|
||||||
|
"yargs": "^17.6.2"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"sealgen": "lib/cli.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"koa": "^2.13.0",
|
||||||
|
"koa-responsive-image-router": "^0.2.24",
|
||||||
|
"sealious": "^0.20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/@sealcode/sealgen/node_modules/@koa/router": {
|
||||||
|
"version": "12.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz",
|
||||||
|
"integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.3.4",
|
||||||
|
"http-errors": "^2.0.0",
|
||||||
|
"koa-compose": "^4.1.0",
|
||||||
|
"methods": "^1.1.2",
|
||||||
|
"path-to-regexp": "^6.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/@sealcode/ts-predicates": {
|
||||||
|
"version": "0.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sealcode/ts-predicates/-/ts-predicates-0.4.3.tgz",
|
||||||
|
"integrity": "sha512-UNSEacu7Ye8q0N8AJCJy37oJvv3w2OXKGkUnP7xO5lOY9DQviDPRDQhVaZdJ3/xMzXLm4UE3389ihctrPaov/A=="
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/@types/object-hash": {
|
||||||
|
"version": "1.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
|
||||||
|
"integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/@types/uuid": {
|
||||||
|
"version": "8.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
|
||||||
|
"integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/ansi-styles": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"color-convert": "^2.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/chalk": {
|
||||||
|
"version": "4.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||||
|
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-styles": "^4.1.0",
|
||||||
|
"supports-color": "^7.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/clone": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
|
||||||
|
"peer": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/color-convert": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"color-name": "~1.1.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/color-name": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/get-port": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
|
||||||
|
"peer": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/has-flag": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||||
|
"peer": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/object-hash": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
|
||||||
|
"peer": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/prettier": {
|
||||||
|
"version": "2.8.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
|
||||||
|
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
|
||||||
|
"bin": {
|
||||||
|
"prettier": "bin-prettier.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.13.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/sealious": {
|
||||||
|
"version": "0.20.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/sealious/-/sealious-0.20.1.tgz",
|
||||||
|
"integrity": "sha512-DDzIDNYWtdSnZ5wqPdlIK/PKpkPER1lqoMgsxEPw0AjDZxYOLAl3Okil8z36T8nHsNPelmSntndgDfgads91xQ==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@koa/router": "^12.0.1",
|
||||||
|
"@sealcode/file-manager": "^1.0.1",
|
||||||
|
"@sealcode/ts-predicates": "^0.4.3",
|
||||||
|
"@types/boom": "^7.3.0",
|
||||||
|
"@types/clone": "^0.1.30",
|
||||||
|
"@types/color": "^3.0.1",
|
||||||
|
"@types/color-hash": "^1.0.0",
|
||||||
|
"@types/escape-html": "^1.0.0",
|
||||||
|
"@types/koa": "^2.11.6",
|
||||||
|
"@types/koa-mount": "^4.0.0",
|
||||||
|
"@types/koa-qs": "^2.0.0",
|
||||||
|
"@types/koa-send": "^4.1.2",
|
||||||
|
"@types/koa-static": "^4.0.1",
|
||||||
|
"@types/mjml": "^4.0.4",
|
||||||
|
"@types/mongodb": "^3.5.20",
|
||||||
|
"@types/node": "^20.0",
|
||||||
|
"@types/nodemailer": "^6.4.0",
|
||||||
|
"@types/object-hash": "^1.3.3",
|
||||||
|
"@types/sanitize-html": "^2.11.0",
|
||||||
|
"@types/uuid": "^8.3.0",
|
||||||
|
"boom": "^7.3.0",
|
||||||
|
"chalk": "^4.1.0",
|
||||||
|
"clone": "^1.0.2",
|
||||||
|
"color": "latest",
|
||||||
|
"color-hash": "^1.0.3",
|
||||||
|
"commonmark": "^0.31.0",
|
||||||
|
"cron": "^2.1.0",
|
||||||
|
"csv-stringify": "^6.4.5",
|
||||||
|
"deepmerge": "^4.2.2",
|
||||||
|
"dot-prop": "^8.0.2",
|
||||||
|
"emittery": "0.8.1",
|
||||||
|
"escape-html": "^1.0.3",
|
||||||
|
"get-port": "^5.1.1",
|
||||||
|
"koa": "^2.13.0",
|
||||||
|
"koa-body": "^4.2.0",
|
||||||
|
"koa-mount": "^4.0.0",
|
||||||
|
"koa-qs": "^3.0.0",
|
||||||
|
"koa-send": "^5.0.1",
|
||||||
|
"koa-static": "^5.0.0",
|
||||||
|
"locreq": "^3.0.0",
|
||||||
|
"mjml": "^4.2.0",
|
||||||
|
"mongodb": "^6.5.0",
|
||||||
|
"nanoid": "^5.0.9",
|
||||||
|
"nodemailer": "^6.4.6",
|
||||||
|
"object-hash": "^2.0.3",
|
||||||
|
"pg": "^8.13.1",
|
||||||
|
"pretty-ms": "^7.0.0",
|
||||||
|
"qs": "^6.12.0",
|
||||||
|
"sanitize-html": "^1.13.0",
|
||||||
|
"typedoc": "^0.17.8",
|
||||||
|
"uuid": "^8.3.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=21.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/sealious/node_modules/@koa/router": {
|
||||||
|
"version": "12.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz",
|
||||||
|
"integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.3.4",
|
||||||
|
"http-errors": "^2.0.0",
|
||||||
|
"koa-compose": "^4.1.0",
|
||||||
|
"methods": "^1.1.2",
|
||||||
|
"path-to-regexp": "^6.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/supports-color": {
|
||||||
|
"version": "7.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
|
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"has-flag": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sealcode/crud-ui/node_modules/uuid": {
|
||||||
|
"version": "8.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||||
|
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||||
|
"peer": true,
|
||||||
|
"bin": {
|
||||||
|
"uuid": "dist/bin/uuid"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@sealcode/file-manager": {
|
"node_modules/@sealcode/file-manager": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
@ -1273,9 +1546,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sealcode/jdd": {
|
"node_modules/@sealcode/jdd": {
|
||||||
"version": "0.7.7",
|
"version": "0.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sealcode/jdd/-/jdd-0.7.7.tgz",
|
"resolved": "https://registry.npmjs.org/@sealcode/jdd/-/jdd-0.8.0.tgz",
|
||||||
"integrity": "sha512-L99aj9q6V1sRqFmMmtwKuzS6wNId22mKxJQc0pQH1StumYVpDfiSmtknPD6ZNLRWMGtmN7PYqal3cqBk+X4vTQ==",
|
"integrity": "sha512-0esGO0j922FK3rYs+OmWbp0SWAQWkPaidNzvrq2dyaj0SyPU7B0vZZOYjzboICyvqBkMZWbf+YXNK/zzYs18EA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sealcode/file-manager": "^1.0.2",
|
"@sealcode/file-manager": "^1.0.2",
|
||||||
"@sealcode/ts-predicates": "^0.5.3",
|
"@sealcode/ts-predicates": "^0.5.3",
|
||||||
@ -1292,23 +1565,23 @@
|
|||||||
"uuid": "^9.0.1"
|
"uuid": "^9.0.1"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"sealious": "^0.20"
|
"sealious": "^0.21"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sealcode/jdd-editor": {
|
"node_modules/@sealcode/jdd-editor": {
|
||||||
"version": "0.1.23",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sealcode/jdd-editor/-/jdd-editor-0.1.23.tgz",
|
"resolved": "https://registry.npmjs.org/@sealcode/jdd-editor/-/jdd-editor-0.2.0.tgz",
|
||||||
"integrity": "sha512-PUogLAYskZ4LtbOwixP/KyexTUoWT8Z/Ht4r+k1spa6+4t+z0MK15AD6Oj3Gs8vfr20/YHZjMHiG+5NHvsDdDg==",
|
"integrity": "sha512-zZGcfqanv/c5IefPASpLjB12YM3SG0pWpIjlpxIVh0XuvvLLPPtUemFyAJD4evgA+MXmph9fTlj4F8ki/9ImCw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@koa/router": "^13.1.0",
|
"@koa/router": "^13.1.0",
|
||||||
"@sealcode/jdd": "^0.7.7",
|
"@sealcode/jdd": "^0.8.0",
|
||||||
"@sealcode/sealcodemirror": "^5.70.0-beta5",
|
"@sealcode/sealcodemirror": "^5.70.0-beta5",
|
||||||
"@sealcode/sealgen": "^0.17.31",
|
"@sealcode/sealgen": "^0.18",
|
||||||
"@types/object-path": "^0.11.4",
|
"@types/object-path": "^0.11.4",
|
||||||
"@types/throttle-debounce": "^5.0.2",
|
"@types/throttle-debounce": "^5.0.2",
|
||||||
"@types/turndown": "^5.0.5",
|
"@types/turndown": "^5.0.5",
|
||||||
"object-path": "^0.11.8",
|
"object-path": "^0.11.8",
|
||||||
"sealious": "^0.20.0",
|
"sealious": "^0.21.0",
|
||||||
"stimulus": "^3.2.2",
|
"stimulus": "^3.2.2",
|
||||||
"tempstream": "^0.4.6",
|
"tempstream": "^0.4.6",
|
||||||
"throttle-debounce": "^5.0.2",
|
"throttle-debounce": "^5.0.2",
|
||||||
@ -1352,9 +1625,9 @@
|
|||||||
"integrity": "sha512-pDsGlk2KokQkwzsJDBUWJFDRpEoxxth6TMQGDJyCTmWnd1Vn+cQb5moXDKaf7cXnWb9Y6QtdNX/fPzM/3RH2Cg=="
|
"integrity": "sha512-pDsGlk2KokQkwzsJDBUWJFDRpEoxxth6TMQGDJyCTmWnd1Vn+cQb5moXDKaf7cXnWb9Y6QtdNX/fPzM/3RH2Cg=="
|
||||||
},
|
},
|
||||||
"node_modules/@sealcode/sealgen": {
|
"node_modules/@sealcode/sealgen": {
|
||||||
"version": "0.17.35",
|
"version": "0.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.17.35.tgz",
|
"resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.18.0.tgz",
|
||||||
"integrity": "sha512-gbh9r2KtZFMrzPuley1SSfRC4C+3gOGf7v1PewgaPFBZHsfP7D2Bsgs8Gp0kgf2eWGcBvm1RECLn82p5w67r6g==",
|
"integrity": "sha512-R6D5NWILQDjZKkhQ4Q854T+o/fG+fcQKaj8dFQmEPiX7lsXYaQ4zQ5YuyRBfavM0RyuXl8Nj0DQqpt8D5NB8jQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@koa/router": "^12.0.1",
|
"@koa/router": "^12.0.1",
|
||||||
"@sealcode/file-manager": "^1.0.2",
|
"@sealcode/file-manager": "^1.0.2",
|
||||||
@ -1388,7 +1661,7 @@
|
|||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"koa": "^2.13.0",
|
"koa": "^2.13.0",
|
||||||
"koa-responsive-image-router": "^0.2.24",
|
"koa-responsive-image-router": "^0.2.24",
|
||||||
"sealious": "^0.20"
|
"sealious": "^0.21"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sealcode/sealgen/node_modules/@sealcode/ts-predicates": {
|
"node_modules/@sealcode/sealgen/node_modules/@sealcode/ts-predicates": {
|
||||||
@ -1543,6 +1816,14 @@
|
|||||||
"version": "0.1.30",
|
"version": "0.1.30",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/color": {
|
||||||
|
"version": "3.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz",
|
||||||
|
"integrity": "sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/color-convert": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/color-convert": {
|
"node_modules/@types/color-convert": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -11488,9 +11769,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/sealious": {
|
"node_modules/sealious": {
|
||||||
"version": "0.20.1",
|
"version": "0.21.2",
|
||||||
"resolved": "https://registry.npmjs.org/sealious/-/sealious-0.20.1.tgz",
|
"resolved": "https://registry.npmjs.org/sealious/-/sealious-0.21.2.tgz",
|
||||||
"integrity": "sha512-DDzIDNYWtdSnZ5wqPdlIK/PKpkPER1lqoMgsxEPw0AjDZxYOLAl3Okil8z36T8nHsNPelmSntndgDfgads91xQ==",
|
"integrity": "sha512-JNLVBJ2PqhZbktmkNheLFBfj+GgMcpUZ40Bpm9Qyi2z6Md3bgBgF+Yh9856AoktemO7pR2eRSIxKOX9eFxKjUw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@koa/router": "^12.0.1",
|
"@koa/router": "^12.0.1",
|
||||||
"@sealcode/file-manager": "^1.0.1",
|
"@sealcode/file-manager": "^1.0.1",
|
||||||
@ -11552,15 +11833,6 @@
|
|||||||
"version": "0.4.3",
|
"version": "0.4.3",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/sealious/node_modules/@types/color": {
|
|
||||||
"version": "3.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz",
|
|
||||||
"integrity": "sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/color-convert": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/sealious/node_modules/@types/object-hash": {
|
"node_modules/sealious/node_modules/@types/object-hash": {
|
||||||
"version": "1.3.4",
|
"version": "1.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
|
||||||
|
@ -76,9 +76,9 @@
|
|||||||
"@sealcode/add-to-head": "^1.0.0",
|
"@sealcode/add-to-head": "^1.0.0",
|
||||||
"@sealcode/crud-ui": "^0.0.17",
|
"@sealcode/crud-ui": "^0.0.17",
|
||||||
"@sealcode/file-manager": "^1.0.2",
|
"@sealcode/file-manager": "^1.0.2",
|
||||||
"@sealcode/jdd": "^0.7.7",
|
"@sealcode/jdd": "^0.8.0",
|
||||||
"@sealcode/jdd-editor": "^0.1.23",
|
"@sealcode/jdd-editor": "^0.2.0",
|
||||||
"@sealcode/sealgen": "^0.17.35",
|
"@sealcode/sealgen": "^0.18.0",
|
||||||
"@sealcode/simplemde": "^1.12.1",
|
"@sealcode/simplemde": "^1.12.1",
|
||||||
"@sealcode/ts-predicates": "^0.6.2",
|
"@sealcode/ts-predicates": "^0.6.2",
|
||||||
"@types/kill-port": "^2.0.0",
|
"@types/kill-port": "^2.0.0",
|
||||||
@ -101,7 +101,7 @@
|
|||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"object-path": "^0.11.8",
|
"object-path": "^0.11.8",
|
||||||
"qs": "^6.12.0",
|
"qs": "^6.12.0",
|
||||||
"sealious": "^0.20.1",
|
"sealious": "^0.21.2",
|
||||||
"slug": "^9.1.0",
|
"slug": "^9.1.0",
|
||||||
"stimulus": "^3.2.2",
|
"stimulus": "^3.2.2",
|
||||||
"tempstream": "^0.4.6",
|
"tempstream": "^0.4.6",
|
||||||
|
@ -8,7 +8,6 @@ import _NavbarLinks from "./navbar-links.js";
|
|||||||
import _Pages from "./pages.js";
|
import _Pages from "./pages.js";
|
||||||
import _PasswordResetIntents from "./password-reset-intents.js";
|
import _PasswordResetIntents from "./password-reset-intents.js";
|
||||||
import _Redirects from "./redirects.js";
|
import _Redirects from "./redirects.js";
|
||||||
import _UserRoles from "./user-roles.js";
|
|
||||||
import _Users from "./users.js";
|
import _Users from "./users.js";
|
||||||
|
|
||||||
export const Globals = new _Globals();
|
export const Globals = new _Globals();
|
||||||
@ -18,7 +17,6 @@ export const NavbarLinks = new _NavbarLinks();
|
|||||||
export const Pages = new _Pages();
|
export const Pages = new _Pages();
|
||||||
export const PasswordResetIntents = new _PasswordResetIntents();
|
export const PasswordResetIntents = new _PasswordResetIntents();
|
||||||
export const Redirects = new _Redirects();
|
export const Redirects = new _Redirects();
|
||||||
export const UserRoles = new _UserRoles();
|
|
||||||
export const Users = new _Users();
|
export const Users = new _Users();
|
||||||
|
|
||||||
export const collections = {
|
export const collections = {
|
||||||
@ -30,6 +28,5 @@ export const collections = {
|
|||||||
pages: Pages,
|
pages: Pages,
|
||||||
"password-reset-intents": PasswordResetIntents,
|
"password-reset-intents": PasswordResetIntents,
|
||||||
redirects: Redirects,
|
redirects: Redirects,
|
||||||
"user-roles": UserRoles,
|
|
||||||
users: Users,
|
users: Users,
|
||||||
};
|
};
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
import assert from "assert";
|
|
||||||
import axios from "axios";
|
|
||||||
import { Context, TestUtils } from "sealious";
|
|
||||||
import { withProdApp } from "../test_utils/with-prod-app.js";
|
|
||||||
import { createAdmin, createAUser } from "../test_utils/users.js";
|
|
||||||
import Users from "./users.js";
|
|
||||||
|
|
||||||
describe("user-roles", () => {
|
|
||||||
it("rejects when given an empty role", async () =>
|
|
||||||
withProdApp(async ({ app, rest_api }) => {
|
|
||||||
const [user, session] = await createAdmin(app, rest_api);
|
|
||||||
await TestUtils.assertThrowsAsync(
|
|
||||||
async () => {
|
|
||||||
return rest_api.post(
|
|
||||||
`/api/v1/collections/user-roles`,
|
|
||||||
{
|
|
||||||
user: user.id,
|
|
||||||
},
|
|
||||||
session
|
|
||||||
);
|
|
||||||
},
|
|
||||||
(e) => {
|
|
||||||
console.error(e);
|
|
||||||
assert.equal(
|
|
||||||
e?.response.data.data.field_messages.role?.message,
|
|
||||||
"Missing value for field 'role'."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("accepts correct dataset", async () =>
|
|
||||||
withProdApp(async ({ app, base_url, rest_api }) => {
|
|
||||||
const [user, session] = await createAdmin(app, rest_api);
|
|
||||||
const response = await axios.post(
|
|
||||||
`${base_url}/api/v1/collections/user-roles`,
|
|
||||||
{
|
|
||||||
user: user.id,
|
|
||||||
role: "admin",
|
|
||||||
},
|
|
||||||
session
|
|
||||||
);
|
|
||||||
assert.equal(response.status, 201);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("get user roles with admin", async () =>
|
|
||||||
withProdApp(async ({ app, rest_api }) => {
|
|
||||||
const [user] = await createAdmin(app, rest_api);
|
|
||||||
const roles = await Users.getRoles(
|
|
||||||
new Context(app, new Date().getTime(), user.id)
|
|
||||||
);
|
|
||||||
assert.ok(roles.includes("admin"));
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("get user with no roles", async () =>
|
|
||||||
withProdApp(async ({ app }) => {
|
|
||||||
const user = await createAUser(app, "normal");
|
|
||||||
const roles = await Users.getRoles(
|
|
||||||
new Context(app, new Date().getTime(), user.id)
|
|
||||||
);
|
|
||||||
assert.ok(roles.length === 0);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("get no roles for no logged user", async () =>
|
|
||||||
withProdApp(async ({ app }) => {
|
|
||||||
const roles = await Users.getRoles(
|
|
||||||
new Context(app, new Date().getTime(), null)
|
|
||||||
);
|
|
||||||
assert.ok(roles.length === 0);
|
|
||||||
}));
|
|
||||||
});
|
|
@ -1,41 +0,0 @@
|
|||||||
import type { App, Policy } from "sealious";
|
|
||||||
import { Collection, FieldTypes, Policies } from "sealious";
|
|
||||||
import { Roles } from "../policy-types/roles.js";
|
|
||||||
|
|
||||||
export default class UserRoles extends Collection {
|
|
||||||
name = "user-roles";
|
|
||||||
fields = {
|
|
||||||
role: new FieldTypes.Text().setRequired(true),
|
|
||||||
user: new FieldTypes.SingleReference("users"),
|
|
||||||
};
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
||||||
policies = {
|
|
||||||
create: new Roles(["admin"]),
|
|
||||||
delete: new Roles(["admin"]),
|
|
||||||
show: new Policies.Or([
|
|
||||||
new Policies.UserReferencedInField("user"),
|
|
||||||
new Roles(["admin"]),
|
|
||||||
]),
|
|
||||||
edit: new Policies.Noone(),
|
|
||||||
} as { [policy: string]: Policy }; // this `as` statement allows the policies to be overwritten;
|
|
||||||
|
|
||||||
async init(app: App, collection_name: string) {
|
|
||||||
await super.init(app, collection_name);
|
|
||||||
app.on("started", async () => {
|
|
||||||
const roles = app.collections["user-roles"];
|
|
||||||
if (!roles) {
|
|
||||||
throw new Error("roles undefined");
|
|
||||||
}
|
|
||||||
for (const action of <const>["create", "delete"]) {
|
|
||||||
const policy = roles?.getPolicy(action);
|
|
||||||
if (policy instanceof Policies.Public) {
|
|
||||||
app.Logger.warn(
|
|
||||||
"USER POLICY",
|
|
||||||
`<user-roles> collection is using <public> access strategy for ${action} action. Anyone can change anyone elses role. This is the default behavior and you should overwrite it with <set_policy>`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,3 @@
|
|||||||
import type { Context } from "sealious";
|
|
||||||
import { App, Collections, FieldTypes, Policies } from "sealious";
|
import { App, Collections, FieldTypes, Policies } from "sealious";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import TheApp from "../app.js";
|
import TheApp from "../app.js";
|
||||||
@ -9,10 +8,10 @@ export default class Users extends Collections.users {
|
|||||||
fields = {
|
fields = {
|
||||||
...App.BaseCollections.users.fields,
|
...App.BaseCollections.users.fields,
|
||||||
email: new FieldTypes.Email().setRequired(true),
|
email: new FieldTypes.Email().setRequired(true),
|
||||||
roles: new FieldTypes.ReverseSingleReference({
|
roles: new FieldTypes.SettableBy(
|
||||||
referencing_collection: "user-roles",
|
new FieldTypes.StructuredArray({ role: new FieldTypes.Text() }),
|
||||||
referencing_field: "user",
|
new Roles(["admin"])
|
||||||
}),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultPolicy = new Policies.Or([new Policies.Themselves(), new Roles(["admin"])]);
|
defaultPolicy = new Policies.Or([new Policies.Themselves(), new Roles(["admin"])]);
|
||||||
@ -33,25 +32,13 @@ export default class Users extends Collections.users {
|
|||||||
"ADMIN",
|
"ADMIN",
|
||||||
`Creating an admin account for ${app.manifest.admin_email}`
|
`Creating an admin account for ${app.manifest.admin_email}`
|
||||||
);
|
);
|
||||||
const { id } = await app.collections.users.suCreate({
|
await app.collections.users.suCreate({
|
||||||
username,
|
username,
|
||||||
password: ADMIN_CREDENTIALS.password,
|
password: ADMIN_CREDENTIALS.password,
|
||||||
email: ADMIN_CREDENTIALS.email,
|
email: ADMIN_CREDENTIALS.email,
|
||||||
roles: [],
|
roles: [{ role: "admin" }],
|
||||||
});
|
});
|
||||||
await app.collections["user-roles"].suCreate({ user: id, role: "admin" });
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async getRoles(ctx: Context) {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
||||||
const rolesEntries = await (ctx.app as TheApp).collections["user-roles"]
|
|
||||||
.list(ctx)
|
|
||||||
.filter({ user: ctx.user_id || "" })
|
|
||||||
.fetch();
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
||||||
return rolesEntries.items.map((item) => item.get("role"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -10,16 +10,11 @@ describe("roles", () => {
|
|||||||
roles: [],
|
roles: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
const admin = await app.collections.users.suCreate({
|
await app.collections.users.suCreate({
|
||||||
username: "someadmin",
|
username: "someadmin",
|
||||||
password: "admin-password",
|
password: "admin-password",
|
||||||
email: "admin@example.com",
|
email: "admin@example.com",
|
||||||
roles: [],
|
roles: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
await app.collections["user-roles"].suCreate({
|
|
||||||
user: admin.id,
|
|
||||||
role: "admin",
|
|
||||||
});
|
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/consistent-type-assertions */
|
/* eslint-disable @typescript-eslint/consistent-type-assertions */
|
||||||
import type { ActionName, Collection, Context } from "sealious";
|
import type { ActionName, Context } from "sealious";
|
||||||
import { Policies } from "sealious";
|
import { Policies } from "sealious";
|
||||||
import { Policy, QueryTypes } from "sealious";
|
import { Policy, QueryTypes } from "sealious";
|
||||||
|
|
||||||
@ -12,20 +12,12 @@ export class Roles extends Policy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async countMatchingRoles(context: Context) {
|
async countMatchingRoles(context: Context) {
|
||||||
const user_id = context.user_id;
|
const user_id = context.user_id as string;
|
||||||
context.app.Logger.debug2("ROLES", "Checking the roles for user", user_id);
|
context.app.Logger.debug2("ROLES", "Checking the roles for user", user_id);
|
||||||
const roles = await context.cache("roles_for_this_user", async () => {
|
const roles = await context.cache("roles_for_this_user", async () => {
|
||||||
const { items: user_roles } = await (
|
const user = await context.app.collections.users.suGetByID(user_id);
|
||||||
context.app.collections["user-roles"] as Collection
|
const roles = (user.get("roles") as { role: string }[])?.map((e) => e.role);
|
||||||
)
|
return roles || [];
|
||||||
.suList()
|
|
||||||
.filter({ user: user_id })
|
|
||||||
.fetch();
|
|
||||||
const roles = user_roles.map(
|
|
||||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
||||||
(user_role) => user_role.get("role") as string
|
|
||||||
);
|
|
||||||
return roles;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.allowed_roles.filter((allowed_role) => roles.includes(allowed_role))
|
return this.allowed_roles.filter((allowed_role) => roles.includes(allowed_role))
|
||||||
|
@ -4,12 +4,12 @@ import type Users from "../collections/users.js";
|
|||||||
|
|
||||||
type Unpromisify<T> = T extends Promise<infer R> ? R : T;
|
type Unpromisify<T> = T extends Promise<infer R> ? R : T;
|
||||||
|
|
||||||
export function createAUser(app: TheApp, username: string) {
|
export function createAUser(app: TheApp, username: string, roles: string[]) {
|
||||||
return app.collections.users.suCreate({
|
return app.collections.users.suCreate({
|
||||||
username,
|
username,
|
||||||
email: `${username}@example.com`,
|
email: `${username}@example.com`,
|
||||||
password: "password",
|
password: "password",
|
||||||
roles: [],
|
roles: roles.map((role) => ({ role })),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,11 +17,7 @@ export async function createAdmin(
|
|||||||
app: TheApp,
|
app: TheApp,
|
||||||
rest_api: TestUtils.MockRestApi
|
rest_api: TestUtils.MockRestApi
|
||||||
): Promise<[CollectionItem<Users>, Unpromisify<ReturnType<typeof rest_api.login>>]> {
|
): Promise<[CollectionItem<Users>, Unpromisify<ReturnType<typeof rest_api.login>>]> {
|
||||||
const user = await createAUser(app, "super_user");
|
const user = await createAUser(app, "super_user", ["admin"]);
|
||||||
await app.collections["user-roles"].suCreate({
|
|
||||||
user: user.id,
|
|
||||||
role: "admin",
|
|
||||||
});
|
|
||||||
const session = await rest_api.login({
|
const session = await rest_api.login({
|
||||||
username: "super_user",
|
username: "super_user",
|
||||||
password: "password",
|
password: "password",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user