atmosx-nwws-parser 1.0.19 → 1.0.22

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.
Files changed (44) hide show
  1. package/README.md +182 -64
  2. package/dist/cjs/index.cjs +3799 -0
  3. package/dist/esm/index.mjs +3757 -0
  4. package/package.json +49 -37
  5. package/src/bootstrap.ts +196 -0
  6. package/src/database.ts +148 -0
  7. package/src/dictionaries/awips.ts +342 -0
  8. package/src/dictionaries/events.ts +142 -0
  9. package/src/dictionaries/icao.ts +237 -0
  10. package/src/dictionaries/offshore.ts +12 -0
  11. package/src/dictionaries/signatures.ts +107 -0
  12. package/src/eas.ts +493 -0
  13. package/src/index.ts +229 -0
  14. package/src/parsers/events/api.ts +151 -0
  15. package/src/parsers/events/cap.ts +138 -0
  16. package/src/parsers/events/text.ts +106 -0
  17. package/src/parsers/events/ugc.ts +109 -0
  18. package/src/parsers/events/vtec.ts +78 -0
  19. package/src/parsers/events.ts +367 -0
  20. package/src/parsers/hvtec.ts +46 -0
  21. package/src/parsers/pvtec.ts +71 -0
  22. package/src/parsers/stanza.ts +132 -0
  23. package/src/parsers/text.ts +166 -0
  24. package/src/parsers/ugc.ts +197 -0
  25. package/src/types.ts +251 -0
  26. package/src/utils.ts +314 -0
  27. package/src/xmpp.ts +144 -0
  28. package/test.js +58 -34
  29. package/tsconfig.json +12 -5
  30. package/tsup.config.ts +14 -0
  31. package/bootstrap.ts +0 -122
  32. package/dist/bootstrap.js +0 -153
  33. package/dist/src/events.js +0 -585
  34. package/dist/src/helper.js +0 -463
  35. package/dist/src/stanza.js +0 -147
  36. package/dist/src/text-parser.js +0 -119
  37. package/dist/src/ugc.js +0 -214
  38. package/dist/src/vtec.js +0 -125
  39. package/src/events.ts +0 -394
  40. package/src/helper.ts +0 -298
  41. package/src/stanza.ts +0 -102
  42. package/src/text-parser.ts +0 -120
  43. package/src/ugc.ts +0 -122
  44. package/src/vtec.ts +0 -99
