@gettersethya/mira 0.1.0-alpha.10
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/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/src/app/app.d.ts +100 -0
- package/dist/src/app/app.d.ts.map +1 -0
- package/dist/src/app/app.js +176 -0
- package/dist/src/app/app.js.map +1 -0
- package/dist/src/app/builder.d.ts +106 -0
- package/dist/src/app/builder.d.ts.map +1 -0
- package/dist/src/app/builder.js +122 -0
- package/dist/src/app/builder.js.map +1 -0
- package/dist/src/app/index.d.ts +33 -0
- package/dist/src/app/index.d.ts.map +1 -0
- package/dist/src/app/index.js +30 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/plugin.d.ts +60 -0
- package/dist/src/app/plugin.d.ts.map +1 -0
- package/dist/src/app/plugin.js +20 -0
- package/dist/src/app/plugin.js.map +1 -0
- package/dist/src/app/types.d.ts +55 -0
- package/dist/src/app/types.d.ts.map +1 -0
- package/dist/src/app/types.js +2 -0
- package/dist/src/app/types.js.map +1 -0
- package/dist/src/cache/cached-collection.d.ts +30 -0
- package/dist/src/cache/cached-collection.d.ts.map +1 -0
- package/dist/src/cache/cached-collection.js +107 -0
- package/dist/src/cache/cached-collection.js.map +1 -0
- package/dist/src/cache/collection-cache.d.ts +17 -0
- package/dist/src/cache/collection-cache.d.ts.map +1 -0
- package/dist/src/cache/collection-cache.js +37 -0
- package/dist/src/cache/collection-cache.js.map +1 -0
- package/dist/src/cache/index.d.ts +4 -0
- package/dist/src/cache/index.d.ts.map +1 -0
- package/dist/src/cache/index.js +3 -0
- package/dist/src/cache/index.js.map +1 -0
- package/dist/src/cache/types.d.ts +12 -0
- package/dist/src/cache/types.d.ts.map +1 -0
- package/dist/src/cache/types.js +2 -0
- package/dist/src/cache/types.js.map +1 -0
- package/dist/src/collection-service/collection-service.d.ts +62 -0
- package/dist/src/collection-service/collection-service.d.ts.map +1 -0
- package/dist/src/collection-service/collection-service.js +289 -0
- package/dist/src/collection-service/collection-service.js.map +1 -0
- package/dist/src/collection-service/context.d.ts +19 -0
- package/dist/src/collection-service/context.d.ts.map +1 -0
- package/dist/src/collection-service/context.js +2 -0
- package/dist/src/collection-service/context.js.map +1 -0
- package/dist/src/collection-service/decode.d.ts +6 -0
- package/dist/src/collection-service/decode.d.ts.map +1 -0
- package/dist/src/collection-service/decode.js +26 -0
- package/dist/src/collection-service/decode.js.map +1 -0
- package/dist/src/collection-service/errors.d.ts +67 -0
- package/dist/src/collection-service/errors.d.ts.map +1 -0
- package/dist/src/collection-service/errors.js +43 -0
- package/dist/src/collection-service/errors.js.map +1 -0
- package/dist/src/collection-service/index.d.ts +5 -0
- package/dist/src/collection-service/index.d.ts.map +1 -0
- package/dist/src/collection-service/index.js +3 -0
- package/dist/src/collection-service/index.js.map +1 -0
- package/dist/src/collection-service/input-schema.d.ts +10 -0
- package/dist/src/collection-service/input-schema.d.ts.map +1 -0
- package/dist/src/collection-service/input-schema.js +123 -0
- package/dist/src/collection-service/input-schema.js.map +1 -0
- package/dist/src/collection-service/where.d.ts +35 -0
- package/dist/src/collection-service/where.d.ts.map +1 -0
- package/dist/src/collection-service/where.js +91 -0
- package/dist/src/collection-service/where.js.map +1 -0
- package/dist/src/config/config.d.ts +44 -0
- package/dist/src/config/config.d.ts.map +1 -0
- package/dist/src/config/config.js +89 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +2 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/types.d.ts +29 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +2 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/crypto/crypto.d.ts +11 -0
- package/dist/src/crypto/crypto.d.ts.map +1 -0
- package/dist/src/crypto/crypto.js +4 -0
- package/dist/src/crypto/crypto.js.map +1 -0
- package/dist/src/crypto/index.d.ts +3 -0
- package/dist/src/crypto/index.d.ts.map +1 -0
- package/dist/src/crypto/index.js +3 -0
- package/dist/src/crypto/index.js.map +1 -0
- package/dist/src/crypto/node.d.ts +4 -0
- package/dist/src/crypto/node.d.ts.map +1 -0
- package/dist/src/crypto/node.js +9 -0
- package/dist/src/crypto/node.js.map +1 -0
- package/dist/src/databases/index.d.ts +2 -0
- package/dist/src/databases/index.d.ts.map +1 -0
- package/dist/src/databases/index.js +2 -0
- package/dist/src/databases/index.js.map +1 -0
- package/dist/src/databases/sqlite.d.ts +24 -0
- package/dist/src/databases/sqlite.d.ts.map +1 -0
- package/dist/src/databases/sqlite.js +27 -0
- package/dist/src/databases/sqlite.js.map +1 -0
- package/dist/src/hooks/hook-collection.d.ts +5 -0
- package/dist/src/hooks/hook-collection.d.ts.map +1 -0
- package/dist/src/hooks/hook-collection.js +77 -0
- package/dist/src/hooks/hook-collection.js.map +1 -0
- package/dist/src/hooks/hook-service.d.ts +33 -0
- package/dist/src/hooks/hook-service.d.ts.map +1 -0
- package/dist/src/hooks/hook-service.js +118 -0
- package/dist/src/hooks/hook-service.js.map +1 -0
- package/dist/src/hooks/index.d.ts +4 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +3 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/types.d.ts +52 -0
- package/dist/src/hooks/types.d.ts.map +1 -0
- package/dist/src/hooks/types.js +2 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/http/auth-node.d.ts +4 -0
- package/dist/src/http/auth-node.d.ts.map +1 -0
- package/dist/src/http/auth-node.js +34 -0
- package/dist/src/http/auth-node.js.map +1 -0
- package/dist/src/http/auth.d.ts +40 -0
- package/dist/src/http/auth.d.ts.map +1 -0
- package/dist/src/http/auth.js +76 -0
- package/dist/src/http/auth.js.map +1 -0
- package/dist/src/http/errors.d.ts +31 -0
- package/dist/src/http/errors.d.ts.map +1 -0
- package/dist/src/http/errors.js +36 -0
- package/dist/src/http/errors.js.map +1 -0
- package/dist/src/http/file-serve.d.ts +10 -0
- package/dist/src/http/file-serve.d.ts.map +1 -0
- package/dist/src/http/file-serve.js +159 -0
- package/dist/src/http/file-serve.js.map +1 -0
- package/dist/src/http/file-token.d.ts +7 -0
- package/dist/src/http/file-token.d.ts.map +1 -0
- package/dist/src/http/file-token.js +57 -0
- package/dist/src/http/file-token.js.map +1 -0
- package/dist/src/http/files.d.ts +11 -0
- package/dist/src/http/files.d.ts.map +1 -0
- package/dist/src/http/files.js +85 -0
- package/dist/src/http/files.js.map +1 -0
- package/dist/src/http/index.d.ts +11 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/index.js +9 -0
- package/dist/src/http/index.js.map +1 -0
- package/dist/src/http/ip-middleware.d.ts +4 -0
- package/dist/src/http/ip-middleware.d.ts.map +1 -0
- package/dist/src/http/ip-middleware.js +24 -0
- package/dist/src/http/ip-middleware.js.map +1 -0
- package/dist/src/http/params.d.ts +15 -0
- package/dist/src/http/params.d.ts.map +1 -0
- package/dist/src/http/params.js +48 -0
- package/dist/src/http/params.js.map +1 -0
- package/dist/src/http/router.d.ts +11 -0
- package/dist/src/http/router.d.ts.map +1 -0
- package/dist/src/http/router.js +300 -0
- package/dist/src/http/router.js.map +1 -0
- package/dist/src/http/schema.d.ts +5 -0
- package/dist/src/http/schema.d.ts.map +1 -0
- package/dist/src/http/schema.js +17 -0
- package/dist/src/http/schema.js.map +1 -0
- package/dist/src/http/server-factory-node.d.ts +4 -0
- package/dist/src/http/server-factory-node.d.ts.map +1 -0
- package/dist/src/http/server-factory-node.js +8 -0
- package/dist/src/http/server-factory-node.js.map +1 -0
- package/dist/src/http/server-factory.d.ts +11 -0
- package/dist/src/http/server-factory.d.ts.map +1 -0
- package/dist/src/http/server-factory.js +4 -0
- package/dist/src/http/server-factory.js.map +1 -0
- package/dist/src/http/telemetry-routes.d.ts +5 -0
- package/dist/src/http/telemetry-routes.d.ts.map +1 -0
- package/dist/src/http/telemetry-routes.js +156 -0
- package/dist/src/http/telemetry-routes.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/migrator/dialect-sqlite.d.ts +9 -0
- package/dist/src/migrator/dialect-sqlite.d.ts.map +1 -0
- package/dist/src/migrator/dialect-sqlite.js +102 -0
- package/dist/src/migrator/dialect-sqlite.js.map +1 -0
- package/dist/src/migrator/dialect.d.ts +24 -0
- package/dist/src/migrator/dialect.d.ts.map +1 -0
- package/dist/src/migrator/dialect.js +5 -0
- package/dist/src/migrator/dialect.js.map +1 -0
- package/dist/src/migrator/index.d.ts +8 -0
- package/dist/src/migrator/index.d.ts.map +1 -0
- package/dist/src/migrator/index.js +6 -0
- package/dist/src/migrator/index.js.map +1 -0
- package/dist/src/migrator/migrator.d.ts +36 -0
- package/dist/src/migrator/migrator.d.ts.map +1 -0
- package/dist/src/migrator/migrator.js +200 -0
- package/dist/src/migrator/migrator.js.map +1 -0
- package/dist/src/migrator/schema-diff.d.ts +25 -0
- package/dist/src/migrator/schema-diff.d.ts.map +1 -0
- package/dist/src/migrator/schema-diff.js +157 -0
- package/dist/src/migrator/schema-diff.js.map +1 -0
- package/dist/src/migrator/types.d.ts +91 -0
- package/dist/src/migrator/types.d.ts.map +1 -0
- package/dist/src/migrator/types.js +13 -0
- package/dist/src/migrator/types.js.map +1 -0
- package/dist/src/platforms/node.d.ts +40 -0
- package/dist/src/platforms/node.d.ts.map +1 -0
- package/dist/src/platforms/node.js +45 -0
- package/dist/src/platforms/node.js.map +1 -0
- package/dist/src/repository/id.d.ts +5 -0
- package/dist/src/repository/id.d.ts.map +1 -0
- package/dist/src/repository/id.js +9 -0
- package/dist/src/repository/id.js.map +1 -0
- package/dist/src/repository/index.d.ts +3 -0
- package/dist/src/repository/index.d.ts.map +1 -0
- package/dist/src/repository/index.js +2 -0
- package/dist/src/repository/index.js.map +1 -0
- package/dist/src/repository/repository.d.ts +53 -0
- package/dist/src/repository/repository.d.ts.map +1 -0
- package/dist/src/repository/repository.js +150 -0
- package/dist/src/repository/repository.js.map +1 -0
- package/dist/src/repository/types.d.ts +42 -0
- package/dist/src/repository/types.d.ts.map +1 -0
- package/dist/src/repository/types.js +2 -0
- package/dist/src/repository/types.js.map +1 -0
- package/dist/src/rule/compiler.d.ts +52 -0
- package/dist/src/rule/compiler.d.ts.map +1 -0
- package/dist/src/rule/compiler.js +115 -0
- package/dist/src/rule/compiler.js.map +1 -0
- package/dist/src/rule/enforcer.d.ts +47 -0
- package/dist/src/rule/enforcer.d.ts.map +1 -0
- package/dist/src/rule/enforcer.js +60 -0
- package/dist/src/rule/enforcer.js.map +1 -0
- package/dist/src/rule/index.d.ts +3 -0
- package/dist/src/rule/index.d.ts.map +1 -0
- package/dist/src/rule/index.js +3 -0
- package/dist/src/rule/index.js.map +1 -0
- package/dist/src/storage/index.d.ts +3 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +3 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/local-preset.d.ts +21 -0
- package/dist/src/storage/local-preset.d.ts.map +1 -0
- package/dist/src/storage/local-preset.js +21 -0
- package/dist/src/storage/local-preset.js.map +1 -0
- package/dist/src/storage/storage.d.ts +83 -0
- package/dist/src/storage/storage.d.ts.map +1 -0
- package/dist/src/storage/storage.js +120 -0
- package/dist/src/storage/storage.js.map +1 -0
- package/dist/src/telemetry/collections.d.ts +4 -0
- package/dist/src/telemetry/collections.d.ts.map +1 -0
- package/dist/src/telemetry/collections.js +19 -0
- package/dist/src/telemetry/collections.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +9 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +9 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/logger.d.ts +4 -0
- package/dist/src/telemetry/logger.d.ts.map +1 -0
- package/dist/src/telemetry/logger.js +27 -0
- package/dist/src/telemetry/logger.js.map +1 -0
- package/dist/src/telemetry/sqlite-logger.d.ts +24 -0
- package/dist/src/telemetry/sqlite-logger.d.ts.map +1 -0
- package/dist/src/telemetry/sqlite-logger.js +152 -0
- package/dist/src/telemetry/sqlite-logger.js.map +1 -0
- package/dist/src/telemetry/telemetry-sql-client.d.ts +11 -0
- package/dist/src/telemetry/telemetry-sql-client.d.ts.map +1 -0
- package/dist/src/telemetry/telemetry-sql-client.js +8 -0
- package/dist/src/telemetry/telemetry-sql-client.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +16 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -0
- package/dist/src/telemetry/tracer.js +106 -0
- package/dist/src/telemetry/tracer.js.map +1 -0
- package/dist/src/thumbnail/index.d.ts +4 -0
- package/dist/src/thumbnail/index.d.ts.map +1 -0
- package/dist/src/thumbnail/index.js +3 -0
- package/dist/src/thumbnail/index.js.map +1 -0
- package/dist/src/thumbnail/photon.d.ts +9 -0
- package/dist/src/thumbnail/photon.d.ts.map +1 -0
- package/dist/src/thumbnail/photon.js +73 -0
- package/dist/src/thumbnail/photon.js.map +1 -0
- package/dist/src/thumbnail/types.d.ts +23 -0
- package/dist/src/thumbnail/types.d.ts.map +1 -0
- package/dist/src/thumbnail/types.js +22 -0
- package/dist/src/thumbnail/types.js.map +1 -0
- package/dist/tests/app/app.test.d.ts +2 -0
- package/dist/tests/app/app.test.d.ts.map +1 -0
- package/dist/tests/app/app.test.js +125 -0
- package/dist/tests/app/app.test.js.map +1 -0
- package/dist/tests/app/builder.test.d.ts +2 -0
- package/dist/tests/app/builder.test.d.ts.map +1 -0
- package/dist/tests/app/builder.test.js +70 -0
- package/dist/tests/app/builder.test.js.map +1 -0
- package/dist/tests/cache/cached-collection.test.d.ts +2 -0
- package/dist/tests/cache/cached-collection.test.d.ts.map +1 -0
- package/dist/tests/cache/cached-collection.test.js +244 -0
- package/dist/tests/cache/cached-collection.test.js.map +1 -0
- package/dist/tests/cache/collection-cache.test.d.ts +2 -0
- package/dist/tests/cache/collection-cache.test.d.ts.map +1 -0
- package/dist/tests/cache/collection-cache.test.js +73 -0
- package/dist/tests/cache/collection-cache.test.js.map +1 -0
- package/dist/tests/collection-service/collection-service.test.d.ts +2 -0
- package/dist/tests/collection-service/collection-service.test.d.ts.map +1 -0
- package/dist/tests/collection-service/collection-service.test.js +938 -0
- package/dist/tests/collection-service/collection-service.test.js.map +1 -0
- package/dist/tests/collection-service/input-schema.test.d.ts +2 -0
- package/dist/tests/collection-service/input-schema.test.d.ts.map +1 -0
- package/dist/tests/collection-service/input-schema.test.js +327 -0
- package/dist/tests/collection-service/input-schema.test.js.map +1 -0
- package/dist/tests/config/config.test.d.ts +2 -0
- package/dist/tests/config/config.test.d.ts.map +1 -0
- package/dist/tests/config/config.test.js +84 -0
- package/dist/tests/config/config.test.js.map +1 -0
- package/dist/tests/crypto/crypto.test.d.ts +2 -0
- package/dist/tests/crypto/crypto.test.d.ts.map +1 -0
- package/dist/tests/crypto/crypto.test.js +56 -0
- package/dist/tests/crypto/crypto.test.js.map +1 -0
- package/dist/tests/hooks/hook-collection.test.d.ts +2 -0
- package/dist/tests/hooks/hook-collection.test.d.ts.map +1 -0
- package/dist/tests/hooks/hook-collection.test.js +103 -0
- package/dist/tests/hooks/hook-collection.test.js.map +1 -0
- package/dist/tests/hooks/hook-service.test.d.ts +2 -0
- package/dist/tests/hooks/hook-service.test.d.ts.map +1 -0
- package/dist/tests/hooks/hook-service.test.js +216 -0
- package/dist/tests/hooks/hook-service.test.js.map +1 -0
- package/dist/tests/http/file-serve.test.d.ts +2 -0
- package/dist/tests/http/file-serve.test.d.ts.map +1 -0
- package/dist/tests/http/file-serve.test.js +210 -0
- package/dist/tests/http/file-serve.test.js.map +1 -0
- package/dist/tests/http/file-token.test.d.ts +2 -0
- package/dist/tests/http/file-token.test.d.ts.map +1 -0
- package/dist/tests/http/file-token.test.js +165 -0
- package/dist/tests/http/file-token.test.js.map +1 -0
- package/dist/tests/http/ip-middleware.test.d.ts +2 -0
- package/dist/tests/http/ip-middleware.test.d.ts.map +1 -0
- package/dist/tests/http/ip-middleware.test.js +58 -0
- package/dist/tests/http/ip-middleware.test.js.map +1 -0
- package/dist/tests/http/router.test.d.ts +2 -0
- package/dist/tests/http/router.test.d.ts.map +1 -0
- package/dist/tests/http/router.test.js +312 -0
- package/dist/tests/http/router.test.js.map +1 -0
- package/dist/tests/migrator/dialect-sqlite.test.d.ts +2 -0
- package/dist/tests/migrator/dialect-sqlite.test.d.ts.map +1 -0
- package/dist/tests/migrator/dialect-sqlite.test.js +90 -0
- package/dist/tests/migrator/dialect-sqlite.test.js.map +1 -0
- package/dist/tests/migrator/integration.test.d.ts +2 -0
- package/dist/tests/migrator/integration.test.d.ts.map +1 -0
- package/dist/tests/migrator/integration.test.js +180 -0
- package/dist/tests/migrator/integration.test.js.map +1 -0
- package/dist/tests/migrator/migrator.test.d.ts +2 -0
- package/dist/tests/migrator/migrator.test.d.ts.map +1 -0
- package/dist/tests/migrator/migrator.test.js +225 -0
- package/dist/tests/migrator/migrator.test.js.map +1 -0
- package/dist/tests/migrator/schema-diff.test.d.ts +2 -0
- package/dist/tests/migrator/schema-diff.test.d.ts.map +1 -0
- package/dist/tests/migrator/schema-diff.test.js +323 -0
- package/dist/tests/migrator/schema-diff.test.js.map +1 -0
- package/dist/tests/repository/repository.test.d.ts +2 -0
- package/dist/tests/repository/repository.test.d.ts.map +1 -0
- package/dist/tests/repository/repository.test.js +255 -0
- package/dist/tests/repository/repository.test.js.map +1 -0
- package/dist/tests/rule/compiler.test.d.ts +2 -0
- package/dist/tests/rule/compiler.test.d.ts.map +1 -0
- package/dist/tests/rule/compiler.test.js +226 -0
- package/dist/tests/rule/compiler.test.js.map +1 -0
- package/dist/tests/rule/enforcer.test.d.ts +2 -0
- package/dist/tests/rule/enforcer.test.d.ts.map +1 -0
- package/dist/tests/rule/enforcer.test.js +190 -0
- package/dist/tests/rule/enforcer.test.js.map +1 -0
- package/dist/tests/storage/storage.test.d.ts +2 -0
- package/dist/tests/storage/storage.test.d.ts.map +1 -0
- package/dist/tests/storage/storage.test.js +76 -0
- package/dist/tests/storage/storage.test.js.map +1 -0
- package/dist/tests/telemetry/collections.test.d.ts +2 -0
- package/dist/tests/telemetry/collections.test.d.ts.map +1 -0
- package/dist/tests/telemetry/collections.test.js +67 -0
- package/dist/tests/telemetry/collections.test.js.map +1 -0
- package/dist/tests/telemetry/instrumentation.test.d.ts +2 -0
- package/dist/tests/telemetry/instrumentation.test.d.ts.map +1 -0
- package/dist/tests/telemetry/instrumentation.test.js +226 -0
- package/dist/tests/telemetry/instrumentation.test.js.map +1 -0
- package/dist/tests/telemetry/logger.test.d.ts +2 -0
- package/dist/tests/telemetry/logger.test.d.ts.map +1 -0
- package/dist/tests/telemetry/logger.test.js +56 -0
- package/dist/tests/telemetry/logger.test.js.map +1 -0
- package/dist/tests/telemetry/sqlite-logger.test.d.ts +2 -0
- package/dist/tests/telemetry/sqlite-logger.test.d.ts.map +1 -0
- package/dist/tests/telemetry/sqlite-logger.test.js +218 -0
- package/dist/tests/telemetry/sqlite-logger.test.js.map +1 -0
- package/dist/tests/telemetry/telemetry-routes.test.d.ts +2 -0
- package/dist/tests/telemetry/telemetry-routes.test.d.ts.map +1 -0
- package/dist/tests/telemetry/telemetry-routes.test.js +133 -0
- package/dist/tests/telemetry/telemetry-routes.test.js.map +1 -0
- package/dist/tests/telemetry/tracer.test.d.ts +2 -0
- package/dist/tests/telemetry/tracer.test.d.ts.map +1 -0
- package/dist/tests/telemetry/tracer.test.js +63 -0
- package/dist/tests/telemetry/tracer.test.js.map +1 -0
- package/dist/tests/thumbnail/photon.test.d.ts +2 -0
- package/dist/tests/thumbnail/photon.test.d.ts.map +1 -0
- package/dist/tests/thumbnail/photon.test.js +478 -0
- package/dist/tests/thumbnail/photon.test.js.map +1 -0
- package/dist/tests/thumbnail/thumbnail.test.d.ts +2 -0
- package/dist/tests/thumbnail/thumbnail.test.d.ts.map +1 -0
- package/dist/tests/thumbnail/thumbnail.test.js +35 -0
- package/dist/tests/thumbnail/thumbnail.test.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { SqlClient } from "@effect/sql";
|
|
2
|
+
import { unsafeFragment } from "@effect/sql/Statement";
|
|
3
|
+
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
4
|
+
import { filterNodeToWhereClause } from "@gettersethya/mira-client";
|
|
5
|
+
import { enforcerForAction } from "../rule/enforcer.js";
|
|
6
|
+
import { Repository } from "../repository/repository.js";
|
|
7
|
+
import { FileStorage } from "../storage/storage.js";
|
|
8
|
+
import { makeRowDecoder } from "./decode.js";
|
|
9
|
+
import { ForbiddenError, NotFoundError, ReadOnlyError, ValidationError } from "./errors.js";
|
|
10
|
+
import { buildInputSchemas, parseErrToValidationError } from "./input-schema.js";
|
|
11
|
+
import { andWhere, cursorClause, idClause, resolveCtxPlaceholders, resolveFieldRefs } from "./where.js";
|
|
12
|
+
/**
|
|
13
|
+
* Collection Service tag — the core business-logic layer sitting between
|
|
14
|
+
* the HTTP router and the repository.
|
|
15
|
+
*
|
|
16
|
+
* Each method performs:
|
|
17
|
+
* - Schema validation (field types, required fields, constraints via Effect Schema)
|
|
18
|
+
* - Access rule enforcement (compiles and applies x-rules)
|
|
19
|
+
* - System field management (seqId, created, updated timestamps)
|
|
20
|
+
* - Hidden/read-only field stripping for responses
|
|
21
|
+
* - Cursor-based pagination for list operations
|
|
22
|
+
* - File cleanup on update/delete (best-effort)
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* import { CollectionService } from "@gettersethya/mira"
|
|
26
|
+
*
|
|
27
|
+
* Effect.gen(function* () {
|
|
28
|
+
* const svc = yield* CollectionService
|
|
29
|
+
* const page = yield* svc.list(postsDef, null, 20, ctx, undefined, { field: "seqId", direction: "asc" })
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* @see makeCollectionServiceLayer — factory function
|
|
33
|
+
* @see Repository — the underlying data access layer
|
|
34
|
+
*/
|
|
35
|
+
export class CollectionService extends Context.Tag("CollectionService")() {
|
|
36
|
+
}
|
|
37
|
+
function resolveFields(schema, userSelect, admin = false) {
|
|
38
|
+
const nonHidden = Object.entries(schema.properties)
|
|
39
|
+
.filter(([, p]) => admin || !p["x-hidden"])
|
|
40
|
+
.map(([k]) => k);
|
|
41
|
+
if (userSelect === null)
|
|
42
|
+
return nonHidden;
|
|
43
|
+
// Intersect with non-hidden fields (admin bypasses hidden filter)
|
|
44
|
+
const nonHiddenSet = new Set(nonHidden);
|
|
45
|
+
const selected = userSelect.filter((f) => admin || nonHiddenSet.has(f));
|
|
46
|
+
// Always include core system fields needed for the response
|
|
47
|
+
const always = new Set(["id", "created", "updated"]);
|
|
48
|
+
for (const a of always) {
|
|
49
|
+
if (!selected.includes(a)) {
|
|
50
|
+
selected.push(a);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return selected;
|
|
54
|
+
}
|
|
55
|
+
function resolveExpand(schema, expandFieldNames, allCollections) {
|
|
56
|
+
if (expandFieldNames === null)
|
|
57
|
+
return [];
|
|
58
|
+
const collectionMap = new Map(allCollections.map((c) => [c.name, c]));
|
|
59
|
+
const result = [];
|
|
60
|
+
for (const name of expandFieldNames) {
|
|
61
|
+
const prop = schema.properties[name];
|
|
62
|
+
if (!prop || prop["x-kind"] !== "relation")
|
|
63
|
+
continue;
|
|
64
|
+
if (!prop["x-collection"])
|
|
65
|
+
continue;
|
|
66
|
+
const target = collectionMap.get(prop["x-collection"]);
|
|
67
|
+
if (!target)
|
|
68
|
+
continue;
|
|
69
|
+
const targetColumns = resolveFields(target.schema, null);
|
|
70
|
+
result.push({ localField: name, targetTable: prop["x-collection"], targetColumns });
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
// These fields are auto-generated by the system and must never be accepted from user input.
|
|
75
|
+
// Auth-collection fields like email/password are also x-system but ARE user-provided.
|
|
76
|
+
const GENERATED_FIELDS = new Set(["id", "seqId", "created", "updated"]);
|
|
77
|
+
function rejectSystemFields(data, _schema, collectionName) {
|
|
78
|
+
const sysKeys = Object.keys(data).filter((k) => GENERATED_FIELDS.has(k));
|
|
79
|
+
if (sysKeys.length === 0)
|
|
80
|
+
return Effect.void;
|
|
81
|
+
return Effect.fail(new ValidationError({
|
|
82
|
+
collection: collectionName,
|
|
83
|
+
issues: [`Fields are read-only: ${sysKeys.join(", ")}`]
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
function extractFileKeys(record, schema) {
|
|
87
|
+
return Object.entries(schema.properties)
|
|
88
|
+
.filter(([, prop]) => prop["x-kind"] === "file")
|
|
89
|
+
.map(([field]) => record[field])
|
|
90
|
+
.filter((v) => typeof v === "string" && v.length > 0);
|
|
91
|
+
}
|
|
92
|
+
function extractReplacedFileKeys(existing, patch, schema) {
|
|
93
|
+
return Object.entries(schema.properties)
|
|
94
|
+
.filter(([, prop]) => prop["x-kind"] === "file")
|
|
95
|
+
.flatMap(([field]) => {
|
|
96
|
+
const oldKey = existing[field];
|
|
97
|
+
const newKey = patch[field];
|
|
98
|
+
if (typeof oldKey === "string" && oldKey.length > 0 && field in patch && newKey !== oldKey) {
|
|
99
|
+
return [oldKey];
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function compileRule(collection, action, ctx) {
|
|
105
|
+
const result = enforcerForAction(collection.schema, action);
|
|
106
|
+
if (result === null) {
|
|
107
|
+
return Effect.fail(new ForbiddenError({ collection: collection.name, action }));
|
|
108
|
+
}
|
|
109
|
+
return resolveCtxPlaceholders(result, ctx, collection.name, action);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Create a `CollectionService` layer for a given set of collection definitions.
|
|
113
|
+
* Each collection gets its own validated service instance with per-collection
|
|
114
|
+
* rules, field schemas, and system field handling.
|
|
115
|
+
*
|
|
116
|
+
* The layer depends on `Repository`, `SqlClient`, and `FileStorage`.
|
|
117
|
+
*
|
|
118
|
+
* @param allCollections - Array of collection definitions
|
|
119
|
+
* @returns A Layer providing CollectionService
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* Layer.provideMerge(makeCollectionServiceLayer([Posts, Users]))
|
|
123
|
+
*
|
|
124
|
+
* @see CollectionService — the service tag
|
|
125
|
+
* @see makeCachedCollectionServiceLayer — wrapping layer that adds caching
|
|
126
|
+
*/
|
|
127
|
+
export function makeCollectionServiceLayer(allCollections) {
|
|
128
|
+
return Layer.effect(CollectionService, Effect.gen(function* () {
|
|
129
|
+
const repo = yield* Repository;
|
|
130
|
+
const sql = yield* SqlClient.SqlClient;
|
|
131
|
+
const fileStorage = yield* FileStorage;
|
|
132
|
+
const decoderMap = new Map(allCollections.map((c) => [c.name, makeRowDecoder(c.schema)]));
|
|
133
|
+
const inputSchemaMap = new Map(allCollections.map((c) => [c.name, buildInputSchemas(c)]));
|
|
134
|
+
const getInputSchemas = (col) => inputSchemaMap.get(col.name) ?? buildInputSchemas(col);
|
|
135
|
+
const decodeRow = (collection, record) => (decoderMap.get(collection.name) ?? Effect.succeed)(record);
|
|
136
|
+
const list = (collection, cursor, perPage, ctx, filter, sort, select, expand) => Effect.gen(function* () {
|
|
137
|
+
const ruleWhere = ctx.admin ? null : yield* compileRule(collection, "list", ctx);
|
|
138
|
+
const userFilter = filter !== undefined ? yield* filterNodeToWhereClause(filter, collection.schema, collection.name) : null;
|
|
139
|
+
const where = ruleWhere !== null && userFilter !== null ? andWhere(ruleWhere, userFilter) : (userFilter ?? ruleWhere);
|
|
140
|
+
const combined = cursor !== null && where !== null ? andWhere(where, cursorClause(cursor)) : where;
|
|
141
|
+
const fields = resolveFields(collection.schema, select ?? null, ctx.admin);
|
|
142
|
+
const expandDefs = resolveExpand(collection.schema, expand ?? null, allCollections);
|
|
143
|
+
const fieldsWithExpand = [...new Set([...fields, ...expandDefs.map((e) => e.localField)])];
|
|
144
|
+
// seqId is x-hidden but must be fetched for cursor-based pagination
|
|
145
|
+
const fieldsForQuery = fieldsWithExpand.includes("seqId") ? fieldsWithExpand : [...fieldsWithExpand, "seqId"];
|
|
146
|
+
const listOpts = {
|
|
147
|
+
sort: sort ?? { field: "seqId", direction: "asc" },
|
|
148
|
+
fields: fieldsForQuery,
|
|
149
|
+
expand: expandDefs
|
|
150
|
+
};
|
|
151
|
+
const rows = yield* repo.list(collection.name, perPage, combined !== null ? { ...listOpts, where: combined } : listOpts);
|
|
152
|
+
const lastRow = rows.items.at(-1);
|
|
153
|
+
const rawSeqId = lastRow?.["seqId"];
|
|
154
|
+
const lastSeqId = typeof rawSeqId === "number" ? rawSeqId : null;
|
|
155
|
+
const nextCursor = rows.items.length === perPage ? lastSeqId : null;
|
|
156
|
+
// Strip seqId — it's internal and must not appear in API responses
|
|
157
|
+
const items = yield* Effect.forEach(rows.items.map((r) => {
|
|
158
|
+
const copy = { ...r };
|
|
159
|
+
delete copy["seqId"];
|
|
160
|
+
return copy;
|
|
161
|
+
}), (r) => decodeRow(collection, r));
|
|
162
|
+
return { items, nextCursor };
|
|
163
|
+
}).pipe(Effect.withSpan("collection.list", {
|
|
164
|
+
kind: "internal",
|
|
165
|
+
attributes: { collection: collection.name }
|
|
166
|
+
}));
|
|
167
|
+
const view = (collection, id, ctx, select, expand) => Effect.gen(function* () {
|
|
168
|
+
const ruleWhere = ctx.admin ? null : yield* compileRule(collection, "view", ctx);
|
|
169
|
+
const combined = ruleWhere !== null ? andWhere(ruleWhere, idClause(id)) : idClause(id);
|
|
170
|
+
const fields = resolveFields(collection.schema, select ?? null, ctx.admin);
|
|
171
|
+
const expandDefs = resolveExpand(collection.schema, expand ?? null, allCollections);
|
|
172
|
+
const fieldsWithExpand = [...new Set([...fields, ...expandDefs.map((e) => e.localField)])];
|
|
173
|
+
const rows = yield* repo.viewFilter(collection.name, {
|
|
174
|
+
where: combined,
|
|
175
|
+
fields: fieldsWithExpand,
|
|
176
|
+
expand: expandDefs
|
|
177
|
+
});
|
|
178
|
+
if (rows.length === 0) {
|
|
179
|
+
return yield* new NotFoundError({ collection: collection.name, id });
|
|
180
|
+
}
|
|
181
|
+
return yield* decodeRow(collection, rows[0]);
|
|
182
|
+
}).pipe(Effect.withSpan("collection.view", {
|
|
183
|
+
kind: "internal",
|
|
184
|
+
attributes: { collection: collection.name }
|
|
185
|
+
}));
|
|
186
|
+
const create = (collection, data, ctx) => Effect.gen(function* () {
|
|
187
|
+
if (collection.schema["x-collection-kind"] === "view") {
|
|
188
|
+
return yield* new ReadOnlyError({ collection: collection.name });
|
|
189
|
+
}
|
|
190
|
+
yield* rejectSystemFields(data, collection.schema, collection.name);
|
|
191
|
+
const schemas = getInputSchemas(collection);
|
|
192
|
+
const cleaned = yield* Schema.decodeUnknown(schemas.create)(data).pipe(Effect.mapError(parseErrToValidationError(collection.name)));
|
|
193
|
+
if (!ctx.admin) {
|
|
194
|
+
const ruleWhere = yield* compileRule(collection, "create", ctx);
|
|
195
|
+
// Pre-check: evaluate the create rule against the payload (no table needed).
|
|
196
|
+
const payloadBound = resolveFieldRefs(ruleWhere, cleaned);
|
|
197
|
+
const where = unsafeFragment(payloadBound.sql, payloadBound.params);
|
|
198
|
+
const check = yield* sql `SELECT 1 AS ok WHERE ${where}`;
|
|
199
|
+
if (check.length === 0) {
|
|
200
|
+
return yield* new ForbiddenError({ collection: collection.name, action: "create" });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const row = yield* repo.create(collection.name, cleaned);
|
|
204
|
+
return yield* decodeRow(collection, row);
|
|
205
|
+
}).pipe(Effect.withSpan("collection.create", {
|
|
206
|
+
kind: "internal",
|
|
207
|
+
attributes: { collection: collection.name }
|
|
208
|
+
}));
|
|
209
|
+
const update = (collection, id, data, ctx) => Effect.gen(function* () {
|
|
210
|
+
if (collection.schema["x-collection-kind"] === "view") {
|
|
211
|
+
return yield* new ReadOnlyError({ collection: collection.name });
|
|
212
|
+
}
|
|
213
|
+
yield* rejectSystemFields(data, collection.schema, collection.name);
|
|
214
|
+
const schemas = getInputSchemas(collection);
|
|
215
|
+
const cleaned = yield* Schema.decodeUnknown(schemas.update)(data).pipe(Effect.mapError(parseErrToValidationError(collection.name)));
|
|
216
|
+
// If the collection has no rules at all, deny immediately (don't leak existence)
|
|
217
|
+
if (!ctx.admin) {
|
|
218
|
+
const enforcerResult = enforcerForAction(collection.schema, "update");
|
|
219
|
+
if (enforcerResult === null) {
|
|
220
|
+
return yield* new ForbiddenError({ collection: collection.name, action: "update" });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const existing = yield* repo.view(collection.name, id);
|
|
224
|
+
if (Option.isNone(existing)) {
|
|
225
|
+
return yield* new NotFoundError({ collection: collection.name, id });
|
|
226
|
+
}
|
|
227
|
+
if (!ctx.admin) {
|
|
228
|
+
const ruleWhere = yield* compileRule(collection, "update", ctx);
|
|
229
|
+
// Rule check against this specific row
|
|
230
|
+
const combined = andWhere(ruleWhere, idClause(id));
|
|
231
|
+
const allowed = yield* repo.viewFilter(collection.name, { where: combined });
|
|
232
|
+
if (allowed.length === 0) {
|
|
233
|
+
return yield* new ForbiddenError({ collection: collection.name, action: "update" });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const updated = yield* repo.update(collection.name, id, cleaned);
|
|
237
|
+
// Best-effort: delete old files and their thumbnails for any replaced file fields.
|
|
238
|
+
const oldKeys = extractReplacedFileKeys(existing.value, cleaned, collection.schema);
|
|
239
|
+
yield* Effect.forEach(oldKeys, (key) => Effect.gen(function* () {
|
|
240
|
+
yield* fileStorage.delete(key).pipe(Effect.orElse(() => Effect.void));
|
|
241
|
+
const thumbKeys = yield* fileStorage.list(`_thumbs/${key}/`).pipe(Effect.orElseSucceed(() => []));
|
|
242
|
+
yield* Effect.forEach(thumbKeys, (tk) => fileStorage.delete(tk).pipe(Effect.orElse(() => Effect.void)), { concurrency: "unbounded" });
|
|
243
|
+
}), { concurrency: "unbounded" });
|
|
244
|
+
return yield* decodeRow(collection, Option.getOrElse(updated, () => existing.value));
|
|
245
|
+
}).pipe(Effect.withSpan("collection.update", {
|
|
246
|
+
kind: "internal",
|
|
247
|
+
attributes: { collection: collection.name }
|
|
248
|
+
}));
|
|
249
|
+
const deleteImpl = (collection, id, ctx) => Effect.gen(function* () {
|
|
250
|
+
if (collection.schema["x-collection-kind"] === "view") {
|
|
251
|
+
return yield* new ReadOnlyError({ collection: collection.name });
|
|
252
|
+
}
|
|
253
|
+
// If the collection has no rules at all, deny immediately (don't leak existence)
|
|
254
|
+
if (!ctx.admin) {
|
|
255
|
+
const enforcerResult = enforcerForAction(collection.schema, "delete");
|
|
256
|
+
if (enforcerResult === null) {
|
|
257
|
+
return yield* new ForbiddenError({ collection: collection.name, action: "delete" });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const existing = yield* repo.view(collection.name, id);
|
|
261
|
+
if (Option.isNone(existing)) {
|
|
262
|
+
return yield* new NotFoundError({ collection: collection.name, id });
|
|
263
|
+
}
|
|
264
|
+
if (!ctx.admin) {
|
|
265
|
+
const ruleWhere = yield* compileRule(collection, "delete", ctx);
|
|
266
|
+
const combined = andWhere(ruleWhere, idClause(id));
|
|
267
|
+
const allowed = yield* repo.viewFilter(collection.name, { where: combined });
|
|
268
|
+
if (allowed.length === 0) {
|
|
269
|
+
return yield* new ForbiddenError({ collection: collection.name, action: "delete" });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
yield* repo.delete(collection.name, id);
|
|
273
|
+
// Best-effort: delete files and their thumbnails after the record is gone.
|
|
274
|
+
const keys = extractFileKeys(existing.value, collection.schema);
|
|
275
|
+
yield* Effect.forEach(keys, (key) => Effect.gen(function* () {
|
|
276
|
+
yield* fileStorage.delete(key).pipe(Effect.orElse(() => Effect.void));
|
|
277
|
+
const thumbKeys = yield* fileStorage.list(`_thumbs/${key}/`).pipe(Effect.orElseSucceed(() => []));
|
|
278
|
+
yield* Effect.forEach(thumbKeys, (tk) => fileStorage.delete(tk).pipe(Effect.orElse(() => Effect.void)), { concurrency: "unbounded" });
|
|
279
|
+
}), { concurrency: "unbounded" });
|
|
280
|
+
}).pipe(Effect.withSpan("collection.delete", {
|
|
281
|
+
kind: "internal",
|
|
282
|
+
attributes: { collection: collection.name }
|
|
283
|
+
}));
|
|
284
|
+
return { list, view, create, update, delete: deleteImpl };
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
/** @deprecated Use makeCollectionServiceLayer(allCollections) */
|
|
288
|
+
export const CollectionServiceLive = makeCollectionServiceLayer([]);
|
|
289
|
+
//# sourceMappingURL=collection-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-service.js","sourceRoot":"","sources":["../../../src/collection-service/collection-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RepoRecord } from "../repository/types.js";
|
|
2
|
+
/** Auth-resolved request context. JWT parsing is not done here — the route handler provides this. */
|
|
3
|
+
export type RequestCtx = {
|
|
4
|
+
auth?: {
|
|
5
|
+
collection: string;
|
|
6
|
+
record: RepoRecord;
|
|
7
|
+
};
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
query: Record<string, string | ReadonlyArray<string>>;
|
|
10
|
+
/** When true, skip all rule enforcement (validation still applies). Used by admin/dashboard routes. */
|
|
11
|
+
admin?: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** Paginated result — cursor-based via seqId. Used for all collection kinds. */
|
|
14
|
+
export type CursorPage = {
|
|
15
|
+
items: ReadonlyArray<RepoRecord>;
|
|
16
|
+
/** seqId of the last item. Pass as `after` to fetch the next page. null = no more pages. */
|
|
17
|
+
nextCursor: number | null;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/collection-service/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,qGAAqG;AACrG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAA;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IACrD,uGAAuG;IACvG,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAChC,4FAA4F;IAC5F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/collection-service/context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { CollectionSchema } from "@gettersethya/mira-client";
|
|
3
|
+
import type { RepoRecord } from "../repository/types.js";
|
|
4
|
+
export type RowDecoder = (record: RepoRecord) => Effect.Effect<RepoRecord>;
|
|
5
|
+
export declare function makeRowDecoder(colSchema: CollectionSchema): RowDecoder;
|
|
6
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../../src/collection-service/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAIvD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;AAE1E,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,UAAU,CAsBtE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
const RecordSchema = Schema.Record({ key: Schema.String, value: Schema.Unknown });
|
|
3
|
+
export function makeRowDecoder(colSchema) {
|
|
4
|
+
const boolKeys = new Set();
|
|
5
|
+
for (const [key, prop] of Object.entries(colSchema.properties)) {
|
|
6
|
+
if (prop.type === "boolean")
|
|
7
|
+
boolKeys.add(key);
|
|
8
|
+
}
|
|
9
|
+
if (boolKeys.size === 0)
|
|
10
|
+
return Effect.succeed;
|
|
11
|
+
const RowSchema = Schema.transform(RecordSchema, RecordSchema, {
|
|
12
|
+
decode: (record) => {
|
|
13
|
+
const result = { ...record };
|
|
14
|
+
for (const key of boolKeys) {
|
|
15
|
+
const v = result[key];
|
|
16
|
+
if (v === 0 || v === 1)
|
|
17
|
+
result[key] = v === 1;
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
},
|
|
21
|
+
encode: (v) => v
|
|
22
|
+
});
|
|
23
|
+
const decode = Schema.decodeUnknown(RowSchema);
|
|
24
|
+
return (record) => decode(record).pipe(Effect.orDie, Effect.map((r) => r));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/collection-service/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;AAIjF,MAAM,UAAU,cAAc,CAAC,SAA2B;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAA;IAE9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE;QAC7D,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;YAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;gBACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC/C,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KACjB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IAC9C,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAe,CAAC,CAAC,CAAA;AAC1F,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { SqlError } from "@effect/sql";
|
|
2
|
+
import { ValidationError } from "@gettersethya/mira-client";
|
|
3
|
+
export { ValidationError };
|
|
4
|
+
declare const NotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "NotFoundError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
/**
|
|
8
|
+
* Error raised when a requested record is not found.
|
|
9
|
+
* Contains the collection name and the requested record ID.
|
|
10
|
+
*
|
|
11
|
+
* The server returns HTTP 404 when this error propagates to the HTTP layer.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* new NotFoundError({ collection: "posts", id: "abc123" })
|
|
15
|
+
*
|
|
16
|
+
* @see CollectionService — raises this error on getOne/update/delete for missing records
|
|
17
|
+
*/
|
|
18
|
+
export declare class NotFoundError extends NotFoundError_base<{
|
|
19
|
+
collection: string;
|
|
20
|
+
id: string;
|
|
21
|
+
}> {
|
|
22
|
+
}
|
|
23
|
+
declare const ForbiddenError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
24
|
+
readonly _tag: "ForbiddenError";
|
|
25
|
+
} & Readonly<A>;
|
|
26
|
+
/**
|
|
27
|
+
* Error raised when an action is forbidden by access rules.
|
|
28
|
+
* Contains the collection name and the attempted action.
|
|
29
|
+
*
|
|
30
|
+
* The server returns HTTP 403 when this error propagates to the HTTP layer.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* new ForbiddenError({ collection: "posts", action: "update" })
|
|
34
|
+
*
|
|
35
|
+
* @see CollectionService — raises this error when rules deny an action
|
|
36
|
+
*/
|
|
37
|
+
export declare class ForbiddenError extends ForbiddenError_base<{
|
|
38
|
+
collection: string;
|
|
39
|
+
action: string;
|
|
40
|
+
}> {
|
|
41
|
+
}
|
|
42
|
+
declare const ReadOnlyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
43
|
+
readonly _tag: "ReadOnlyError";
|
|
44
|
+
} & Readonly<A>;
|
|
45
|
+
/**
|
|
46
|
+
* Error raised when a write operation is attempted on a read-only collection.
|
|
47
|
+
* View collections always raise this on create/update/delete.
|
|
48
|
+
*
|
|
49
|
+
* The server returns HTTP 405 (Method Not Allowed) when this error propagates.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* new ReadOnlyError({ collection: "active_posts" })
|
|
53
|
+
*
|
|
54
|
+
* @see ViewCollection — view collections are read-only
|
|
55
|
+
*/
|
|
56
|
+
export declare class ReadOnlyError extends ReadOnlyError_base<{
|
|
57
|
+
collection: string;
|
|
58
|
+
}> {
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Union of all errors that can be raised by CollectionService operations.
|
|
62
|
+
* Includes NotFoundError, ForbiddenError, ValidationError, ReadOnlyError, and SqlError.
|
|
63
|
+
*
|
|
64
|
+
* @see CollectionService — all methods fail with CollectionError
|
|
65
|
+
*/
|
|
66
|
+
export type CollectionError = NotFoundError | ForbiddenError | ValidationError | ReadOnlyError | SqlError.SqlError;
|
|
67
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/collection-service/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,CAAA;;;;AAE1B;;;;;;;;;;GAUG;AACH,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;CACX,CAAC;CAAG;;;;AAEL;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf,CAAC;CAAG;;;;AAEL;;;;;;;;;;GAUG;AACH,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC;CAAG;AAEL;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,cAAc,GACd,eAAe,GACf,aAAa,GACb,QAAQ,CAAC,QAAQ,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Data } from "effect";
|
|
2
|
+
import { ValidationError } from "@gettersethya/mira-client";
|
|
3
|
+
export { ValidationError };
|
|
4
|
+
/**
|
|
5
|
+
* Error raised when a requested record is not found.
|
|
6
|
+
* Contains the collection name and the requested record ID.
|
|
7
|
+
*
|
|
8
|
+
* The server returns HTTP 404 when this error propagates to the HTTP layer.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* new NotFoundError({ collection: "posts", id: "abc123" })
|
|
12
|
+
*
|
|
13
|
+
* @see CollectionService — raises this error on getOne/update/delete for missing records
|
|
14
|
+
*/
|
|
15
|
+
export class NotFoundError extends Data.TaggedError("NotFoundError") {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Error raised when an action is forbidden by access rules.
|
|
19
|
+
* Contains the collection name and the attempted action.
|
|
20
|
+
*
|
|
21
|
+
* The server returns HTTP 403 when this error propagates to the HTTP layer.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* new ForbiddenError({ collection: "posts", action: "update" })
|
|
25
|
+
*
|
|
26
|
+
* @see CollectionService — raises this error when rules deny an action
|
|
27
|
+
*/
|
|
28
|
+
export class ForbiddenError extends Data.TaggedError("ForbiddenError") {
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error raised when a write operation is attempted on a read-only collection.
|
|
32
|
+
* View collections always raise this on create/update/delete.
|
|
33
|
+
*
|
|
34
|
+
* The server returns HTTP 405 (Method Not Allowed) when this error propagates.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* new ReadOnlyError({ collection: "active_posts" })
|
|
38
|
+
*
|
|
39
|
+
* @see ViewCollection — view collections are read-only
|
|
40
|
+
*/
|
|
41
|
+
export class ReadOnlyError extends Data.TaggedError("ReadOnlyError") {
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/collection-service/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,CAAA;AAE1B;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAc,SAAQ,IAAI,CAAC,WAAW,CAAC,eAAe,CAGjE;CAAG;AAEL;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAEL;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAc,SAAQ,IAAI,CAAC,WAAW,CAAC,eAAe,CAEjE;CAAG"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CollectionService, CollectionServiceLive, makeCollectionServiceLayer } from "./collection-service.js";
|
|
2
|
+
export type { CollectionError } from "./errors.js";
|
|
3
|
+
export { ForbiddenError, NotFoundError, ReadOnlyError, ValidationError } from "./errors.js";
|
|
4
|
+
export type { CursorPage, RequestCtx } from "./context.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collection-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAC9G,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC3F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collection-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAE9G,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ParseResult, Schema } from "effect";
|
|
2
|
+
import type { AnyCollectionDef } from "@gettersethya/mira-client";
|
|
3
|
+
import { ValidationError } from "./errors.js";
|
|
4
|
+
export type InputSchemas = {
|
|
5
|
+
create: Schema.Schema<any, any, never>;
|
|
6
|
+
update: Schema.Schema<any, any, never>;
|
|
7
|
+
};
|
|
8
|
+
export declare function buildInputSchemas(colDef: AnyCollectionDef): InputSchemas;
|
|
9
|
+
export declare function parseErrToValidationError(collection: string): (err: ParseResult.ParseError) => ValidationError;
|
|
10
|
+
//# sourceMappingURL=input-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-schema.d.ts","sourceRoot":"","sources":["../../../src/collection-service/input-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAgD,MAAM,2BAA2B,CAAA;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAO7C,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACvC,CAAA;AAkGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,CAiCxE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,IAClD,KAAK,WAAW,CAAC,UAAU,KAAG,eAAe,CAOtD"}
|