forked from wgroeneveld/go-jamming
only allow webmentions from configured domains
This commit is contained in:
parent
3045291d09
commit
fc0ed203fe
|
@ -37,6 +37,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
[null, {
|
||||
"packageLocation": "./",
|
||||
"packageDependencies": [
|
||||
["got", "npm:11.8.2"],
|
||||
["jest", "npm:26.6.3"],
|
||||
["koa", "npm:2.13.1"],
|
||||
["koa-body", "npm:4.2.0"],
|
||||
|
@ -858,6 +859,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@sindresorhus/is", [
|
||||
["npm:4.0.0", {
|
||||
"packageLocation": "./.yarn/cache/@sindresorhus-is-npm-4.0.0-5aa71e5397-7022d5037f.zip/node_modules/@sindresorhus/is/",
|
||||
"packageDependencies": [
|
||||
["@sindresorhus/is", "npm:4.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@sinonjs/commons", [
|
||||
["npm:1.8.2", {
|
||||
"packageLocation": "./.yarn/cache/@sinonjs-commons-npm-1.8.2-36d9339683-b7eb499e35.zip/node_modules/@sinonjs/commons/",
|
||||
|
@ -878,6 +888,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@szmarczak/http-timer", [
|
||||
["npm:4.0.5", {
|
||||
"packageLocation": "./.yarn/cache/@szmarczak-http-timer-npm-4.0.5-03463d10ab-13d8f71dbd.zip/node_modules/@szmarczak/http-timer/",
|
||||
"packageDependencies": [
|
||||
["@szmarczak/http-timer", "npm:4.0.5"],
|
||||
["defer-to-connect", "npm:2.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/babel__core", [
|
||||
["npm:7.1.12", {
|
||||
"packageLocation": "./.yarn/cache/@types-babel__core-npm-7.1.12-0093691d63-e2642b77b8.zip/node_modules/@types/babel__core/",
|
||||
|
@ -933,6 +953,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/cacheable-request", [
|
||||
["npm:6.0.1", {
|
||||
"packageLocation": "./.yarn/cache/@types-cacheable-request-npm-6.0.1-067bf7714d-3dae802a08.zip/node_modules/@types/cacheable-request/",
|
||||
"packageDependencies": [
|
||||
["@types/cacheable-request", "npm:6.0.1"],
|
||||
["@types/http-cache-semantics", "npm:4.0.0"],
|
||||
["@types/keyv", "npm:3.1.1"],
|
||||
["@types/node", "npm:14.14.32"],
|
||||
["@types/responselike", "npm:1.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/formidable", [
|
||||
["npm:1.0.32", {
|
||||
"packageLocation": "./.yarn/cache/@types-formidable-npm-1.0.32-12f895a971-98f3f54727.zip/node_modules/@types/formidable/",
|
||||
|
@ -953,6 +986,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/http-cache-semantics", [
|
||||
["npm:4.0.0", {
|
||||
"packageLocation": "./.yarn/cache/@types-http-cache-semantics-npm-4.0.0-000c9dc8e0-e16fae56d4.zip/node_modules/@types/http-cache-semantics/",
|
||||
"packageDependencies": [
|
||||
["@types/http-cache-semantics", "npm:4.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/istanbul-lib-coverage", [
|
||||
["npm:2.0.3", {
|
||||
"packageLocation": "./.yarn/cache/@types-istanbul-lib-coverage-npm-2.0.3-67a37eb00a-d6f6dbf66d.zip/node_modules/@types/istanbul-lib-coverage/",
|
||||
|
@ -982,6 +1024,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/keyv", [
|
||||
["npm:3.1.1", {
|
||||
"packageLocation": "./.yarn/cache/@types-keyv-npm-3.1.1-779a80f2c7-3aaf557d5b.zip/node_modules/@types/keyv/",
|
||||
"packageDependencies": [
|
||||
["@types/keyv", "npm:3.1.1"],
|
||||
["@types/node", "npm:14.14.32"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/mongodb", [
|
||||
["npm:3.6.9", {
|
||||
"packageLocation": "./.yarn/cache/@types-mongodb-npm-3.6.9-2e9fa33eb9-ab78a36f7d.zip/node_modules/@types/mongodb/",
|
||||
|
@ -1020,6 +1072,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/responselike", [
|
||||
["npm:1.0.0", {
|
||||
"packageLocation": "./.yarn/cache/@types-responselike-npm-1.0.0-85dd08af42-e6e6613c80.zip/node_modules/@types/responselike/",
|
||||
"packageDependencies": [
|
||||
["@types/responselike", "npm:1.0.0"],
|
||||
["@types/node", "npm:14.14.32"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["@types/stack-utils", [
|
||||
["npm:2.0.0", {
|
||||
"packageLocation": "./.yarn/cache/@types-stack-utils-npm-2.0.0-8ded8461bc-662312302e.zip/node_modules/@types/stack-utils/",
|
||||
|
@ -1631,6 +1693,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["cacheable-lookup", [
|
||||
["npm:5.0.4", {
|
||||
"packageLocation": "./.yarn/cache/cacheable-lookup-npm-5.0.4-8f13e8b44b-cb5849f584.zip/node_modules/cacheable-lookup/",
|
||||
"packageDependencies": [
|
||||
["cacheable-lookup", "npm:5.0.4"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["cacheable-request", [
|
||||
["npm:7.0.1", {
|
||||
"packageLocation": "./.yarn/cache/cacheable-request-npm-7.0.1-d870be2496-fe0b6f3b8a.zip/node_modules/cacheable-request/",
|
||||
"packageDependencies": [
|
||||
["cacheable-request", "npm:7.0.1"],
|
||||
["clone-response", "npm:1.0.2"],
|
||||
["get-stream", "npm:5.2.0"],
|
||||
["http-cache-semantics", "npm:4.1.0"],
|
||||
["keyv", "npm:4.0.3"],
|
||||
["lowercase-keys", "npm:2.0.0"],
|
||||
["normalize-url", "npm:4.5.0"],
|
||||
["responselike", "npm:2.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["callsites", [
|
||||
["npm:3.1.0", {
|
||||
"packageLocation": "./.yarn/cache/callsites-npm-3.1.0-268f989910-f726bf10d7.zip/node_modules/callsites/",
|
||||
|
@ -1766,6 +1853,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["clone-response", [
|
||||
["npm:1.0.2", {
|
||||
"packageLocation": "./.yarn/cache/clone-response-npm-1.0.2-135ae8239d-71832f9219.zip/node_modules/clone-response/",
|
||||
"packageDependencies": [
|
||||
["clone-response", "npm:1.0.2"],
|
||||
["mimic-response", "npm:1.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["cls-bluebird", [
|
||||
["npm:2.1.0", {
|
||||
"packageLocation": "./.yarn/cache/cls-bluebird-npm-2.1.0-1a11680445-f3b31004a9.zip/node_modules/cls-bluebird/",
|
||||
|
@ -2124,6 +2221,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["decompress-response", [
|
||||
["npm:6.0.0", {
|
||||
"packageLocation": "./.yarn/cache/decompress-response-npm-6.0.0-359de2878c-bb8b8c42be.zip/node_modules/decompress-response/",
|
||||
"packageDependencies": [
|
||||
["decompress-response", "npm:6.0.0"],
|
||||
["mimic-response", "npm:3.1.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["deep-equal", [
|
||||
["npm:1.0.1", {
|
||||
"packageLocation": "./.yarn/cache/deep-equal-npm-1.0.1-f05565c4e5-97d8558d19.zip/node_modules/deep-equal/",
|
||||
|
@ -2151,6 +2258,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["defer-to-connect", [
|
||||
["npm:2.0.1", {
|
||||
"packageLocation": "./.yarn/cache/defer-to-connect-npm-2.0.1-9005cc8c60-6641e63777.zip/node_modules/defer-to-connect/",
|
||||
"packageDependencies": [
|
||||
["defer-to-connect", "npm:2.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["define-property", [
|
||||
["npm:0.2.5", {
|
||||
"packageLocation": "./.yarn/cache/define-property-npm-0.2.5-44a0da3575-6fed054072.zip/node_modules/define-property/",
|
||||
|
@ -2839,6 +2955,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["got", [
|
||||
["npm:11.8.2", {
|
||||
"packageLocation": "./.yarn/cache/got-npm-11.8.2-c1eb105458-6415f98ec2.zip/node_modules/got/",
|
||||
"packageDependencies": [
|
||||
["got", "npm:11.8.2"],
|
||||
["@sindresorhus/is", "npm:4.0.0"],
|
||||
["@szmarczak/http-timer", "npm:4.0.5"],
|
||||
["@types/cacheable-request", "npm:6.0.1"],
|
||||
["@types/responselike", "npm:1.0.0"],
|
||||
["cacheable-lookup", "npm:5.0.4"],
|
||||
["cacheable-request", "npm:7.0.1"],
|
||||
["decompress-response", "npm:6.0.0"],
|
||||
["http2-wrapper", "npm:1.0.3"],
|
||||
["lowercase-keys", "npm:2.0.0"],
|
||||
["p-cancelable", "npm:2.0.0"],
|
||||
["responselike", "npm:2.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["graceful-fs", [
|
||||
["npm:4.2.6", {
|
||||
"packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.6-535b2234f1-84d39c7756.zip/node_modules/graceful-fs/",
|
||||
|
@ -3000,6 +3136,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["http-cache-semantics", [
|
||||
["npm:4.1.0", {
|
||||
"packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-451df9784a.zip/node_modules/http-cache-semantics/",
|
||||
"packageDependencies": [
|
||||
["http-cache-semantics", "npm:4.1.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["http-errors", [
|
||||
["npm:1.7.3", {
|
||||
"packageLocation": "./.yarn/cache/http-errors-npm-1.7.3-f6dc83b082-563ae4a3f1.zip/node_modules/http-errors/",
|
||||
|
@ -3038,6 +3183,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["http2-wrapper", [
|
||||
["npm:1.0.3", {
|
||||
"packageLocation": "./.yarn/cache/http2-wrapper-npm-1.0.3-5b58ade1df-2fc0140a69.zip/node_modules/http2-wrapper/",
|
||||
"packageDependencies": [
|
||||
["http2-wrapper", "npm:1.0.3"],
|
||||
["quick-lru", "npm:5.1.1"],
|
||||
["resolve-alpn", "npm:1.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["human-signals", [
|
||||
["npm:1.1.1", {
|
||||
"packageLocation": "./.yarn/cache/human-signals-npm-1.1.1-616b2586c2-cac115f635.zip/node_modules/human-signals/",
|
||||
|
@ -4058,6 +4214,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["json-buffer", [
|
||||
["npm:3.0.1", {
|
||||
"packageLocation": "./.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-78011309cb.zip/node_modules/json-buffer/",
|
||||
"packageDependencies": [
|
||||
["json-buffer", "npm:3.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["json-parse-even-better-errors", [
|
||||
["npm:2.3.1", {
|
||||
"packageLocation": "./.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-d89fa7fe57.zip/node_modules/json-parse-even-better-errors/",
|
||||
|
@ -4136,6 +4301,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["keyv", [
|
||||
["npm:4.0.3", {
|
||||
"packageLocation": "./.yarn/cache/keyv-npm-4.0.3-4018fb536e-63527e3d01.zip/node_modules/keyv/",
|
||||
"packageDependencies": [
|
||||
["keyv", "npm:4.0.3"],
|
||||
["json-buffer", "npm:3.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["kind-of", [
|
||||
["npm:3.2.2", {
|
||||
"packageLocation": "./.yarn/cache/kind-of-npm-3.2.2-7deaffa5f9-e8a1835c4b.zip/node_modules/kind-of/",
|
||||
|
@ -4355,6 +4530,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["lowercase-keys", [
|
||||
["npm:2.0.0", {
|
||||
"packageLocation": "./.yarn/cache/lowercase-keys-npm-2.0.0-1876065a32-4da67f4186.zip/node_modules/lowercase-keys/",
|
||||
"packageDependencies": [
|
||||
["lowercase-keys", "npm:2.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["lru-cache", [
|
||||
["npm:6.0.0", {
|
||||
"packageLocation": "./.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-b8b78353d2.zip/node_modules/lru-cache/",
|
||||
|
@ -4499,6 +4683,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["mimic-response", [
|
||||
["npm:1.0.1", {
|
||||
"packageLocation": "./.yarn/cache/mimic-response-npm-1.0.1-f6f85dde84-64b43c717e.zip/node_modules/mimic-response/",
|
||||
"packageDependencies": [
|
||||
["mimic-response", "npm:1.0.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}],
|
||||
["npm:3.1.0", {
|
||||
"packageLocation": "./.yarn/cache/mimic-response-npm-3.1.0-a4a24b4e96-cfbf19f66d.zip/node_modules/mimic-response/",
|
||||
"packageDependencies": [
|
||||
["mimic-response", "npm:3.1.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["minimatch", [
|
||||
["npm:3.0.4", {
|
||||
"packageLocation": "./.yarn/cache/minimatch-npm-3.0.4-6e76f51c23-47eab92639.zip/node_modules/minimatch/",
|
||||
|
@ -4844,6 +5044,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["normalize-url", [
|
||||
["npm:4.5.0", {
|
||||
"packageLocation": "./.yarn/cache/normalize-url-npm-4.5.0-14a0c5430f-09794941db.zip/node_modules/normalize-url/",
|
||||
"packageDependencies": [
|
||||
["normalize-url", "npm:4.5.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["npm-run-path", [
|
||||
["npm:2.0.2", {
|
||||
"packageLocation": "./.yarn/cache/npm-run-path-npm-2.0.2-96c8b48857-0a1bc9a1e0.zip/node_modules/npm-run-path/",
|
||||
|
@ -4997,6 +5206,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["p-cancelable", [
|
||||
["npm:2.0.0", {
|
||||
"packageLocation": "./.yarn/cache/p-cancelable-npm-2.0.0-5f988ffca4-966065f056.zip/node_modules/p-cancelable/",
|
||||
"packageDependencies": [
|
||||
["p-cancelable", "npm:2.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["p-each-series", [
|
||||
["npm:2.2.0", {
|
||||
"packageLocation": "./.yarn/cache/p-each-series-npm-2.2.0-b9907a1ae6-d5a0896eb7.zip/node_modules/p-each-series/",
|
||||
|
@ -5290,6 +5508,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["quick-lru", [
|
||||
["npm:5.1.1", {
|
||||
"packageLocation": "./.yarn/cache/quick-lru-npm-5.1.1-e38e0edce3-fafb2b2fa1.zip/node_modules/quick-lru/",
|
||||
"packageDependencies": [
|
||||
["quick-lru", "npm:5.1.1"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["raw-body", [
|
||||
["npm:2.4.1", {
|
||||
"packageLocation": "./.yarn/cache/raw-body-npm-2.4.1-e6e30ccf94-dc56e010d2.zip/node_modules/raw-body/",
|
||||
|
@ -5558,6 +5785,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["resolve-alpn", [
|
||||
["npm:1.0.0", {
|
||||
"packageLocation": "./.yarn/cache/resolve-alpn-npm-1.0.0-f655c150b7-17baee01c0.zip/node_modules/resolve-alpn/",
|
||||
"packageDependencies": [
|
||||
["resolve-alpn", "npm:1.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["resolve-cwd", [
|
||||
["npm:3.0.0", {
|
||||
"packageLocation": "./.yarn/cache/resolve-cwd-npm-3.0.0-e6f4e296bf-97edfbbf83.zip/node_modules/resolve-cwd/",
|
||||
|
@ -5593,6 +5829,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["responselike", [
|
||||
["npm:2.0.0", {
|
||||
"packageLocation": "./.yarn/cache/responselike-npm-2.0.0-7813864e97-11d8225dd8.zip/node_modules/responselike/",
|
||||
"packageDependencies": [
|
||||
["responselike", "npm:2.0.0"],
|
||||
["lowercase-keys", "npm:2.0.0"]
|
||||
],
|
||||
"linkType": "HARD",
|
||||
}]
|
||||
]],
|
||||
["ret", [
|
||||
["npm:0.1.15", {
|
||||
"packageLocation": "./.yarn/cache/ret-npm-0.1.15-0d3c19de76-749c2fcae7.zip/node_modules/ret/",
|
||||
|
@ -5766,6 +6012,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
|
|||
"packageLocation": "./",
|
||||
"packageDependencies": [
|
||||
["serve-my-jams", "workspace:."],
|
||||
["got", "npm:11.8.2"],
|
||||
["jest", "npm:26.6.3"],
|
||||
["koa", "npm:2.13.1"],
|
||||
["koa-body", "npm:4.2.0"],
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
"jest": "^26.6.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"got": "^11.8.2",
|
||||
"koa": "^2.13.1",
|
||||
"koa-body": "^4.2.0",
|
||||
"koa-helmet": "^6.0.0",
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
module.exports = {
|
||||
port: 4000,
|
||||
host: "localhost",
|
||||
|
||||
allowedWebmentionSources: [
|
||||
"brainbaking.com",
|
||||
"jefklakscodex.com"
|
||||
]
|
||||
}
|
|
@ -30,12 +30,13 @@ app.use(bodyParser({
|
|||
|
||||
// route docs: https://github.com/koajs/router/blob/HEAD/API.md#module_koa-router--Router+get%7Cput%7Cpost%7Cpatch%7Cdelete%7Cdel
|
||||
require("./webmention/route").route(router);
|
||||
const config = require("./config");
|
||||
|
||||
app.use(router.routes()).use(router.allowedMethods());
|
||||
|
||||
const port = process.env.PORT || 4000
|
||||
const port = process.env.PORT || config.port
|
||||
|
||||
app.listen(port, "localhost", () => {
|
||||
app.listen(port, config.host, () => {
|
||||
console.log(`Started localhost at port ${port}`)
|
||||
});
|
||||
|
||||
|
|
|
@ -1,10 +1,20 @@
|
|||
|
||||
const got = require('got')
|
||||
const config = require('./../config')
|
||||
|
||||
function isValidUrl(url) {
|
||||
return url !== undefined &&
|
||||
(url.startsWith("http://") || url.startsWith("https://"))
|
||||
}
|
||||
|
||||
function isValidDomain(url) {
|
||||
return config.allowedWebmentionSources.some(domain => {
|
||||
return url.indexOf(domain) !== -1
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
Remember, TARGET is own domain, SOURCE is the article to process
|
||||
https://www.w3.org/TR/webmention/#sender-notifies-receiver
|
||||
example:
|
||||
POST /webmention-endpoint HTTP/1.1
|
||||
|
@ -20,12 +30,31 @@ function isValidUrl(url) {
|
|||
function validate(request) {
|
||||
return request.type === "application/x-www-form-urlencoded" &&
|
||||
request.body !== undefined &&
|
||||
isValidUrl(request?.body.source) &&
|
||||
isValidUrl(request?.body.target)
|
||||
isValidUrl(request?.body?.source) &&
|
||||
isValidUrl(request?.body?.target) &&
|
||||
request?.body?.source !== request?.body?.target &&
|
||||
isValidDomain(request?.body?.source)
|
||||
}
|
||||
|
||||
function processSourceBody(body, target) {
|
||||
if(body.indexOf(target) === -1) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
async function receive(body) {
|
||||
// do stuff with it
|
||||
try {
|
||||
await got(body.target)
|
||||
} catch(unknownTarget) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const src = await got(body.source)
|
||||
processSourceBody(src.body, body.target)
|
||||
} catch(unknownSource) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
|
@ -6,6 +6,7 @@ function route(router) {
|
|||
if(!validate(ctx.request)) {
|
||||
ctx.throw(400, "malformed webmention request")
|
||||
}
|
||||
// we do NOT await this on purpose.
|
||||
receive(ctx.request.body)
|
||||
|
||||
ctx.body = "Thanks, bro. Will process this webmention soon, pinky swear!";
|
||||
|
|
|
@ -3,11 +3,34 @@ const { receive, validate } = require('../../src/webmention/receive')
|
|||
|
||||
describe("validate tests", () => {
|
||||
|
||||
const validhttpurl = "http://localhost/bla"
|
||||
const validhttpsurl = "https://localhost/blie"
|
||||
const validhttpurl = "http://brainbaking.com/bla"
|
||||
const validhttpsurl = "https://brainbaking.com/blie"
|
||||
const urlfrominvaliddomain = "http://brainthe.bake/jup"
|
||||
const invalidurl = "lolzw"
|
||||
|
||||
test("is valid if source and target https urls", () => {
|
||||
const result = validate({
|
||||
type: "application/x-www-form-urlencoded",
|
||||
body: {
|
||||
source: validhttpsurl + "1",
|
||||
target: validhttpsurl + "2"
|
||||
}
|
||||
})
|
||||
|
||||
expect(result).toBe(true)
|
||||
})
|
||||
test("is NOT valid if source is a valid url but not form valid domain", () => {
|
||||
const result = validate({
|
||||
type: "application/x-www-form-urlencoded",
|
||||
body: {
|
||||
source: urlfrominvaliddomain,
|
||||
target: validhttpsurl + "2"
|
||||
}
|
||||
})
|
||||
|
||||
expect(result).toBe(false)
|
||||
})
|
||||
test("is NOT valid if source and target are the same urls", () => {
|
||||
const result = validate({
|
||||
type: "application/x-www-form-urlencoded",
|
||||
body: {
|
||||
|
@ -16,14 +39,14 @@ describe("validate tests", () => {
|
|||
}
|
||||
})
|
||||
|
||||
expect(result).toBe(true)
|
||||
expect(result).toBe(false)
|
||||
})
|
||||
test("is valid if source and target http urls", () => {
|
||||
const result = validate({
|
||||
type: "application/x-www-form-urlencoded",
|
||||
body: {
|
||||
source: validhttpurl,
|
||||
target: validhttpurl
|
||||
source: validhttpurl + "1",
|
||||
target: validhttpurl + "2"
|
||||
}
|
||||
})
|
||||
|
||||
|
|
213
yarn.lock
213
yarn.lock
|
@ -621,6 +621,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sindresorhus/is@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "@sindresorhus/is@npm:4.0.0"
|
||||
checksum: 7022d5037ff778c5c369c353e16a173c3797de5f4196b631ec00b0f710a3ccb016937ce454d4fac6ca32d695ed30a59444e941f8f78ff7692dc3c50959b3fe61
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sinonjs/commons@npm:^1.7.0":
|
||||
version: 1.8.2
|
||||
resolution: "@sinonjs/commons@npm:1.8.2"
|
||||
|
@ -639,6 +646,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@szmarczak/http-timer@npm:^4.0.5":
|
||||
version: 4.0.5
|
||||
resolution: "@szmarczak/http-timer@npm:4.0.5"
|
||||
dependencies:
|
||||
defer-to-connect: ^2.0.0
|
||||
checksum: 13d8f71dbd792b620b2cd13d72d086ef031ebefd5263a9db2f34693a32e4d90920fa1d7075cd59bf0c9810b2b1b93ad36d89fc88aba4cd3b8022df7ecc5ffdec
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.7":
|
||||
version: 7.1.12
|
||||
resolution: "@types/babel__core@npm:7.1.12"
|
||||
|
@ -689,6 +705,18 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/cacheable-request@npm:^6.0.1":
|
||||
version: 6.0.1
|
||||
resolution: "@types/cacheable-request@npm:6.0.1"
|
||||
dependencies:
|
||||
"@types/http-cache-semantics": "*"
|
||||
"@types/keyv": "*"
|
||||
"@types/node": "*"
|
||||
"@types/responselike": "*"
|
||||
checksum: 3dae802a0808573986c56b92bf16cd031a5b648b6c893d20c7ef6bfda3fc72a2107c7978697d2b27b14febc597162d6959985eeb5befc307a9f9f3c5081d4905
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/formidable@npm:^1.0.31":
|
||||
version: 1.0.32
|
||||
resolution: "@types/formidable@npm:1.0.32"
|
||||
|
@ -707,6 +735,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/http-cache-semantics@npm:*":
|
||||
version: 4.0.0
|
||||
resolution: "@types/http-cache-semantics@npm:4.0.0"
|
||||
checksum: e16fae56d4daea4ed678b4d5918b693b44ca12fb5e479b87d242d3a35bf3a014974dcf9ed7aba7e29149fdb6c3719f9987fca51b20ef10aa84b58f86553c2f74
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
|
||||
version: 2.0.3
|
||||
resolution: "@types/istanbul-lib-coverage@npm:2.0.3"
|
||||
|
@ -732,6 +767,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/keyv@npm:*":
|
||||
version: 3.1.1
|
||||
resolution: "@types/keyv@npm:3.1.1"
|
||||
dependencies:
|
||||
"@types/node": "*"
|
||||
checksum: 3aaf557d5b82e733d5a17b7f55af5d6be953363c3a594f006d64265790fe87c301c6e1400c0b6b1cf72add50a0ceddc25afb8231ab8302a2e5b6ebfbfac30e5d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/mongodb@npm:^3.5.27":
|
||||
version: 3.6.9
|
||||
resolution: "@types/mongodb@npm:3.6.9"
|
||||
|
@ -763,6 +807,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/responselike@npm:*, @types/responselike@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "@types/responselike@npm:1.0.0"
|
||||
dependencies:
|
||||
"@types/node": "*"
|
||||
checksum: e6e6613c800aeda63e2331e753e8d21df1a2c9aa7a4bc71ed792a848e4811fc96e609759089355314a2318c76eff1f161499cd242044838ab1e6f56e463ebb9c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/stack-utils@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "@types/stack-utils@npm:2.0.0"
|
||||
|
@ -1278,6 +1331,28 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cacheable-lookup@npm:^5.0.3":
|
||||
version: 5.0.4
|
||||
resolution: "cacheable-lookup@npm:5.0.4"
|
||||
checksum: cb5849f5841e37f007aeaea2516ecf2cb0a9730667694d131331a04413f6c3bf2587391d55003cc2b95ef59085b5f50ac9887a0b7c673fc0c8102bcc69b6d73d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cacheable-request@npm:^7.0.1":
|
||||
version: 7.0.1
|
||||
resolution: "cacheable-request@npm:7.0.1"
|
||||
dependencies:
|
||||
clone-response: ^1.0.2
|
||||
get-stream: ^5.1.0
|
||||
http-cache-semantics: ^4.0.0
|
||||
keyv: ^4.0.0
|
||||
lowercase-keys: ^2.0.0
|
||||
normalize-url: ^4.1.0
|
||||
responselike: ^2.0.0
|
||||
checksum: fe0b6f3b8a145c98fecc00f0f1b13a9886cad9bf4537533c5568cba19db81c8ee09ace9c61967d5a4e72615e174d771b6b8080c3816f0b74fc6f9c69060c3ff0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"callsites@npm:^3.0.0":
|
||||
version: 3.1.0
|
||||
resolution: "callsites@npm:3.1.0"
|
||||
|
@ -1394,6 +1469,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"clone-response@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "clone-response@npm:1.0.2"
|
||||
dependencies:
|
||||
mimic-response: ^1.0.0
|
||||
checksum: 71832f9219f2682b0915bdbc0dd187ba8e63d16b0af5342b44f97b34afe9400a1f528a253dd2f70a8dd8b23bfa4c4e106928fcc520fa5899d769af95e4cce53c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cls-bluebird@npm:^2.1.0":
|
||||
version: 2.1.0
|
||||
resolution: "cls-bluebird@npm:2.1.0"
|
||||
|
@ -1683,6 +1767,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"decompress-response@npm:^6.0.0":
|
||||
version: 6.0.0
|
||||
resolution: "decompress-response@npm:6.0.0"
|
||||
dependencies:
|
||||
mimic-response: ^3.1.0
|
||||
checksum: bb8b8c42be7767994764d27f91a3949e3dc9008da82f1aaeab1de40f1ebb50d7abf17b31b2e4000f8d267a1e75f76052efd58d4419124c04bf430e184c164fad
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"deep-equal@npm:~1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "deep-equal@npm:1.0.1"
|
||||
|
@ -1704,6 +1797,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"defer-to-connect@npm:^2.0.0":
|
||||
version: 2.0.1
|
||||
resolution: "defer-to-connect@npm:2.0.1"
|
||||
checksum: 6641e6377732f3066e5f101ae4f22de6b85c45fda3ff0cd710412901af7570cfbb77c9c25cb6dcd5d1b52b816e37fccfc013c9ec7f1f6a95823773625e8be6c5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"define-property@npm:^0.2.5":
|
||||
version: 0.2.5
|
||||
resolution: "define-property@npm:0.2.5"
|
||||
|
@ -2272,7 +2372,7 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-stream@npm:^5.0.0":
|
||||
"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0":
|
||||
version: 5.2.0
|
||||
resolution: "get-stream@npm:5.2.0"
|
||||
dependencies:
|
||||
|
@ -2318,6 +2418,25 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"got@npm:^11.8.2":
|
||||
version: 11.8.2
|
||||
resolution: "got@npm:11.8.2"
|
||||
dependencies:
|
||||
"@sindresorhus/is": ^4.0.0
|
||||
"@szmarczak/http-timer": ^4.0.5
|
||||
"@types/cacheable-request": ^6.0.1
|
||||
"@types/responselike": ^1.0.0
|
||||
cacheable-lookup: ^5.0.3
|
||||
cacheable-request: ^7.0.1
|
||||
decompress-response: ^6.0.0
|
||||
http2-wrapper: ^1.0.0-beta.5.2
|
||||
lowercase-keys: ^2.0.0
|
||||
p-cancelable: ^2.0.0
|
||||
responselike: ^2.0.0
|
||||
checksum: 6415f98ec249e932ca8223396e58ec18017ade64e21efc40db62f994f3551eaf7eca945671d40b2486f0650b1f17b5a2a0f11655ea501712566ef60be010f07f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4":
|
||||
version: 4.2.6
|
||||
resolution: "graceful-fs@npm:4.2.6"
|
||||
|
@ -2458,6 +2577,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"http-cache-semantics@npm:^4.0.0":
|
||||
version: 4.1.0
|
||||
resolution: "http-cache-semantics@npm:4.1.0"
|
||||
checksum: 451df9784af2acbe0cc1fd70291285c08ca4a8966ab5ee4d3975e003d1ad4d74c81473086d628f31296b31221966fda8bc5ea1e29dd8f1f33f9fc2b0fdca65ca
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"http-errors@npm:1.7.3, http-errors@npm:~1.7.2":
|
||||
version: 1.7.3
|
||||
resolution: "http-errors@npm:1.7.3"
|
||||
|
@ -2495,6 +2621,16 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"http2-wrapper@npm:^1.0.0-beta.5.2":
|
||||
version: 1.0.3
|
||||
resolution: "http2-wrapper@npm:1.0.3"
|
||||
dependencies:
|
||||
quick-lru: ^5.1.1
|
||||
resolve-alpn: ^1.0.0
|
||||
checksum: 2fc0140a69558cf1352372ed6cdf94eb6d108b2755ca087a5626044667033ca9fd6d0e5e04db3c3d2129aadff99b9b07b5bcf3952f5b7138926cb7a1d3128c6e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"human-signals@npm:^1.1.1":
|
||||
version: 1.1.1
|
||||
resolution: "human-signals@npm:1.1.1"
|
||||
|
@ -3414,6 +3550,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"json-buffer@npm:3.0.1":
|
||||
version: 3.0.1
|
||||
resolution: "json-buffer@npm:3.0.1"
|
||||
checksum: 78011309cb53c19195702ece9e282c8c58d7facd8d6e286857fd4daf511f0bd93424498898d0b9ecfde6ab8e87a2ab0c0a654fba4b1a4ec81fa51f2c48a5ddba
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"json-parse-even-better-errors@npm:^2.3.0":
|
||||
version: 2.3.1
|
||||
resolution: "json-parse-even-better-errors@npm:2.3.1"
|
||||
|
@ -3481,6 +3624,15 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"keyv@npm:^4.0.0":
|
||||
version: 4.0.3
|
||||
resolution: "keyv@npm:4.0.3"
|
||||
dependencies:
|
||||
json-buffer: 3.0.1
|
||||
checksum: 63527e3d010dd9b8f8e62435130cdb1518de7b7d0ebafcff1359611caa0e79c7f80f1863ff73e712d99ce69fa06be62b66a78fb5cfee6483f2f95eeac340f12b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0":
|
||||
version: 3.2.2
|
||||
resolution: "kind-of@npm:3.2.2"
|
||||
|
@ -3680,6 +3832,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lowercase-keys@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "lowercase-keys@npm:2.0.0"
|
||||
checksum: 4da67f41865a25360bb05749a66a83c60987c7efa0b8ec443941a19978c21ba916ae9fedca25b96fc652026c4264a437d3fec099d1949716b5483eec42395ec9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lru-cache@npm:^6.0.0":
|
||||
version: 6.0.0
|
||||
resolution: "lru-cache@npm:6.0.0"
|
||||
|
@ -3805,6 +3964,20 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"mimic-response@npm:^1.0.0":
|
||||
version: 1.0.1
|
||||
resolution: "mimic-response@npm:1.0.1"
|
||||
checksum: 64b43c717ed8710bc920576e96d38d0e504e9eec3114af8e00c9e3d7ae53cd459ee38febb0badc83e3a4e6d21cd571db43e9011f8cf014809989c87a1a9f0ea4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"mimic-response@npm:^3.1.0":
|
||||
version: 3.1.0
|
||||
resolution: "mimic-response@npm:3.1.0"
|
||||
checksum: cfbf19f66de6ad46df7481d9e8c1a7f30b6fa77dd771ad4a72a0443265041a39768182bde6d1de39001c2774168635bc74f42902e401c8ba33db55d69b773004
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^3.0.4":
|
||||
version: 3.0.4
|
||||
resolution: "minimatch@npm:3.0.4"
|
||||
|
@ -4102,6 +4275,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"normalize-url@npm:^4.1.0":
|
||||
version: 4.5.0
|
||||
resolution: "normalize-url@npm:4.5.0"
|
||||
checksum: 09794941dbe5c7b91caf6f3cd1ae167c27f6d09793e4a03601a68b62de7e8ee9e5de21a246130cdbab98b01481de292f9556d492444a527648f9cf1220e4b0df
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"npm-run-path@npm:^2.0.0":
|
||||
version: 2.0.2
|
||||
resolution: "npm-run-path@npm:2.0.2"
|
||||
|
@ -4237,6 +4417,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"p-cancelable@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "p-cancelable@npm:2.0.0"
|
||||
checksum: 966065f056a116a1ca3b6c7064d4d27a65bc1740c25cc60729faa5deea385bbd0f2317aedabb8e64c0cfc3c6b2dafe7f3ea65c267373d6d9be1602af443b4f12
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"p-each-series@npm:^2.1.0":
|
||||
version: 2.2.0
|
||||
resolution: "p-each-series@npm:2.2.0"
|
||||
|
@ -4481,6 +4668,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"quick-lru@npm:^5.1.1":
|
||||
version: 5.1.1
|
||||
resolution: "quick-lru@npm:5.1.1"
|
||||
checksum: fafb2b2fa1a948d6f2e88d4a60571be70b316d9b0be857d24fba0ac28fc31acebf535b643fe968473d689f8c655bcb2a0e4da67912f571059a4e4eb15740b021
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"raw-body@npm:^2.2.0":
|
||||
version: 2.4.1
|
||||
resolution: "raw-body@npm:2.4.1"
|
||||
|
@ -4687,6 +4881,13 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"resolve-alpn@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "resolve-alpn@npm:1.0.0"
|
||||
checksum: 17baee01c03a57cebd163aa5c9bd94f33646378bce8aa94c7a8d29fc0e1bf0807532bda3c36bb929511606633921d0f4a69e7fcc894cf02ad1c742e649b71673
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"resolve-cwd@npm:^3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "resolve-cwd@npm:3.0.0"
|
||||
|
@ -4737,6 +4938,15 @@ fsevents@^2.1.2:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"responselike@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "responselike@npm:2.0.0"
|
||||
dependencies:
|
||||
lowercase-keys: ^2.0.0
|
||||
checksum: 11d8225dd8bbbd2ab7482c2e54ff2618e346c7d785e66d2ff5da03d6eafa8b33c3a4c6d685324dccf06f36ee2695db9bd2579382548c2a7253d770204694a63d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ret@npm:~0.1.10":
|
||||
version: 0.1.15
|
||||
resolution: "ret@npm:0.1.15"
|
||||
|
@ -4901,6 +5111,7 @@ fsevents@^2.1.2:
|
|||
version: 0.0.0-use.local
|
||||
resolution: "serve-my-jams@workspace:."
|
||||
dependencies:
|
||||
got: ^11.8.2
|
||||
jest: ^26.6.3
|
||||
koa: ^2.13.1
|
||||
koa-body: ^4.2.0
|
||||
|
|
Loading…
Reference in New Issue