anchordb 0.2.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/CHANGELOG.md +61 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/cjs/conflict/strategies.d.ts +110 -0
- package/dist/cjs/conflict/strategies.d.ts.map +1 -0
- package/dist/cjs/conflict/strategies.js +298 -0
- package/dist/cjs/conflict/strategies.js.map +1 -0
- package/dist/cjs/conflict/types.d.ts +38 -0
- package/dist/cjs/conflict/types.d.ts.map +1 -0
- package/dist/cjs/conflict/types.js +3 -0
- package/dist/cjs/conflict/types.js.map +1 -0
- package/dist/cjs/core/anchor-db.d.ts +154 -0
- package/dist/cjs/core/anchor-db.d.ts.map +1 -0
- package/dist/cjs/core/anchor-db.js +273 -0
- package/dist/cjs/core/anchor-db.js.map +1 -0
- package/dist/cjs/core/errors.d.ts +125 -0
- package/dist/cjs/core/errors.d.ts.map +1 -0
- package/dist/cjs/core/errors.js +174 -0
- package/dist/cjs/core/errors.js.map +1 -0
- package/dist/cjs/core/hex.d.ts +4 -0
- package/dist/cjs/core/hex.d.ts.map +1 -0
- package/dist/cjs/core/hex.js +41 -0
- package/dist/cjs/core/hex.js.map +1 -0
- package/dist/cjs/core/hlc.d.ts +96 -0
- package/dist/cjs/core/hlc.d.ts.map +1 -0
- package/dist/cjs/core/hlc.js +161 -0
- package/dist/cjs/core/hlc.js.map +1 -0
- package/dist/cjs/core/object-id.d.ts +38 -0
- package/dist/cjs/core/object-id.d.ts.map +1 -0
- package/dist/cjs/core/object-id.js +167 -0
- package/dist/cjs/core/object-id.js.map +1 -0
- package/dist/cjs/core/random.d.ts +6 -0
- package/dist/cjs/core/random.d.ts.map +1 -0
- package/dist/cjs/core/random.js +39 -0
- package/dist/cjs/core/random.js.map +1 -0
- package/dist/cjs/core/runtime.d.ts +96 -0
- package/dist/cjs/core/runtime.d.ts.map +1 -0
- package/dist/cjs/core/runtime.js +3 -0
- package/dist/cjs/core/runtime.js.map +1 -0
- package/dist/cjs/core/uuid.d.ts +16 -0
- package/dist/cjs/core/uuid.d.ts.map +1 -0
- package/dist/cjs/core/uuid.js +37 -0
- package/dist/cjs/core/uuid.js.map +1 -0
- package/dist/cjs/decorators/index.d.ts +48 -0
- package/dist/cjs/decorators/index.d.ts.map +1 -0
- package/dist/cjs/decorators/index.js +295 -0
- package/dist/cjs/decorators/index.js.map +1 -0
- package/dist/cjs/events/emitter.d.ts +16 -0
- package/dist/cjs/events/emitter.d.ts.map +1 -0
- package/dist/cjs/events/emitter.js +56 -0
- package/dist/cjs/events/emitter.js.map +1 -0
- package/dist/cjs/index/keys.d.ts +79 -0
- package/dist/cjs/index/keys.d.ts.map +1 -0
- package/dist/cjs/index/keys.js +208 -0
- package/dist/cjs/index/keys.js.map +1 -0
- package/dist/cjs/index.d.ts +81 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +193 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/inspector/agent.d.ts +75 -0
- package/dist/cjs/inspector/agent.d.ts.map +1 -0
- package/dist/cjs/inspector/agent.js +520 -0
- package/dist/cjs/inspector/agent.js.map +1 -0
- package/dist/cjs/inspector/auth.d.ts +49 -0
- package/dist/cjs/inspector/auth.d.ts.map +1 -0
- package/dist/cjs/inspector/auth.js +234 -0
- package/dist/cjs/inspector/auth.js.map +1 -0
- package/dist/cjs/inspector/bridge.d.ts +141 -0
- package/dist/cjs/inspector/bridge.d.ts.map +1 -0
- package/dist/cjs/inspector/bridge.js +190 -0
- package/dist/cjs/inspector/bridge.js.map +1 -0
- package/dist/cjs/inspector/client.d.ts +111 -0
- package/dist/cjs/inspector/client.d.ts.map +1 -0
- package/dist/cjs/inspector/client.js +218 -0
- package/dist/cjs/inspector/client.js.map +1 -0
- package/dist/cjs/inspector/protocol.d.ts +160 -0
- package/dist/cjs/inspector/protocol.d.ts.map +1 -0
- package/dist/cjs/inspector/protocol.js +53 -0
- package/dist/cjs/inspector/protocol.js.map +1 -0
- package/dist/cjs/inspector/transports/in-process.d.ts +7 -0
- package/dist/cjs/inspector/transports/in-process.d.ts.map +1 -0
- package/dist/cjs/inspector/transports/in-process.js +58 -0
- package/dist/cjs/inspector/transports/in-process.js.map +1 -0
- package/dist/cjs/inspector/transports/websocket.d.ts +39 -0
- package/dist/cjs/inspector/transports/websocket.d.ts.map +1 -0
- package/dist/cjs/inspector/transports/websocket.js +60 -0
- package/dist/cjs/inspector/transports/websocket.js.map +1 -0
- package/dist/cjs/interop/csv.d.ts +53 -0
- package/dist/cjs/interop/csv.d.ts.map +1 -0
- package/dist/cjs/interop/csv.js +230 -0
- package/dist/cjs/interop/csv.js.map +1 -0
- package/dist/cjs/interop/ejson.d.ts +41 -0
- package/dist/cjs/interop/ejson.d.ts.map +1 -0
- package/dist/cjs/interop/ejson.js +182 -0
- package/dist/cjs/interop/ejson.js.map +1 -0
- package/dist/cjs/interop/export-import.d.ts +98 -0
- package/dist/cjs/interop/export-import.d.ts.map +1 -0
- package/dist/cjs/interop/export-import.js +222 -0
- package/dist/cjs/interop/export-import.js.map +1 -0
- package/dist/cjs/model/document.d.ts +66 -0
- package/dist/cjs/model/document.d.ts.map +1 -0
- package/dist/cjs/model/document.js +302 -0
- package/dist/cjs/model/document.js.map +1 -0
- package/dist/cjs/model/model.d.ts +178 -0
- package/dist/cjs/model/model.d.ts.map +1 -0
- package/dist/cjs/model/model.js +823 -0
- package/dist/cjs/model/model.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/query/aggregation/expressions.d.ts +34 -0
- package/dist/cjs/query/aggregation/expressions.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/expressions.js +552 -0
- package/dist/cjs/query/aggregation/expressions.js.map +1 -0
- package/dist/cjs/query/aggregation/pipeline.d.ts +79 -0
- package/dist/cjs/query/aggregation/pipeline.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/pipeline.js +597 -0
- package/dist/cjs/query/aggregation/pipeline.js.map +1 -0
- package/dist/cjs/query/aggregation/source.d.ts +35 -0
- package/dist/cjs/query/aggregation/source.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/source.js +81 -0
- package/dist/cjs/query/aggregation/source.js.map +1 -0
- package/dist/cjs/query/builder/query.d.ts +113 -0
- package/dist/cjs/query/builder/query.d.ts.map +1 -0
- package/dist/cjs/query/builder/query.js +215 -0
- package/dist/cjs/query/builder/query.js.map +1 -0
- package/dist/cjs/query/filter.d.ts +50 -0
- package/dist/cjs/query/filter.d.ts.map +1 -0
- package/dist/cjs/query/filter.js +275 -0
- package/dist/cjs/query/filter.js.map +1 -0
- package/dist/cjs/query/path.d.ts +41 -0
- package/dist/cjs/query/path.d.ts.map +1 -0
- package/dist/cjs/query/path.js +294 -0
- package/dist/cjs/query/path.js.map +1 -0
- package/dist/cjs/query/update.d.ts +30 -0
- package/dist/cjs/query/update.d.ts.map +1 -0
- package/dist/cjs/query/update.js +205 -0
- package/dist/cjs/query/update.js.map +1 -0
- package/dist/cjs/reactive/live-query.d.ts +41 -0
- package/dist/cjs/reactive/live-query.d.ts.map +1 -0
- package/dist/cjs/reactive/live-query.js +88 -0
- package/dist/cjs/reactive/live-query.js.map +1 -0
- package/dist/cjs/schema/cast.d.ts +38 -0
- package/dist/cjs/schema/cast.d.ts.map +1 -0
- package/dist/cjs/schema/cast.js +280 -0
- package/dist/cjs/schema/cast.js.map +1 -0
- package/dist/cjs/schema/index.d.ts +5 -0
- package/dist/cjs/schema/index.d.ts.map +1 -0
- package/dist/cjs/schema/index.js +27 -0
- package/dist/cjs/schema/index.js.map +1 -0
- package/dist/cjs/schema/schema.d.ts +58 -0
- package/dist/cjs/schema/schema.d.ts.map +1 -0
- package/dist/cjs/schema/schema.js +363 -0
- package/dist/cjs/schema/schema.js.map +1 -0
- package/dist/cjs/schema/types.d.ts +144 -0
- package/dist/cjs/schema/types.d.ts.map +1 -0
- package/dist/cjs/schema/types.js +20 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/schema/validate.d.ts +15 -0
- package/dist/cjs/schema/validate.d.ts.map +1 -0
- package/dist/cjs/schema/validate.js +101 -0
- package/dist/cjs/schema/validate.js.map +1 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts +67 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.js +69 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/expo-sqlite.d.ts +55 -0
- package/dist/cjs/storage/adapters/expo-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/expo-sqlite.js +53 -0
- package/dist/cjs/storage/adapters/expo-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/indexeddb.d.ts +55 -0
- package/dist/cjs/storage/adapters/indexeddb.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/indexeddb.js +393 -0
- package/dist/cjs/storage/adapters/indexeddb.js.map +1 -0
- package/dist/cjs/storage/adapters/memory.d.ts +44 -0
- package/dist/cjs/storage/adapters/memory.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/memory.js +286 -0
- package/dist/cjs/storage/adapters/memory.js.map +1 -0
- package/dist/cjs/storage/adapters/node-sqlite.d.ts +59 -0
- package/dist/cjs/storage/adapters/node-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/node-sqlite.js +457 -0
- package/dist/cjs/storage/adapters/node-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/sql-base.d.ts +84 -0
- package/dist/cjs/storage/adapters/sql-base.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/sql-base.js +393 -0
- package/dist/cjs/storage/adapters/sql-base.js.map +1 -0
- package/dist/cjs/storage/types.d.ts +131 -0
- package/dist/cjs/storage/types.d.ts.map +1 -0
- package/dist/cjs/storage/types.js +3 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/sync/adapters/rest.d.ts +31 -0
- package/dist/cjs/sync/adapters/rest.d.ts.map +1 -0
- package/dist/cjs/sync/adapters/rest.js +75 -0
- package/dist/cjs/sync/adapters/rest.js.map +1 -0
- package/dist/cjs/sync/attach.d.ts +30 -0
- package/dist/cjs/sync/attach.d.ts.map +1 -0
- package/dist/cjs/sync/attach.js +104 -0
- package/dist/cjs/sync/attach.js.map +1 -0
- package/dist/cjs/sync/engine.d.ts +96 -0
- package/dist/cjs/sync/engine.d.ts.map +1 -0
- package/dist/cjs/sync/engine.js +491 -0
- package/dist/cjs/sync/engine.js.map +1 -0
- package/dist/cjs/sync/protocol.d.ts +128 -0
- package/dist/cjs/sync/protocol.d.ts.map +1 -0
- package/dist/cjs/sync/protocol.js +38 -0
- package/dist/cjs/sync/protocol.js.map +1 -0
- package/dist/cjs/sync/queue.d.ts +77 -0
- package/dist/cjs/sync/queue.d.ts.map +1 -0
- package/dist/cjs/sync/queue.js +245 -0
- package/dist/cjs/sync/queue.js.map +1 -0
- package/dist/cjs/sync/server/memory-server.d.ts +65 -0
- package/dist/cjs/sync/server/memory-server.d.ts.map +1 -0
- package/dist/cjs/sync/server/memory-server.js +193 -0
- package/dist/cjs/sync/server/memory-server.js.map +1 -0
- package/dist/cjs/timestamps/index.d.ts +47 -0
- package/dist/cjs/timestamps/index.d.ts.map +1 -0
- package/dist/cjs/timestamps/index.js +88 -0
- package/dist/cjs/timestamps/index.js.map +1 -0
- package/dist/cjs/timestamps/timezone.d.ts +65 -0
- package/dist/cjs/timestamps/timezone.d.ts.map +1 -0
- package/dist/cjs/timestamps/timezone.js +208 -0
- package/dist/cjs/timestamps/timezone.js.map +1 -0
- package/dist/esm/conflict/strategies.d.ts +110 -0
- package/dist/esm/conflict/strategies.d.ts.map +1 -0
- package/dist/esm/conflict/strategies.js +289 -0
- package/dist/esm/conflict/strategies.js.map +1 -0
- package/dist/esm/conflict/types.d.ts +38 -0
- package/dist/esm/conflict/types.d.ts.map +1 -0
- package/dist/esm/conflict/types.js +2 -0
- package/dist/esm/conflict/types.js.map +1 -0
- package/dist/esm/core/anchor-db.d.ts +154 -0
- package/dist/esm/core/anchor-db.d.ts.map +1 -0
- package/dist/esm/core/anchor-db.js +269 -0
- package/dist/esm/core/anchor-db.js.map +1 -0
- package/dist/esm/core/errors.d.ts +125 -0
- package/dist/esm/core/errors.d.ts.map +1 -0
- package/dist/esm/core/errors.js +161 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/hex.d.ts +4 -0
- package/dist/esm/core/hex.d.ts.map +1 -0
- package/dist/esm/core/hex.js +37 -0
- package/dist/esm/core/hex.js.map +1 -0
- package/dist/esm/core/hlc.d.ts +96 -0
- package/dist/esm/core/hlc.d.ts.map +1 -0
- package/dist/esm/core/hlc.js +153 -0
- package/dist/esm/core/hlc.js.map +1 -0
- package/dist/esm/core/object-id.d.ts +38 -0
- package/dist/esm/core/object-id.d.ts.map +1 -0
- package/dist/esm/core/object-id.js +163 -0
- package/dist/esm/core/object-id.js.map +1 -0
- package/dist/esm/core/random.d.ts +6 -0
- package/dist/esm/core/random.d.ts.map +1 -0
- package/dist/esm/core/random.js +34 -0
- package/dist/esm/core/random.js.map +1 -0
- package/dist/esm/core/runtime.d.ts +96 -0
- package/dist/esm/core/runtime.d.ts.map +1 -0
- package/dist/esm/core/runtime.js +2 -0
- package/dist/esm/core/runtime.js.map +1 -0
- package/dist/esm/core/uuid.d.ts +16 -0
- package/dist/esm/core/uuid.d.ts.map +1 -0
- package/dist/esm/core/uuid.js +33 -0
- package/dist/esm/core/uuid.js.map +1 -0
- package/dist/esm/decorators/index.d.ts +48 -0
- package/dist/esm/decorators/index.d.ts.map +1 -0
- package/dist/esm/decorators/index.js +286 -0
- package/dist/esm/decorators/index.js.map +1 -0
- package/dist/esm/events/emitter.d.ts +16 -0
- package/dist/esm/events/emitter.d.ts.map +1 -0
- package/dist/esm/events/emitter.js +52 -0
- package/dist/esm/events/emitter.js.map +1 -0
- package/dist/esm/index/keys.d.ts +79 -0
- package/dist/esm/index/keys.d.ts.map +1 -0
- package/dist/esm/index/keys.js +198 -0
- package/dist/esm/index/keys.js.map +1 -0
- package/dist/esm/index.d.ts +81 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +59 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/inspector/agent.d.ts +75 -0
- package/dist/esm/inspector/agent.d.ts.map +1 -0
- package/dist/esm/inspector/agent.js +482 -0
- package/dist/esm/inspector/agent.js.map +1 -0
- package/dist/esm/inspector/auth.d.ts +49 -0
- package/dist/esm/inspector/auth.d.ts.map +1 -0
- package/dist/esm/inspector/auth.js +228 -0
- package/dist/esm/inspector/auth.js.map +1 -0
- package/dist/esm/inspector/bridge.d.ts +141 -0
- package/dist/esm/inspector/bridge.d.ts.map +1 -0
- package/dist/esm/inspector/bridge.js +182 -0
- package/dist/esm/inspector/bridge.js.map +1 -0
- package/dist/esm/inspector/client.d.ts +111 -0
- package/dist/esm/inspector/client.d.ts.map +1 -0
- package/dist/esm/inspector/client.js +213 -0
- package/dist/esm/inspector/client.js.map +1 -0
- package/dist/esm/inspector/protocol.d.ts +160 -0
- package/dist/esm/inspector/protocol.d.ts.map +1 -0
- package/dist/esm/inspector/protocol.js +43 -0
- package/dist/esm/inspector/protocol.js.map +1 -0
- package/dist/esm/inspector/transports/in-process.d.ts +7 -0
- package/dist/esm/inspector/transports/in-process.d.ts.map +1 -0
- package/dist/esm/inspector/transports/in-process.js +55 -0
- package/dist/esm/inspector/transports/in-process.js.map +1 -0
- package/dist/esm/inspector/transports/websocket.d.ts +39 -0
- package/dist/esm/inspector/transports/websocket.d.ts.map +1 -0
- package/dist/esm/inspector/transports/websocket.js +56 -0
- package/dist/esm/inspector/transports/websocket.js.map +1 -0
- package/dist/esm/interop/csv.d.ts +53 -0
- package/dist/esm/interop/csv.d.ts.map +1 -0
- package/dist/esm/interop/csv.js +222 -0
- package/dist/esm/interop/csv.js.map +1 -0
- package/dist/esm/interop/ejson.d.ts +41 -0
- package/dist/esm/interop/ejson.d.ts.map +1 -0
- package/dist/esm/interop/ejson.js +176 -0
- package/dist/esm/interop/ejson.js.map +1 -0
- package/dist/esm/interop/export-import.d.ts +98 -0
- package/dist/esm/interop/export-import.d.ts.map +1 -0
- package/dist/esm/interop/export-import.js +210 -0
- package/dist/esm/interop/export-import.js.map +1 -0
- package/dist/esm/model/document.d.ts +66 -0
- package/dist/esm/model/document.d.ts.map +1 -0
- package/dist/esm/model/document.js +297 -0
- package/dist/esm/model/document.js.map +1 -0
- package/dist/esm/model/model.d.ts +178 -0
- package/dist/esm/model/model.d.ts.map +1 -0
- package/dist/esm/model/model.js +815 -0
- package/dist/esm/model/model.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/query/aggregation/expressions.d.ts +34 -0
- package/dist/esm/query/aggregation/expressions.d.ts.map +1 -0
- package/dist/esm/query/aggregation/expressions.js +545 -0
- package/dist/esm/query/aggregation/expressions.js.map +1 -0
- package/dist/esm/query/aggregation/pipeline.d.ts +79 -0
- package/dist/esm/query/aggregation/pipeline.d.ts.map +1 -0
- package/dist/esm/query/aggregation/pipeline.js +591 -0
- package/dist/esm/query/aggregation/pipeline.js.map +1 -0
- package/dist/esm/query/aggregation/source.d.ts +35 -0
- package/dist/esm/query/aggregation/source.d.ts.map +1 -0
- package/dist/esm/query/aggregation/source.js +77 -0
- package/dist/esm/query/aggregation/source.js.map +1 -0
- package/dist/esm/query/builder/query.d.ts +113 -0
- package/dist/esm/query/builder/query.d.ts.map +1 -0
- package/dist/esm/query/builder/query.js +209 -0
- package/dist/esm/query/builder/query.js.map +1 -0
- package/dist/esm/query/filter.d.ts +50 -0
- package/dist/esm/query/filter.d.ts.map +1 -0
- package/dist/esm/query/filter.js +267 -0
- package/dist/esm/query/filter.js.map +1 -0
- package/dist/esm/query/path.d.ts +41 -0
- package/dist/esm/query/path.d.ts.map +1 -0
- package/dist/esm/query/path.js +282 -0
- package/dist/esm/query/path.js.map +1 -0
- package/dist/esm/query/update.d.ts +30 -0
- package/dist/esm/query/update.d.ts.map +1 -0
- package/dist/esm/query/update.js +198 -0
- package/dist/esm/query/update.js.map +1 -0
- package/dist/esm/reactive/live-query.d.ts +41 -0
- package/dist/esm/reactive/live-query.d.ts.map +1 -0
- package/dist/esm/reactive/live-query.js +83 -0
- package/dist/esm/reactive/live-query.js.map +1 -0
- package/dist/esm/schema/cast.d.ts +38 -0
- package/dist/esm/schema/cast.d.ts.map +1 -0
- package/dist/esm/schema/cast.js +275 -0
- package/dist/esm/schema/cast.js.map +1 -0
- package/dist/esm/schema/index.d.ts +5 -0
- package/dist/esm/schema/index.d.ts.map +1 -0
- package/dist/esm/schema/index.js +5 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/schema.d.ts +58 -0
- package/dist/esm/schema/schema.d.ts.map +1 -0
- package/dist/esm/schema/schema.js +358 -0
- package/dist/esm/schema/schema.js.map +1 -0
- package/dist/esm/schema/types.d.ts +144 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +17 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/schema/validate.d.ts +15 -0
- package/dist/esm/schema/validate.d.ts.map +1 -0
- package/dist/esm/schema/validate.js +98 -0
- package/dist/esm/schema/validate.js.map +1 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.d.ts +67 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.js +65 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/expo-sqlite.d.ts +55 -0
- package/dist/esm/storage/adapters/expo-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/expo-sqlite.js +49 -0
- package/dist/esm/storage/adapters/expo-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/indexeddb.d.ts +55 -0
- package/dist/esm/storage/adapters/indexeddb.d.ts.map +1 -0
- package/dist/esm/storage/adapters/indexeddb.js +389 -0
- package/dist/esm/storage/adapters/indexeddb.js.map +1 -0
- package/dist/esm/storage/adapters/memory.d.ts +44 -0
- package/dist/esm/storage/adapters/memory.d.ts.map +1 -0
- package/dist/esm/storage/adapters/memory.js +282 -0
- package/dist/esm/storage/adapters/memory.js.map +1 -0
- package/dist/esm/storage/adapters/node-sqlite.d.ts +59 -0
- package/dist/esm/storage/adapters/node-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/node-sqlite.js +450 -0
- package/dist/esm/storage/adapters/node-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/sql-base.d.ts +84 -0
- package/dist/esm/storage/adapters/sql-base.d.ts.map +1 -0
- package/dist/esm/storage/adapters/sql-base.js +383 -0
- package/dist/esm/storage/adapters/sql-base.js.map +1 -0
- package/dist/esm/storage/types.d.ts +131 -0
- package/dist/esm/storage/types.d.ts.map +1 -0
- package/dist/esm/storage/types.js +2 -0
- package/dist/esm/storage/types.js.map +1 -0
- package/dist/esm/sync/adapters/rest.d.ts +31 -0
- package/dist/esm/sync/adapters/rest.d.ts.map +1 -0
- package/dist/esm/sync/adapters/rest.js +71 -0
- package/dist/esm/sync/adapters/rest.js.map +1 -0
- package/dist/esm/sync/attach.d.ts +30 -0
- package/dist/esm/sync/attach.d.ts.map +1 -0
- package/dist/esm/sync/attach.js +98 -0
- package/dist/esm/sync/attach.js.map +1 -0
- package/dist/esm/sync/engine.d.ts +96 -0
- package/dist/esm/sync/engine.d.ts.map +1 -0
- package/dist/esm/sync/engine.js +487 -0
- package/dist/esm/sync/engine.js.map +1 -0
- package/dist/esm/sync/protocol.d.ts +128 -0
- package/dist/esm/sync/protocol.d.ts.map +1 -0
- package/dist/esm/sync/protocol.js +33 -0
- package/dist/esm/sync/protocol.js.map +1 -0
- package/dist/esm/sync/queue.d.ts +77 -0
- package/dist/esm/sync/queue.d.ts.map +1 -0
- package/dist/esm/sync/queue.js +241 -0
- package/dist/esm/sync/queue.js.map +1 -0
- package/dist/esm/sync/server/memory-server.d.ts +65 -0
- package/dist/esm/sync/server/memory-server.d.ts.map +1 -0
- package/dist/esm/sync/server/memory-server.js +189 -0
- package/dist/esm/sync/server/memory-server.js.map +1 -0
- package/dist/esm/timestamps/index.d.ts +47 -0
- package/dist/esm/timestamps/index.d.ts.map +1 -0
- package/dist/esm/timestamps/index.js +70 -0
- package/dist/esm/timestamps/index.js.map +1 -0
- package/dist/esm/timestamps/timezone.d.ts +65 -0
- package/dist/esm/timestamps/timezone.d.ts.map +1 -0
- package/dist/esm/timestamps/timezone.js +196 -0
- package/dist/esm/timestamps/timezone.js.map +1 -0
- package/package.json +163 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UUIDv7 — time-ordered, used for mutation ids.
|
|
3
|
+
*
|
|
4
|
+
* Time-ordering matters here: the mutation queue is replayed in creation order, and a sortable id
|
|
5
|
+
* means the queue's natural primary-key order is already the correct apply order.
|
|
6
|
+
*
|
|
7
|
+
* 48 bits big-endian milliseconds
|
|
8
|
+
* 4 bits version (7)
|
|
9
|
+
* 12 bits random
|
|
10
|
+
* 2 bits variant (0b10)
|
|
11
|
+
* 62 bits random
|
|
12
|
+
*/
|
|
13
|
+
export declare function uuidv7(): string;
|
|
14
|
+
/** Short, human-readable client identity, e.g. `cli_a3f9c2d1`. */
|
|
15
|
+
export declare function generateClientId(): string;
|
|
16
|
+
//# sourceMappingURL=uuid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../../src/core/uuid.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAgB/B;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { bytesToHex } from "./hex.js";
|
|
2
|
+
import { randomBytes } from "./random.js";
|
|
3
|
+
/**
|
|
4
|
+
* UUIDv7 — time-ordered, used for mutation ids.
|
|
5
|
+
*
|
|
6
|
+
* Time-ordering matters here: the mutation queue is replayed in creation order, and a sortable id
|
|
7
|
+
* means the queue's natural primary-key order is already the correct apply order.
|
|
8
|
+
*
|
|
9
|
+
* 48 bits big-endian milliseconds
|
|
10
|
+
* 4 bits version (7)
|
|
11
|
+
* 12 bits random
|
|
12
|
+
* 2 bits variant (0b10)
|
|
13
|
+
* 62 bits random
|
|
14
|
+
*/
|
|
15
|
+
export function uuidv7() {
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
const bytes = randomBytes(16);
|
|
18
|
+
bytes[0] = (now / 2 ** 40) & 0xff;
|
|
19
|
+
bytes[1] = (now / 2 ** 32) & 0xff;
|
|
20
|
+
bytes[2] = (now / 2 ** 24) & 0xff;
|
|
21
|
+
bytes[3] = (now / 2 ** 16) & 0xff;
|
|
22
|
+
bytes[4] = (now / 2 ** 8) & 0xff;
|
|
23
|
+
bytes[5] = now & 0xff;
|
|
24
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
|
|
25
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10
|
|
26
|
+
const hex = bytesToHex(bytes);
|
|
27
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
28
|
+
}
|
|
29
|
+
/** Short, human-readable client identity, e.g. `cli_a3f9c2d1`. */
|
|
30
|
+
export function generateClientId() {
|
|
31
|
+
return `cli_${bytesToHex(randomBytes(8))}`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=uuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../src/core/uuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,MAAM;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAE9B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;IAEtB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY;IAClD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;IAEnD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Schema } from "../schema/schema.js";
|
|
2
|
+
import { SchemaTypes, type SchemaOptions, type SchemaTypeOptions, type VirtualDefinition } from "../schema/types.js";
|
|
3
|
+
/** `@Schema({ timestamps: true })` on the class. */
|
|
4
|
+
export declare function Schema_(options?: SchemaOptions): ClassDecorator;
|
|
5
|
+
export { Schema_ as Schema };
|
|
6
|
+
export type PropArg = SchemaTypeOptions | unknown[] | (new (...args: never[]) => unknown) | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* `@Prop()`, accepting every form `@nestjs/mongoose` accepts:
|
|
9
|
+
*
|
|
10
|
+
* @Prop() infer from design:type
|
|
11
|
+
* @Prop(String) explicit type
|
|
12
|
+
* @Prop({ type: String, ... }) explicit type plus options
|
|
13
|
+
* @Prop([String]) array of type
|
|
14
|
+
* @Prop(raw({ ... })) inline nested definition
|
|
15
|
+
*/
|
|
16
|
+
export declare function Prop(arg?: PropArg): PropertyDecorator;
|
|
17
|
+
/** `@Virtual()` — a computed path, matching @nestjs/mongoose v10. */
|
|
18
|
+
export declare function Virtual(options?: VirtualDefinition["options"]): PropertyDecorator;
|
|
19
|
+
/** Class-level index declaration, mirroring `schema.index()`. */
|
|
20
|
+
export declare function Index(fields: Record<string, 1 | -1>, options?: Record<string, unknown>): ClassDecorator;
|
|
21
|
+
/** Inline nested definition, matching @nestjs/mongoose's `raw()`. */
|
|
22
|
+
export declare function raw(definition: Record<string, unknown>): SchemaTypeOptions;
|
|
23
|
+
export interface MongooseDefinition {
|
|
24
|
+
definition: Record<string, unknown>;
|
|
25
|
+
options: SchemaOptions;
|
|
26
|
+
indexes: Array<{
|
|
27
|
+
fields: Record<string, 1 | -1>;
|
|
28
|
+
options: Record<string, unknown>;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export declare class SchemaFactory {
|
|
32
|
+
/** Build an AnchorDB `Schema` from a decorated class. */
|
|
33
|
+
static createForClass<T>(target: new (...args: never[]) => T): Schema<T>;
|
|
34
|
+
/** The raw definition, shared by `createForClass` and the Mongoose emitter. */
|
|
35
|
+
static toDefinition(target: new (...args: never[]) => unknown): MongooseDefinition;
|
|
36
|
+
/**
|
|
37
|
+
* Emit the twin Mongoose schema for the backend.
|
|
38
|
+
*
|
|
39
|
+
* Called without arguments it returns the plain definition/options objects, so it works without
|
|
40
|
+
* mongoose installed. Pass the mongoose module to get a real `mongoose.Schema` back.
|
|
41
|
+
*/
|
|
42
|
+
static toMongooseSchema(target: new (...args: never[]) => unknown, mongooseModule?: {
|
|
43
|
+
Schema: new (def: unknown, opts?: unknown) => unknown;
|
|
44
|
+
}): unknown;
|
|
45
|
+
}
|
|
46
|
+
export { SchemaTypes };
|
|
47
|
+
export type { SchemaOptions, SchemaTypeOptions };
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decorators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+DrH,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,OAAO,GAAE,aAAkB,GAAG,cAAc,CASnE;AACD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAC;AAE7B,MAAM,MAAM,OAAO,GAAG,iBAAiB,GAAG,OAAO,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;AAEtG;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAarD;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAsBjF;AAED,iEAAiE;AACjE,wBAAgB,KAAK,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAC9B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,cAAc,CAahB;AAED,qEAAqE;AACrE,wBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAE1E;AAiED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACtF;AAED,qBAAa,aAAa;IACxB,yDAAyD;IACzD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IA0BxE,+EAA+E;IAC/E,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,kBAAkB;IAsBlF;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CACrB,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EACzC,cAAc,CAAC,EAAE;QAAE,MAAM,EAAE,KAAK,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;KAAE,GACzE,OAAO;CAYX;AAgCD,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { AnchorConfigError } from "../core/errors.js";
|
|
2
|
+
import { ObjectId } from "../core/object-id.js";
|
|
3
|
+
import { Schema } from "../schema/schema.js";
|
|
4
|
+
import { SchemaTypes } from "../schema/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Decorator-based schema authoring, identical in shape to `@nestjs/mongoose`.
|
|
7
|
+
*
|
|
8
|
+
* The point is a *shared class file*: the same decorated class is imported by the Ionic/Angular app
|
|
9
|
+
* and by the NestJS backend, so validation rules and index declarations exist once.
|
|
10
|
+
*
|
|
11
|
+
* Shipped from a separate entry point (`anchordb/decorators`) so the base SDK never requires
|
|
12
|
+
* `reflect-metadata` and stays usable from plain JS and React Native.
|
|
13
|
+
*/
|
|
14
|
+
const PROPS = Symbol.for("anchor:schema:props");
|
|
15
|
+
const OPTIONS = Symbol.for("anchor:schema:options");
|
|
16
|
+
const VIRTUALS = Symbol.for("anchor:schema:virtuals");
|
|
17
|
+
const INDEXES = Symbol.for("anchor:schema:indexes");
|
|
18
|
+
/** Reads design:type only when reflect-metadata is actually loaded. */
|
|
19
|
+
function reflectType(target, propertyKey) {
|
|
20
|
+
const r = Reflect;
|
|
21
|
+
if (typeof r.getMetadata !== "function")
|
|
22
|
+
return undefined;
|
|
23
|
+
try {
|
|
24
|
+
return r.getMetadata("design:type", target, propertyKey);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function ownProps(ctor) {
|
|
31
|
+
if (!Object.prototype.hasOwnProperty.call(ctor, PROPS)) {
|
|
32
|
+
// Seed from the parent so a subclass inherits its parent's paths, as Mongoose expects.
|
|
33
|
+
const inherited = ctor[PROPS];
|
|
34
|
+
Object.defineProperty(ctor, PROPS, {
|
|
35
|
+
value: new Map(inherited ? [...inherited] : []),
|
|
36
|
+
enumerable: false,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return ctor[PROPS];
|
|
42
|
+
}
|
|
43
|
+
/** `@Schema({ timestamps: true })` on the class. */
|
|
44
|
+
export function Schema_(options = {}) {
|
|
45
|
+
return (target) => {
|
|
46
|
+
Object.defineProperty(target, OPTIONS, {
|
|
47
|
+
value: options,
|
|
48
|
+
enumerable: false,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export { Schema_ as Schema };
|
|
55
|
+
/**
|
|
56
|
+
* `@Prop()`, accepting every form `@nestjs/mongoose` accepts:
|
|
57
|
+
*
|
|
58
|
+
* @Prop() infer from design:type
|
|
59
|
+
* @Prop(String) explicit type
|
|
60
|
+
* @Prop({ type: String, ... }) explicit type plus options
|
|
61
|
+
* @Prop([String]) array of type
|
|
62
|
+
* @Prop(raw({ ... })) inline nested definition
|
|
63
|
+
*/
|
|
64
|
+
export function Prop(arg) {
|
|
65
|
+
return (target, propertyKey) => {
|
|
66
|
+
if (typeof propertyKey === "symbol") {
|
|
67
|
+
throw new AnchorConfigError("@Prop() cannot be applied to a symbol-keyed property.");
|
|
68
|
+
}
|
|
69
|
+
const ctor = target.constructor;
|
|
70
|
+
const props = ownProps(ctor);
|
|
71
|
+
const record = { key: propertyKey };
|
|
72
|
+
if (arg !== undefined)
|
|
73
|
+
record.explicit = arg;
|
|
74
|
+
const reflected = reflectType(target, propertyKey);
|
|
75
|
+
if (reflected !== undefined)
|
|
76
|
+
record.reflected = reflected;
|
|
77
|
+
props.set(propertyKey, record);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** `@Virtual()` — a computed path, matching @nestjs/mongoose v10. */
|
|
81
|
+
export function Virtual(options) {
|
|
82
|
+
return (target, propertyKey) => {
|
|
83
|
+
const ctor = target.constructor;
|
|
84
|
+
if (!Object.prototype.hasOwnProperty.call(ctor, VIRTUALS)) {
|
|
85
|
+
Object.defineProperty(ctor, VIRTUALS, {
|
|
86
|
+
value: [...(ctor[VIRTUALS] ?? [])],
|
|
87
|
+
enumerable: false,
|
|
88
|
+
configurable: true,
|
|
89
|
+
writable: true,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
|
|
93
|
+
const def = { name: String(propertyKey) };
|
|
94
|
+
if (descriptor?.get)
|
|
95
|
+
def.getter = function () {
|
|
96
|
+
return descriptor.get.call(this);
|
|
97
|
+
};
|
|
98
|
+
if (descriptor?.set)
|
|
99
|
+
def.setter = function (value) {
|
|
100
|
+
descriptor.set.call(this, value);
|
|
101
|
+
};
|
|
102
|
+
if (options)
|
|
103
|
+
def.options = options;
|
|
104
|
+
ctor[VIRTUALS].push(def);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Class-level index declaration, mirroring `schema.index()`. */
|
|
108
|
+
export function Index(fields, options = {}) {
|
|
109
|
+
return (target) => {
|
|
110
|
+
const ctor = target;
|
|
111
|
+
if (!Object.prototype.hasOwnProperty.call(ctor, INDEXES)) {
|
|
112
|
+
Object.defineProperty(ctor, INDEXES, {
|
|
113
|
+
value: [...(ctor[INDEXES] ?? [])],
|
|
114
|
+
enumerable: false,
|
|
115
|
+
configurable: true,
|
|
116
|
+
writable: true,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
ctor[INDEXES].push({ fields, options });
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Inline nested definition, matching @nestjs/mongoose's `raw()`. */
|
|
123
|
+
export function raw(definition) {
|
|
124
|
+
return { __raw: definition };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Map a reflected `design:type` onto a schema type.
|
|
128
|
+
*
|
|
129
|
+
* Returns null where inference is genuinely impossible, so the caller can throw with the property
|
|
130
|
+
* name attached. The ambiguous cases are exactly the ones @nestjs/mongoose also refuses:
|
|
131
|
+
* `Array` (no element type), `Object` (interfaces, unions, optionals) and arbitrary classes.
|
|
132
|
+
*/
|
|
133
|
+
function inferFromReflected(reflected) {
|
|
134
|
+
if (reflected === String)
|
|
135
|
+
return String;
|
|
136
|
+
if (reflected === Number)
|
|
137
|
+
return Number;
|
|
138
|
+
if (reflected === Boolean)
|
|
139
|
+
return Boolean;
|
|
140
|
+
if (reflected === Date)
|
|
141
|
+
return Date;
|
|
142
|
+
if (reflected === ObjectId)
|
|
143
|
+
return SchemaTypes.ObjectId;
|
|
144
|
+
if (reflected === Uint8Array)
|
|
145
|
+
return SchemaTypes.Buffer;
|
|
146
|
+
if (reflected === Map)
|
|
147
|
+
return SchemaTypes.Map;
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
function buildDefinition(record, className) {
|
|
151
|
+
const explicit = record.explicit;
|
|
152
|
+
if (explicit !== undefined) {
|
|
153
|
+
// Arrays, constructors and raw() pass straight through; the Schema compiler understands them.
|
|
154
|
+
if (Array.isArray(explicit))
|
|
155
|
+
return explicit;
|
|
156
|
+
if (typeof explicit === "function")
|
|
157
|
+
return explicit;
|
|
158
|
+
const opts = explicit;
|
|
159
|
+
if (opts && typeof opts === "object") {
|
|
160
|
+
if ("type" in opts || "__raw" in opts)
|
|
161
|
+
return opts;
|
|
162
|
+
// Options given without a type: fall back to inference for the type only.
|
|
163
|
+
const inferred = record.reflected !== undefined ? inferFromReflected(record.reflected) : null;
|
|
164
|
+
if (inferred === null)
|
|
165
|
+
throw inferenceError(record, className);
|
|
166
|
+
return { ...opts, type: inferred };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const inferred = record.reflected !== undefined ? inferFromReflected(record.reflected) : null;
|
|
170
|
+
if (inferred === null)
|
|
171
|
+
throw inferenceError(record, className);
|
|
172
|
+
return { type: inferred };
|
|
173
|
+
}
|
|
174
|
+
function inferenceError(record, className) {
|
|
175
|
+
const reflectedName = typeof record.reflected === "function" ? record.reflected.name : String(record.reflected);
|
|
176
|
+
const reason = record.reflected === undefined
|
|
177
|
+
? "no decorator metadata is available (emitDecoratorMetadata is off, or reflect-metadata was not imported)"
|
|
178
|
+
: reflectedName === "Array"
|
|
179
|
+
? "an array's element type cannot be reflected"
|
|
180
|
+
: reflectedName === "Object"
|
|
181
|
+
? "the reflected type is Object, which happens for interfaces, type aliases, unions and optional-with-null properties"
|
|
182
|
+
: `the reflected type "${reflectedName}" has no schema equivalent`;
|
|
183
|
+
return new AnchorConfigError(`Cannot determine the schema type for ${className}.${record.key}: ${reason}. ` +
|
|
184
|
+
`Pass the type explicitly, e.g. @Prop(String), @Prop({ type: String }), @Prop([String]), ` +
|
|
185
|
+
`or @Prop({ type: SchemaTypes.ObjectId, ref: "Other" }). ` +
|
|
186
|
+
`AnchorDB will not silently fall back to Mixed, because that would discard casting and ` +
|
|
187
|
+
`validation for this field and surface as corrupt data much later.`);
|
|
188
|
+
}
|
|
189
|
+
export class SchemaFactory {
|
|
190
|
+
/** Build an AnchorDB `Schema` from a decorated class. */
|
|
191
|
+
static createForClass(target) {
|
|
192
|
+
const { definition, options, indexes } = SchemaFactory.toDefinition(target);
|
|
193
|
+
const schema = new Schema(definition, options);
|
|
194
|
+
const ctor = target;
|
|
195
|
+
for (const virtual of ctor[VIRTUALS] ?? []) {
|
|
196
|
+
const handle = schema.virtual(virtual.name, virtual.options);
|
|
197
|
+
if (virtual.getter)
|
|
198
|
+
handle.get(virtual.getter);
|
|
199
|
+
if (virtual.setter)
|
|
200
|
+
handle.set(virtual.setter);
|
|
201
|
+
}
|
|
202
|
+
for (const idx of indexes) {
|
|
203
|
+
schema.index(idx.fields, idx.options);
|
|
204
|
+
}
|
|
205
|
+
// Instance methods declared on the class become schema methods, as in @nestjs/mongoose.
|
|
206
|
+
for (const name of Object.getOwnPropertyNames(target.prototype)) {
|
|
207
|
+
if (name === "constructor")
|
|
208
|
+
continue;
|
|
209
|
+
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, name);
|
|
210
|
+
if (descriptor && typeof descriptor.value === "function") {
|
|
211
|
+
schema.methods[name] = descriptor.value;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return schema;
|
|
215
|
+
}
|
|
216
|
+
/** The raw definition, shared by `createForClass` and the Mongoose emitter. */
|
|
217
|
+
static toDefinition(target) {
|
|
218
|
+
const ctor = target;
|
|
219
|
+
const props = ctor[PROPS];
|
|
220
|
+
if (!props || props.size === 0) {
|
|
221
|
+
throw new AnchorConfigError(`Class "${target.name}" has no @Prop() properties. ` +
|
|
222
|
+
`Did you forget the decorators, or is "emitDecoratorMetadata" disabled without explicit types?`);
|
|
223
|
+
}
|
|
224
|
+
const definition = {};
|
|
225
|
+
for (const record of props.values()) {
|
|
226
|
+
definition[record.key] = buildDefinition(record, target.name);
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
definition,
|
|
230
|
+
options: ctor[OPTIONS] ?? {},
|
|
231
|
+
indexes: ctor[INDEXES] ?? [],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Emit the twin Mongoose schema for the backend.
|
|
236
|
+
*
|
|
237
|
+
* Called without arguments it returns the plain definition/options objects, so it works without
|
|
238
|
+
* mongoose installed. Pass the mongoose module to get a real `mongoose.Schema` back.
|
|
239
|
+
*/
|
|
240
|
+
static toMongooseSchema(target, mongooseModule) {
|
|
241
|
+
const { definition, options, indexes } = SchemaFactory.toDefinition(target);
|
|
242
|
+
const mongooseDefinition = toMongooseDefinition(definition);
|
|
243
|
+
if (!mongooseModule)
|
|
244
|
+
return { definition: mongooseDefinition, options, indexes };
|
|
245
|
+
const schema = new mongooseModule.Schema(mongooseDefinition, options);
|
|
246
|
+
for (const idx of indexes)
|
|
247
|
+
schema.index(idx.fields, idx.options);
|
|
248
|
+
return schema;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Translate the definition into the form mongoose expects.
|
|
253
|
+
*
|
|
254
|
+
* Only two things actually differ: AnchorDB's `ObjectId` class must become
|
|
255
|
+
* `mongoose.Schema.Types.ObjectId` (handled by callers passing the module, or by leaving the token
|
|
256
|
+
* for mongoose to resolve), and `__raw` is unwrapped back into a plain nested object.
|
|
257
|
+
*/
|
|
258
|
+
function toMongooseDefinition(definition) {
|
|
259
|
+
const out = {};
|
|
260
|
+
for (const [key, value] of Object.entries(definition)) {
|
|
261
|
+
out[key] = translate(value);
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
function translate(value) {
|
|
266
|
+
if (Array.isArray(value))
|
|
267
|
+
return value.map(translate);
|
|
268
|
+
if (value === SchemaTypes.ObjectId || value === ObjectId)
|
|
269
|
+
return "ObjectId";
|
|
270
|
+
if (value === SchemaTypes.Mixed)
|
|
271
|
+
return "Mixed";
|
|
272
|
+
if (value === SchemaTypes.Buffer)
|
|
273
|
+
return "Buffer";
|
|
274
|
+
if (value && typeof value === "object") {
|
|
275
|
+
const obj = value;
|
|
276
|
+
if (obj.__raw)
|
|
277
|
+
return toMongooseDefinition(obj.__raw);
|
|
278
|
+
const out = {};
|
|
279
|
+
for (const [k, v] of Object.entries(obj))
|
|
280
|
+
out[k] = k === "type" ? translate(v) : v;
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
return value;
|
|
284
|
+
}
|
|
285
|
+
export { SchemaTypes };
|
|
286
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Minimal typed event emitter — no Node `events` dependency, so it runs unchanged in RN and browsers. */
|
|
2
|
+
export type Listener<T> = (payload: T) => void;
|
|
3
|
+
export declare class TypedEmitter<Events extends Record<string, unknown>> {
|
|
4
|
+
private listeners;
|
|
5
|
+
on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void;
|
|
6
|
+
once<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void;
|
|
7
|
+
off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void;
|
|
8
|
+
/**
|
|
9
|
+
* A throwing listener must never break the emitter — a UI callback crashing would otherwise abort
|
|
10
|
+
* a sync pass midway and leave the queue in an odd state. Errors are reported and swallowed.
|
|
11
|
+
*/
|
|
12
|
+
emit<K extends keyof Events>(event: K, payload: Events[K]): void;
|
|
13
|
+
removeAllListeners(event?: keyof Events): void;
|
|
14
|
+
listenerCount(event: keyof Events): number;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAE/C,qBAAa,YAAY,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,OAAO,CAAC,SAAS,CAAiD;IAElE,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAU/E,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAQjF,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAI1E;;;OAGG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAahE,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI;IAK9C,aAAa,CAAC,KAAK,EAAE,MAAM,MAAM,GAAG,MAAM;CAG3C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class TypedEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.listeners = new Map();
|
|
4
|
+
}
|
|
5
|
+
on(event, listener) {
|
|
6
|
+
let set = this.listeners.get(event);
|
|
7
|
+
if (!set) {
|
|
8
|
+
set = new Set();
|
|
9
|
+
this.listeners.set(event, set);
|
|
10
|
+
}
|
|
11
|
+
set.add(listener);
|
|
12
|
+
return () => this.off(event, listener);
|
|
13
|
+
}
|
|
14
|
+
once(event, listener) {
|
|
15
|
+
const off = this.on(event, ((payload) => {
|
|
16
|
+
off();
|
|
17
|
+
listener(payload);
|
|
18
|
+
}));
|
|
19
|
+
return off;
|
|
20
|
+
}
|
|
21
|
+
off(event, listener) {
|
|
22
|
+
this.listeners.get(event)?.delete(listener);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A throwing listener must never break the emitter — a UI callback crashing would otherwise abort
|
|
26
|
+
* a sync pass midway and leave the queue in an odd state. Errors are reported and swallowed.
|
|
27
|
+
*/
|
|
28
|
+
emit(event, payload) {
|
|
29
|
+
const set = this.listeners.get(event);
|
|
30
|
+
if (!set || set.size === 0)
|
|
31
|
+
return;
|
|
32
|
+
for (const listener of [...set]) {
|
|
33
|
+
try {
|
|
34
|
+
listener(payload);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.error(`[anchor] listener for "${String(event)}" threw:`, err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
removeAllListeners(event) {
|
|
43
|
+
if (event === undefined)
|
|
44
|
+
this.listeners.clear();
|
|
45
|
+
else
|
|
46
|
+
this.listeners.delete(event);
|
|
47
|
+
}
|
|
48
|
+
listenerCount(event) {
|
|
49
|
+
return this.listeners.get(event)?.size ?? 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/events/emitter.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,YAAY;IAAzB;QACU,cAAS,GAAG,IAAI,GAAG,EAAsC,CAAC;IAiDpE,CAAC;IA/CC,EAAE,CAAyB,KAAQ,EAAE,QAA6B;QAChE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAA2B,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAyB,KAAQ,EAAE,QAA6B;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,OAAkB,EAAE,EAAE;YACjD,GAAG,EAAE,CAAC;YACN,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAwB,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAyB,KAAQ,EAAE,QAA6B;QACjE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAA2B,CAAC,CAAC;IACjE,CAAC;IAED;;;OAGG;IACH,IAAI,CAAyB,KAAQ,EAAE,OAAkB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACF,QAAgC,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAoB;QACrC,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;;YAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,aAAa,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { IndexSpec, StoredDoc } from "../storage/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Index key extraction — shared by every storage adapter so unique semantics cannot drift between
|
|
4
|
+
* SQLite, IndexedDB and memory.
|
|
5
|
+
*
|
|
6
|
+
* ## The MongoDB / SQL divergence this module exists to close
|
|
7
|
+
*
|
|
8
|
+
* SQL treats NULL as *not equal to itself*, so a `UNIQUE` index happily accepts any number of rows
|
|
9
|
+
* whose indexed column is NULL. I verified this on node:sqlite: inserting two documents that both
|
|
10
|
+
* omitted the indexed field succeeded.
|
|
11
|
+
*
|
|
12
|
+
* MongoDB does the opposite. A missing field is indexed **as null**, and null equals null, so the
|
|
13
|
+
* second such document is rejected with E11000.
|
|
14
|
+
*
|
|
15
|
+
* Left alone this diverges silently: the app accepts data on device, sync pushes it, and the real
|
|
16
|
+
* database rejects it much later with no obvious cause. So missing values are mapped to an explicit
|
|
17
|
+
* sentinel that collides with itself, reproducing Mongo's behaviour. `sparse` and partial indexes
|
|
18
|
+
* are then the documented way to opt back out — exactly as in Mongo.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Sentinel for "no value", covering BOTH a missing field and an explicit null.
|
|
22
|
+
*
|
|
23
|
+
* They share one encoding on purpose: MongoDB indexes a missing field *as null*, so `{}` and
|
|
24
|
+
* `{ email: null }` produce the same index entry and collide under a unique index. Separate
|
|
25
|
+
* sentinels would let one of each coexist on device and then be rejected by the real database on
|
|
26
|
+
* first sync — a divergence that only surfaces long after the data was written.
|
|
27
|
+
*
|
|
28
|
+
* `sparse` still distinguishes them: it skips documents *missing* the field while still indexing
|
|
29
|
+
* an explicit null. That check lives in extractIndexKeys, not here.
|
|
30
|
+
*/
|
|
31
|
+
export declare const NULL_SENTINEL = " __anchor_null__";
|
|
32
|
+
/**
|
|
33
|
+
* Separator between components of a compound index key.
|
|
34
|
+
*
|
|
35
|
+
* Named rather than written inline as a raw control character: an invisible literal is impossible
|
|
36
|
+
* to review and trivially diverges between the writer and the reader of a key. Without a separator
|
|
37
|
+
* at all, ["ab","c"] and ["a","bc"] would encode identically and collide under a unique index.
|
|
38
|
+
*/
|
|
39
|
+
export declare const KEY_SEPARATOR: string;
|
|
40
|
+
/** One extracted key: the encoded string plus the raw values, for error reporting. */
|
|
41
|
+
export interface IndexKey {
|
|
42
|
+
encoded: string;
|
|
43
|
+
values: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Encode a single value into a component of an index key.
|
|
47
|
+
*
|
|
48
|
+
* Type is included in the encoding so that `1` (number) and `"1"` (string) do not collide — Mongo
|
|
49
|
+
* treats them as different index entries because they are different BSON types.
|
|
50
|
+
*/
|
|
51
|
+
export declare function encodeComponent(value: unknown): string;
|
|
52
|
+
/** Does the document qualify for a partial index? */
|
|
53
|
+
export declare function matchesPartialFilter(doc: StoredDoc, filter: Record<string, unknown> | undefined): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Extract every index key a document contributes.
|
|
56
|
+
*
|
|
57
|
+
* Returns more than one key only for multikey indexes, where an array field contributes one entry
|
|
58
|
+
* per element — which is what makes a unique multikey index mean "no two documents share any
|
|
59
|
+
* element".
|
|
60
|
+
*
|
|
61
|
+
* Returns an empty array when the document should not be indexed at all (sparse with the field
|
|
62
|
+
* absent, or a partial filter that does not match), which is precisely how those options let
|
|
63
|
+
* multiple documents escape a unique constraint.
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractIndexKeys(doc: StoredDoc, spec: IndexSpec): IndexKey[];
|
|
66
|
+
/** True when any indexed path currently holds an array, so the adapter can pick its strategy. */
|
|
67
|
+
export declare function isMultikeyFor(doc: StoredDoc, spec: IndexSpec): boolean;
|
|
68
|
+
export declare function indexKeyPattern(spec: IndexSpec): Record<string, 1 | -1>;
|
|
69
|
+
/** Mongo's default index name: field_direction joined by underscores, e.g. `email_1`. */
|
|
70
|
+
export declare function defaultIndexName(key: Array<[string, 1 | -1]>): string;
|
|
71
|
+
/**
|
|
72
|
+
* Encode a lookup key for an index whose every field has an equality constraint.
|
|
73
|
+
*
|
|
74
|
+
* Returns null when the constraints do not cover the full key. A partial key cannot be turned into
|
|
75
|
+
* an exact lookup against the entries table, and guessing with a prefix match could silently drop
|
|
76
|
+
* rows — so we decline and let the caller fall back to a scan.
|
|
77
|
+
*/
|
|
78
|
+
export declare function encodeLookupKey(spec: IndexSpec, equalities: Map<string, unknown>): string | null;
|
|
79
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/index/keys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhE;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,QAAyB,CAAC;AAEpD,sFAAsF;AACtF,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUtD;AAMD,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAwCzG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,EAAE,CAqC5E;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAEtE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAIvE;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAOhG"}
|