@ifc-lite/wasm 1.0.0 → 1.1.0

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
@@ -1,402 +1,245 @@
1
- # @ifc-lite/wasm
1
+ <p align="center">
2
+ <img src="docs/assets/logo.svg" alt="IFC-Lite Logo" width="120" height="120">
3
+ </p>
2
4
 
3
- **Modern IFC Parser built with Rust + WebAssembly**
5
+ <h1 align="center">IFC-Lite</h1>
4
6
 
5
- A high-performance, lightweight alternative to web-ifc built from the ground up with Rust and compiled to WebAssembly. Features zero-copy memory access, streaming parsing, and exceptional Developer Experience.
7
+ <p align="center">
8
+ <strong>High-performance browser-native IFC platform</strong>
9
+ </p>
6
10
 
7
- ## 📦 Bundle Size
11
+ <p align="center">
12
+ <a href="https://github.com/louistrue/ifc-lite/actions"><img src="https://img.shields.io/github/actions/workflow/status/louistrue/ifc-lite/ci.yml?branch=main&style=flat-square&logo=github" alt="Build Status"></a>
13
+ <a href="https://github.com/louistrue/ifc-lite/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MPL--2.0-blue?style=flat-square" alt="License"></a>
14
+ <a href="https://www.npmjs.com/package/@ifc-lite/parser"><img src="https://img.shields.io/npm/v/@ifc-lite/parser?style=flat-square&logo=npm&label=parser" alt="npm parser"></a>
15
+ <a href="https://crates.io/crates/ifc-lite-core"><img src="https://img.shields.io/crates/v/ifc-lite-core?style=flat-square&logo=rust&label=core" alt="crates.io"></a>
16
+ </p>
8
17
 
9
- - **WASM**: 60 KB (gzipped: ~20 KB)
10
- - **JS Glue**: 26 KB (gzipped: ~8 KB)
11
- - **Total**: ~86 KB vs 8+ MB for web-ifc (**93% smaller!**)
18
+ <p align="center">
19
+ <a href="#features">Features</a> &bull;
20
+ <a href="#quick-start">Quick Start</a> &bull;
21
+ <a href="#documentation">Documentation</a> &bull;
22
+ <a href="#architecture">Architecture</a> &bull;
23
+ <a href="#performance">Performance</a> &bull;
24
+ <a href="#contributing">Contributing</a>
25
+ </p>
12
26
 
13
- ## ⚡ Performance
27
+ ---
14
28
 
15
- - **8-10x faster** geometry processing than JavaScript
16
- - **100x faster** queries with columnar data structures
17
- - **Zero-copy** memory access for direct GPU upload
18
- - **Streaming** parser for progressive rendering
29
+ ## Overview
19
30
 
20
- ## 🚀 Quick Start
31
+ **IFC-Lite** is a next-generation IFC (Industry Foundation Classes) platform built with **Rust + WebAssembly** for parsing, geometry processing, and **WebGPU** for 3D visualization. It's designed to be a **95x smaller** and significantly faster alternative to existing web-based IFC solutions.
21
32
 
22
- ```bash
23
- npm install @ifc-lite/wasm
24
- ```
25
-
26
- ### Basic Usage
27
-
28
- ```javascript
29
- import { IfcAPI } from '@ifc-lite/wasm';
30
-
31
- // Initialize
32
- const api = new IfcAPI();
33
-
34
- // Parse IFC file
35
- const result = await api.parse(ifcData);
36
- console.log('Entities:', result.entityCount);
37
- console.log('Types:', result.entityTypes);
38
- ```
39
-
40
- ## 📚 API Documentation
33
+ <p align="center">
34
+ <strong>~86 KB total</strong> &nbsp;•&nbsp; <strong>1.9x faster</strong> &nbsp;•&nbsp; <strong>100% IFC4 schema</strong>
35
+ </p>
41
36
 
42
- ### IfcAPI Class
37
+ ## Features
43
38
 
44
- The main entry point for IFC parsing operations.
39
+ | Feature | Description |
40
+ |---------|-------------|
41
+ | **STEP/IFC Parsing** | Zero-copy tokenization at ~1,259 MB/s with full IFC4 schema support (776 entities) |
42
+ | **Streaming Pipeline** | Progressive geometry processing - first triangles render in 300-500ms |
43
+ | **WebGPU Rendering** | Modern GPU-accelerated 3D visualization with depth testing and frustum culling |
44
+ | **Columnar Storage** | Memory-efficient TypedArray storage with 30% string deduplication |
45
+ | **Zero-Copy GPU** | Direct WASM memory binding to GPU buffers |
45
46
 
