Skip to content

Commit

Permalink
feat(build): Enhance module structure and improve package exports.
Browse files Browse the repository at this point in the history
  • Loading branch information
Alice39s committed Feb 9, 2025
1 parent d009554 commit 288c912
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 99 deletions.
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.0.2] - 2024-02-09

### Changed

- Optimized build output structure for better module consumption
- Separated Node.js and browser builds into distinct directories
- Added proper CommonJS support for Node.js environment
Expand All @@ -17,13 +18,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved type definitions organization

### Optimized

- Significantly reduced JSON data file sizes through minification
- Improved module tree-shaking support
- Better source maps generation for both Node.js and browser builds

### Fixed

- Fixed incorrect file extensions in package exports
- Resolved module format compatibility issues
- Fixed type declarations path in package.json

[1.0.2]: https://github.com/alice39s/ourairports-data-js/compare/v1.0.1...v1.0.2
[1.0.2]: https://github.com/alice39s/ourairports-data-js/compare/v1.0.1...v1.0.2
200 changes: 112 additions & 88 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,131 +43,148 @@ bun add ourairports-data-js
import OurAirports from 'https://unpkg.com/ourairports-data-js/dist/browser/index.js';
const airports = new OurAirports();
await airports.initialize();
await airports.init();
</script>

<!-- Using jsDelivr -->
<script type="module">
import OurAirports from 'https://cdn.jsdelivr.net/npm/ourairports-data-js/dist/browser/index.js';
const airports = new OurAirports();
await airports.initialize();
await airports.init();
</script>
```

## Usage

### ESM Import
### Basic Usage

The library supports tree-shaking and can be imported in multiple ways:
The library automatically detects your environment (Node.js or browser) and uses the appropriate implementation:

```typescript
// Import everything
import OurAirports from 'ourairports-data-js';

// Import specific types
import { BasicInfo, AirportFilter, AirportType } from 'ourairports-data-js';
async function main() {
// Create instance
const airports = new OurAirports();

// Initialize (auto-detects environment)
await airports.init();

// Find airport by IATA code
const pek = airports.findByIataCode('PEK');
console.log(pek?.name); // "Beijing Capital International Airport"
console.log(pek?.type); // "large_airport"

// Find airport by ICAO code
const zbaa = airports.findByIcaoCode('ZBAA');
console.log(zbaa?.name); // "Beijing Capital International Airport"

// Find airports in China
const chineseAirports = airports.findByCountry('CN');
console.log(`Found ${chineseAirports.length} airports in China`);

// Find airports within 100km radius of Beijing Capital Airport
const nearbyAirports = airports.findAirportsInRadius(40.0799, 116.6031, 100);
console.log(
'Nearby airports:',
nearbyAirports.map(a => a.name)
);

// Search airports with filters
const largeAirports = airports.searchAirports({
type: 'large_airport',
hasIataCode: true,
hasScheduledService: true,
country: 'CN',
continent: 'AS',
});
}

// Import schemas for validation
import { BasicInfoSchema, CodesSchema } from 'ourairports-data-js';
main().catch(console.error);
```

### Node.js Environment
### Advanced Usage

#### Environment-Specific Imports

You can explicitly import the environment-specific version if needed:

```typescript
import OurAirports from 'ourairports-data-js';
// Browser-specific import
import OurAirports from 'ourairports-data-js/browser';

// Node.js-specific import
import OurAirports from 'ourairports-data-js/node';
```

const airports = new OurAirports();
airports.initialize(); // Synchronous initialization in Node.js
#### Type Imports

// Find airport by IATA code
```typescript
// Import types
import type {
BasicInfo, // Airport basic information
AirportFilter, // Search filter interface
AirportType, // Airport type enum
Coordinates, // Airport coordinates
Region, // Airport region information
} from 'ourairports-data-js';

// Import validation schemas
import { BasicInfoSchema, CoordinatesSchema, RegionSchema } from 'ourairports-data-js';
```

### Search Examples

#### Find by IATA/ICAO Code

```typescript
// Find by IATA code
const pek = airports.findByIataCode('PEK');
console.log(pek?.name); // "Beijing Capital International Airport"
console.log(pek?.type); // "large_airport"

// Find airport by ICAO code
// Find by ICAO code
const zbaa = airports.findByIcaoCode('ZBAA');
console.log(zbaa?.name); // "Beijing Capital International Airport"
```

// Find airports in China
const chineseAirports = airports.findByCountry('CN');
console.log(`Found ${chineseAirports.length} airports in China`);

// Find airports within 100km radius of Beijing Capital Airport
const nearbyAirports = airports.findAirportsInRadius(40.0799, 116.6031, 100);
console.log(
'Nearby airports:',
nearbyAirports.map(a => ({
name: a.name,
type: a.type,
distance: 'calculated by the library',
}))
);
#### Search with Filters

// Search airports with filters
const largeAirports = airports.searchAirports({
```typescript
// Search for major airports in China
const majorAirports = airports.searchAirports({
type: 'large_airport',
country: 'CN',
hasIataCode: true,
hasScheduledService: true,
country: 'CN',
continent: 'AS',
});
```

### Browser Environment

```typescript
import OurAirports from 'ourairports-data-js';
import { AirportFilter } from 'ourairports-data-js';

