diff --git a/package-lock.json b/package-lock.json index 76f008e1b6..2041d97d95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -128,14 +128,14 @@ } }, "@lerna/add": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.13.1.tgz", - "integrity": "sha512-cXk42YbuhzEnADCK8Qte5laC9Qo03eJLVnr0qKY85jQUM/T4URe3IIUemqpg0CpVATrB+Vz+iNdeqw9ng1iALw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.13.3.tgz", + "integrity": "sha512-T3/Lsbo9ZFq+vL3ssaHxA8oKikZAPTJTGFe4CRuQgWCDd/M61+51jeWsngdaHpwzSSRDRjxg8fJTG10y10pnfA==", "dev": true, "requires": { - "@lerna/bootstrap": "3.13.1", - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", + "@lerna/bootstrap": "3.13.3", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", "@lerna/npm-conf": "3.13.0", "@lerna/validation-error": "3.13.0", "dedent": "^0.7.0", @@ -157,19 +157,19 @@ } }, "@lerna/bootstrap": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.13.1.tgz", - "integrity": "sha512-mKdi5Ds5f82PZwEFyB9/W60I3iELobi1i87sTeVrbJh/um7GvqpSPy7kG/JPxyOdMpB2njX6LiJgw+7b6BEPWw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.13.3.tgz", + "integrity": "sha512-2XzijnLHRZOVQh8pwS7+5GR3cG4uh+EiLrWOishCq2TVzkqgjaS3GGBoef7KMCXfWHoLqAZRr/jEdLqfETLVqg==", "dev": true, "requires": { "@lerna/batch-packages": "3.13.0", - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", - "@lerna/has-npm-version": "3.13.0", - "@lerna/npm-install": "3.13.0", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", + "@lerna/has-npm-version": "3.13.3", + "@lerna/npm-install": "3.13.3", "@lerna/package-graph": "3.13.0", "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.13.0", + "@lerna/rimraf-dir": "3.13.3", "@lerna/run-lifecycle": "3.13.0", "@lerna/run-parallel-batches": "3.13.0", "@lerna/symlink-binary": "3.13.0", @@ -189,32 +189,32 @@ } }, "@lerna/changed": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.13.2.tgz", - "integrity": "sha512-mcmkxUMR0J4ZyRyVUrdDJl4ZsdHDgdA1xQcbdB4LZvAE/E2lNlPcEfAfbfs08VnRiqvFOqcczbzBq10hvSFg4w==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.13.3.tgz", + "integrity": "sha512-REMZ/1UvYrizUhN7ktlbfMUa0vhMf1ogAe97WQC4I8r3s973Orfhs3aselo1GwudUwM4tMHBH8A9vnll9or3iA==", "dev": true, "requires": { - "@lerna/collect-updates": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/collect-updates": "3.13.3", + "@lerna/command": "3.13.3", "@lerna/listable": "3.13.0", "@lerna/output": "3.13.0", - "@lerna/version": "3.13.2" + "@lerna/version": "3.13.3" } }, "@lerna/check-working-tree": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.13.0.tgz", - "integrity": "sha512-dsdO15NXX5To+Q53SYeCrBEpiqv4m5VkaPZxbGQZNwoRen1MloXuqxSymJANQn+ZLEqarv5V56gydebeROPH5A==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.13.3.tgz", + "integrity": "sha512-LoGZvTkne+V1WpVdCTU0XNzFKsQa2AiAFKksGRT0v8NQj6VAPp0jfVYDayTqwaWt2Ne0OGKOFE79Y5LStOuhaQ==", "dev": true, "requires": { - "@lerna/describe-ref": "3.13.0", + "@lerna/describe-ref": "3.13.3", "@lerna/validation-error": "3.13.0" } }, "@lerna/child-process": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.13.0.tgz", - "integrity": "sha512-0iDS8y2jiEucD4fJHEzKoc8aQJgm7s+hG+0RmDNtfT0MM3n17pZnf5JOMtS1FJp+SEXOjMKQndyyaDIPFsnp6A==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.13.3.tgz", + "integrity": "sha512-3/e2uCLnbU+bydDnDwyadpOmuzazS01EcnOleAnuj9235CU2U97DH6OyoG1EW/fU59x11J+HjIqovh5vBaMQjQ==", "dev": true, "requires": { "chalk": "^2.3.1", @@ -223,16 +223,16 @@ } }, "@lerna/clean": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.13.1.tgz", - "integrity": "sha512-myGIaXv7RUO2qCFZXvx8SJeI+eN6y9SUD5zZ4/LvNogbOiEIlujC5lUAqK65rAHayQ9ltSa/yK6Xv510xhZXZQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.13.3.tgz", + "integrity": "sha512-xmNauF1PpmDaKdtA2yuRc23Tru4q7UMO6yB1a/TTwxYPYYsAWG/CBK65bV26J7x4RlZtEv06ztYGMa9zh34UXA==", "dev": true, "requires": { - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", "@lerna/prompt": "3.13.0", "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.13.0", + "@lerna/rimraf-dir": "3.13.3", "p-map": "^1.2.0", "p-map-series": "^1.0.0", "p-waterfall": "^1.0.0" @@ -251,25 +251,25 @@ } }, "@lerna/collect-updates": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.13.0.tgz", - "integrity": "sha512-uR3u6uTzrS1p46tHQ/mlHog/nRJGBqskTHYYJbgirujxm6FqNh7Do+I1Q/7zSee407G4lzsNxZdm8IL927HemQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.13.3.tgz", + "integrity": "sha512-sTpALOAxli/ZS+Mjq6fbmjU9YXqFJ2E4FrE1Ijl4wPC5stXEosg2u0Z1uPY+zVKdM+mOIhLxPVdx83rUgRS+Cg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", - "@lerna/describe-ref": "3.13.0", + "@lerna/child-process": "3.13.3", + "@lerna/describe-ref": "3.13.3", "minimatch": "^3.0.4", "npmlog": "^4.1.2", "slash": "^1.0.0" } }, "@lerna/command": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.13.1.tgz", - "integrity": "sha512-SYWezxX+iheWvzRoHCrbs8v5zHPaxAx3kWvZhqi70vuGsdOVAWmaG4IvHLn11ztS+Vpd5PM+ztBWSbnykpLFKQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.13.3.tgz", + "integrity": "sha512-WHFIQCubJV0T8gSLRNr6exZUxTswrh+iAtJCb86SE0Sa+auMPklE8af7w2Yck5GJfewmxSjke3yrjNxQrstx7w==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "@lerna/package-graph": "3.13.0", "@lerna/project": "3.13.1", "@lerna/validation-error": "3.13.0", @@ -308,13 +308,13 @@ } }, "@lerna/create": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.13.1.tgz", - "integrity": "sha512-pLENMXgTkQuvKxAopjKeoLOv9fVUCnpTUD7aLrY5d95/1xqSZlnsOcQfUYcpMf3GpOvHc8ILmI5OXkPqjAf54g==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.13.3.tgz", + "integrity": "sha512-4M5xT1AyUMwt1gCDph4BfW3e6fZmt0KjTa3FoXkUotf/w/eqTsc2IQ+ULz2+gOFQmtuNbqIZEOK3J4P9ArJJ/A==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/child-process": "3.13.3", + "@lerna/command": "3.13.3", "@lerna/npm-conf": "3.13.0", "@lerna/validation-error": "3.13.0", "camelcase": "^5.0.0", @@ -359,48 +359,48 @@ } }, "@lerna/describe-ref": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.13.0.tgz", - "integrity": "sha512-UJefF5mLxLae9I2Sbz5RLYGbqbikRuMqdgTam0MS5OhXnyuuKYBUpwBshCURNb1dPBXTQhSwc7+oUhORx8ojCg==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.13.3.tgz", + "integrity": "sha512-5KcLTvjdS4gU5evW8ESbZ0BF44NM5HrP3dQNtWnOUSKJRgsES8Gj0lq9AlB2+YglZfjEftFT03uOYOxnKto4Uw==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "npmlog": "^4.1.2" } }, "@lerna/diff": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.13.1.tgz", - "integrity": "sha512-cKqmpONO57mdvxtp8e+l5+tjtmF04+7E+O0QEcLcNUAjC6UR2OSM77nwRCXDukou/1h72JtWs0jjcdYLwAmApg==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.13.3.tgz", + "integrity": "sha512-/DRS2keYbnKaAC+5AkDyZRGkP/kT7v1GlUS0JGZeiRDPQ1H6PzhX09EgE5X6nj0Ytrm0sUasDeN++CDVvgaI+A==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/child-process": "3.13.3", + "@lerna/command": "3.13.3", "@lerna/validation-error": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/exec": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.13.1.tgz", - "integrity": "sha512-I34wEP9lrAqqM7tTXLDxv/6454WFzrnXDWpNDbiKQiZs6SIrOOjmm6I4FiQsx+rU3o9d+HkC6tcUJRN5mlJUgA==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.13.3.tgz", + "integrity": "sha512-c0bD4XqM96CTPV8+lvkxzE7mkxiFyv/WNM4H01YvvbFAJzk+S4Y7cBtRkIYFTfkFZW3FLo8pEgtG1ONtIdM+tg==", "dev": true, "requires": { "@lerna/batch-packages": "3.13.0", - "@lerna/child-process": "3.13.0", - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", + "@lerna/child-process": "3.13.3", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", "@lerna/run-parallel-batches": "3.13.0", "@lerna/validation-error": "3.13.0" } }, "@lerna/filter-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.13.0.tgz", - "integrity": "sha512-SRp7DCo9zrf+7NkQxZMkeyO1GRN6GICoB9UcBAbXhLbWisT37Cx5/6+jh49gYB63d/0/WYHSEPMlheUrpv1Srw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.13.3.tgz", + "integrity": "sha512-DbtQX4eRgrBz1wCFWRP99JBD7ODykYme9ykEK79+RrKph40znhJQRlLg4idogj6IsUEzwo1OHjihCzSfnVo6Cg==", "dev": true, "requires": { - "@lerna/collect-updates": "3.13.0", + "@lerna/collect-updates": "3.13.3", "@lerna/filter-packages": "3.13.0", "dedent": "^0.7.0" } @@ -454,12 +454,12 @@ } }, "@lerna/github-client": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.13.1.tgz", - "integrity": "sha512-iPLUp8FFoAKGURksYEYZzfuo9TRA+NepVlseRXFaWlmy36dCQN20AciINpoXiXGoHcEUHXUKHQvY3ARFdMlf3w==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.13.3.tgz", + "integrity": "sha512-fcJkjab4kX0zcLLSa/DCUNvU3v8wmy2c1lhdIbL7s7gABmDcV0QZq93LhnEee3VkC9UpnJ6GKG4EkD7eIifBnA==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "@octokit/plugin-enterprise-rest": "^2.1.1", "@octokit/rest": "^16.16.0", "git-url-parse": "^11.1.2", @@ -473,23 +473,23 @@ "dev": true }, "@lerna/has-npm-version": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.13.0.tgz", - "integrity": "sha512-Oqu7DGLnrMENPm+bPFGOHnqxK8lCnuYr6bk3g/CoNn8/U0qgFvHcq6Iv8/Z04TsvleX+3/RgauSD2kMfRmbypg==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.13.3.tgz", + "integrity": "sha512-mQzoghRw4dBg0R9FFfHrj0TH0glvXyzdEZmYZ8Isvx5BSuEEwpsryoywuZSdppcvLu8o7NAdU5Tac8cJ/mT52w==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "semver": "^5.5.0" } }, "@lerna/import": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.13.1.tgz", - "integrity": "sha512-A1Vk1siYx1XkRl6w+zkaA0iptV5TIynVlHPR9S7NY0XAfhykjztYVvwtxarlh6+VcNrO9We6if0+FXCrfDEoIg==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.13.3.tgz", + "integrity": "sha512-gDjLAFVavG/CMvj9leBfiwd7vrXqtdFXPIz1oXmghBMnje7nCTbodbNWFe4VDDWx7reDaZIN+6PxTSvrPcF//A==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/child-process": "3.13.3", + "@lerna/command": "3.13.3", "@lerna/prompt": "3.13.0", "@lerna/pulse-till-done": "3.13.0", "@lerna/validation-error": "3.13.0", @@ -499,25 +499,25 @@ } }, "@lerna/init": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.13.1.tgz", - "integrity": "sha512-M59WACqim8WkH5FQEGOCEZ89NDxCKBfFTx4ZD5ig3LkGyJ8RdcJq5KEfpW/aESuRE9JrZLzVr0IjKbZSxzwEMA==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.13.3.tgz", + "integrity": "sha512-bK/mp0sF6jT0N+c+xrbMCqN4xRoiZCXQzlYsyACxPK99KH/mpHv7hViZlTYUGlYcymtew6ZC770miv5A9wF9hA==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/child-process": "3.13.3", + "@lerna/command": "3.13.3", "fs-extra": "^7.0.0", "p-map": "^1.2.0", "write-json-file": "^2.3.0" } }, "@lerna/link": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.13.1.tgz", - "integrity": "sha512-N3h3Fj1dcea+1RaAoAdy4g2m3fvU7m89HoUn5X/Zcw5n2kPoK8kTO+NfhNAatfRV8VtMXst8vbNrWQQtfm0FFw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.13.3.tgz", + "integrity": "sha512-IHhtdhA0KlIdevCsq6WHkI2rF3lHWHziJs2mlrEWAKniVrFczbELON1KJAgdJS1k3kAP/WeWVqmIYZ2hJDxMvg==", "dev": true, "requires": { - "@lerna/command": "3.13.1", + "@lerna/command": "3.13.3", "@lerna/package-graph": "3.13.0", "@lerna/symlink-dependencies": "3.13.0", "p-map": "^1.2.0", @@ -525,13 +525,13 @@ } }, "@lerna/list": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.13.1.tgz", - "integrity": "sha512-635iRbdgd9gNvYLLIbYdQCQLr+HioM5FGJLFS0g3DPGygr6iDR8KS47hzCRGH91LU9NcM1mD1RoT/AChF+QbiA==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.13.3.tgz", + "integrity": "sha512-rLRDsBCkydMq2FL6WY1J/elvnXIjxxRtb72lfKHdvDEqVdquT5Qgt9ci42hwjmcocFwWcFJgF6BZozj5pbc13A==", "dev": true, "requires": { - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", "@lerna/listable": "3.13.0", "@lerna/output": "3.13.0" } @@ -590,12 +590,12 @@ } }, "@lerna/npm-install": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.13.0.tgz", - "integrity": "sha512-qNyfts//isYQxore6fsPorNYJmPVKZ6tOThSH97tP0aV91zGMtrYRqlAoUnDwDdAjHPYEM16hNujg2wRmsqqIw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.13.3.tgz", + "integrity": "sha512-7Jig9MLpwAfcsdQ5UeanAjndChUjiTjTp50zJ+UZz4CbIBIDhoBehvNMTCL2G6pOEC7sGEg6sAqJINAqred6Tg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "@lerna/get-npm-exec-opts": "3.13.0", "fs-extra": "^7.0.0", "npm-package-arg": "^6.1.0", @@ -629,12 +629,12 @@ } }, "@lerna/npm-run-script": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.13.0.tgz", - "integrity": "sha512-hiL3/VeVp+NFatBjkGN8mUdX24EfZx9rQlSie0CMgtjc7iZrtd0jCguLomSCRHYjJuvqgbp+LLYo7nHVykfkaQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.13.3.tgz", + "integrity": "sha512-qR4o9BFt5hI8Od5/DqLalOJydnKpiQFEeN0h9xZi7MwzuX1Ukwh3X22vqsX4YRbipIelSFtrDzleNVUm5jj0ow==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "@lerna/get-npm-exec-opts": "3.13.0", "npmlog": "^4.1.2" } @@ -806,17 +806,17 @@ } }, "@lerna/publish": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.13.2.tgz", - "integrity": "sha512-L8iceC3Z2YJnlV3cGbfk47NSh1+iOo1tD65z+BU3IYLRpPnnSf8i6BORdKV8rECDj6kjLYvL7//2yxbHy7shhA==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.13.3.tgz", + "integrity": "sha512-Ni3pZKueIfgJJoL0OXfbAuWhGlJrDNwGx3CYWp2dbNqJmKD6uBZmsDtmeARKDp92oUK60W0drXCMydkIFFHMDQ==", "dev": true, "requires": { "@lerna/batch-packages": "3.13.0", - "@lerna/check-working-tree": "3.13.0", - "@lerna/child-process": "3.13.0", - "@lerna/collect-updates": "3.13.0", - "@lerna/command": "3.13.1", - "@lerna/describe-ref": "3.13.0", + "@lerna/check-working-tree": "3.13.3", + "@lerna/child-process": "3.13.3", + "@lerna/collect-updates": "3.13.3", + "@lerna/command": "3.13.3", + "@lerna/describe-ref": "3.13.3", "@lerna/log-packed": "3.13.0", "@lerna/npm-conf": "3.13.0", "@lerna/npm-dist-tag": "3.13.0", @@ -828,7 +828,7 @@ "@lerna/run-lifecycle": "3.13.0", "@lerna/run-parallel-batches": "3.13.0", "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.13.2", + "@lerna/version": "3.13.3", "figgy-pudding": "^3.5.1", "fs-extra": "^7.0.0", "libnpmaccess": "^3.0.1", @@ -864,12 +864,12 @@ } }, "@lerna/rimraf-dir": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.13.0.tgz", - "integrity": "sha512-kte+pMemulre8cmPqljxIYjCmdLByz8DgHBHXB49kz2EiPf8JJ+hJFt0PzEubEyJZ2YE2EVAx5Tv5+NfGNUQyQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.13.3.tgz", + "integrity": "sha512-d0T1Hxwu3gpYVv73ytSL+/Oy8JitsmvOYUR5ouRSABsmqS7ZZCh5t6FgVDDGVXeuhbw82+vuny1Og6Q0k4ilqw==", "dev": true, "requires": { - "@lerna/child-process": "3.13.0", + "@lerna/child-process": "3.13.3", "npmlog": "^4.1.2", "path-exists": "^3.0.0", "rimraf": "^2.6.2" @@ -884,15 +884,15 @@ } }, "@lerna/run": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.13.1.tgz", - "integrity": "sha512-nv1oj7bsqppWm1M4ifN+/IIbVu9F4RixrbQD2okqDGYne4RQPAXyb5cEZuAzY/wyGTWWiVaZ1zpj5ogPWvH0bw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.13.3.tgz", + "integrity": "sha512-ygnLIfIYS6YY1JHWOM4CsdZiY8kTYPsDFOLAwASlRnlAXF9HiMT08GFXLmMHIblZJ8yJhsM2+QgraCB0WdxzOQ==", "dev": true, "requires": { "@lerna/batch-packages": "3.13.0", - "@lerna/command": "3.13.1", - "@lerna/filter-options": "3.13.0", - "@lerna/npm-run-script": "3.13.0", + "@lerna/command": "3.13.3", + "@lerna/filter-options": "3.13.3", + "@lerna/npm-run-script": "3.13.3", "@lerna/output": "3.13.0", "@lerna/run-parallel-batches": "3.13.0", "@lerna/timer": "3.13.0", @@ -965,18 +965,18 @@ } }, "@lerna/version": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.13.2.tgz", - "integrity": "sha512-85AEn6Cx5p1VOejEd5fpTyeDCx6yejSJCgbILkx+gXhLhFg2XpFzLswMd+u71X7RAttWHvhzeKJAw4tWTXDvpQ==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.13.3.tgz", + "integrity": "sha512-o/yQGAwDHmyu17wTj4Kat1/uDhjYFMeG+H0Y0HC4zJ4a/T6rEiXx7jJrnucPTmTQTDcUBoH/It5LrPYGOPsExA==", "dev": true, "requires": { "@lerna/batch-packages": "3.13.0", - "@lerna/check-working-tree": "3.13.0", - "@lerna/child-process": "3.13.0", - "@lerna/collect-updates": "3.13.0", - "@lerna/command": "3.13.1", + "@lerna/check-working-tree": "3.13.3", + "@lerna/child-process": "3.13.3", + "@lerna/collect-updates": "3.13.3", + "@lerna/command": "3.13.3", "@lerna/conventional-commits": "3.13.0", - "@lerna/github-client": "3.13.1", + "@lerna/github-client": "3.13.3", "@lerna/output": "3.13.0", "@lerna/prompt": "3.13.0", "@lerna/run-lifecycle": "3.13.0", @@ -1053,9 +1053,9 @@ } }, "@octokit/rest": { - "version": "16.24.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.24.1.tgz", - "integrity": "sha512-V2GVL+cfuwNTcZ9qtBMOR9pIftWo1AiZIiGvWNmTcIQG5mkj83ZXC+g3w5g0cVXt7Hi+mSOrD2bZ7HJOuouUNg==", + "version": "16.25.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.25.0.tgz", + "integrity": "sha512-QKIzP0gNYjyIGmY3Gpm3beof0WFwxFR+HhRZ+Wi0fYYhkEUvkJiXqKF56Pf5glzzfhEwOrggfluEld5F/ZxsKw==", "dev": true, "requires": { "@octokit/request": "3.0.0", @@ -1325,50 +1325,6 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2769,6 +2725,15 @@ "meow": "^3.3.0" } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", @@ -3106,15 +3071,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3474,9 +3430,9 @@ } }, "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -5113,9 +5069,9 @@ } }, "istanbul-reports": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.2.tgz", - "integrity": "sha512-ZFuTdBQ3PSaPnm02aEA4R6mzQ2AF9w03CYiXADzWbbE48v/EFOWF4MaX4FT0NRdqIk48I7o0RPi+S8TMswaCbQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.3.tgz", + "integrity": "sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw==", "dev": true, "requires": { "handlebars": "^4.1.0" @@ -5216,26 +5172,26 @@ } }, "lerna": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.13.2.tgz", - "integrity": "sha512-2iliiFVAMNqaKsVSJ90p49dur93d5RlktotAJNp+uuHsCuIIAvwceqmSgDQCmWu4GkgAom+5uy//KV6F9t8fLA==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.13.3.tgz", + "integrity": "sha512-0TkG40F02A4wjKraJBztPtj87BjUezFmaZKAha8eLdtngZkSpAdrSANa5K7jnnA8mywmpQwrKJuBmjdNpm9cBw==", "dev": true, "requires": { - "@lerna/add": "3.13.1", - "@lerna/bootstrap": "3.13.1", - "@lerna/changed": "3.13.2", - "@lerna/clean": "3.13.1", + "@lerna/add": "3.13.3", + "@lerna/bootstrap": "3.13.3", + "@lerna/changed": "3.13.3", + "@lerna/clean": "3.13.3", "@lerna/cli": "3.13.0", - "@lerna/create": "3.13.1", - "@lerna/diff": "3.13.1", - "@lerna/exec": "3.13.1", - "@lerna/import": "3.13.1", - "@lerna/init": "3.13.1", - "@lerna/link": "3.13.1", - "@lerna/list": "3.13.1", - "@lerna/publish": "3.13.2", - "@lerna/run": "3.13.1", - "@lerna/version": "3.13.2", + "@lerna/create": "3.13.3", + "@lerna/diff": "3.13.3", + "@lerna/exec": "3.13.3", + "@lerna/import": "3.13.3", + "@lerna/init": "3.13.3", + "@lerna/link": "3.13.3", + "@lerna/list": "3.13.3", + "@lerna/publish": "3.13.3", + "@lerna/run": "3.13.3", + "@lerna/version": "3.13.3", "import-local": "^1.0.0", "npmlog": "^4.1.2" } @@ -5619,18 +5575,18 @@ } }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -6814,6 +6770,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", @@ -7013,14 +6975,6 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } } }, "requestretry": { @@ -7327,15 +7281,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -8013,12 +7958,12 @@ "dev": true }, "tslint": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", - "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", @@ -8080,9 +8025,9 @@ "dev": true }, "uglify-js": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz", - "integrity": "sha512-GpKo28q/7Bm5BcX9vOu4S46FwisbPbAmkkqPnGIpKvKTM96I85N6XHQV+k4I6FA2wxgLhcsSyHoNhzucwCflvA==", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.6.tgz", + "integrity": "sha512-YDKRX8F0Y+Jr7LhoVk0n4G7ltR3Y7qFAj+DtVBthlOgCcIj1hyMigCfousVfn9HKmvJ+qiFlLDwaHx44/e5ZKw==", "dev": true, "optional": true, "requires": { diff --git a/packages/express/lib/rest/wrappers.js b/packages/express/lib/rest/getHandler.js similarity index 69% rename from packages/express/lib/rest/wrappers.js rename to packages/express/lib/rest/getHandler.js index b1e19008d1..4805b5a1fa 100644 --- a/packages/express/lib/rest/wrappers.js +++ b/packages/express/lib/rest/getHandler.js @@ -1,6 +1,5 @@ const errors = require('@feathersjs/errors'); const { omit } = require('@feathersjs/commons')._; - const debug = require('debug')('@feathersjs/express/rest'); const statusCodes = { @@ -16,23 +15,47 @@ const methodMap = { patch: 'PATCH', remove: 'DELETE' }; -const allowedMethods = function (service) { + +function getAllowedMethods (service, routes) { + if (routes) { + return routes + .filter(({ method }) => typeof service[method] === 'function') + .map(methodRoute => methodRoute.verb.toUpperCase()) + .filter((value, index, list) => list.indexOf(value) === index); + } + return Object.keys(methodMap) .filter(method => typeof service[method] === 'function') .map(method => methodMap[method]) // Filter out duplicates .filter((value, index, list) => list.indexOf(value) === index); -}; +} + +function makeArgsGetter (argsOrder) { + return (req, params) => argsOrder.reduce((result, argName) => { + switch (argName) { + case 'id': + return [ ...result, req.params.__feathersId || null ]; + case 'data': + return [ ...result, req.body ]; + case 'params': + return [ ...result, params ]; + } + }, []); +} // A function that returns the middleware for a given method and service // `getArgs` is a function that should return additional leading service arguments -function getHandler (method, getArgs) { - return service => { +module.exports = function getHandler (method) { + return (service, routes) => { + const getArgs = makeArgsGetter(service.methods[method]); + const allowedMethods = getAllowedMethods(service, routes); + return function (req, res, next) { const { query } = req; const route = omit(req.params, '__feathersId'); - res.setHeader('Allow', allowedMethods(service).join(',')); + res.setHeader('Allow', allowedMethods.join(',')); // Check if the method exists on the service at all. Send 405 (Method not allowed) if not if (typeof service[method] !== 'function') { @@ -52,7 +75,6 @@ function getHandler (method, getArgs) { value: true }); - // Run the getArgs callback, if available, for additional parameters const args = getArgs(req, params); debug(`REST handler calling \`${method}\` from \`${req.url}\``); @@ -85,33 +107,4 @@ function getHandler (method, getArgs) { }); }; }; -} - -// Returns no leading parameters -function reqNone (req, params) { - return [ params ]; -} - -// Returns the leading parameters for a `get` or `remove` request (the id) -function reqId (req, params) { - return [ req.params.__feathersId || null, params ]; -} - -// Returns the leading parameters for an `update` or `patch` request (id, data) -function reqUpdate (req, params) { - return [ req.params.__feathersId || null, req.body, params ]; -} - -// Returns the leading parameters for a `create` request (data) -function reqCreate (req, params) { - return [ req.body, params ]; -} - -module.exports = { - find: getHandler('find', reqNone), - get: getHandler('get', reqId), - create: getHandler('create', reqCreate), - update: getHandler('update', reqUpdate), - patch: getHandler('patch', reqUpdate), - remove: getHandler('remove', reqId) }; diff --git a/packages/express/lib/rest/index.js b/packages/express/lib/rest/index.js index d34ca5b567..ca690aaf00 100644 --- a/packages/express/lib/rest/index.js +++ b/packages/express/lib/rest/index.js @@ -1,8 +1,78 @@ -const makeDebug = require('debug'); -const wrappers = require('./wrappers'); +const { stripSlashes } = require('@feathersjs/commons'); +const debug = require('debug')('@feathersjs/express/rest'); const { parseAuthentication } = require('../authentication'); +const getHandler = require('./getHandler'); + +const HTTP_METHOD = Symbol('@feathersjs/express/rest/HTTP_METHOD'); + +function httpMethod (verb, uris) { + return method => { + Object.defineProperty(method, HTTP_METHOD, { + enumerable: false, + configurable: true, + writable: false, + value: (Array.isArray(uris) ? uris : [uris]) + .reduce( + (result, uri) => ([...result, { verb, uri }]), + method[HTTP_METHOD] || [] + ) + }); + + return method; + }; +} + +function getDefaultUri (path, methods, method) { + return methods[method].indexOf('id') === -1 + ? `/${path}/${method}` + : `/${path}/:__feathersId/${method}`; +} + +function parseRoute (path, methods, method, route) { + return { + method, + verb: route.verb, + uri: route.uri ? `/${path}/${stripSlashes(route.uri)}` : getDefaultUri(path, methods, method) + }; +} + +function getServiceRoutes (service, path, defaultRoutes) { + const { methods } = service; -const debug = makeDebug('@feathersjs/express/rest'); + return Object.keys(methods) + .filter(method => (service[method] && service[method][HTTP_METHOD])) + .reduce((result, method) => { + const routes = service[method][HTTP_METHOD]; + + if (Array.isArray(routes)) { + return [ + ...result, + ...routes.map(route => parseRoute(path, methods, method, route)) + ]; + } + + return [ + ...result, + parseRoute(path, methods, method, routes) + ]; + }, defaultRoutes); +} + +function getDefaultRoutes (uri) { + const idUri = `${uri}/:__feathersId`; + + return [ + { method: 'find', verb: 'GET', uri }, // find(params) + { method: 'get', verb: 'GET', uri: idUri }, // get(id, params) + { method: 'create', verb: 'POST', uri }, // create(data, params) + { method: 'patch', verb: 'PATCH', uri: idUri }, // patch(id, data, params) + { method: 'patch', verb: 'PATCH', uri }, // patch(null, data, params) + { method: 'update', verb: 'PUT', uri: idUri }, // update(id, data, params) + { method: 'update', verb: 'PUT', uri }, // update(null, data, params) + { method: 'remove', verb: 'DELETE', uri: idUri }, // remove(id, data, params) + { method: 'remove', verb: 'DELETE', uri } // remove(null, data, params) + ]; +} function formatter (req, res, next) { if (res.data === undefined) { @@ -28,7 +98,14 @@ function rest (handler = formatter) { throw new Error(`@feathersjs/express/rest requires an instance of a Feathers application version 3.x or later (got ${app.version})`); } - app.rest = wrappers; + app.rest = { + find: getHandler('find'), + get: getHandler('get'), + create: getHandler('create'), + update: getHandler('update'), + patch: getHandler('patch'), + remove: getHandler('remove') + }; app.use(function (req, res, next) { req.feathers = Object.assign({ provider: 'rest' }, req.feathers); @@ -39,42 +116,30 @@ function rest (handler = formatter) { // Register the REST provider app.providers.push(function (service, path, options) { - const uri = `/${path}`; - const baseRoute = app.route(uri); - const idRoute = app.route(`${uri}/:__feathersId`); - - let { middleware } = options; - let { before, after } = middleware; + const baseUri = `/${path}`; + let { middleware: { before, after } } = options; if (typeof handler === 'function') { after = after.concat(handler); } - debug(`Adding REST provider for service \`${path}\` at base route \`${uri}\``); - - // GET / -> service.find(params) - baseRoute.get(...before, app.rest.find(service), ...after); - // POST / -> service.create(data, params) - baseRoute.post(...before, app.rest.create(service), ...after); - // PATCH / -> service.patch(null, data, params) - baseRoute.patch(...before, app.rest.patch(service), ...after); - // PUT / -> service.update(null, data, params) - baseRoute.put(...before, app.rest.update(service), ...after); - // DELETE / -> service.remove(null, params) - baseRoute.delete(...before, app.rest.remove(service), ...after); - - // GET /:id -> service.get(id, params) - idRoute.get(...before, app.rest.get(service), ...after); - // PUT /:id -> service.update(id, data, params) - idRoute.put(...before, app.rest.update(service), ...after); - // PATCH /:id -> service.patch(id, data, params) - idRoute.patch(...before, app.rest.patch(service), ...after); - // DELETE /:id -> service.remove(id, params) - idRoute.delete(...before, app.rest.remove(service), ...after); + debug(`Adding REST provider for service \`${path}\` at base route \`${baseUri}\``); + + const routes = getServiceRoutes(service, path, getDefaultRoutes(baseUri)); + + for (const { method, verb, uri } of routes) { + app.route(uri)[verb.toLowerCase()]( + ...before, + getHandler(method)(service, routes), + ...after + ); + } }); }; } rest.formatter = formatter; +rest.httpMethod = httpMethod; +rest.HTTP_METHOD = HTTP_METHOD; module.exports = rest; diff --git a/packages/express/test/rest/index.test.js b/packages/express/test/rest/index.test.js index 86cced4c18..cb4cdae4f3 100644 --- a/packages/express/test/rest/index.test.js +++ b/packages/express/test/rest/index.test.js @@ -163,7 +163,15 @@ describe('@feathersjs/express/rest provider', () => { method: 'get', path: 'hook', result: { description: 'You have to do dishes' }, - addedProperty: true + addedProperty: true, + arguments: [ + 'dishes', + { + route: {}, + query: { test: 'param' }, + provider: 'rest' + } + ] }); }); }); @@ -240,7 +248,15 @@ describe('@feathersjs/express/rest provider', () => { arguments: [ 'dishes', params ], type: 'error', method: 'get', - path: 'hook-error' + path: 'hook-error', + arguments: [ + 'dishes', + { + route: {}, + query: {}, + provider: 'rest' + } + ] }, error: { message: 'I blew up' } }); @@ -535,4 +551,65 @@ describe('@feathersjs/express/rest provider', () => { }); }); }); + + describe('Custom methods', () => { + let server; + let app; + + before(() => { + app = expressify(feathers()) + .configure(rest()) + .use(expressify.json()) + .use('/todo', { + get (id) { + return id; + }, + // httpMethod is usable as a decorator: @httpMethod('POST', '/:__feathersId/custom-path') + custom: rest.httpMethod('POST')(feathers.activateHooks(['id', 'data', 'params'])( + (id, data, params = {}) => { + return Promise.resolve({ + id, + data + }); + } + )), + other: rest.httpMethod('PATCH', ':__feathersId/second-method')( + feathers.activateHooks(['id', 'data', 'params'])( + (id, data, params = {}) => { + return Promise.resolve({ + id, + data + }); + } + ) + ) + }); + + server = app.listen(4781); + }); + + after(done => server.close(done)); + + it('works with custom methods', () => { + return axios.post('http://localhost:4781/todo/42/custom', { text: 'Do dishes' }) + .then(res => { + assert.equal(res.headers.allow, 'GET,POST,PATCH'); + assert.deepEqual(res.data, { + id: '42', + data: { text: 'Do dishes' } + }); + }); + }); + + it('works with custom methods - with route', () => { + return axios.patch('http://localhost:4781/todo/12/second-method', { text: 'Hmm' }) + .then(res => { + assert.equal(res.headers.allow, 'GET,POST,PATCH'); + assert.deepEqual(res.data, { + id: '12', + data: { text: 'Hmm' } + }); + }); + }); + }); });