@sesamecare-oss/us-postal-codes 1.1.0 → 2.0.1
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 +2 -0
- package/build/index.d.ts +2 -2
- package/build/index.js +9 -9
- package/build/index.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +21 -21
package/README.md
CHANGED
package/build/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
2
|
export interface PostalCodeLocation {
|
|
3
3
|
postalCode: string;
|
|
4
4
|
city: string;
|
|
@@ -10,7 +10,7 @@ export interface NearbyResult extends PostalCodeLocation {
|
|
|
10
10
|
distanceMiles: number;
|
|
11
11
|
}
|
|
12
12
|
export declare class USPostalCodes {
|
|
13
|
-
db:
|
|
13
|
+
db: DatabaseSync | undefined;
|
|
14
14
|
open(): Promise<void>;
|
|
15
15
|
lookup(zipCode: string): Promise<{
|
|
16
16
|
city: string;
|
package/build/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import {
|
|
3
|
-
import { open } from 'sqlite';
|
|
2
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
3
|
const EARTH_RADIUS_MILES = 3958.8;
|
|
5
4
|
function haversineDistance(lat1, lng1, lat2, lng2) {
|
|
6
5
|
const toRad = (deg) => (deg * Math.PI) / 180;
|
|
@@ -13,16 +12,15 @@ function haversineDistance(lat1, lng1, lat2, lng2) {
|
|
|
13
12
|
export class USPostalCodes {
|
|
14
13
|
db;
|
|
15
14
|
async open() {
|
|
16
|
-
this.db =
|
|
17
|
-
filename: path.join(__dirname, '../assets/uspostalcodes.db'),
|
|
18
|
-
driver: DatabaseDriver,
|
|
19
|
-
});
|
|
15
|
+
this.db = new DatabaseSync(path.join(__dirname, '../assets/uspostalcodes.db'));
|
|
20
16
|
}
|
|
21
17
|
async lookup(zipCode) {
|
|
22
18
|
if (!this.db) {
|
|
23
19
|
throw new Error('Postal code database unavailable');
|
|
24
20
|
}
|
|
25
|
-
return this.db
|
|
21
|
+
return this.db
|
|
22
|
+
.prepare('SELECT city, state, lat, lng FROM locations WHERE postal_code = ?')
|
|
23
|
+
.all(zipCode);
|
|
26
24
|
}
|
|
27
25
|
async nearby(lat, lng, limit = 10) {
|
|
28
26
|
if (!this.db) {
|
|
@@ -30,9 +28,11 @@ export class USPostalCodes {
|
|
|
30
28
|
}
|
|
31
29
|
// Use approximate Euclidean ordering in SQL (fast for 41K rows),
|
|
32
30
|
// then compute exact Haversine distances in JS
|
|
33
|
-
const rows =
|
|
31
|
+
const rows = this.db
|
|
32
|
+
.prepare(`SELECT postal_code, city, state, lat, lng FROM locations
|
|
34
33
|
ORDER BY (lat - ?) * (lat - ?) + (lng - ?) * (lng - ?)
|
|
35
|
-
LIMIT
|
|
34
|
+
LIMIT ?`)
|
|
35
|
+
.all(lat, lat, lng, lng, limit);
|
|
36
36
|
return rows
|
|
37
37
|
.map((row) => ({
|
|
38
38
|
postalCode: row.postal_code,
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;IAC/E,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GACL,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,OAAO,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,OAAO,aAAa;IACxB,EAAE,CAA2B;IAE7B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAQ1B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,OAAO,CAKX,CAAC;IACN,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,GAAW,EAAE,KAAK,GAAG,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,iEAAiE;QACjE,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;iBAES,CACV;aACA,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAM7B,CAAC;QAEJ,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SACrF,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sesamecare-oss/us-postal-codes",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Lookup city, state and geolocation by US postal codes. Includes infra for fetching the latest values.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"author": "Developers <developers@sesamecare.com>",
|
|
8
8
|
"license": "UNLICENSED",
|
|
9
9
|
"packageManager": "yarn@3.6.0",
|
|
10
|
+
"type": "module",
|
|
10
11
|
"scripts": {
|
|
11
12
|
"build": "tsc -p tsconfig.build.json",
|
|
12
13
|
"clean": "yarn dlx rimraf ./dist",
|
|
@@ -25,6 +26,9 @@
|
|
|
25
26
|
"publishConfig": {
|
|
26
27
|
"access": "public"
|
|
27
28
|
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22.5.0"
|
|
31
|
+
},
|
|
28
32
|
"release": {
|
|
29
33
|
"branches": [
|
|
30
34
|
"main"
|
|
@@ -60,9 +64,5 @@
|
|
|
60
64
|
"prettier": "^3.8.1",
|
|
61
65
|
"typescript": "^5.9.3",
|
|
62
66
|
"vitest": "^4.1.4"
|
|
63
|
-
},
|
|
64
|
-
"dependencies": {
|
|
65
|
-
"sqlite": "^5.1.1",
|
|
66
|
-
"sqlite3": "^6.0.1"
|
|
67
67
|
}
|
|
68
68
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
|
|
3
|
-
import { Database as DatabaseDriver } from 'sqlite3';
|
|
4
|
-
import type { Database } from 'sqlite';
|
|
5
|
-
import { open } from 'sqlite';
|
|
2
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
6
3
|
|
|
7
4
|
export interface PostalCodeLocation {
|
|
8
5
|
postalCode: string;
|
|
@@ -29,13 +26,10 @@ function haversineDistance(lat1: number, lng1: number, lat2: number, lng2: numbe
|
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
export class USPostalCodes {
|
|
32
|
-
db:
|
|
29
|
+
db: DatabaseSync | undefined;
|
|
33
30
|
|
|
34
31
|
async open() {
|
|
35
|
-
this.db =
|
|
36
|
-
filename: path.join(__dirname, '../assets/uspostalcodes.db'),
|
|
37
|
-
driver: DatabaseDriver,
|
|
38
|
-
});
|
|
32
|
+
this.db = new DatabaseSync(path.join(__dirname, '../assets/uspostalcodes.db'));
|
|
39
33
|
}
|
|
40
34
|
|
|
41
35
|
async lookup(zipCode: string): Promise<
|
|
@@ -49,10 +43,14 @@ export class USPostalCodes {
|
|
|
49
43
|
if (!this.db) {
|
|
50
44
|
throw new Error('Postal code database unavailable');
|
|
51
45
|
}
|
|
52
|
-
return this.db
|
|
53
|
-
'SELECT city, state, lat, lng FROM locations WHERE postal_code = ?'
|
|
54
|
-
zipCode
|
|
55
|
-
|
|
46
|
+
return this.db
|
|
47
|
+
.prepare('SELECT city, state, lat, lng FROM locations WHERE postal_code = ?')
|
|
48
|
+
.all(zipCode) as {
|
|
49
|
+
city: string;
|
|
50
|
+
state: string;
|
|
51
|
+
lat: number;
|
|
52
|
+
lng: number;
|
|
53
|
+
}[];
|
|
56
54
|
}
|
|
57
55
|
|
|
58
56
|
async nearby(lat: number, lng: number, limit = 10): Promise<NearbyResult[]> {
|
|
@@ -62,17 +60,19 @@ export class USPostalCodes {
|
|
|
62
60
|
|
|
63
61
|
// Use approximate Euclidean ordering in SQL (fast for 41K rows),
|
|
64
62
|
// then compute exact Haversine distances in JS
|
|
65
|
-
const rows
|
|
66
|
-
|
|
63
|
+
const rows = this.db
|
|
64
|
+
.prepare(
|
|
67
65
|
`SELECT postal_code, city, state, lat, lng FROM locations
|
|
68
66
|
ORDER BY (lat - ?) * (lat - ?) + (lng - ?) * (lng - ?)
|
|
69
67
|
LIMIT ?`,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
)
|
|
69
|
+
.all(lat, lat, lng, lng, limit) as {
|
|
70
|
+
postal_code: string;
|
|
71
|
+
city: string;
|
|
72
|
+
state: string;
|
|
73
|
+
lat: number;
|
|
74
|
+
lng: number;
|
|
75
|
+
}[];
|
|
76
76
|
|
|
77
77
|
return rows
|
|
78
78
|
.map((row) => ({
|