@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,123 @@
|
|
|
1
|
+
import { ParseResult, Schema } from "effect";
|
|
2
|
+
import { ValidationError } from "./errors.js";
|
|
3
|
+
// Fields auto-generated by the system — excluded from all input schemas.
|
|
4
|
+
const GENERATED_FIELDS = new Set(["id", "seqId", "created", "updated"]);
|
|
5
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
6
|
+
function filterAnnotations(kind, errorFn) {
|
|
7
|
+
if (errorFn === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
const msg = errorFn(kind);
|
|
10
|
+
if (msg === undefined)
|
|
11
|
+
return undefined;
|
|
12
|
+
return { message: () => msg };
|
|
13
|
+
}
|
|
14
|
+
function propertyToSchema(prop, fieldDef) {
|
|
15
|
+
const errorFn = fieldDef?.error;
|
|
16
|
+
if (prop["x-kind"] === "literalText") {
|
|
17
|
+
const typeMsg = errorFn?.("type");
|
|
18
|
+
const base = typeMsg !== undefined
|
|
19
|
+
? Schema.String.annotations({ message: () => typeMsg })
|
|
20
|
+
: Schema.String;
|
|
21
|
+
const literalValues = prop["x-literal"];
|
|
22
|
+
if (literalValues && literalValues.length > 0) {
|
|
23
|
+
const literalSet = new Set(literalValues);
|
|
24
|
+
return base.pipe(Schema.filter((a) => literalSet.has(a), filterAnnotations("literal", errorFn)));
|
|
25
|
+
}
|
|
26
|
+
return base;
|
|
27
|
+
}
|
|
28
|
+
if (prop["x-kind"] === "json")
|
|
29
|
+
return Schema.Unknown;
|
|
30
|
+
if (prop["x-kind"] === "date" ||
|
|
31
|
+
prop["x-kind"] === "relation" ||
|
|
32
|
+
prop["x-kind"] === "file")
|
|
33
|
+
return Schema.String;
|
|
34
|
+
if (prop.type === "string") {
|
|
35
|
+
const typeMsg = errorFn?.("type");
|
|
36
|
+
const base = typeMsg !== undefined
|
|
37
|
+
? Schema.String.annotations({ message: () => typeMsg })
|
|
38
|
+
: Schema.String;
|
|
39
|
+
let s = base;
|
|
40
|
+
if (prop.format === "email") {
|
|
41
|
+
s = s.pipe(Schema.pattern(EMAIL_RE, filterAnnotations("email", errorFn)));
|
|
42
|
+
}
|
|
43
|
+
if (prop.minLength !== undefined) {
|
|
44
|
+
s = s.pipe(Schema.minLength(prop.minLength, filterAnnotations("minLength", errorFn)));
|
|
45
|
+
}
|
|
46
|
+
if (prop.maxLength !== undefined) {
|
|
47
|
+
s = s.pipe(Schema.maxLength(prop.maxLength, filterAnnotations("maxLength", errorFn)));
|
|
48
|
+
}
|
|
49
|
+
return s;
|
|
50
|
+
}
|
|
51
|
+
if (prop.type === "integer") {
|
|
52
|
+
const typeMsg = errorFn?.("type");
|
|
53
|
+
const base = typeMsg !== undefined
|
|
54
|
+
? Schema.Number.annotations({ message: () => typeMsg })
|
|
55
|
+
: Schema.Number;
|
|
56
|
+
let s = base.pipe(Schema.int(filterAnnotations("int", errorFn)));
|
|
57
|
+
if (prop.minimum !== undefined) {
|
|
58
|
+
s = s.pipe(Schema.greaterThanOrEqualTo(prop.minimum, filterAnnotations("minimum", errorFn)));
|
|
59
|
+
}
|
|
60
|
+
if (prop.maximum !== undefined) {
|
|
61
|
+
s = s.pipe(Schema.lessThanOrEqualTo(prop.maximum, filterAnnotations("maximum", errorFn)));
|
|
62
|
+
}
|
|
63
|
+
return s;
|
|
64
|
+
}
|
|
65
|
+
if (prop.type === "number") {
|
|
66
|
+
const typeMsg = errorFn?.("type");
|
|
67
|
+
const base = typeMsg !== undefined
|
|
68
|
+
? Schema.Number.annotations({ message: () => typeMsg })
|
|
69
|
+
: Schema.Number;
|
|
70
|
+
let s = base;
|
|
71
|
+
if (prop.minimum !== undefined) {
|
|
72
|
+
s = s.pipe(Schema.greaterThanOrEqualTo(prop.minimum, filterAnnotations("minimum", errorFn)));
|
|
73
|
+
}
|
|
74
|
+
if (prop.maximum !== undefined) {
|
|
75
|
+
s = s.pipe(Schema.lessThanOrEqualTo(prop.maximum, filterAnnotations("maximum", errorFn)));
|
|
76
|
+
}
|
|
77
|
+
return s;
|
|
78
|
+
}
|
|
79
|
+
if (prop.type === "boolean") {
|
|
80
|
+
const typeMsg = errorFn?.("type");
|
|
81
|
+
return typeMsg !== undefined
|
|
82
|
+
? Schema.Boolean.annotations({ message: () => typeMsg })
|
|
83
|
+
: Schema.Boolean;
|
|
84
|
+
}
|
|
85
|
+
return Schema.Unknown;
|
|
86
|
+
}
|
|
87
|
+
export function buildInputSchemas(colDef) {
|
|
88
|
+
const schema = colDef.schema;
|
|
89
|
+
const required = new Set(schema.required ?? []);
|
|
90
|
+
const createFields = {};
|
|
91
|
+
const updateFields = {};
|
|
92
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
93
|
+
if (GENERATED_FIELDS.has(key))
|
|
94
|
+
continue;
|
|
95
|
+
const fieldDef = colDef.fields[key];
|
|
96
|
+
const errorFn = fieldDef?.error;
|
|
97
|
+
const base = propertyToSchema(prop, fieldDef);
|
|
98
|
+
if (required.has(key)) {
|
|
99
|
+
const requiredMsg = errorFn?.("required");
|
|
100
|
+
createFields[key] = requiredMsg !== undefined
|
|
101
|
+
? Schema.propertySignature(base).annotations({ missingMessage: () => requiredMsg })
|
|
102
|
+
: base;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
createFields[key] = Schema.optional(base);
|
|
106
|
+
}
|
|
107
|
+
updateFields[key] = Schema.optional(base);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
create: Schema.Struct(createFields),
|
|
111
|
+
update: Schema.Struct(updateFields)
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function parseErrToValidationError(collection) {
|
|
115
|
+
return (err) => {
|
|
116
|
+
const issues = ParseResult.ArrayFormatter.formatIssueSync(err.issue).map((i) => {
|
|
117
|
+
const prefix = i.path.length > 0 ? `${i.path.join(".")}: ` : "";
|
|
118
|
+
return `${prefix}${i.message}`;
|
|
119
|
+
});
|
|
120
|
+
return new ValidationError({ collection, issues });
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=input-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-schema.js","sourceRoot":"","sources":["../../../src/collection-service/input-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { CollectionSchema } from "@gettersethya/mira-client";
|
|
3
|
+
import type { EnforceResult } from "../rule/enforcer.js";
|
|
4
|
+
import type { RepoRecord, SortOrder, WhereClause } from "../repository/types.js";
|
|
5
|
+
import type { RequestCtx } from "./context.js";
|
|
6
|
+
import { ForbiddenError } from "./errors.js";
|
|
7
|
+
/** Combines two WHERE clauses with AND. Both inputs are trusted internal code. */
|
|
8
|
+
export declare function andWhere(a: WhereClause, b: WhereClause): WhereClause;
|
|
9
|
+
/** Produces a WHERE clause that matches a single record by id. */
|
|
10
|
+
export declare function idClause(id: string): WhereClause;
|
|
11
|
+
/** Produces a WHERE clause for cursor pagination: seqId strictly after the given cursor. */
|
|
12
|
+
export declare function cursorClause(after: number): WhereClause;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves `@auth_<field>` and `@request_<source>_<key>` placeholders produced by the
|
|
15
|
+
* rule compiler into positional `?` params bound from `RequestCtx`.
|
|
16
|
+
*
|
|
17
|
+
* The replacement is done in a single left-to-right pass so that the param array stays
|
|
18
|
+
* in the same order as the `?` placeholders in the resulting SQL.
|
|
19
|
+
*
|
|
20
|
+
* Returns `ForbiddenError` if the rule references auth but `ctx.auth` is absent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveCtxPlaceholders(result: EnforceResult, ctx: RequestCtx, collection: string, action: string): Effect.Effect<{
|
|
23
|
+
sql: string;
|
|
24
|
+
params: unknown[];
|
|
25
|
+
}, ForbiddenError, never>;
|
|
26
|
+
/**
|
|
27
|
+
* Replaces `t.<fieldName>` column references in a WHERE clause with `?` params
|
|
28
|
+
* bound to the corresponding values in `record`.
|
|
29
|
+
*
|
|
30
|
+
* Used for the `create` permission pre-check: `SELECT 1 WHERE <rule>` without a FROM.
|
|
31
|
+
* The replacement is done left-to-right to preserve param ordering with existing `?`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveFieldRefs(clause: WhereClause, record: RepoRecord): WhereClause;
|
|
34
|
+
export declare function buildUserSort(query: RequestCtx["query"], schema: CollectionSchema): SortOrder | null;
|
|
35
|
+
//# sourceMappingURL=where.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/collection-service/where.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAKpE;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAEhD;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;0BAiChH;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CAgBrF;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,gBAAgB,GACvB,SAAS,GAAG,IAAI,CAMlB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { ForbiddenError } from "./errors.js";
|
|
3
|
+
/** Combines two WHERE clauses with AND. Both inputs are trusted internal code. */
|
|
4
|
+
export function andWhere(a, b) {
|
|
5
|
+
return {
|
|
6
|
+
sql: `(${a.sql}) AND (${b.sql})`,
|
|
7
|
+
params: [...a.params, ...b.params]
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** Produces a WHERE clause that matches a single record by id. */
|
|
11
|
+
export function idClause(id) {
|
|
12
|
+
return { sql: "t.id = ?", params: [id] };
|
|
13
|
+
}
|
|
14
|
+
/** Produces a WHERE clause for cursor pagination: seqId strictly after the given cursor. */
|
|
15
|
+
export function cursorClause(after) {
|
|
16
|
+
return { sql: "t.seqId > ?", params: [after] };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolves `@auth_<field>` and `@request_<source>_<key>` placeholders produced by the
|
|
20
|
+
* rule compiler into positional `?` params bound from `RequestCtx`.
|
|
21
|
+
*
|
|
22
|
+
* The replacement is done in a single left-to-right pass so that the param array stays
|
|
23
|
+
* in the same order as the `?` placeholders in the resulting SQL.
|
|
24
|
+
*
|
|
25
|
+
* Returns `ForbiddenError` if the rule references auth but `ctx.auth` is absent.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveCtxPlaceholders(result, ctx, collection, action) {
|
|
28
|
+
return Effect.gen(function* () {
|
|
29
|
+
const needsAuth = /@auth_\w+/.test(result.sql);
|
|
30
|
+
if (needsAuth && ctx.auth === undefined) {
|
|
31
|
+
return yield* new ForbiddenError({ collection, action });
|
|
32
|
+
}
|
|
33
|
+
const resolved = [];
|
|
34
|
+
let pIdx = 0;
|
|
35
|
+
const { params } = result;
|
|
36
|
+
// Single-pass left-to-right replacement preserves param ordering.
|
|
37
|
+
// Groups: (1) @auth field, (2) @request source, (3) @request key
|
|
38
|
+
const newSql = result.sql.replace(/\?|@auth_(\w+)|@request_(\w+)_(\w+)/g, (match, g1, g2, g3) => {
|
|
39
|
+
const authField = typeof g1 === "string" ? g1 : undefined;
|
|
40
|
+
const reqSource = typeof g2 === "string" ? g2 : undefined;
|
|
41
|
+
const reqKey = typeof g3 === "string" ? g3 : undefined;
|
|
42
|
+
if (match === "?") {
|
|
43
|
+
resolved.push(params[pIdx++]);
|
|
44
|
+
}
|
|
45
|
+
else if (authField === "collection") {
|
|
46
|
+
resolved.push(ctx.auth?.collection ?? null);
|
|
47
|
+
}
|
|
48
|
+
else if (authField !== undefined) {
|
|
49
|
+
resolved.push(ctx.auth?.record[authField] ?? null);
|
|
50
|
+
}
|
|
51
|
+
else if (reqSource !== undefined && reqKey !== undefined) {
|
|
52
|
+
const val = reqSource === "query" ? ctx.query[reqKey] : ctx.headers[reqKey];
|
|
53
|
+
resolved.push(Array.isArray(val) ? val[0] : (val ?? null));
|
|
54
|
+
}
|
|
55
|
+
return "?";
|
|
56
|
+
});
|
|
57
|
+
return yield* Effect.succeed({ sql: newSql, params: resolved });
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Replaces `t.<fieldName>` column references in a WHERE clause with `?` params
|
|
62
|
+
* bound to the corresponding values in `record`.
|
|
63
|
+
*
|
|
64
|
+
* Used for the `create` permission pre-check: `SELECT 1 WHERE <rule>` without a FROM.
|
|
65
|
+
* The replacement is done left-to-right to preserve param ordering with existing `?`.
|
|
66
|
+
*/
|
|
67
|
+
export function resolveFieldRefs(clause, record) {
|
|
68
|
+
const resolved = [];
|
|
69
|
+
let pIdx = 0;
|
|
70
|
+
const { params } = clause;
|
|
71
|
+
const newSql = clause.sql.replace(/\?|\bt\.(\w+)\b/g, (_, g1) => {
|
|
72
|
+
const field = typeof g1 === "string" ? g1 : undefined;
|
|
73
|
+
if (field !== undefined) {
|
|
74
|
+
resolved.push(record[field] ?? null);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
resolved.push(params[pIdx++]);
|
|
78
|
+
}
|
|
79
|
+
return "?";
|
|
80
|
+
});
|
|
81
|
+
return { sql: newSql, params: resolved };
|
|
82
|
+
}
|
|
83
|
+
export function buildUserSort(query, schema) {
|
|
84
|
+
const sortField = typeof query["sort"] === "string" ? query["sort"] : null;
|
|
85
|
+
if (sortField === null || !schema.properties[sortField])
|
|
86
|
+
return null;
|
|
87
|
+
const rawOrder = typeof query["order"] === "string" ? query["order"] : null;
|
|
88
|
+
const direction = rawOrder === "desc" ? "desc" : "asc";
|
|
89
|
+
return { field: sortField, direction };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=where.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/collection-service/where.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SqlClient } from "@effect/sql";
|
|
2
|
+
import { CryptoService } from "../crypto/index.js";
|
|
3
|
+
import { Context, Layer } from "effect";
|
|
4
|
+
import type { AppConfigShape } from "./types.js";
|
|
5
|
+
declare const AppConfig_base: Context.TagClass<AppConfig, "AppConfig", AppConfigShape>;
|
|
6
|
+
/**
|
|
7
|
+
* Application configuration tag, backed by the `_config` table in the database.
|
|
8
|
+
*
|
|
9
|
+
* On first boot, seeds default values (including an auto-generated `jwt_secret`)
|
|
10
|
+
* into the `_config` table. Runtime reads go through the database — no env vars
|
|
11
|
+
* or config files are needed for basic operation.
|
|
12
|
+
*
|
|
13
|
+
* Provides access to:
|
|
14
|
+
* - `appName`, `port`, `applicationUrl` — basic server configuration
|
|
15
|
+
* - `jwtSecret` — Redacted JWT signing secret (auto-generated)
|
|
16
|
+
* - `useS3`, `s3Config` — optional S3 storage configuration
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { AppConfig } from "@gettersethya/mira"
|
|
20
|
+
*
|
|
21
|
+
* Effect.gen(function* () {
|
|
22
|
+
* const cfg = yield* AppConfig
|
|
23
|
+
* console.log(cfg.appName, cfg.port)
|
|
24
|
+
* const secret = cfg.jwtSecret // Redacted<string>
|
|
25
|
+
* })
|
|
26
|
+
*
|
|
27
|
+
* @see AppConfigLive — the live layer implementation
|
|
28
|
+
* @see AppConfigShape — the full config shape
|
|
29
|
+
*/
|
|
30
|
+
export declare class AppConfig extends AppConfig_base {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Live layer for `AppConfig`.
|
|
34
|
+
* Seeds the `_config` table on first boot with sensible defaults
|
|
35
|
+
* (including auto-generating `jwt_secret` via CryptoService).
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* Layer.provideMerge(AppConfigLive)
|
|
39
|
+
*
|
|
40
|
+
* @see AppConfig — the service tag
|
|
41
|
+
*/
|
|
42
|
+
export declare const AppConfigLive: Layer.Layer<AppConfig, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError, CryptoService | SqlClient.SqlClient>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAU,KAAK,EAA4B,MAAM,QAAQ,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;;AAO1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,SAAU,SAAQ,cAAqD;CAAG;AAEvF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gJA8DzB,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { SqlClient, SqlSchema } from "@effect/sql";
|
|
2
|
+
import { CryptoService } from "../crypto/index.js";
|
|
3
|
+
import { Context, Effect, Layer, Option, Redacted, Schema } from "effect";
|
|
4
|
+
const ConfigRowSchema = Schema.Struct({
|
|
5
|
+
key: Schema.String,
|
|
6
|
+
value: Schema.String
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Application configuration tag, backed by the `_config` table in the database.
|
|
10
|
+
*
|
|
11
|
+
* On first boot, seeds default values (including an auto-generated `jwt_secret`)
|
|
12
|
+
* into the `_config` table. Runtime reads go through the database — no env vars
|
|
13
|
+
* or config files are needed for basic operation.
|
|
14
|
+
*
|
|
15
|
+
* Provides access to:
|
|
16
|
+
* - `appName`, `port`, `applicationUrl` — basic server configuration
|
|
17
|
+
* - `jwtSecret` — Redacted JWT signing secret (auto-generated)
|
|
18
|
+
* - `useS3`, `s3Config` — optional S3 storage configuration
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* import { AppConfig } from "@gettersethya/mira"
|
|
22
|
+
*
|
|
23
|
+
* Effect.gen(function* () {
|
|
24
|
+
* const cfg = yield* AppConfig
|
|
25
|
+
* console.log(cfg.appName, cfg.port)
|
|
26
|
+
* const secret = cfg.jwtSecret // Redacted<string>
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* @see AppConfigLive — the live layer implementation
|
|
30
|
+
* @see AppConfigShape — the full config shape
|
|
31
|
+
*/
|
|
32
|
+
export class AppConfig extends Context.Tag("AppConfig")() {
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Live layer for `AppConfig`.
|
|
36
|
+
* Seeds the `_config` table on first boot with sensible defaults
|
|
37
|
+
* (including auto-generating `jwt_secret` via CryptoService).
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* Layer.provideMerge(AppConfigLive)
|
|
41
|
+
*
|
|
42
|
+
* @see AppConfig — the service tag
|
|
43
|
+
*/
|
|
44
|
+
export const AppConfigLive = Layer.effect(AppConfig, Effect.gen(function* () {
|
|
45
|
+
const sql = yield* SqlClient.SqlClient;
|
|
46
|
+
// DDL — sql.unsafe is fine for CREATE TABLE
|
|
47
|
+
yield* sql.unsafe(`CREATE TABLE IF NOT EXISTS _config (key TEXT PRIMARY KEY, value TEXT NOT NULL)`);
|
|
48
|
+
const rows = yield* SqlSchema.findAll({
|
|
49
|
+
Request: Schema.Void,
|
|
50
|
+
Result: ConfigRowSchema,
|
|
51
|
+
execute: () => sql `SELECT key, value FROM ${sql("_config")}`
|
|
52
|
+
})(undefined);
|
|
53
|
+
const stored = new Map(rows.map((r) => [r.key, r.value]));
|
|
54
|
+
const seed = (key, defaultValue) => Effect.gen(function* () {
|
|
55
|
+
const existing = stored.get(key);
|
|
56
|
+
if (existing !== undefined)
|
|
57
|
+
return existing;
|
|
58
|
+
yield* sql `INSERT INTO ${sql("_config")} ${sql.insert({ key, value: defaultValue })}`;
|
|
59
|
+
return defaultValue;
|
|
60
|
+
});
|
|
61
|
+
const require = (key) => Effect.fromNullable(stored.get(key)).pipe(Effect.mapError(() => new Error(`_config key "${key}" is required when use_s3=true`)), Effect.orDie);
|
|
62
|
+
const appName = yield* seed("app_name", "mira");
|
|
63
|
+
const port = Number(yield* seed("port", "8080"));
|
|
64
|
+
const applicationUrl = yield* seed("application_url", `http://localhost:${port}`);
|
|
65
|
+
// Generated once on first boot, persisted so tokens survive restarts
|
|
66
|
+
const existingSecret = stored.get("jwt_secret");
|
|
67
|
+
const jwtSecretStr = existingSecret !== undefined
|
|
68
|
+
? existingSecret
|
|
69
|
+
: yield* Effect.gen(function* () {
|
|
70
|
+
const cryptoSvc = yield* CryptoService;
|
|
71
|
+
const generated = Buffer.from(yield* cryptoSvc.randomBytes(48)).toString("hex");
|
|
72
|
+
yield* sql `INSERT INTO ${sql("_config")} ${sql.insert({ key: "jwt_secret", value: generated })}`;
|
|
73
|
+
yield* Effect.logInfo("jwt_secret generated and persisted to _config table.");
|
|
74
|
+
return generated;
|
|
75
|
+
});
|
|
76
|
+
const jwtSecret = Redacted.make(jwtSecretStr);
|
|
77
|
+
const useS3 = (yield* seed("use_s3", "false")) === "true";
|
|
78
|
+
const s3Config = useS3
|
|
79
|
+
? Option.some({
|
|
80
|
+
endpoint: Redacted.make(yield* require("s3_endpoint")),
|
|
81
|
+
bucketName: yield* require("s3_bucket_name"),
|
|
82
|
+
regionName: yield* require("s3_region_name"),
|
|
83
|
+
accessKey: Redacted.make(yield* require("s3_access_key")),
|
|
84
|
+
secret: Redacted.make(yield* require("s3_secret"))
|
|
85
|
+
})
|
|
86
|
+
: Option.none();
|
|
87
|
+
return { appName, port, applicationUrl, jwtSecret, useS3, s3Config };
|
|
88
|
+
}));
|
|
89
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACtD,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Option, Redacted } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Optional S3 storage configuration.
|
|
4
|
+
* Only loaded when `useS3` is true in AppConfig.
|
|
5
|
+
*
|
|
6
|
+
* @see AppConfig.useS3 — whether S3 is enabled
|
|
7
|
+
* @see AppConfig.s3Config — the Option<S3Config>
|
|
8
|
+
*/
|
|
9
|
+
export interface S3Config {
|
|
10
|
+
readonly endpoint: Redacted.Redacted<string>;
|
|
11
|
+
readonly bucketName: string;
|
|
12
|
+
readonly regionName: string;
|
|
13
|
+
readonly accessKey: Redacted.Redacted<string>;
|
|
14
|
+
readonly secret: Redacted.Redacted<string>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Shape of the application configuration stored in the `_config` DB table.
|
|
18
|
+
*
|
|
19
|
+
* @see AppConfig — the Context.Tag that provides this
|
|
20
|
+
*/
|
|
21
|
+
export interface AppConfigShape {
|
|
22
|
+
readonly appName: string;
|
|
23
|
+
readonly port: number;
|
|
24
|
+
readonly applicationUrl: string;
|
|
25
|
+
readonly jwtSecret: Redacted.Redacted<string>;
|
|
26
|
+
readonly useS3: boolean;
|
|
27
|
+
readonly s3Config: Option.Option<S3Config>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
declare const CryptoService_base: Context.TagClass<CryptoService, "CryptoService", {
|
|
3
|
+
/** Synchronous variant — for use in callbacks that cannot yield an Effect. */
|
|
4
|
+
randomBytesSync(size: number): Uint8Array;
|
|
5
|
+
randomBytes(size: number): Effect.Effect<Uint8Array>;
|
|
6
|
+
randomUUID(): Effect.Effect<string>;
|
|
7
|
+
}>;
|
|
8
|
+
export declare class CryptoService extends CryptoService_base {
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;IAKpC,8EAA8E;0BACxD,MAAM,GAAG,UAAU;sBACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;kBACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;;AANvC,qBAAa,aAAc,SAAQ,kBAQhC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/crypto/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,QAAQ,CAAA;AAExC,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAQ5D;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/crypto/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,eAAO,MAAM,eAAe,0CAO3B,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as nodeCrypto from "node:crypto";
|
|
2
|
+
import { Effect, Layer } from "effect";
|
|
3
|
+
import { CryptoService } from "./crypto.js";
|
|
4
|
+
export const NodeCryptoLayer = Layer.succeed(CryptoService, CryptoService.of({
|
|
5
|
+
randomBytesSync: (size) => nodeCrypto.randomBytes(size),
|
|
6
|
+
randomBytes: (size) => Effect.sync(() => nodeCrypto.randomBytes(size)),
|
|
7
|
+
randomUUID: () => Effect.sync(() => nodeCrypto.randomUUID())
|
|
8
|
+
}));
|
|
9
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/crypto/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAC1C,aAAa,EACb,aAAa,CAAC,EAAE,CAAC;IACf,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;IACvD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;CAC7D,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/databases/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/databases/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MiraDatabase } from "../app/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* SQLite database preset using `@effect/sql-sqlite-node`.
|
|
4
|
+
*
|
|
5
|
+
* Creates a `MiraDatabase` that provides both the SQLite `SqlClient`
|
|
6
|
+
* and the `Dialect` (for schema generation). The layer uses `Layer.orDie`
|
|
7
|
+
* to convert `ConfigError` into a runtime panic — if the config is wrong,
|
|
8
|
+
* the server should not start.
|
|
9
|
+
*
|
|
10
|
+
* @param config.filename - Path to the SQLite database file (use `":memory:"` for testing)
|
|
11
|
+
* @returns A MiraDatabase preset
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* Mira.builder()
|
|
15
|
+
* .database(SqliteDatabase({ filename: "data.db" }))
|
|
16
|
+
* // or for testing:
|
|
17
|
+
* .database(SqliteDatabase({ filename: ":memory:" }))
|
|
18
|
+
*
|
|
19
|
+
* @see MiraDatabase — the interface SqliteDatabase implements
|
|
20
|
+
*/
|
|
21
|
+
export declare const SqliteDatabase: (config: {
|
|
22
|
+
filename: string;
|
|
23
|
+
}) => MiraDatabase;
|
|
24
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/databases/sqlite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KAAG,YAK5D,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SqliteClient } from "@effect/sql-sqlite-node";
|
|
2
|
+
import { Layer } from "effect";
|
|
3
|
+
import { Dialect } from "../migrator/dialect.js";
|
|
4
|
+
import { sqliteDialect } from "../migrator/dialect-sqlite.js";
|
|
5
|
+
/**
|
|
6
|
+
* SQLite database preset using `@effect/sql-sqlite-node`.
|
|
7
|
+
*
|
|
8
|
+
* Creates a `MiraDatabase` that provides both the SQLite `SqlClient`
|
|
9
|
+
* and the `Dialect` (for schema generation). The layer uses `Layer.orDie`
|
|
10
|
+
* to convert `ConfigError` into a runtime panic — if the config is wrong,
|
|
11
|
+
* the server should not start.
|
|
12
|
+
*
|
|
13
|
+
* @param config.filename - Path to the SQLite database file (use `":memory:"` for testing)
|
|
14
|
+
* @returns A MiraDatabase preset
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* Mira.builder()
|
|
18
|
+
* .database(SqliteDatabase({ filename: "data.db" }))
|
|
19
|
+
* // or for testing:
|
|
20
|
+
* .database(SqliteDatabase({ filename: ":memory:" }))
|
|
21
|
+
*
|
|
22
|
+
* @see MiraDatabase — the interface SqliteDatabase implements
|
|
23
|
+
*/
|
|
24
|
+
export const SqliteDatabase = (config) => ({
|
|
25
|
+
layer: Layer.mergeAll(SqliteClient.layer({ filename: config.filename }).pipe(Layer.orDie), Layer.succeed(Dialect, sqliteDialect)),
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/databases/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAG5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA4B,EAAgB,EAAE,CAAC,CAAC;IAC7E,KAAK,EAAE,KAAK,CAAC,QAAQ,CACnB,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EACnE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CACtC;CACF,CAAC,CAAA"}
|