async function initAirports() {
const airports = new OurAirports();

try {
// Asynchronous initialization in browser (automatically uses CDN)
await airports.initializeAsync();

// Search for major Chinese airports
const filter: AirportFilter = {
country: 'CN',
type: 'large_airport',
hasIataCode: true,
hasScheduledService: true,
};

const majorAirports = airports.searchAirports(filter);
console.log('Major Chinese airports:', majorAirports);
} catch (error) {
console.error('Failed to initialize airports:', error);
}
}

initAirports();
// Find airports within radius
const nearbyAirports = airports.findAirportsInRadius(
40.0799, // latitude
116.6031, // longitude
100 // radius in kilometers
);
```

### Environment Detection
### Advanced Features

The library automatically detects your environment and uses the appropriate implementation:
#### Raw Data Access

```typescript
import OurAirports, { BasicInfo } from 'ourairports-data-js';
// Get access to raw data for advanced usage
const { basicInfo, codes, coordinates, region, references } = airports.data;
```

async function searchAirport(iataCode: string): Promise<BasicInfo | undefined> {
const airports = new OurAirports();
#### Environment Detection

try {
// Library automatically uses the appropriate initialization method
if (typeof window !== 'undefined') {
await airports.initializeAsync(); // Browser environment
} else {
airports.initialize(); // Node.js environment
}

return airports.findByIataCode(iataCode);
} catch (error) {
console.error('Error searching airport:', error);
throw error;
}
```typescript
// Check current environment
if (airports.isInBrowser) {
console.log('Running in browser');
} else {
console.log('Running in Node.js');
}
```

Expand All @@ -179,8 +196,9 @@ async function searchAirport(iataCode: string): Promise<BasicInfo | undefined> {

### Initialization Methods

- `initialize()` - Synchronous initialization (Node.js only)
- `initializeAsync()` - Asynchronous initialization (works in both Node.js and browser)
- `init()` - Auto-detect environment and initialize (recommended)
- `initialize()` - Explicit Node.js initialization
- `initializeAsync()` - Explicit browser initialization

### Search Methods

Expand All @@ -190,6 +208,12 @@ async function searchAirport(iataCode: string): Promise<BasicInfo | undefined> {
- `findAirportsInRadius(lat: number, lon: number, radiusKm: number): BasicInfo[]` - Find airports within radius
- `searchAirports(filter: AirportFilter): BasicInfo[]` - Search airports with filters

### Properties

- `isInitialized: boolean` - Check if the instance is initialized
- `isInBrowser: boolean` - Check if running in browser environment
- `data: AirportData` - Get raw data for advanced usage

### Types

```typescript
Expand Down Expand Up @@ -222,17 +246,17 @@ The library uses data from OurAirports, which is updated periodically:

### Node.js

- Synchronous data loading
- Synchronous data loading available
- File system access for data files
- Better performance with local data
- Full tree-shaking support in ESM mode
- CommonJS and ESM support

### Browser

- Asynchronous data loading
- Automatic CDN fallback
- Automatic CDN data loading
- No file system dependencies
- Optimized bundle size with tree-shaking
- Optimized bundle size
- Modern ESM format

## Contributing

Expand Down
13 changes: 6 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
{
"name": "ourairports-data-js",
"version": "1.0.2",
"version": "1.0.3",
"description": "A TypeScript library for handling OurAirports data, supports browser and node.js",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"node": {
"types": "./dist/node/index.d.ts",
"import": "./dist/node/index.js",
Expand All @@ -14,11 +16,7 @@
"types": "./dist/browser/index.d.ts",
"import": "./dist/browser/index.js"
},
"default": {
"types": "./dist/node/index.d.ts",
"import": "./dist/node/index.js",
"require": "./dist/node/index.cjs"
}
"default": "./dist/index.js"
},
"./data/*": "./dist/data/*"
},
Expand All @@ -29,7 +27,8 @@
"clean": "rm -rf dist",
"prebuild": "bun run clean",
"build": "bun run fetch-data && bun run format && bun run build:all",
"build:all": "bun run build:node && bun run build:browser && bun run build:data",
"build:all": "bun run build:main && bun run build:node && bun run build:browser && bun run build:data",
"build:main": "vite build --mode main",
"build:node": "vite build --mode node",
"build:browser": "vite build --mode browser",
"build:data": "mkdir -p dist/data && bun src/scripts/jsonMinify.ts",
Expand Down
2 changes: 2 additions & 0 deletions src/browser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './index';
export { OurAirports as default } from './index';
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,4 +197,6 @@ class OurAirports {
}
}

// Export the class as both default and named export
export { OurAirports };
export default OurAirports;
17 changes: 17 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { OurAirports } from './index';

// Re-export everything from index
export * from './index';

// Export the class with environment detection
export default class SmartOurAirports extends OurAirports {
constructor() {
super();
// Auto-initialize based on environment
if (typeof window !== 'undefined') {
this.initializeAsync().catch(console.error);
} else {
this.initialize().catch(console.error);
}
}
}
2 changes: 2 additions & 0 deletions src/node.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './index';
export { OurAirports as default } from './index';
Loading

0 comments on commit 288c912

Please sign in to comment.