@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 CHANGED
@@ -8,6 +8,8 @@ Lookup city, state, and geolocation by US postal code, or find nearby zip codes
8
8
  npm install @sesamecare-oss/us-postal-codes
9
9
  ```
10
10
 
11
+ Requires Node.js 22.5.0 or newer because the module uses the built-in `node:sqlite` API.
12
+
11
13
  ## Usage
12
14
 
13
15
  ```typescript
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Database } from 'sqlite';
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: Database | undefined;
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 { Database as DatabaseDriver } from 'sqlite3';
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 = await open({
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.all('SELECT city, state, lat, lng FROM locations WHERE postal_code = ?', zipCode);
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 = await this.db.all(`SELECT postal_code, city, state, lat, lng FROM locations
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 ?`, lat, lat, lng, lng, limit);
34
+ LIMIT ?`)
35
+ .all(lat, lat, lng, lng, limit);
36
36
  return rows
37
37
  .map((row) => ({
38
38
  postalCode: row.postal_code,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAc9B,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,CAAuB;IAEzB,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC;YAC5D,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;IACL,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,CAAC,GAAG,CAChB,mEAAmE,EACnE,OAAO,CACR,CAAC;IACJ,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,GACR,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACf;;iBAES,EACT,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,KAAK,CACN,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"}
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": "1.1.0",
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: Database | undefined;
29
+ db: DatabaseSync | undefined;
33
30
 
34
31
  async open() {
35
- this.db = await open({
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.all(
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: { postal_code: string; city: string; state: string; lat: number; lng: number }[] =
66
- await this.db.all(
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
- lat,
71
- lat,
72
- lng,
73
- lng,
74
- limit,
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) => ({