46
- #### Constructor
47
+ ## Quick Start
47
48
 
48
- ```typescript
49
- const api = new IfcAPI();
50
- ```
51
-
52
- Creates and initializes a new IFC API instance. Automatically sets up panic hooks for better error messages in development.
49
+ ### Prerequisites
53
50
 
54
- #### Properties
51
+ - **Node.js** 18.0+ with **pnpm** 8.0+
52
+ - **Rust** toolchain with wasm32-unknown-unknown target
53
+ - Modern browser with **WebGPU** support (Chrome 113+, Edge 113+, Firefox 127+, Safari 18+)
55
54
 
56
- - `version: string` - Returns the IFC-Lite version
57
- - `is_ready: boolean` - Check if API is initialized
55
+ ### Installation
58
56
 
59
- ### Parsing Methods
57
+ ```bash
58
+ # Clone the repository
59
+ git clone https://github.com/louistrue/ifc-lite.git
60
+ cd ifc-lite
60
61
 
61
- #### parse() - Traditional Async/Await
62
+ # Install dependencies
63
+ pnpm install
62
64
 
63
- Best for: **Simple use cases, entity counting, type analysis**
65
+ # Build all packages
66
+ pnpm build
64
67
 
65
- ```javascript
66
- const result = await api.parse(ifcData);
67
- // Returns: { entityCount: number, entityTypes: Record<string, number> }
68
+ # Run the viewer
69
+ cd apps/viewer
70
+ pnpm dev
68
71
  ```
69
72
 
70
- **Use when:**
71
- - You need quick entity statistics
72
- - File is small-to-medium size
73
- - You don't need progressive feedback
74
-
75
- **Example:**
76
- ```javascript
77
- const result = await api.parse(ifcData);
78
-
79
- console.log(`Total entities: ${result.entityCount}`);
73
+ ### Basic Usage
80
74
 
81
- // Show distribution
82
- for (const [type, count] of Object.entries(result.entityTypes)) {
83
- console.log(`${type}: ${count}`);
84
- }
85
- ```
75
+ ```typescript
76
+ import { IfcParser } from '@ifc-lite/parser';
77
+ import { Renderer } from '@ifc-lite/renderer';
86
78
 
87
- #### parseStreaming() - Progressive with Events
88
-
89
- Best for: **Large files, progress bars, real-time feedback**
90
-
91
- ```javascript
92
- await api.parseStreaming(ifcData, (event) => {
93
- switch(event.type) {
94
- case 'started':
95
- console.log(`Parsing ${event.fileSize} bytes`);
96
- break;
97
- case 'progress':
98
- updateProgressBar(event.percent);
99
- break;
100
- case 'entityScanned':
101
- console.log(`Found ${event.ifcType} #${event.id}`);
102
- break;
103
- case 'completed':
104
- console.log(`Done in ${event.durationMs}ms`);
105
- break;
106
- }
107
- });
108
- ```
79
+ // Parse IFC file
80
+ const parser = new IfcParser();
81
+ const result = await parser.parse(ifcArrayBuffer);
109
82
 
110
- **Event Types:**
83
+ // Access entities
84
+ const walls = result.entities.filter(e => e.type === 'IFCWALL');
85
+ console.log(`Found ${walls.length} walls`);
111
86
 
112
- ```typescript
113
- type ParseEvent =
114
- | { type: 'started'; fileSize: number; timestamp: number }
115
- | { type: 'entityScanned'; id: number; ifcType: string; position: number }
116
- | { type: 'geometryReady'; id: number; vertexCount: number; triangleCount: number }
117
- | { type: 'progress'; phase: string; percent: number; entitiesProcessed: number; totalEntities: number }
118
- | { type: 'completed'; durationMs: number; entityCount: number; triangleCount: number }
119
- | { type: 'error'; message: string; position?: number };
87
+ // Render geometry
88
+ const renderer = new Renderer(canvas);
89
+ await renderer.loadGeometry(result.geometry);
90
+ renderer.render();
120
91
  ```
121
92
 
122
- **Use when:**
123
- - File is large (>5 MB)
124
- - You need to show progress
125
- - You want to start rendering before parsing completes
126
-
127
- **Example: Progressive Rendering**
128
- ```javascript
129
- const viewer = new IFCViewer();
130
-
131
- await api.parseStreaming(ifcData, (event) => {
132
- if (event.type === 'geometryReady') {
133
- // Render geometry as soon as it's ready
134
- viewer.addMesh(event.id, /* ... */);
135
- }
136
-
137
- if (event.type === 'progress') {
138
- document.getElementById('progress').value = event.percent;
139
- }
140
- });
141
- ```
93
+ ## Documentation
142
94
 
143
- #### parseZeroCopy() - Maximum Performance
95
+ | Resource | Description |
96
+ |----------|-------------|
97
+ | [**User Guide**](https://louistrue.github.io/ifc-lite/) | Complete guide with tutorials and examples |
98
+ | [**API Reference**](https://louistrue.github.io/ifc-lite/api/) | Rustdoc API documentation |
99
+ | [**Architecture**](docs/architecture.md) | System design and data flow |
100
+ | [**Contributing**](CONTRIBUTING.md) | How to contribute to the project |
144
101
 
145
- Best for: **3D rendering, WebGL/WebGPU, maximum performance**
102
+ ## Architecture
146
103
 
147
- ```javascript
148
- const mesh = await api.parseZeroCopy(ifcData);
149
- const memory = await api.getMemory();
104
+ IFC files flow through three layers:
150
105
 
