Add m.censor, adjust m.route.Link to use it (#2538)
Also, restructure a few things for better code reuse.
This commit is contained in:
parent
3fa1630f91
commit
34f4363357
15 changed files with 488 additions and 55 deletions
10
util/assign.js
Normal file
10
util/assign.js
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// This exists so I'm only saving it once.
|
||||
"use strict"
|
||||
|
||||
var hasOwn = require("./hasOwn")
|
||||
|
||||
module.exports = Object.assign || function(target, source) {
|
||||
for (var key in source) {
|
||||
if (hasOwn.call(source, key)) target[key] = source[key]
|
||||
}
|
||||
}
|
||||
47
util/censor.js
Normal file
47
util/censor.js
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
"use strict"
|
||||
|
||||
// Note: this is mildly perf-sensitive.
|
||||
//
|
||||
// It does *not* use `delete` - dynamic `delete`s usually cause objects to bail
|
||||
// out into dictionary mode and just generally cause a bunch of optimization
|
||||
// issues within engines.
|
||||
//
|
||||
// Ideally, I would've preferred to do this, if it weren't for the optimization
|
||||
// issues:
|
||||
//
|
||||
// ```js
|
||||
// const hasOwn = require("./hasOwn")
|
||||
// const magic = [
|
||||
// "key", "oninit", "oncreate", "onbeforeupdate", "onupdate",
|
||||
// "onbeforeremove", "onremove",
|
||||
// ]
|
||||
// module.exports = (attrs, extras) => {
|
||||
// const result = Object.assign(Object.create(null), attrs)
|
||||
// for (const key of magic) delete result[key]
|
||||
// if (extras != null) for (const key of extras) delete result[key]
|
||||
// return result
|
||||
// }
|
||||
// ```
|
||||
|
||||
var hasOwn = require("./hasOwn")
|
||||
var magic = /^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$/
|
||||
|
||||
module.exports = function(attrs, extras) {
|
||||
var result = {}
|
||||
|
||||
if (extras != null) {
|
||||
for (var key in attrs) {
|
||||
if (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) {
|
||||
result[key] = attrs[key]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (var key in attrs) {
|
||||
if (hasOwn.call(attrs, key) && !magic.test(key)) {
|
||||
result[key] = attrs[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
4
util/hasOwn.js
Normal file
4
util/hasOwn.js
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
// This exists so I'm only saving it once.
|
||||
"use strict"
|
||||
|
||||
module.exports = {}.hasOwnProperty
|
||||
17
util/tests/index.html
Normal file
17
util/tests/index.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<script src="../../module/module.js"></script>
|
||||
<script src="../../ospec/ospec.js"></script>
|
||||
|
||||
<script src="../../util/hasOwn.js"></script>
|
||||
<script src="../../util/assign.js"></script>
|
||||
<script src="../../util/censor.js"></script>
|
||||
<script src="test-censor.js"></script>
|
||||
|
||||
<script>require("../../ospec/ospec").run()</script>
|
||||
</body>
|
||||
</html>
|
||||
238
util/tests/test-censor.js
Normal file
238
util/tests/test-censor.js
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
"use strict"
|
||||
|
||||
var o = require("../../ospec/ospec")
|
||||
var censor = require("../../util/censor")
|
||||
|
||||
o.spec("censor", function() {
|
||||
o.spec("magic missing, no extras", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {one: "two"}
|
||||
var censored = censor(original)
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {one: "two"}
|
||||
censor(original)
|
||||
o(original).deepEquals({one: "two"})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic present, no extras", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
var censored = censor(original)
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
censor(original)
|
||||
o(original).deepEquals({
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic missing, null extras", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {one: "two"}
|
||||
var censored = censor(original, null)
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {one: "two"}
|
||||
censor(original, null)
|
||||
o(original).deepEquals({one: "two"})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic present, null extras", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
var censored = censor(original, null)
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
censor(original, null)
|
||||
o(original).deepEquals({
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic missing, extras missing", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {one: "two"}
|
||||
var censored = censor(original, ["extra"])
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {one: "two"}
|
||||
censor(original, ["extra"])
|
||||
o(original).deepEquals({one: "two"})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic present, extras missing", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
var censored = censor(original, ["extra"])
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
censor(original, ["extra"])
|
||||
o(original).deepEquals({
|
||||
one: "two",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic missing, extras present", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
extra: "test",
|
||||
}
|
||||
var censored = censor(original, ["extra"])
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
extra: "test",
|
||||
}
|
||||
censor(original, ["extra"])
|
||||
o(original).deepEquals({
|
||||
one: "two",
|
||||
extra: "test",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
o.spec("magic present, extras present", function() {
|
||||
o("returns new object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
extra: "test",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
var censored = censor(original, ["extra"])
|
||||
o(censored).notEquals(original)
|
||||
o(censored).deepEquals({one: "two"})
|
||||
})
|
||||
o("does not modify original object", function() {
|
||||
var original = {
|
||||
one: "two",
|
||||
extra: "test",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
}
|
||||
censor(original, ["extra"])
|
||||
o(original).deepEquals({
|
||||
one: "two",
|
||||
extra: "test",
|
||||
key: "test",
|
||||
oninit: "test",
|
||||
oncreate: "test",
|
||||
onbeforeupdate: "test",
|
||||
onupdate: "test",
|
||||
onbeforeremove: "test",
|
||||
onremove: "test",
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue