@geoprotocol/grc-20 0.1.0 → 0.1.4
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/dist/builder/edit.d.ts +5 -8
- package/dist/builder/edit.d.ts.map +1 -1
- package/dist/builder/edit.js +8 -19
- package/dist/builder/edit.js.map +1 -1
- package/dist/builder/entity.d.ts +4 -4
- package/dist/builder/entity.d.ts.map +1 -1
- package/dist/builder/entity.js +6 -6
- package/dist/builder/entity.js.map +1 -1
- package/dist/builder/index.d.ts +1 -0
- package/dist/builder/index.d.ts.map +1 -1
- package/dist/builder/index.js +1 -0
- package/dist/builder/index.js.map +1 -1
- package/dist/builder/relation.d.ts +4 -8
- package/dist/builder/relation.d.ts.map +1 -1
- package/dist/builder/relation.js +7 -14
- package/dist/builder/relation.js.map +1 -1
- package/dist/builder/update-relation.d.ts +64 -0
- package/dist/builder/update-relation.d.ts.map +1 -0
- package/dist/builder/update-relation.js +107 -0
- package/dist/builder/update-relation.js.map +1 -0
- package/dist/builder/update.d.ts +4 -4
- package/dist/builder/update.d.ts.map +1 -1
- package/dist/builder/update.js +6 -6
- package/dist/builder/update.js.map +1 -1
- package/dist/codec/compression.d.ts +132 -0
- package/dist/codec/compression.d.ts.map +1 -0
- package/dist/codec/compression.js +244 -0
- package/dist/codec/compression.js.map +1 -0
- package/dist/codec/index.d.ts +1 -0
- package/dist/codec/index.d.ts.map +1 -1
- package/dist/codec/index.js +9 -0
- package/dist/codec/index.js.map +1 -1
- package/dist/codec/op.d.ts.map +1 -1
- package/dist/codec/op.js +100 -37
- package/dist/codec/op.js.map +1 -1
- package/dist/codec/value.d.ts.map +1 -1
- package/dist/codec/value.js +35 -16
- package/dist/codec/value.js.map +1 -1
- package/dist/genesis/index.d.ts +14 -90
- package/dist/genesis/index.d.ts.map +1 -1
- package/dist/genesis/index.js +22 -149
- package/dist/genesis/index.js.map +1 -1
- package/dist/genesis/language.d.ts +33 -0
- package/dist/genesis/language.d.ts.map +1 -0
- package/dist/genesis/language.js +35 -0
- package/dist/genesis/language.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/test/basic.test.js +175 -26
- package/dist/test/basic.test.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/op.d.ts +17 -12
- package/dist/types/op.d.ts.map +1 -1
- package/dist/types/op.js.map +1 -1
- package/dist/types/value.d.ts +7 -6
- package/dist/types/value.d.ts.map +1 -1
- package/dist/types/value.js +11 -8
- package/dist/types/value.js.map +1 -1
- package/package.json +5 -1
- package/readme.md +76 -23
package/readme.md
CHANGED
|
@@ -42,7 +42,8 @@ const decoded = decodeEdit(bytes);
|
|
|
42
42
|
|
|
43
43
|
- **Type-safe API** - Full TypeScript definitions
|
|
44
44
|
- **Builder pattern** - Fluent API for constructing edits
|
|
45
|
-
- **Binary codec** - Pure TypeScript encoder/decoder
|
|
45
|
+
- **Binary codec** - Pure TypeScript encoder/decoder
|
|
46
|
+
- **Zstd compression** - Optional WASM-based compression (lazy-loaded)
|
|
46
47
|
- **Tree-shakeable** - Separate entry points for minimal bundles
|
|
47
48
|
- **Cross-platform** - Works in Node.js and browsers
|
|
48
49
|
|
|
@@ -50,24 +51,30 @@ const decoded = decodeEdit(bytes);
|
|
|
50
51
|
|
|
51
52
|
| Entry Point | Gzipped |
|
|
52
53
|
|-------------|---------|
|
|
53
|
-
| Full library | ~
|
|
54
|
+
| Full library | ~12 KB |
|
|
54
55
|
| Types only | ~1.4 KB |
|
|
55
56
|
| Builder only | ~1.2 KB |
|
|
56
|
-
| Codec only | ~
|
|
57
|
-
| Genesis IDs | ~1.
|
|
57
|
+
| Codec only | ~8 KB |
|
|
58
|
+
| Genesis IDs | ~1.7 KB |
|
|
58
59
|
| Utilities | ~1.6 KB |
|
|
60
|
+
| Zstd WASM (lazy) | ~81 KB |
|
|
61
|
+
|
|
62
|
+
The Zstd WASM module is only loaded when compression functions are used.
|
|
59
63
|
|
|
60
64
|
### Lazy Loading
|
|
61
65
|
|
|
62
66
|
For optimal initial load, import the codec separately:
|
|
63
67
|
|
|
64
68
|
```typescript
|
|
65
|
-
// Initial load (~4.
|
|
69
|
+
// Initial load (~4.4 KB gzipped)
|
|
66
70
|
import { EditBuilder, randomId, properties } from "@geoprotocol/grc-20/builder";
|
|
67
71
|
import { properties } from "@geoprotocol/grc-20/genesis";
|
|
68
72
|
|
|
69
|
-
// Lazy load codec when needed (~
|
|
73
|
+
// Lazy load codec when needed (~8 KB gzipped)
|
|
70
74
|
const { encodeEdit } = await import("@geoprotocol/grc-20/codec");
|
|
75
|
+
|
|
76
|
+
// WASM only loads if you use compression (~81 KB additional)
|
|
77
|
+
const { encodeEditAuto } = await import("@geoprotocol/grc-20/codec");
|
|
71
78
|
```
|
|
72
79
|
|
|
73
80
|
## API Reference
|
|
@@ -131,14 +138,65 @@ const edit = new EditBuilder(editId)
|
|
|
131
138
|
```typescript
|
|
132
139
|
import { encodeEdit, decodeEdit } from "@geoprotocol/grc-20";
|
|
133
140
|
|
|
134
|
-
// Encode
|
|
141
|
+
// Encode (uncompressed)
|
|
135
142
|
const bytes = encodeEdit(edit);
|
|
136
143
|
const bytesCanonical = encodeEdit(edit, { canonical: true });
|
|
137
144
|
|
|
138
|
-
// Decode
|
|
145
|
+
// Decode (uncompressed)
|
|
139
146
|
const edit = decodeEdit(bytes);
|
|
140
147
|
```
|
|
141
148
|
|
|
149
|
+
### Compression
|
|
150
|
+
|
|
151
|
+
The library supports Zstd compression via a lazy-loaded WASM module. The WASM is only downloaded when compression functions are first used.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import {
|
|
155
|
+
preloadCompression,
|
|
156
|
+
isCompressionReady,
|
|
157
|
+
encodeEditAuto,
|
|
158
|
+
decodeEditAuto,
|
|
159
|
+
encodeEditCompressed,
|
|
160
|
+
decodeEditCompressed,
|
|
161
|
+
} from "@geoprotocol/grc-20";
|
|
162
|
+
|
|
163
|
+
// Preload WASM on app startup (recommended)
|
|
164
|
+
await preloadCompression();
|
|
165
|
+
|
|
166
|
+
// Check if compression is ready
|
|
167
|
+
if (isCompressionReady()) {
|
|
168
|
+
console.log("Compression ready!");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Auto encode/decode (recommended for most use cases)
|
|
172
|
+
// Compresses if data > 256 bytes, otherwise uncompressed
|
|
173
|
+
const data = await encodeEditAuto(edit);
|
|
174
|
+
const decoded = await decodeEditAuto(data);
|
|
175
|
+
|
|
176
|
+
// Control compression threshold
|
|
177
|
+
const data = await encodeEditAuto(edit, { threshold: 0 }); // always compress
|
|
178
|
+
const data = await encodeEditAuto(edit, { threshold: 1024 }); // compress if > 1KB
|
|
179
|
+
const data = await encodeEditAuto(edit, { threshold: Infinity }); // never compress
|
|
180
|
+
|
|
181
|
+
// Explicit compressed encode/decode
|
|
182
|
+
const compressed = await encodeEditCompressed(edit);
|
|
183
|
+
const decoded = await decodeEditCompressed(compressed);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### Browser Usage (without bundler)
|
|
187
|
+
|
|
188
|
+
If using native ES modules without a bundler, add an import map for the WASM dependency:
|
|
189
|
+
|
|
190
|
+
```html
|
|
191
|
+
<script type="importmap">
|
|
192
|
+
{
|
|
193
|
+
"imports": {
|
|
194
|
+
"@bokuweb/zstd-wasm": "https://esm.sh/@bokuweb/zstd-wasm@0.0.27"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
</script>
|
|
198
|
+
```
|
|
199
|
+
|
|
142
200
|
### ID Utilities
|
|
143
201
|
|
|
144
202
|
```typescript
|
|
@@ -163,26 +221,18 @@ Well-known IDs from the Genesis Space:
|
|
|
163
221
|
import { properties, types, relationTypes, languages } from "@geoprotocol/grc-20";
|
|
164
222
|
|
|
165
223
|
// Properties
|
|
166
|
-
properties.name() // Name (TEXT)
|
|
167
|
-
properties.description() // Description (TEXT)
|
|
168
|
-
properties.
|
|
169
|
-
properties.url() // External URL (TEXT)
|
|
170
|
-
properties.created() // Creation time (TIMESTAMP)
|
|
171
|
-
properties.modified() // Last modified (TIMESTAMP)
|
|
224
|
+
properties.name() // a126ca530c8e48d5b88882c734c38935 - Name (TEXT)
|
|
225
|
+
properties.description() // 9b1f76ff9711404c861e59dc3fa7d037 - Description (TEXT)
|
|
226
|
+
properties.cover() // 34f535072e6b42c5a84443981a77cfa2 - Cover image URL (TEXT)
|
|
172
227
|
|
|
173
228
|
// Types
|
|
174
|
-
types.
|
|
175
|
-
types.organization()
|
|
176
|
-
types.place()
|
|
177
|
-
types.topic()
|
|
229
|
+
types.image() // f3f790c4c74e4d23a0a91e8ef84e30d9 - Image entity
|
|
178
230
|
|
|
179
231
|
// Relation Types
|
|
180
|
-
relationTypes.types()
|
|
181
|
-
relationTypes.partOf() // Composition
|
|
182
|
-
relationTypes.relatedTo() // Generic association
|
|
232
|
+
relationTypes.types() // 8f151ba4de204e3c9cb499ddf96f48f1 - Type membership
|
|
183
233
|
|
|
184
|
-
// Languages
|
|
185
|
-
languages.english()
|
|
234
|
+
// Languages (derived from BCP 47 codes)
|
|
235
|
+
languages.english() // or languages.fromCode("en")
|
|
186
236
|
languages.spanish()
|
|
187
237
|
languages.french()
|
|
188
238
|
// ... etc
|
|
@@ -222,6 +272,9 @@ npm run test:all
|
|
|
222
272
|
# Analyze bundle sizes
|
|
223
273
|
npm run bundle:analyze
|
|
224
274
|
|
|
275
|
+
# Run performance benchmark
|
|
276
|
+
npm run benchmark
|
|
277
|
+
|
|
225
278
|
# Run browser demo
|
|
226
279
|
npm run demo
|
|
227
280
|
# Then open http://localhost:3000/examples/browser-demo.html
|