@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.
Files changed (63) hide show
  1. package/dist/builder/edit.d.ts +5 -8
  2. package/dist/builder/edit.d.ts.map +1 -1
  3. package/dist/builder/edit.js +8 -19
  4. package/dist/builder/edit.js.map +1 -1
  5. package/dist/builder/entity.d.ts +4 -4
  6. package/dist/builder/entity.d.ts.map +1 -1
  7. package/dist/builder/entity.js +6 -6
  8. package/dist/builder/entity.js.map +1 -1
  9. package/dist/builder/index.d.ts +1 -0
  10. package/dist/builder/index.d.ts.map +1 -1
  11. package/dist/builder/index.js +1 -0
  12. package/dist/builder/index.js.map +1 -1
  13. package/dist/builder/relation.d.ts +4 -8
  14. package/dist/builder/relation.d.ts.map +1 -1
  15. package/dist/builder/relation.js +7 -14
  16. package/dist/builder/relation.js.map +1 -1
  17. package/dist/builder/update-relation.d.ts +64 -0
  18. package/dist/builder/update-relation.d.ts.map +1 -0
  19. package/dist/builder/update-relation.js +107 -0
  20. package/dist/builder/update-relation.js.map +1 -0
  21. package/dist/builder/update.d.ts +4 -4
  22. package/dist/builder/update.d.ts.map +1 -1
  23. package/dist/builder/update.js +6 -6
  24. package/dist/builder/update.js.map +1 -1
  25. package/dist/codec/compression.d.ts +132 -0
  26. package/dist/codec/compression.d.ts.map +1 -0
  27. package/dist/codec/compression.js +244 -0
  28. package/dist/codec/compression.js.map +1 -0
  29. package/dist/codec/index.d.ts +1 -0
  30. package/dist/codec/index.d.ts.map +1 -1
  31. package/dist/codec/index.js +9 -0
  32. package/dist/codec/index.js.map +1 -1
  33. package/dist/codec/op.d.ts.map +1 -1
  34. package/dist/codec/op.js +100 -37
  35. package/dist/codec/op.js.map +1 -1
  36. package/dist/codec/value.d.ts.map +1 -1
  37. package/dist/codec/value.js +35 -16
  38. package/dist/codec/value.js.map +1 -1
  39. package/dist/genesis/index.d.ts +14 -90
  40. package/dist/genesis/index.d.ts.map +1 -1
  41. package/dist/genesis/index.js +22 -149
  42. package/dist/genesis/index.js.map +1 -1
  43. package/dist/genesis/language.d.ts +33 -0
  44. package/dist/genesis/language.d.ts.map +1 -0
  45. package/dist/genesis/language.js +35 -0
  46. package/dist/genesis/language.js.map +1 -0
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/test/basic.test.js +175 -26
  52. package/dist/test/basic.test.js.map +1 -1
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/op.d.ts +17 -12
  56. package/dist/types/op.d.ts.map +1 -1
  57. package/dist/types/op.js.map +1 -1
  58. package/dist/types/value.d.ts +7 -6
  59. package/dist/types/value.d.ts.map +1 -1
  60. package/dist/types/value.js +11 -8
  61. package/dist/types/value.js.map +1 -1
  62. package/package.json +5 -1
  63. 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 (no WASM)
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 | ~8.7 KB |
54
+ | Full library | ~12 KB |
54
55
  | Types only | ~1.4 KB |
55
56
  | Builder only | ~1.2 KB |
56
- | Codec only | ~4.8 KB |
57
- | Genesis IDs | ~1.9 KB |
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.6 KB gzipped)
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 (~4.8 KB gzipped)
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.avatar() // Avatar URL (TEXT)
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.person()
175
- types.organization()
176
- types.place()
177
- types.topic()
229
+ types.image() // f3f790c4c74e4d23a0a91e8ef84e30d9 - Image entity
178
230
 
179
231
  // Relation Types
180
- relationTypes.types() // Type membership
181
- relationTypes.partOf() // Composition
182
- relationTypes.relatedTo() // Generic association
232
+ relationTypes.types() // 8f151ba4de204e3c9cb499ddf96f48f1 - Type membership
183
233
 
184
- // Languages
185
- languages.english() // or languages.fromCode("en")
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