@mountainpass/addressr 1.1.2 → 1.1.4

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.
@@ -4,24 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.printVersion = printVersion;
7
-
8
7
  var _dotenv = require("dotenv");
9
-
10
8
  var _dotenv2 = _interopRequireDefault(_dotenv);
11
-
12
9
  var _version = require("../version");
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  _dotenv2.default.config();
17
-
18
12
  function printVersion() {
19
13
  let environment = process.env.NODE_ENV || 'development';
20
-
21
14
  if (environment === 'development') {
22
15
  environment = `${environment}|(set NODE_ENV to 'production' in production environments)`;
23
16
  }
24
-
25
17
  const port = process.env.PORT || 8080;
26
18
  console.log(`Version: ${_version.version}`);
27
19
  console.log(`NODE_ENV: ${environment}`);
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.setLinkOptions = setLinkOptions;
7
-
8
7
  var _jsonPtr = require("json-ptr");
9
-
10
8
  function setLinkOptions(op, url, linkTemplate) {
11
9
  if (op.parameters) {
12
10
  const parameters = op.parameters;
@@ -1,17 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  var _debug = require("debug");
4
-
5
4
  var _debug2 = _interopRequireDefault(_debug);
6
-
7
5
  var _elasticsearch = require("../client/elasticsearch");
8
-
9
6
  var _printVersion = require("../service/printVersion");
10
-
11
7
  var _waycharterServer = require("./waycharterServer");
12
-
13
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
9
  const logger = (0, _debug2.default)('api');
16
10
  (0, _waycharterServer.startRest2Server)().then(() => {
17
11
  logger('connecting es client');
@@ -5,30 +5,19 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.startRest2Server = startRest2Server;
7
7
  exports.stopServer = stopServer;
8
-
9
8
  var _debug = require("debug");
10
-
11
9
  var _debug2 = _interopRequireDefault(_debug);
12
-
13
10
  var _express = require("express");
14
-
15
11
  var _express2 = _interopRequireDefault(_express);
16
-
17
12
  var _http = require("http");
18
-
19
13
  var _waycharter = require("@mountainpass/waycharter");
20
-
21
14
  var _addressService = require("../service/address-service");
22
-
23
15
  var _version = require("../version");
24
-
25
16
  var _crypto = require("crypto");
26
-
27
17
  var _crypto2 = _interopRequireDefault(_crypto);
28
-
29
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
-
31
19
  //import connect from 'connect';
20
+
32
21
  var app = (0, _express2.default)();
33
22
  const ONE_DAY = 60 * 60 * 24;
34
23
  const ONE_WEEK = ONE_DAY * 7;
@@ -39,21 +28,17 @@ error.log = console.error.bind(console); // eslint-disable-line no-console
39
28
 
40
29
  let server;
41
30
  const PAGE_SIZE = process.env.PAGE_SIZE || 8;
42
-
43
31
  function startRest2Server() {
44
32
  app.use((_request, response, next) => {
45
33
  if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN !== undefined) {
46
34
  response.append('Access-Control-Allow-Origin', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN);
47
35
  }
48
-
49
36
  if (process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS !== undefined) {
50
37
  response.append('Access-Control-Expose-Headers', process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS);
51
38
  }
52
-
53
39
  if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS !== undefined) {
54
40
  response.append('Access-Control-Allow-Headers', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS);
55
41
  }
56
-
57
42
  next();
58
43
  });
59
44
  const waycharter = new _waycharter.WayCharter();
@@ -100,9 +85,7 @@ function startRest2Server() {
100
85
  pid: h._id.replace('/addresses/', '')
101
86
  };
102
87
  });
103
-
104
88
  const responseHash = _crypto2.default.createHash('md5').update(JSON.stringify(body)).digest('hex');
105
-
106
89
  return {
107
90
  body,
108
91
  hasMore: page < foundAddresses.body.hits.total.value / PAGE_SIZE - 1,
@@ -128,12 +111,30 @@ function startRest2Server() {
128
111
  parameters: ['q']
129
112
  }]
130
113
  });