151
- // Create TypedArray views (NO COPYING!)
152
- const positions = new Float32Array(
153
- memory.buffer,
154
- mesh.positions_ptr,
155
- mesh.positions_len
156
- );
106
+ **Parser** (Rust/WASM) Zero-copy STEP tokenizer, entity scanner, and geometry processor using nom, earcutr, and nalgebra.
157
107
 
158
- const indices = new Uint32Array(
159
- memory.buffer,
160
- mesh.indices_ptr,
161
- mesh.indices_len
162
- );
108
+ **Data** (TypeScript) Columnar TypedArrays for properties, CSR graph for relationships, GPU-ready geometry buffers.
163
109
 
164
- // Upload directly to GPU
165
- gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
166
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
167
- ```
110
+ **Output** WebGPU renderer, Parquet analytics, glTF/JSON-LD/CSV export.
168
111
 
169
- **ZeroCopyMesh Properties:**
112
+ ## Project Structure
170
113
 
171
- ```typescript
172
- interface ZeroCopyMesh {
173
- // Pointers to WASM memory
174
- positions_ptr: number; // Float32Array pointer
175
- normals_ptr: number; // Float32Array pointer
176
- indices_ptr: number; // Uint32Array pointer
177
-
178
- // Array lengths
179
- positions_len: number; // Number of f32 elements
180
- normals_len: number; // Number of f32 elements
181
- indices_len: number; // Number of u32 elements
182
-
183
- // Metadata
184
- vertex_count: number;
185
- triangle_count: number;
186
- is_empty: boolean;
187
-
188
- // Bounding box
189
- bounds_min(): [number, number, number];
190
- bounds_max(): [number, number, number];
191
- }
192
114
  ```
193
-
194
- **Use when:**
195
- - You're rendering with WebGL/WebGPU
196
- - Performance is critical
197
- - You want zero-copy memory access
198
-
199
- **Example: Three.js Integration**
200
- ```javascript
201
- import * as THREE from 'three';
202
-
203
- const mesh = await api.parseZeroCopy(ifcData);
204
- const memory = await api.getMemory();
205
-
206
- // Create Three.js geometry
207
- const geometry = new THREE.BufferGeometry();
208
-
209
- // Zero-copy attribute creation
210
- const positions = new Float32Array(
211
- memory.buffer,
212
- mesh.positions_ptr,
213
- mesh.positions_len
214
- );
215
- geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
216
-
217
- const normals = new Float32Array(
218
- memory.buffer,
219
- mesh.normals_ptr,
220
- mesh.normals_len
221
- );
222
- geometry.setAttribute('normal', new THREE.BufferAttribute(normals, 3));
223
-
224
- const indices = new Uint32Array(
225
- memory.buffer,
226
- mesh.indices_ptr,
227
- mesh.indices_len
228
- );
229
- geometry.setIndex(new THREE.BufferAttribute(indices, 1));
230
-
231
- // Create mesh and add to scene
232
- const material = new THREE.MeshStandardMaterial({ color: 0x888888 });
233
- const threeMesh = new THREE.Mesh(geometry, material);
234
- scene.add(threeMesh);
115
+ ifc-lite/
116
+ ├── rust/ # Rust/WASM backend
117
+ │ ├── core/ # IFC/STEP parsing (~2,000 LOC)
118
+ │ ├── geometry/ # Geometry processing (~2,500 LOC)
119
+ │ └── wasm-bindings/ # JavaScript API (~800 LOC)
120
+
121
+ ├── packages/ # TypeScript packages
122
+ │ ├── parser/ # High-level IFC parser
123
+ │ ├── geometry/ # Geometry bridge (WASM)
124
+ │ ├── renderer/ # WebGPU rendering
125
+ │ ├── query/ # Query system
126
+ │ ├── data/ # Columnar data structures
127
+ │ ├── spatial/ # Spatial indexing
128
+ │ ├── export/ # Export formats
129
+ │ └── codegen/ # Schema generator
130
+
131
+ ├── apps/
132
+ │ └── viewer/ # React web application
133
+
134
+ ├── docs/ # Documentation (MkDocs)
135
+ └── plan/ # Technical specifications
235
136
  ```
236
137
 
237
- ## 🎯 Choosing the Right Method
138
+ ## Performance
238
139
 
239
- | Method | Use Case | Performance | Memory | Complexity |
240
- |--------|----------|-------------|--------|------------|
241
- | `parse()` | Entity counting, stats | Fast | Low | ⭐ Simple |
242
- | `parseStreaming()` | Large files, progress | Fast | Low | ⭐⭐ Moderate |
243
- | `parseZeroCopy()` | 3D rendering, GPU | **Fastest** | **Lowest** | ⭐⭐⭐ Advanced |
140
+ ### Bundle Size Comparison
244
141
 
245
- ## 💡 Best Practices
142
+ | Library | Size | Gzipped |
143
+ |---------|------|---------|
144
+ | **IFC-Lite** | **~86 KB** | **~28 KB** |
145
+ | Traditional WASM | 8+ MB | N/A |
146
+ | **Reduction** | **93%** | - |
246
147
 
247
- ### 1. Use Streaming for Large Files
148
+ ### Parse Performance
248
149
 
249
- ```javascript
250
- const FILE_SIZE_THRESHOLD = 5 * 1024 * 1024; // 5 MB
150
+ | Model Size | IFC-Lite | Notes |
151
+ |------------|----------|-------|
152
+ | 10 MB | ~800ms | Small models |
153
+ | 50 MB | ~2.7s | Typical models |
154
+ | 100+ MB | ~5s+ | Complex geometry |
251
155
 