@@ -1,119 +0,0 @@
1
- "use strict";
2
- /*
3
- _ _ __ __
4
- /\ | | | | (_) \ \ / /
5
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
6
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
7
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
8
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
9
- | |
10
- |_|
11
-
12
- Written by: k3yomi@GitHub
13
- */
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.mTextParser = void 0;
16
- var mTextParser = /** @class */ (function () {
17
- function mTextParser() {
18
- }
19
- /**
20
- * @function getString
21
- * @description Extracts a substring from a message based on a specified starting string and optional removal patterns.
22
- *
23
- * @param {string} message - The full text message to search within.
24
- * @param {string} string - The starting string to look for in the message.
25
- * @param {Array|string|null} removal - Optional patterns (string or array of strings) to remove from the extracted substring.
26
- */
27
- mTextParser.getString = function (message, string, removal) {
28
- if (removal === void 0) { removal = null; }
29
- var lines = message.split('\n');
30
- for (var i = 0; i < lines.length; i++) {
31
- if (lines[i].includes(string)) {
32
- var start = lines[i].indexOf(string) + string.length;
33
- var result = lines[i].substring(start).trim();
34
- if (Array.isArray(removal)) {
35
- for (var j = 0; j < removal.length; j++) {
36
- result = result.replace(removal[j], '');
37
- }
38
- }
39
- return result.replace(string, '').replace(/^\s+|\s+$/g, '').replace('<', '').trim();
40
- }
41
- }
42
- return null;
43
- };
44
- /**
45
- * @function getEventCode
46
- * @description Extracts the event code from a weather alert message.
47
- *
48
- * @param {string} message - The full text message to search within.
49
- */
50
- mTextParser.getForecastOffice = function (message) {
51
- return this.getString(message, "National Weather Service") || this.getString(message, "NWS STORM PREDICTION CENTER ") || null;
52
- };
53
- /**
54
- * @function getEventCode
55
- * @description Extracts the event code from a weather alert message.
56
- *
57
- * @param {string} message - The full text message to search within.
58
- */
59
- mTextParser.getPolygonCoordinates = function (message) {
60
- var coordinates = [];
61
- var latLon = message.match(/LAT\.{3}LON\s+([\d\s]+)/i);
62
- if (latLon && latLon[1]) {
63
- var coordStrings = latLon[1].replace(/\n/g, ' ').trim().split(/\s+/);
64
- for (var i = 0; i < coordStrings.length - 1; i += 2) {
65
- var lat = parseFloat(coordStrings[i]) / 100;
66
- var long = -1 * (parseFloat(coordStrings[i + 1]) / 100);
67
- if (!isNaN(lat) && !isNaN(long)) {
68
- coordinates.push([long, lat]);
69
- }
70
- }
71
- if (coordinates.length > 2) {
72
- coordinates.push(coordinates[0]);
73
- }
74
- }
75
- return coordinates;
76
- };
77
- /**
78
- * @function getCleanDescription
79
- * @description Cleans the description text of a weather alert message by removing headers, footers, and extraneous information.
80
- *
81
- * @param {string} message - The full text message to clean.
82
- * @param {string} handle - The VTEC handle to help identify the start of the main content.
83
- */
84
- mTextParser.getCleanDescription = function (message, handle) {
85
- var dateLineMatches = Array.from(message.matchAll(/\d{3,4}\s*(AM|PM)?\s*[A-Z]{2,4}\s+[A-Z]{3,}\s+[A-Z]{3,}\s+\d{1,2}\s+\d{4}/gim));
86
- if (dateLineMatches.length) {
87
- var dateLineMatch = dateLineMatches[dateLineMatches.length - 1];
88
- var nwsStart = message.lastIndexOf(dateLineMatch[0]);
89
- if (nwsStart !== -1) {
90
- var latStart = message.indexOf("&&", nwsStart);
91
- message = latStart !== -1 ? message.substring(nwsStart + dateLineMatch[0].length, latStart).trim() : message.substring(nwsStart + dateLineMatch[0].length).trim();
92
- if (message.startsWith('/'))
93
- message = message.substring(1).trim();
94
- if (handle && handle && message.includes(handle)) {
95
- var vtecIndex = message.indexOf(handle);
96
- if (vtecIndex !== -1) {
97
- message = message.substring(vtecIndex + handle.length).trim();
98
- if (message.startsWith('/'))
99
- message = message.substring(1).trim();
100
- }
101
- }
102
- }
103
- }
104
- else if (handle && handle) {
105
- var vtecStart = message.indexOf(handle);
106
- if (vtecStart !== -1) {
107
- var afterVtec = message.substring(vtecStart + handle.length);
108
- if (afterVtec.startsWith('/'))
109
- afterVtec = afterVtec.substring(1);
110
- var latStart = afterVtec.indexOf("&&");
111
- message = latStart !== -1 ? afterVtec.substring(0, latStart).trim() : afterVtec.trim();
112
- }
113
- }
114
- return message;
115
- };
116
- return mTextParser;
117
- }());
118
- exports.mTextParser = mTextParser;
119
- exports.default = mTextParser;
package/dist/src/ugc.js DELETED
@@ -1,214 +0,0 @@
1
- "use strict";
2
- /*
3
- _ _ __ __
4
- /\ | | | | (_) \ \ / /
5
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
6
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
7
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
8
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
9
- | |
10
- |_|
11
-
12
- Written by: k3yomi@GitHub
13
- */
14
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- var desc = Object.getOwnPropertyDescriptor(m, k);
17
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
- desc = { enumerable: true, get: function() { return m[k]; } };
19
- }
20
- Object.defineProperty(o, k2, desc);
21
- }) : (function(o, m, k, k2) {
22
- if (k2 === undefined) k2 = k;
23
- o[k2] = m[k];
24
- }));
25
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
- Object.defineProperty(o, "default", { enumerable: true, value: v });
27
- }) : function(o, v) {
28
- o["default"] = v;
29
- });
30
- var __importStar = (this && this.__importStar) || (function () {
31
- var ownKeys = function(o) {
32
- ownKeys = Object.getOwnPropertyNames || function (o) {
33
- var ar = [];
34
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
- return ar;
36
- };
37
- return ownKeys(o);
38
- };
39
- return function (mod) {
40
- if (mod && mod.__esModule) return mod;
41
- var result = {};
42
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
- __setModuleDefault(result, mod);
44
- return result;
45
- };
46
- })();
47
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
48
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
49
- return new (P || (P = Promise))(function (resolve, reject) {
50
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
51
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
52
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
53
- step((generator = generator.apply(thisArg, _arguments || [])).next());
54
- });
55
- };
56
- var __generator = (this && this.__generator) || function (thisArg, body) {
57
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
58
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
59
- function verb(n) { return function (v) { return step([n, v]); }; }
60
- function step(op) {
61
- if (f) throw new TypeError("Generator is already executing.");
62
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
63
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
64
- if (y = 0, t) op = [op[0] & 2, t.value];
65
- switch (op[0]) {
66
- case 0: case 1: t = op; break;
67
- case 4: _.label++; return { value: op[1], done: false };
68
- case 5: _.label++; y = op[1]; op = [0]; continue;
69
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
70
- default:
71
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
72
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
73
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
74
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
75
- if (t[2]) _.ops.pop();
76
- _.trys.pop(); continue;
77
- }
78
- op = body.call(thisArg, _);
79
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
80
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
81
- }
82
- };
83
- Object.defineProperty(exports, "__esModule", { value: true });
84
- exports.mUgcParser = void 0;
85
- var loader = __importStar(require("../bootstrap"));
86
- var mUgcParser = /** @class */ (function () {
87
- function mUgcParser() {
88
- }
89
- /**
90
- * @function getUGC
91
- * @description Extracts UGC codes and associated locations from a weather alert message.
92
- *
93
- * @param {string} message - The full text message to search within.
94
- */
95
- mUgcParser.getUGC = function (message) {
96
- return __awaiter(this, void 0, void 0, function () {
97
- var header, zones, locations, ugc;
98
- return __generator(this, function (_a) {
99
- switch (_a.label) {
100
- case 0:
101
- header = this.getHeader(message);
102
- zones = this.getZones(header);
103
- return [4 /*yield*/, this.getLocations(zones)];
104
- case 1:
105
- locations = _a.sent();
106
- ugc = zones.length > 0 ? { zones: zones, locations: locations } : null;
107
- return [2 /*return*/, ugc];
108
- }
109
- });
110
- });
111
- };
112
- /**
113
- * @function getHeader
114
- * @description Extracts the UGC header from a weather alert message.
115
- *
116
- * @param {string} message - The full text message to search within.
117
- */
118
- mUgcParser.getHeader = function (message) {
119
- var start = message.search(new RegExp(loader.definitions.expressions.ugc1, "gimu"));
120
- var end = message.substring(start).search(new RegExp(loader.definitions.expressions.ugc2, "gimu"));
121
- var full = message.substring(start, start + end).replace(/\s+/g, '').slice(0, -1);
122
- return full;
123
- };
124
- /**
125
- * @function getLocations
126
- * @description Retrieves location names from a database based on UGC zone codes.
127
- *
128
- * @param {Array} zones - An array of UGC zone codes.
129
- */
130
- mUgcParser.getLocations = function (zones) {
131
- return __awaiter(this, void 0, void 0, function () {
132
- var locations, i, id, statement, located;
133
- return __generator(this, function (_a) {
134
- switch (_a.label) {
135
- case 0:
136
- locations = [];
137
- i = 0;
138
- _a.label = 1;
139
- case 1:
140
- if (!(i < zones.length)) return [3 /*break*/, 4];
141
- id = zones[i].trim();
142
- statement = "SELECT location FROM shapefiles WHERE id = ?";
143
- return [4 /*yield*/, loader.statics.db.prepare(statement).get(id)];
144
- case 2:
145
- located = _a.sent();
146
- located != undefined ? locations.push(located.location) : locations.push(id);
147
- _a.label = 3;
148
- case 3:
149
- i++;
150
- return [3 /*break*/, 1];
151
- case 4: return [2 /*return*/, Array.from(new Set(locations)).sort()];
152
- }
153
- });
154
- });
155
- };
156
- /**
157
- * @function getCoordinates
158
- * @description Retrieves geographical coordinates from a database based on UGC zone codes.
159
- *
160
- * @param {Array} zones - An array of UGC zone codes.
161
- */
162
- mUgcParser.getCoordinates = function (zones) {
163
- var coordinates = [];
164
- for (var i = 0; i < zones.length; i++) {
165
- var id = zones[i].trim();
166
- var statement = "SELECT geometry FROM shapefiles WHERE id = ?";
167
- var located = loader.statics.db.prepare(statement).get(id);
168
- if (located != undefined) {
169
- var geometry = JSON.parse(located.geometry);
170
- if ((geometry === null || geometry === void 0 ? void 0 : geometry.type) === 'Polygon') {
171
- coordinates.push.apply(coordinates, geometry.coordinates[0].map(function (coord) { return [coord[0], coord[1]]; }));
172
- break;
173
- }
174
- }
175
- }
176
- return coordinates;
177
- };
178
- /**
179
- * @function getZones
180
- * @description Parses the UGC header to extract individual UGC zone codes, handling ranges and formats.
181
- *
182
- * @param {string} header - The UGC header string.
183
- */
184
- mUgcParser.getZones = function (header) {
185
- var ugcSplit = header.split('-');
186
- var zones = [];
187
- var state = ugcSplit[0].substring(0, 2);
188
- var format = ugcSplit[0].substring(2, 3);
189
- for (var i = 0; i < ugcSplit.length; i++) {
190
- if (/^[A-Z]/.test(ugcSplit[i])) {
191
- state = ugcSplit[i].substring(0, 2);
192
- if (ugcSplit[i].includes('>')) {
193
- var _a = ugcSplit[i].split('>'), start = _a[0], end = _a[1], startNum = parseInt(start.substring(3), 10), endNum = parseInt(end, 10);
194
- for (var j = startNum; j <= endNum; j++)
195
- zones.push("".concat(state).concat(format).concat(j.toString().padStart(3, '0')));
196
- }
197
- else
198
- zones.push(ugcSplit[i]);
199
- continue;
200
- }
201
- if (ugcSplit[i].includes('>')) {
202
- var _b = ugcSplit[i].split('>'), start = _b[0], end = _b[1], startNum = parseInt(start, 10), endNum = parseInt(end, 10);
203
- for (var j = startNum; j <= endNum; j++)
204
- zones.push("".concat(state).concat(format).concat(j.toString().padStart(3, '0')));
205
- }
206
- else
207
- zones.push("".concat(state).concat(format).concat(ugcSplit[i]));
208
- }
209
- return zones.filter(function (item) { return item !== ''; });
210
- };
211
- return mUgcParser;
212
- }());
213
- exports.mUgcParser = mUgcParser;
214
- exports.default = mUgcParser;
package/dist/src/vtec.js DELETED
@@ -1,125 +0,0 @@
1
- "use strict";
2
- /*
3
- _ _ __ __
4
- /\ | | | | (_) \ \ / /
5
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
6
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
7
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
8
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
9
- | |
10
- |_|
11
-
12
- Written by: k3yomi@GitHub
13
- */
14
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- var desc = Object.getOwnPropertyDescriptor(m, k);
17
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
- desc = { enumerable: true, get: function() { return m[k]; } };
19
- }
20
- Object.defineProperty(o, k2, desc);
21
- }) : (function(o, m, k, k2) {
22
- if (k2 === undefined) k2 = k;
23
- o[k2] = m[k];
24
- }));
25
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
- Object.defineProperty(o, "default", { enumerable: true, value: v });
27
- }) : function(o, v) {
28
- o["default"] = v;
29
- });
30
- var __importStar = (this && this.__importStar) || (function () {
31
- var ownKeys = function(o) {
32
- ownKeys = Object.getOwnPropertyNames || function (o) {
33
- var ar = [];
34
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
- return ar;
36
- };
37
- return ownKeys(o);
38
- };
39
- return function (mod) {
40
- if (mod && mod.__esModule) return mod;
41
- var result = {};
42
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
- __setModuleDefault(result, mod);
44
- return result;
45
- };
46
- })();
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.mVtecParser = void 0;
49
- var loader = __importStar(require("../bootstrap"));
50
- var mVtecParser = /** @class */ (function () {
51
- function mVtecParser() {
52
- }
53
- /**
54
- * @function getVTEC
55
- * @description Extracts VTEC information from a weather alert message.
56
- *
57
- * @param {string} message - The full text message to search within.
58
- * @param {object} attributes - Additional attributes such as issue time.
59
- */
60
- mVtecParser.getVTEC = function (message, attributes) {
61
- var vtecs = []; // Array to hold all VTEC objects (Alerts CAN have multiple VTECs so we need to account for that)
62
- var matches = message.match(new RegExp(loader.definitions.expressions.vtec, 'g'));
63
- if (!matches)
64
- return null; // No VTEC Found
65
- for (var i = 0; i < matches.length; i++) {
66
- var vtec = matches[i];
67
- var parts = vtec.split(".");
68
- var dates = parts[6].split("-");
69
- vtecs.push({
70
- handle: vtec,
71
- tracking: this.getTracking(parts),
72
- event: this.getEventName(parts),
73
- status: this.getEventStatus(parts),
74
- wmo: message.match(new RegExp(loader.definitions.expressions.wmo, 'gimu')),
75
- expires: this.getEventExpires(dates),
76
- issued: attributes.issue
77
- });
78
- }
79
- return vtecs;
80
- };
81
- /**
82
- * @function getTracking
83
- * @description Constructs a tracking code from VTEC parts.
84
- *
85
- * @param {Array} args - An array of VTEC parts.
86
- */
87
- mVtecParser.getTracking = function (args) {
88
- return "".concat(args[2], "-").concat(args[3], "-").concat(args[4], "-").concat(args[5]);
89
- };
90
- /**
91
- * @function getEventName
92
- * @description Constructs an event name from VTEC parts.
93
- *
94
- * @param {Array} args - An array of VTEC parts.
95
- */
96
- mVtecParser.getEventName = function (args) {
97
- return "".concat(loader.definitions.events[args[3]], " ").concat(loader.definitions.actions[args[4]]);
98
- };
99
- /**
100
- * @function getEventStatus
101
- * @description Retrieves the event status from VTEC parts.
102
- *
103
- * @param {Array} args - An array of VTEC parts.
104
- */
105
- mVtecParser.getEventStatus = function (args) {
106
- return loader.definitions.status[args[1]];
107
- };
108
- /**
109
- * @function getEventExpires
110
- * @description Constructs an expiration date-time string from VTEC date parts.
111
- *
112
- * @param {Array} args - An array containing the start and end date-time strings.
113
- */
114
- mVtecParser.getEventExpires = function (args) {
115
- if (args[1] == "000000T0000Z")
116
- return "Invalid Date Format";
117
- var expires = "".concat(new Date().getFullYear().toString().substring(0, 2)).concat(args[1].substring(0, 2), "-").concat(args[1].substring(2, 4), "-").concat(args[1].substring(4, 6), "T").concat(args[1].substring(7, 9), ":").concat(args[1].substring(9, 11), ":00");
118
- var local = new Date(new Date(expires).getTime() - 4 * 60 * 60000);
119
- var pad = function (n) { return n.toString().padStart(2, '0'); };
120
- return "".concat(local.getFullYear(), "-").concat(pad(local.getMonth() + 1), "-").concat(pad(local.getDate()), "T").concat(pad(local.getHours()), ":").concat(pad(local.getMinutes()), ":00.000-04:00");
121
- };
122
- return mVtecParser;
123
- }());
124
- exports.mVtecParser = mVtecParser;
125
- exports.default = mVtecParser;