114
+ const healthType = waycharter.registerResourceType({
115
+ path: '/health',
116
+ loader: async () => {
117
+ return {
118
+ body: {
119
+ status: 'healthy',
120
+ version: _version.version,
121
+ timestamp: new Date().toISOString()
122
+ },
123
+ headers: {
124
+ 'cache-control': 'no-cache'
125
+ }
126
+ };
127
+ }
128
+ });
131
129
  const index = waycharter.registerResourceType({
132
130
  path: '/',
133
131
  loader: async () => {
134
132
  return {
135
133
  body: {},
136
- links: addressesType.additionalPaths,
134
+ links: [...addressesType.additionalPaths, {
135
+ rel: 'https://addressr.io/rels/health',
136
+ path: '/health'
137
+ }],
137
138
  headers: {
138
139
  etag: `"${_version.version}"`,
139
140
  'cache-control': `public, max-age=${ONE_WEEK}`
@@ -149,7 +150,6 @@ function startRest2Server() {
149
150
  });
150
151
  });
151
152
  }
152
-
153
153
  function stopServer() {
154
154
  if (server !== undefined) {
155
155
  server.close();
package/lib/swagger.js CHANGED
@@ -7,83 +7,71 @@ exports.swaggerDoc = undefined;
7
7
  exports.swaggerInit = swaggerInit;
8
8
  exports.startServer = startServer;
9
9
  exports.stopServer = stopServer;
10
-
11
10
  var _debug = require("debug");
12
-
13
11
  var _debug2 = _interopRequireDefault(_debug);
14
-
15
12
  var _express = require("express");
16
-
17
13
  var _express2 = _interopRequireDefault(_express);
18
-
19
14
  var _fs = require("fs");
20
-
21
15
  var _http = require("http");
22
-
23
16
  var _jsYaml = require("js-yaml");
24
-
25
17
  var _path = require("path");
26
-
27
18
  var _path2 = _interopRequireDefault(_path);
28
-
29
19
  var _swaggerTools = require("swagger-tools");
30
-
31
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
-
33
21
  //import connect from 'connect';
22
+
34
23
  var app = (0, _express2.default)();
35
24
  var serverPort = process.env.PORT || 8080;
36
25
  var logger = (0, _debug2.default)('api');
37
26
  var error = (0, _debug2.default)('error');
38
27
  error.log = console.error.bind(console); // eslint-disable-line no-console
39
- // swaggerRouter configuration
40
28
 
29
+ // swaggerRouter configuration
41
30
  var options = {
42
31
  swaggerUi: _path2.default.join(__dirname, '/swagger.json'),
43
32
  controllers: _path2.default.join(__dirname, './controllers'),
44
33
  useStubs: process.env.NODE_ENV === 'development' // Conditionally turn on stubs (mock mode)
34
+ };
45
35
 
46
- }; // The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
47
-
36
+ // The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
48
37
  var spec = (0, _fs.readFileSync)(_path2.default.join(__dirname, 'api/swagger.yaml'), 'utf8');
49
38
  var swaggerDoc = exports.swaggerDoc = (0, _jsYaml.safeLoad)(spec);
50
39
  global.swaggerDoc = swaggerDoc;
51
-
52
40
  function swaggerInit() {
53
41
  // Initialize the Swagger middleware
54
42
  return new Promise(resolve => {
55
43
  (0, _swaggerTools.initializeMiddleware)(swaggerDoc, function (middleware) {
56
44
  // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
57
45
  const metaData = middleware.swaggerMetadata();
58
- app.use(metaData); // Validate Swagger requests
46
+ app.use(metaData);
59
47
 
48
+ // Validate Swagger requests
60
49
  app.use(middleware.swaggerValidator({
61
50
  validateResponse: process.env.NODE_ENV === undefined || process.env.NODE_ENV === 'development'
62
- })); // Route validated requests to appropriate controller
51
+ }));
63
52
 
64
- app.use(middleware.swaggerRouter(options)); // Serve the Swagger documents and Swagger UI
53
+ // Route validated requests to appropriate controller
54
+ app.use(middleware.swaggerRouter(options));
65
55
 
66
- app.use(middleware.swaggerUi({// apiDocs: '/api-docs',
56
+ // Serve the Swagger documents and Swagger UI
57
+ app.use(middleware.swaggerUi({
58
+ // apiDocs: '/api-docs',
67
59
  // swaggerUi: '/docs',
68
60
  }));
69
61
  app.use(function (error_, request, res, next) {
70
62
  if (error_.failedValidation) {
71
63
  // handle validation errror
72
64
  const rehydratedError = Object.assign({}, error_);
73
-
74
65
  if (error_.originalResponse) {
75
66
  rehydratedError.originalResponse = JSON.parse(error_.originalResponse);
76
67
  }
77
-
78
68
  if (error_.message) {
79
69
  rehydratedError.message = error_.message;
80
70
  }
81
-
82
71
  if (error_.results) {
83
72
  rehydratedError.errors = error_.results.errors;
84
73
  delete rehydratedError.results;
85
74
  }
86
-
87
75
  error('error!!!', error_.message, JSON.stringify(rehydratedError, undefined, 2));
88
76
  res.status(error_.code === 'SCHEMA_VALIDATION_FAILED' ? '500' : '400').json(rehydratedError);
89
77
  } else {
@@ -99,38 +87,32 @@ function swaggerInit() {
99
87
  });
100
88
  });
101
89
  }
102
-
103
90
  let server;
104
-
105
91
  function startServer() {
106
92
  app.use((request, response, next) => {
107
93
  if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN !== undefined) {
108
94
  response.append('Access-Control-Allow-Origin', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN);
109
95
  }
110
-
111
96
  if (process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS !== undefined) {
112
97
  response.append('Access-Control-Expose-Headers', process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS);
113
98
  }
114
-
115
99
  if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS !== undefined) {
116
100
  response.append('Access-Control-Allow-Headers', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS);
117
101
  }
118
-
119
102
  next();
120
103
  });
121
104
  return swaggerInit().then(({
122
- app
123
- /*, middleware*/
124
-
105
+ app /*, middleware*/
125
106
  }) => {
126
107
  // logger(app);
127
108
  // logger(middleware);
109
+
128
110
  server = (0, _http.createServer)(app);
129
111
  server.listen(serverPort, function () {
130
112
  logger('📡 Addressr is listening on port %d ( http://localhost:%d ) ', serverPort, serverPort);
131
113
  logger('📑 Swagger-ui is available on http://localhost:%d/docs', serverPort);
132
-
133
- if (process.env.NODE_ENV !== 'PRODUCTION') {// ngrok.connect(serverPort).then(url => {
114
+ if (process.env.NODE_ENV !== 'PRODUCTION') {
115
+ // ngrok.connect(serverPort).then(url => {
134
116
  // logger('📡 Addressr is listening at %s', url);
135
117
  // logger('📑 Swagger-ui is available on %s/docs/', url);
136
118
  // });
@@ -139,7 +121,6 @@ function startServer() {
139
121
  return `http://localhost:${serverPort}`;
140
122
  });
141
123
  }
142
-
143
124
  function stopServer() {
144
125
  if (server !== undefined) {
145
126
  server.close();
@@ -1,34 +1,25 @@
1
1
  "use strict";
2
2
 
3
3
  var _progress = require("progress");
4
-
5
4
  var _progress2 = _interopRequireDefault(_progress);
6
-
7
5
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
6
  const {
10
7
  parse
11
8
  } = require('url');
12
-
13
9
  const http = require('https');
14
-
15
10
  const fs = require('fs');
16
-
17
11
  const pathUtil = require('path');
18
-
19
12
  module.exports = function (url, path, size) {
20
13
  const uri = parse(url);
21
-
22
14
  if (!path) {
23
15
  path = pathUtil.basename(uri.path);
24
16
  }
25
-
26
17
  const file = fs.createWriteStream(path);
27
18
  return new Promise(function (resolve, reject) {
28
19
  http.get(uri.href).on('response', function (res) {
29
- const length = res.headers['content-length'] ? Number.parseInt(res.headers['content-length'], 10) : size; // let downloaded = 0;
20
+ const length = res.headers['content-length'] ? Number.parseInt(res.headers['content-length'], 10) : size;
21
+ // let downloaded = 0;
30
22
  // let percent = 0;
31
-
32
23
  var bar = new _progress2.default(' downloading [:bar] :rate/bps :percent :etas', {
33
24
  complete: '=',
34
25
  incomplete: ' ',
@@ -36,10 +27,11 @@ module.exports = function (url, path, size) {
36
27
  total: length
37
28
  });
38
29
  res.on('data', function (chunk) {
39
- file.write(chunk); // downloaded += chunk.length;
30
+ file.write(chunk);
31
+ // downloaded += chunk.length;
40
32
  //percent = ((100.0 * downloaded) / len).toFixed(2);
41
-
42
- bar.tick(chunk.length); // process.stdout.write(
33
+ bar.tick(chunk.length);
34
+ // process.stdout.write(
43
35
  // `Downloading\t${percent}%\t${filesize(downloaded, {
44
36
  // standard: 'iec',
45
37
  // })}\t of ${filesize(len, {
@@ -4,20 +4,16 @@ var ResponsePayload = function (code, payload) {
4
4
  this.code = code;
5
5
  this.payload = payload;
6
6
  };
7
-
8
7
  exports.respondWithCode = function (code, payload) {
9
8
  return new ResponsePayload(code, payload);
10
9
  };
11
-
12
10
  var writeJson = exports.writeJson = function (response, argument1, argument2) {
13
11
  var code;
14
12
  var payload;
15
-
16
13
  if (argument1 && argument1 instanceof ResponsePayload) {
17
14
  writeJson(response, argument1.payload, argument1.code);
18
15
  return;
19
16
  }
20
-
21
17
  if (argument2 && Number.isInteger(argument2)) {
22
18
  code = argument2;
23
19
  } else {
@@ -25,21 +21,18 @@ var writeJson = exports.writeJson = function (response, argument1, argument2) {
25
21
  code = argument1;
26
22
  }
27
23
  }
28
-
29
24
  if (code && argument1) {
30
25
  payload = argument1;
31
26
  } else if (argument1) {
32
27
  payload = argument1;
33
28
  }
34
-
35
29
  if (!code) {
36
30
  // if no response code given, we default to 200
37
31
  code = 200;
38
- } // if (typeof payload === 'object') {
32
+ }
33
+ // if (typeof payload === 'object') {
39
34
  // payload = JSON.stringify(payload, null, 2);
40
35
  // }
41
-
42
-
43
36
  response.status(code);
44
37
  response.setHeader('Content-Type', 'application/json');
45
38
  response.json(payload);
package/lib/version.js CHANGED
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  // generated by genversion
7
- const version = exports.version = '1.1.2';
7
+ const version = exports.version = '1.1.4';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mountainpass/addressr",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Australian Address Validation, Search and Autocomplete",
5
5
  "author": {
6
6
  "name": "Mountain Pass",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "config": {
19
19
  "localport": "6060",
20
- "SEARCH_IMAGE": "opensearchproject/opensearch:1.2.4"
20
+ "SEARCH_IMAGE": "opensearchproject/opensearch:1.3.20"
21
21
  },
22
22
  "scripts": {
23
23
  "gen-install-cmd": "echo \"#!/bin/sh\n\nnpm install -g ${npm_package_name}@${npm_package_version}\" > install.sh",
@@ -75,7 +75,7 @@
75
75
  "npm-check-unused": "npm-check",
76
76
  "lint": "eslint . --fix",
77
77
  "test": "NO_STRICT=' ' npm-run-all --serial test:nogeo test:geo",
78
- "test:nogeo": "NO_STRICT=' ' npm-run-all --serial test:nodejs:nogeo test:rest:nogeo test:cli:nogeo",
78
+ "test:nogeo": "NO_STRICT=' ' npm-run-all --serial test:nodejs:nogeo test:rest:nogeo test:rest2:nogeo test:cli:nogeo",
79
79
  "test:geo": "NO_STRICT=' ' npm-run-all --serial test:nodejs:geo test:rest:geo test:cli:geo",
80
80
  "watch:test": "nodemon -V --ext \"*.feature, *.js, *.json, *.css, *.yaml\" -x npm -- run test",
81
81
  "genversion": "genversion --es6 --semi version.js",
@@ -89,6 +89,7 @@
89
89
  "cover:rest:nogeo": "nyc --report-dir coverage/rest --temp-dir coverage/rest/.nyc_output npm run test:rest:nogeo",
90
90
  "test:rest:geo": "PORT=$npm_package_config_localport ADDRESSR_ENABLE_GEO=1 ES_INDEX_NAME=test-geo COVERED_STATES=OT DEBUG=error,api,express:*,swagger-tools*,test,es TEST_PROFILE=rest cucumber-js -p rest -- --harmony_async_iteration",
91
91
  "cover:rest:geo": "nyc --report-dir coverage/rest-geo --temp-dir coverage/rest-geo/.nyc_output npm run test:rest:geo",
92
+ "test:rest2:nogeo": "PORT=$npm_package_config_localport ES_INDEX_NAME=test COVERED_STATES=OT DEBUG=error,api,express:*,swagger-tools*,test,es,waychaser,waycharter TEST_PROFILE=rest2 cucumber-js -p rest2 -- --harmony_async_iteration",
92
93
  "test:rest2:geo": "PORT=$npm_package_config_localport ADDRESSR_ENABLE_GEO=1 ES_INDEX_NAME=test-geo COVERED_STATES=OT DEBUG=error,api,express:*,swagger-tools*,test,es,waychaser,waycharter TEST_PROFILE=rest2 cucumber-js -p rest2 -- --harmony_async_iteration",
93
94
  "watch:test:rest2:geo": "nodemon -V -x npm -- run ${npm_lifecycle_event#watch:}",
94
95
  "watch:test:rest:nogeo": "nodemon -V --ext \"*.feature, *.js, *.json, *.css, *.yaml\" -x npm -- run test:rest:nogeo",
@@ -120,7 +121,10 @@
120
121
  "test:performance": "k6 run --out csv=target/stress.csv test/k6/script.js",
121
122
  "add-changeset": "changeset add --open",
122
123
  "ci:version": "[ \"$CI\" = true ] && changeset version || echo \"Dry run: changeset version\"",
123
- "ci:publish": "[ \"$CI\" = true ] && changeset publish || echo \"Dry run: changeset publish\""
124
+ "ci:publish": "[ \"$CI\" = true ] && changeset publish || echo \"Dry run: changeset publish\"",
125
+ "push:watch": "bash scripts/push-and-watch.sh",
126
+ "release:watch": "bash scripts/release-watch.sh",
127
+ "test:hooks": "bats .claude/hooks/test/"
124
128
  },
125
129
  "bin": {
126
130
  "addressr-loader": "lib/bin/addressr-loader.js",
@@ -192,6 +196,7 @@
192
196
  "babel-eslint": "^10.0.2",
193
197
  "babel-plugin-istanbul": "^6.0.0",
194
198
  "babel-preset-env": "^1.7.0",
199
+ "bats": "^1.13.0",
195
200
  "chai": "^4.2.0",
196
201
  "cucumber": "^5.1.0",
197
202
  "eslint": "^7.9.0",
@@ -212,7 +217,6 @@
212
217
  "istanbul-middleware": "^0.2.2",
213
218
  "license-checker": "^25.0.1",
214
219
  "lint-staged": "^11.0.0",
215
- "ngrok": "^4.0.1",
216
220
  "nodemon": "^2.0.4",
217
221
  "npm-check": "^5.9.0",
218
222
  "npm-run-all": "^4.1.5",