252
- if (fileSize > FILE_SIZE_THRESHOLD) {
253
- // Use streaming for large files
254
- await api.parseStreaming(ifcData, handleEvent);
255
- } else {
256
- // Use simple parse for small files
257
- const result = await api.parse(ifcData);
258
- }
259
- ```
156
+ ### Geometry Processing
260
157
 
261
- ### 2. Leverage Zero-Copy for Rendering
158
+ - **1.9x faster** mesh extraction than traditional solutions
159
+ - Streaming pipeline with batched processing (100 meshes/batch)
160
+ - First triangles visible in **300-500ms**
262
161
 
263
- ```javascript
264
- // ❌ Don't copy data unnecessarily
265
- const positions = mesh.positions.slice(); // COPYING!
162
+ ## Browser Requirements
266
163
 
267
- // Use direct memory access
268
- const positions = new Float32Array(
269
- memory.buffer,
270
- mesh.positions_ptr,
271
- mesh.positions_len
272
- ); // NO COPYING!
273
- ```
164
+ | Browser | Minimum Version | WebGPU |
165
+ |---------|----------------|--------|
166
+ | Chrome | 113+ | ✅ |
167
+ | Edge | 113+ | ✅ |
168
+ | Firefox | 127+ | ✅ |
169
+ | Safari | 18+ | ✅ |
274
170
 
275
- ### 3. Handle Errors Gracefully
276
-
277
- ```javascript
278
- try {
279
- const result = await api.parse(ifcData);
280
- // ... handle result
281
- } catch (error) {
282
- if (error.message.includes('Invalid entity reference')) {
283
- // Handle corrupted IFC file
284
- showError('This IFC file appears to be corrupted');
285
- } else {
286
- // Generic error handling
287
- showError('Failed to parse IFC file');
288
- }
289
- }
290
- ```
171
+ ## Development
291
172
 
292
- ### 4. Show Progress for Better UX
293
-
294
- ```javascript
295
- let lastUpdate = 0;
296
-
297
- await api.parseStreaming(ifcData, (event) => {
298
- if (event.type === 'progress') {
299
- // Throttle UI updates to avoid jank
300
- const now = Date.now();
301
- if (now - lastUpdate > 100) { // Update every 100ms
302
- updateProgressBar(event.percent);
303
- lastUpdate = now;
304
- }
305
- }
306
- });
307
- ```
308
-
309
- ## 🔧 Advanced Features
173
+ ```bash
174
+ # Watch mode for all packages
175
+ pnpm -r dev
310
176
 
