geoserver-node-client 0.0.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,25 +1,70 @@
1
1
  # GeoServer Node Client
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/geoserver-node-client.svg)](https://www.npmjs.com/package/geoserver-node-client)
4
+ [![Website](https://img.shields.io/website?up_message=API-Docs&url=https%3A%2F%2Fmeggsimum.github.io%2Fgeoserver-node-client%2F)](https://meggsimum.github.io/geoserver-node-client)
5
+ ![GitHub Release Date](https://img.shields.io/github/release-date/meggsimum/geoserver-node-client)
6
+ ![GitHub last commit](https://img.shields.io/github/last-commit/meggsimum/geoserver-node-client)
4
7
  ![](https://github.com/meggsimum/geoserver-node-client/actions/workflows/ci-geoserver-node-client.yml/badge.svg)
5
8
 
6
9
  Node.js / JavaScript Client for the [GeoServer REST API](https://docs.geoserver.org/stable/en/user/rest/).
7
10
 
8
- **CAUTION: This is highly bleeding edge, heavily under development and therefore breaking changes can be made at every time!**
9
-
10
11
  ### API-Docs ###
11
12
 
12
- Detailed API-Docs can be found [here](https://meggsimum.github.io/geoserver-node-client/index.html).
13
+ Detailed [API-Docs](https://meggsimum.github.io/geoserver-node-client/) are automatically created with JSDoc.
13
14
 
14
15
  ### Meta information
15
16
 
16
17
  Compatible with [GeoServer](https://geoserver.org)
17
18
 
19
+ - v2.21.x
18
20
  - v2.20.x
19
- - v2.19.x
21
+ - v2.19.x (no more maintained and officially deprecated)
20
22
  - v2.18.x (no more maintained and officially deprecated)
21
23
  - v2.17.x (no more maintained and officially deprecated)
22
24
 
25
+
26
+ ### Usage
27
+
28
+ ```shell
29
+ npm i geoserver-node-client
30
+ ```
31
+
32
+ usage with require (ES5):
33
+ ```js
34
+ var grcImport = require('geoserver-node-client');
35
+ var GeoServerRestClient = grcImport.GeoServerRestClient;
36
+
37
+ var url = 'http://localhost:8080/geoserver/rest/';
38
+ var user = 'admin';
39
+ var pw = 'geoserver';
40
+ var grc = new GeoServerRestClient(url, user, pw);
41
+
42
+ function main () {
43
+ grc.about.exists().then(function (result) {
44
+ console.log(result);
45
+ });
46
+ };
47
+
48
+ main();
49
+ ```
50
+
51
+ usage as ES module (ES6)
52
+ ```js
53
+ import {GeoServerRestClient} from 'geoserver-node-client';
54
+
55
+ const url = 'http://localhost:8080/geoserver/rest/';
56
+ const user = 'admin';
57
+ const pw = 'geoserver';
58
+ const grc = new GeoServerRestClient(url, user, pw);
59
+
60
+ async function main () {
61
+ const result = await grc.about.exists();
62
+ console.log(result);
63
+ };
64
+
65
+ main();
66
+ ```
67
+
23
68
  ### Setup
24
69
 
25
70
  Run as local checkout (mainly for development purposes)
@@ -34,6 +79,28 @@ npm install
34
79
  npm run demo
35
80
  ```
36
81
 
82
+ ### Error Handling
83
+
84
+ A request either succeeds or throws the custom `GeoServerResponseError`. It has the standard `message` property with a "human-readable" text. Additionally the error has the property `geoServerOutput` which contains the direct response from GeoServer. This output is not guaranteed to exist and can either be a simple text or a complete HTML document. The latter is difficult to read, but might still be helpful for debugging. This example shows how these error properties can be used. It also shows how to filter by error type:
85
+
86
+ ```javascript
87
+ try {
88
+ // call any function from this library
89
+ await grc.styles.publish(workspace, styleName, sldBody)
90
+ } catch (error) {
91
+ // the standard error message
92
+ console.error(error.message);
93
+
94
+ // the whole error including stack trace and (if available) the property 'geoServerOutput'
95
+ console.error(error);
96
+
97
+ if (error instanceof GeoServerResponseError) {
98
+ // a GeoServer specific error happened
99
+ } else {
100
+ // another error happened
101
+ }
102
+ }
103
+ ```
37
104
 
38
105
  ### Unit Tests
39
106
 
@@ -42,20 +109,23 @@ First start a GeoServer, e.g. by using this Docker container:
42
109
  ```shell
43
110
  docker run \
44
111
  -p 8080:8080 \
45
- -v /path/to/geoserver_mnt:/opt/geoserver_data \
46
- meggsimum/geoserver:2.20.1
112
+ meggsimum/geoserver:2.20.4
47
113
  ```
48
114
 
49
115
  Then, in an other terminal, run:
50
116
 
51
117
  ```shell
52
118
  # specify the GeoServer version and run the test suite
53
- GEOSERVER_VERSION=2.20.1 npm run test
119
+ GEOSERVER_VERSION=2.20.4 npm run test
54
120
  ```
55
121
 
56
122
  ### Release
57
123
 
58
- The release to GitHub and npm is done via [release-it](https://github.com/release-it/release-it). This is the workflow for releasing:
124
+ Setting a git tag and increasing the version in the `package.json` as well as releasing to npm is done via [release-it](https://github.com/release-it/release-it).
125
+
126
+ The GitHub release has to be performed manually based on the tag created by `release-it`.
127
+
128
+ This is the workflow for releasing:
59
129
 
60
130
  1. Make sure a `GITHUB_TOKEN` is available as environment variable. See [here](https://github.com/release-it/release-it/blob/master/docs/github-releases.md) for more information.
61
131
 
@@ -87,8 +157,9 @@ npm run release
87
157
 
88
158
  ### Credits
89
159
 
90
- This project was initiated by [meggsimum](https://meggsimum.de) within the [mFund](https://www.bmvi.de/EN/Topics/Digital-Matters/mFund/mFund.html) research project [SAUBER](https://sauber-projekt.de/).
160
+ This project was initiated by [meggsimum](https://meggsimum.de) within the [mFund](https://www.bmvi.de/EN/Topics/Digital-Matters/mFund/mFund.html) research project [SAUBER](https://sauber-projekt.de/) and is further developed in the mFund research project [KLIPS](http://www.klips-projekt.de/):
91
161
  <p><img src="https://sauber-projekt.de/wp-content/uploads/2018/12/SAG_SAUBER_Logo_Dez3_transparent-1-e1543843688935.png" alt="SAUBER Logo" width="200"/></p>.
162
+ <p><img src="http://www.klips-projekt.de/wp-content/uploads/2021/02/SAG_KLIPS-Logo_Jan21.png" alt="KLIPS Logo" width="200"/></p>.
92
163
 
93
164
  <img src="https://sauber-projekt.de/wp-content/uploads/2018/12/mfund-logo-download-e1547545420815-300x77.jpg" alt="mFund Logo" width="300"/>
94
165
  <img src="https://sauber-projekt.de/wp-content/uploads/2019/06/BMVI_Fz_2017_Office_Farbe_de_Bundestag-400x402.png" alt="BMVI Logo" height="200"/>
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "GeoServerResponseError", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _geoserver.GeoServerResponseError;
12
+ }
13
+ });
14
+ exports.GeoServerRestClient = void 0;
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
+
20
+ var _layer = _interopRequireDefault(require("./src/layer.js"));
21
+
22
+ var _style = _interopRequireDefault(require("./src/style.js"));
23
+
24
+ var _workspace = _interopRequireDefault(require("./src/workspace.js"));
25
+
26
+ var _datastore = _interopRequireDefault(require("./src/datastore.js"));
27
+
28
+ var _imagemosaic = _interopRequireDefault(require("./src/imagemosaic.js"));
29
+
30
+ var _security = _interopRequireDefault(require("./src/security.js"));
31
+
32
+ var _settings = _interopRequireDefault(require("./src/settings.js"));
33
+
34
+ var _namespace = _interopRequireDefault(require("./src/namespace.js"));
35
+
36
+ var _about = _interopRequireDefault(require("./src/about.js"));
37
+
38
+ var _resetReload = _interopRequireDefault(require("./src/reset-reload.js"));
39
+
40
+ var _geoserver = require("./src/util/geoserver.js");
41
+
42
+ /**
43
+ * Client for GeoServer REST API.
44
+ * Has minimal basic functionality and offers REST client instances for
45
+ * sub-entities, like workspaces or datastores as member variables.
46
+ *
47
+ * @module GeoServerRestClient
48
+ */
49
+ var GeoServerRestClient = /*#__PURE__*/(0, _createClass2["default"])(
50
+ /**
51
+ * Creates a GeoServerRestClient instance.
52
+ *
53
+ * @param {String} url The URL of the GeoServer REST API endpoint
54
+ * @param {String} user The user for the GeoServer REST API
55
+ * @param {String} password The password for the GeoServer REST API
56
+ */
57
+ function GeoServerRestClient(url, user, password) {
58
+ (0, _classCallCheck2["default"])(this, GeoServerRestClient);
59
+ this.url = url.endsWith('/') ? url : url + '/';
60
+ this.auth = 'Basic ' + Buffer.from(user + ':' + password).toString('base64');
61
+ /** @member {LayerClient} layers GeoServer REST client instance for layers */
62
+
63
+ this.layers = new _layer["default"](this.url, this.auth);
64
+ /** @member {StyleClient} styles GeoServer REST client instance for styles */
65
+
66
+ this.styles = new _style["default"](this.url, this.auth);
67
+ /** @member {WorkspaceClient} workspaces GeoServer REST client instance for workspaces */
68
+
69
+ this.workspaces = new _workspace["default"](this.url, this.auth);
70
+ /** @member {NamespaceClient} namespaces GeoServer REST client instance for namespaces */
71
+
72
+ this.namespaces = new _namespace["default"](this.url, this.auth);
73
+ /** @member {DatastoreClient} datastores GeoServer REST client instance for data stores */
74
+
75
+ this.datastores = new _datastore["default"](this.url, this.auth);
76
+ /** @member {ImageMosaicClient} imagemosaics GeoServer REST client instance for image mosaics */
77
+
78
+ this.imagemosaics = new _imagemosaic["default"](this.url, this.auth);
79
+ /** @member {SecurityClient} security GeoServer REST client instance for security related modifications */
80
+
81
+ this.security = new _security["default"](this.url, this.auth);
82
+ /** @member {SettingsClient} settings GeoServer REST client instance for settings */
83
+
84
+ this.settings = new _settings["default"](this.url, this.auth);
85
+ /** @member {AboutClient} about GeoServer REST client instance for about endpoint */
86
+
87
+ this.about = new _about["default"](this.url, this.auth);
88
+ /** @member {ResetReloadClient} about GeoServer REST client instance for reset/reload endpoints */
89
+
90
+ this.resetReload = new _resetReload["default"](this.url, this.auth);
91
+ });
92
+ exports.GeoServerRestClient = GeoServerRestClient;
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "geoserver-node-client",
3
+ "version": "1.2.0",
4
+ "description": "Node.js client for GeoServer REST API",
5
+ "type": "commonjs",
6
+ "main": "geoserver-rest-client.js",
7
+ "scripts": {
8
+ "demo": "node demo/index.js",
9
+ "docs": "./node_modules/.bin/jsdoc geoserver-rest-client.js src/*.js DOCS_HOME.md",
10
+ "lint": "eslint src/**/*.js test/**/*.js scripts/**/*.js geoserver-rest-client.js",
11
+ "lint-fix": "eslint --fix src/**/*.js test/**/*.js scripts/**/*.js geoserver-rest-client.js",
12
+ "pretest": "npm run lint",
13
+ "test": "mocha --timeout 10000",
14
+ "release": "release-it",
15
+ "build": "npm run build:clean && npm run build:babel && npm run build:fixup",
16
+ "build:clean": "rm -rf dist",
17
+ "build:babel": "babel geoserver-rest-client.js -d dist && babel src -d dist/src",
18
+ "build:fixup": "node scripts/create-custom-package-json.js"
19
+ },
20
+ "exports": {
21
+ "import": "./geoserver-rest-client.js",
22
+ "require": "./dist/geoserver-rest-client.js"
23
+ },
24
+ "files": [
25
+ "geoserver-rest-client.js",
26
+ "src",
27
+ "dist"
28
+ ],
29
+ "keywords": [
30
+ "GeoServer",
31
+ "REST",
32
+ "Client"
33
+ ],
34
+ "author": "C. Mayer, meggsimum (info_at*meggsimum?dot?de)",
35
+ "license": "BSD-2-Clause",
36
+ "dependencies": {
37
+ "@babel/runtime": "^7.18.3",
38
+ "node-fetch": "^2.6.5"
39
+ },
40
+ "devDependencies": {
41
+ "@babel/cli": "^7.17.10",
42
+ "@babel/core": "^7.17.12",
43
+ "@babel/plugin-transform-runtime": "^7.18.0",
44
+ "@babel/preset-env": "^7.17.12",
45
+ "chai": "^4.3.4",
46
+ "eslint": "^7.32.0",
47
+ "eslint-config-standard": "^14.1.1",
48
+ "eslint-plugin-import": "^2.25.2",
49
+ "eslint-plugin-node": "^11.1.0",
50
+ "eslint-plugin-promise": "^4.3.1",
51
+ "eslint-plugin-standard": "^4.1.0",
52
+ "jsdoc": "^3.6.10",
53
+ "mocha": "^9.1.3",
54
+ "release-it": "^14.14.3"
55
+ }
56
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _nodeFetch = _interopRequireDefault(require("node-fetch"));
19
+
20
+ var _geoserver = require("./util/geoserver.js");
21
+
22
+ /**
23
+ * Client for GeoServer "about" endpoint
24
+ *
25
+ * @module AboutClient
26
+ */
27
+ var AboutClient = /*#__PURE__*/function () {
28
+ /**
29
+ * Creates a GeoServer REST AboutClient instance.
30
+ *
31
+ * @param {String} url The URL of the GeoServer REST API endpoint
32
+ * @param {String} auth The Basic Authentication string
33
+ */
34
+ function AboutClient(url, auth) {
35
+ (0, _classCallCheck2["default"])(this, AboutClient);
36
+ this.url = url;
37
+ this.auth = auth;
38
+ }
39
+ /**
40
+ * Get the GeoServer version.
41
+ *
42
+ * @throws Error if request fails
43
+ *
44
+ * @returns {Object} The version of GeoServer
45
+ */
46
+
47
+
48
+ (0, _createClass2["default"])(AboutClient, [{
49
+ key: "getVersion",
50
+ value: function () {
51
+ var _getVersion = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
52
+ var url, response, geoServerResponse;
53
+ return _regenerator["default"].wrap(function _callee$(_context) {
54
+ while (1) {
55
+ switch (_context.prev = _context.next) {
56
+ case 0:
57
+ url = this.url + 'about/version.json';
58
+ _context.next = 3;
59
+ return (0, _nodeFetch["default"])(url, {
60
+ credentials: 'include',
61
+ method: 'GET',
62
+ headers: {
63
+ Authorization: this.auth
64
+ }
65
+ });
66
+
67
+ case 3:
68
+ response = _context.sent;
69
+
70
+ if (response.ok) {
71
+ _context.next = 9;
72
+ break;
73
+ }
74
+
75
+ _context.next = 7;
76
+ return (0, _geoserver.getGeoServerResponseText)(response);
77
+
78
+ case 7:
79
+ geoServerResponse = _context.sent;
80
+ throw new _geoserver.GeoServerResponseError(null, geoServerResponse);
81
+
82
+ case 9:
83
+ return _context.abrupt("return", response.json());
84
+
85
+ case 10:
86
+ case "end":
87
+ return _context.stop();
88
+ }
89
+ }
90
+ }, _callee, this);
91
+ }));
92
+
93
+ function getVersion() {
94
+ return _getVersion.apply(this, arguments);
95
+ }
96
+
97
+ return getVersion;
98
+ }()
99
+ /**
100
+ * Checks if the configured GeoServer REST connection exists.
101
+ *
102
+ * @returns {Boolean} If the connection exists
103
+ */
104
+
105
+ }, {
106
+ key: "exists",
107
+ value: function () {
108
+ var _exists = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
109
+ var versionInfo;
110
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
111
+ while (1) {
112
+ switch (_context2.prev = _context2.next) {
113
+ case 0:
114
+ _context2.prev = 0;
115
+ _context2.next = 3;
116
+ return this.getVersion();
117
+
118
+ case 3:
119
+ versionInfo = _context2.sent;
120
+ return _context2.abrupt("return", !!versionInfo);
121
+
122
+ case 7:
123
+ _context2.prev = 7;
124
+ _context2.t0 = _context2["catch"](0);
125
+ return _context2.abrupt("return", false);
126
+
127
+ case 10:
128
+ case "end":
129
+ return _context2.stop();
130
+ }
131
+ }
132
+ }, _callee2, this, [[0, 7]]);
133
+ }));
134
+
135
+ function exists() {
136
+ return _exists.apply(this, arguments);
137
+ }
138
+
139
+ return exists;
140
+ }()
141
+ }]);
142
+ return AboutClient;
143
+ }();
144
+
145
+ exports["default"] = AboutClient;