311
- ### CSG Operations (Coming Soon)
177
+ # Build specific package
178
+ cd packages/parser && pnpm build
312
179
 
313
- ```javascript
314
- // Boolean operations with clipping planes
315
- const plane = { point: [0, 0, 0], normal: [0, 0, 1] };
316
- const clipped = await api.clipMesh(mesh, plane);
317
- ```
180
+ # Run tests
181
+ pnpm test
318
182
 
319
- ### Custom Entity Filtering
183
+ # Build Rust/WASM
184
+ cd rust && cargo build --release --target wasm32-unknown-unknown
320
185
 
321
- ```javascript
322
- const config = {
323
- skipTypes: ['IFCOWNERHISTORY', 'IFCPERSON'],
324
- onlyTypes: ['IFCWALL', 'IFCSLAB', 'IFCBEAM'],
325
- progressInterval: 100, // Report progress every 100 entities
326
- };
186
+ # Generate Rustdoc
187
+ cd rust && cargo doc --no-deps --open
327
188
 
328
- await api.parseStreaming(ifcData, handleEvent, config);
189
+ # Build documentation site
190
+ cd docs && mkdocs serve
329
191
  ```
330
192
 
331
- ## 📊 Benchmarks
193
+ ## Packages
332
194
 
333
- Tested with Snowdon Towers sample (8.3 MB IFC file):
195
+ | Package | Description | Status |
196
+ |---------|-------------|--------|
197
+ | `@ifc-lite/parser` | STEP tokenizer & entity extraction | ✅ Stable |
198
+ | `@ifc-lite/geometry` | Geometry processing bridge | ✅ Stable |
199
+ | `@ifc-lite/renderer` | WebGPU rendering pipeline | ✅ Stable |
200
+ | `@ifc-lite/query` | Fluent & SQL query system | 🚧 Beta |
201
+ | `@ifc-lite/data` | Columnar data structures | ✅ Stable |
202
+ | `@ifc-lite/spatial` | Spatial indexing & culling | 🚧 Beta |
203
+ | `@ifc-lite/export` | Export (glTF, Parquet, etc.) | 🚧 Beta |
334
204
 
335
- | Operation | IFC-Lite | web-ifc | Improvement |
336
- |-----------|----------|---------|-------------|
337
- | Bundle size | 86 KB | 8.2 MB | **95x smaller** |
338
- | Initial parse | 850 ms | 1200 ms | **1.4x faster** |
339
- | Entity queries | <1 ms | 100 ms | **100x faster** |
340
- | Memory usage | 45 MB | 120 MB | **2.7x less** |
205
+ ## Rust Crates
341
206
 
342
- ## 🐛 Troubleshooting
207
+ | Crate | Description | Status |
208
+ |-------|-------------|--------|
209
+ | `ifc-lite-core` | STEP/IFC parsing | ✅ Stable |
210
+ | `ifc-lite-geometry` | Mesh triangulation | ✅ Stable |
211
+ | `ifc-lite-wasm` | WASM bindings | ✅ Stable |
343
212
 
344
- ### "Failed to instantiate WASM module"
213
+ ## Contributing
345
214
 
346
- Make sure your bundler is configured to handle WASM files:
347
-
348
- **Vite:**
349
- ```javascript
350
- // vite.config.js
351
- export default {
352
- optimizeDeps: {
353
- exclude: ['@ifc-lite/wasm']
354
- }
355
- }
356
- ```
215
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
357
216
 
358
- **Webpack:**
359
- ```javascript
360
- // webpack.config.js
361
- module.exports = {
362
- experiments: {
363
- asyncWebAssembly: true
364
- }
365
- }
366
- ```
367
-
368
- ### "Memory access out of bounds"
369
-
370
- This usually means the WASM memory has been deallocated. Make sure to:
371
- 1. Keep a reference to the API instance
372
- 2. Don't access meshes after they've been freed
373
- 3. Create TypedArray views before the next parse operation
217
+ ```bash
218
+ # Fork and clone
219
+ git clone https://github.com/YOUR_USERNAME/ifc-lite.git
374
220
 
375
- ## 🚀 Migration from web-ifc
221
+ # Create a branch
222
+ git checkout -b feature/my-feature
376
223
 
377
- ```javascript
378
- // Before (web-ifc)
379
- const ifcApi = new IfcAPI();
380
- await ifcApi.Init();
381
- const modelID = ifcApi.OpenModel(buffer);
382
- const walls = ifcApi.GetLineIDsWithType(modelID, IFCWALL);
224
+ # Make changes and test
225
+ pnpm test
383
226
 
384
- // After (IFC-Lite)
385
- const api = new IfcAPI();
386
- const result = await api.parse(buffer);
387
- // Walls are already counted in result.entityTypes.IFCWALL
227
+ # Submit a pull request
388
228
  ```
389
229
 
390
- ## 📄 License
230
+ ## License
391
231
 
392
- MIT
232
+ This project is licensed under the [Mozilla Public License 2.0](LICENSE).
393
233
 
394
- ## 🤝 Contributing
234
+ ## Acknowledgments
395
235
 
396
- Contributions welcome! See the main repository for details.
236
+ - Built with [nom](https://github.com/rust-bakery/nom) for parsing
237
+ - [earcutr](https://github.com/nickel-org/earcutr) for polygon triangulation
238
+ - [nalgebra](https://nalgebra.org/) for linear algebra
239
+ - [wasm-bindgen](https://rustwasm.github.io/wasm-bindgen/) for Rust/JS interop
397
240
 
398
- ## 🔗 Links
241
+ ---
399
242
 
400
- - [Documentation](https://github.com/louistrue/ifc-lite)
401
- - [Examples](./examples/)
402
- - [Benchmarks](./benchmarks/)
243
+ <p align="center">
244
+ Made with ❤️ for the AEC industry
245
+ </p>
package/package.json CHANGED
@@ -1,44 +1,36 @@
1
1
  {
2
2
  "name": "@ifc-lite/wasm",
3
- "version": "1.0.0",
4
- "description": "WebAssembly bindings for IFC-Lite",
5
3
  "type": "module",
6
- "main": "ifc_lite_wasm.js",
7
- "types": "ifc_lite_wasm.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./ifc_lite_wasm.d.ts",
11
- "import": "./ifc_lite_wasm.js"
12
- }
13
- },
14
4
  "collaborators": [
15
5
  "IFC-Lite Contributors"
16
6
  ],
7
+ "description": "WebAssembly bindings for IFC-Lite",
8
+ "version": "1.1.0",
17
9
  "license": "MPL-2.0",
18
10
  "repository": {
19
11
  "type": "git",
20
- "url": "https://github.com/louistrue/ifc-lite.git",
21
- "directory": "packages/wasm"
12
+ "url": "https://github.com/louistrue/ifc-lite"
22
13
  },
23
14
  "files": [
24
- "ifc_lite_wasm_bg.wasm",
25
- "ifc_lite_wasm.js",
26
- "ifc_lite_wasm.d.ts"
15
+ "pkg/ifc-lite_bg.wasm",
16
+ "pkg/ifc-lite.js",
17
+ "pkg/ifc-lite.d.ts"
27
18
  ],
28
- "sideEffects": [
29
- "./snippets/*"
30
- ],
31
- "author": "Louis True",
32
- "homepage": "https://louistrue.github.io/ifc-lite/",
33
- "bugs": "https://github.com/louistrue/ifc-lite/issues",
19
+ "main": "./pkg/ifc-lite.js",
20
+ "module": "./pkg/ifc-lite.js",
21
+ "types": "./pkg/ifc-lite.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "import": "./pkg/ifc-lite.js",
25
+ "types": "./pkg/ifc-lite.d.ts"
26
+ }
27
+ },
28
+ "sideEffects": false,
34
29
  "keywords": [
35
30
  "ifc",
36
31
  "bim",
37
32
  "wasm",
38
33
  "webassembly",
39
34
  "aec"
40
- ],
41
- "publishConfig": {
42
- "access": "public"
43
- }
35
+ ]
44
36
  }