@sixthsummit/ship-api 0.0.0-stage → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +605 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +58 -2
- package/cli/commands/add.js +537 -0
- package/cli/commands/contract.js +2 -0
- package/cli/commands/create.js +250 -0
- package/cli/commands/dev.js +227 -0
- package/cli/commands/doctor.js +286 -0
- package/cli/commands/generate.js +937 -0
- package/cli/commands/graph.js +2 -0
- package/cli/commands/migrate-orm.js +1171 -0
- package/cli/commands/update.js +37 -0
- package/cli/ship-api.js +285 -0
- package/lib/app/auth/AuthProvider.d.ts +91 -0
- package/lib/app/auth/AuthProvider.d.ts.map +1 -0
- package/lib/app/auth/AuthProvider.js +13 -0
- package/lib/app/auth/AuthProvider.js.map +1 -0
- package/lib/app/auth/adapters/firebase.d.ts +79 -0
- package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
- package/lib/app/auth/adapters/firebase.js +122 -0
- package/lib/app/auth/adapters/firebase.js.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.js +120 -0
- package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
- package/lib/app/auth/index.d.ts +8 -0
- package/lib/app/auth/index.d.ts.map +1 -0
- package/lib/app/auth/index.js +7 -0
- package/lib/app/auth/index.js.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.js +127 -0
- package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.js +118 -0
- package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
- package/lib/app/auth/permissionDefinition.d.ts +20 -0
- package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
- package/lib/app/auth/permissionDefinition.js +2 -0
- package/lib/app/auth/permissionDefinition.js.map +1 -0
- package/lib/app/context/RequestContext.d.ts +59 -0
- package/lib/app/context/RequestContext.d.ts.map +1 -0
- package/lib/app/context/RequestContext.js +25 -0
- package/lib/app/context/RequestContext.js.map +1 -0
- package/lib/app/db/QueryOptions.d.ts +82 -0
- package/lib/app/db/QueryOptions.d.ts.map +1 -0
- package/lib/app/db/QueryOptions.js +37 -0
- package/lib/app/db/QueryOptions.js.map +1 -0
- package/lib/app/db/baseFields.d.ts +60 -0
- package/lib/app/db/baseFields.d.ts.map +1 -0
- package/lib/app/db/baseFields.js +54 -0
- package/lib/app/db/baseFields.js.map +1 -0
- package/lib/app/db/buildWhere.d.ts +22 -0
- package/lib/app/db/buildWhere.d.ts.map +1 -0
- package/lib/app/db/buildWhere.js +75 -0
- package/lib/app/db/buildWhere.js.map +1 -0
- package/lib/app/db/client.d.ts +111 -0
- package/lib/app/db/client.d.ts.map +1 -0
- package/lib/app/db/client.js +99 -0
- package/lib/app/db/client.js.map +1 -0
- package/lib/app/db/tenantScoped.d.ts +59 -0
- package/lib/app/db/tenantScoped.d.ts.map +1 -0
- package/lib/app/db/tenantScoped.js +54 -0
- package/lib/app/db/tenantScoped.js.map +1 -0
- package/lib/app/db/transaction.d.ts +58 -0
- package/lib/app/db/transaction.d.ts.map +1 -0
- package/lib/app/db/transaction.js +106 -0
- package/lib/app/db/transaction.js.map +1 -0
- package/lib/app/health/HealthCheck.d.ts +121 -0
- package/lib/app/health/HealthCheck.d.ts.map +1 -0
- package/lib/app/health/HealthCheck.js +151 -0
- package/lib/app/health/HealthCheck.js.map +1 -0
- package/lib/app/health/redisHealthCheck.d.ts +14 -0
- package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
- package/lib/app/health/redisHealthCheck.js +21 -0
- package/lib/app/health/redisHealthCheck.js.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.js +99 -0
- package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
- package/lib/app/registry/routes.d.ts +89 -0
- package/lib/app/registry/routes.d.ts.map +1 -0
- package/lib/app/registry/routes.js +72 -0
- package/lib/app/registry/routes.js.map +1 -0
- package/lib/app/services/DrizzleEntityService.d.ts +123 -0
- package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
- package/lib/app/services/DrizzleEntityService.js +342 -0
- package/lib/app/services/DrizzleEntityService.js.map +1 -0
- package/lib/app/services/RedisProvider.d.ts +52 -0
- package/lib/app/services/RedisProvider.d.ts.map +1 -0
- package/lib/app/services/RedisProvider.js +75 -0
- package/lib/app/services/RedisProvider.js.map +1 -0
- package/lib/app/services/cache/Cache.d.ts +70 -0
- package/lib/app/services/cache/Cache.d.ts.map +1 -0
- package/lib/app/services/cache/Cache.js +18 -0
- package/lib/app/services/cache/Cache.js.map +1 -0
- package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
- package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
- package/lib/app/services/cache/InMemoryCache.js +76 -0
- package/lib/app/services/cache/InMemoryCache.js.map +1 -0
- package/lib/app/services/cache/RedisCache.d.ts +99 -0
- package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
- package/lib/app/services/cache/RedisCache.js +150 -0
- package/lib/app/services/cache/RedisCache.js.map +1 -0
- package/lib/app/services/cache/cached.d.ts +30 -0
- package/lib/app/services/cache/cached.d.ts.map +1 -0
- package/lib/app/services/cache/cached.js +38 -0
- package/lib/app/services/cache/cached.js.map +1 -0
- package/lib/app/services/cache/index.d.ts +5 -0
- package/lib/app/services/cache/index.d.ts.map +1 -0
- package/lib/app/services/cache/index.js +4 -0
- package/lib/app/services/cache/index.js.map +1 -0
- package/lib/app/services/cron/defineCron.d.ts +57 -0
- package/lib/app/services/cron/defineCron.d.ts.map +1 -0
- package/lib/app/services/cron/defineCron.js +15 -0
- package/lib/app/services/cron/defineCron.js.map +1 -0
- package/lib/app/services/cron/index.d.ts +2 -0
- package/lib/app/services/cron/index.d.ts.map +1 -0
- package/lib/app/services/cron/index.js +2 -0
- package/lib/app/services/cron/index.js.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.js +85 -0
- package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
- package/lib/app/services/jobs/JobsManager.d.ts +67 -0
- package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
- package/lib/app/services/jobs/JobsManager.js +121 -0
- package/lib/app/services/jobs/JobsManager.js.map +1 -0
- package/lib/app/services/jobs/bullBoard.d.ts +72 -0
- package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
- package/lib/app/services/jobs/bullBoard.js +96 -0
- package/lib/app/services/jobs/bullBoard.js.map +1 -0
- package/lib/app/services/jobs/defineJob.d.ts +81 -0
- package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
- package/lib/app/services/jobs/defineJob.js +49 -0
- package/lib/app/services/jobs/defineJob.js.map +1 -0
- package/lib/app/services/jobs/index.d.ts +4 -0
- package/lib/app/services/jobs/index.d.ts.map +1 -0
- package/lib/app/services/jobs/index.js +4 -0
- package/lib/app/services/jobs/index.js.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/index.d.ts +4 -0
- package/lib/app/services/rateLimit/index.d.ts.map +1 -0
- package/lib/app/services/rateLimit/index.js +3 -0
- package/lib/app/services/rateLimit/index.js.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
- package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
- package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.js +162 -0
- package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
- package/lib/app/services/storage/StorageService.d.ts +88 -0
- package/lib/app/services/storage/StorageService.d.ts.map +1 -0
- package/lib/app/services/storage/StorageService.js +18 -0
- package/lib/app/services/storage/StorageService.js.map +1 -0
- package/lib/app/services/storage/index.d.ts +5 -0
- package/lib/app/services/storage/index.d.ts.map +1 -0
- package/lib/app/services/storage/index.js +4 -0
- package/lib/app/services/storage/index.js.map +1 -0
- package/lib/app/utils/ContextValidators.d.ts +46 -0
- package/lib/app/utils/ContextValidators.d.ts.map +1 -0
- package/lib/app/utils/ContextValidators.js +81 -0
- package/lib/app/utils/ContextValidators.js.map +1 -0
- package/lib/app/utils/defineEnv.d.ts +80 -0
- package/lib/app/utils/defineEnv.d.ts.map +1 -0
- package/lib/app/utils/defineEnv.js +95 -0
- package/lib/app/utils/defineEnv.js.map +1 -0
- package/lib/client.d.ts +139 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +98 -0
- package/lib/client.js.map +1 -0
- package/lib/contract/application.d.ts +3 -0
- package/lib/contract/application.d.ts.map +1 -0
- package/lib/contract/application.js +2 -0
- package/lib/contract/application.js.map +1 -0
- package/lib/contract/client.d.ts +3 -0
- package/lib/contract/client.d.ts.map +1 -0
- package/lib/contract/client.js +3 -0
- package/lib/contract/client.js.map +1 -0
- package/lib/contract/index.d.ts +3 -0
- package/lib/contract/index.d.ts.map +1 -0
- package/lib/contract/index.js +3 -0
- package/lib/contract/index.js.map +1 -0
- package/lib/contract/manifest.d.ts +3 -0
- package/lib/contract/manifest.d.ts.map +1 -0
- package/lib/contract/manifest.js +2 -0
- package/lib/contract/manifest.js.map +1 -0
- package/lib/contract/openapi.d.ts +3 -0
- package/lib/contract/openapi.d.ts.map +1 -0
- package/lib/contract/openapi.js +3 -0
- package/lib/contract/openapi.js.map +1 -0
- package/lib/contract/project.d.ts +3 -0
- package/lib/contract/project.d.ts.map +1 -0
- package/lib/contract/project.js +3 -0
- package/lib/contract/project.js.map +1 -0
- package/lib/contract/schema.d.ts +3 -0
- package/lib/contract/schema.d.ts.map +1 -0
- package/lib/contract/schema.js +3 -0
- package/lib/contract/schema.js.map +1 -0
- package/lib/drizzle/index.d.ts +3 -0
- package/lib/drizzle/index.d.ts.map +1 -0
- package/lib/drizzle/index.js +3 -0
- package/lib/drizzle/index.js.map +1 -0
- package/lib/hono/auth.d.ts +6 -0
- package/lib/hono/auth.d.ts.map +1 -0
- package/lib/hono/auth.js +54 -0
- package/lib/hono/auth.js.map +1 -0
- package/lib/hono/index.d.ts +4 -0
- package/lib/hono/index.d.ts.map +1 -0
- package/lib/hono/index.js +4 -0
- package/lib/hono/index.js.map +1 -0
- package/lib/http/app/createApp.d.ts +132 -0
- package/lib/http/app/createApp.d.ts.map +1 -0
- package/lib/http/app/createApp.js +215 -0
- package/lib/http/app/createApp.js.map +1 -0
- package/lib/http/app/devRoutes.d.ts +31 -0
- package/lib/http/app/devRoutes.d.ts.map +1 -0
- package/lib/http/app/devRoutes.js +145 -0
- package/lib/http/app/devRoutes.js.map +1 -0
- package/lib/http/app/errors.d.ts +45 -0
- package/lib/http/app/errors.d.ts.map +1 -0
- package/lib/http/app/errors.js +93 -0
- package/lib/http/app/errors.js.map +1 -0
- package/lib/http/app/health.d.ts +66 -0
- package/lib/http/app/health.d.ts.map +1 -0
- package/lib/http/app/health.js +104 -0
- package/lib/http/app/health.js.map +1 -0
- package/lib/http/errors/AppError.d.ts +10 -0
- package/lib/http/errors/AppError.d.ts.map +1 -0
- package/lib/http/errors/AppError.js +19 -0
- package/lib/http/errors/AppError.js.map +1 -0
- package/lib/http/errors/AuthenticationError.d.ts +8 -0
- package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
- package/lib/http/errors/AuthenticationError.js +10 -0
- package/lib/http/errors/AuthenticationError.js.map +1 -0
- package/lib/http/errors/AuthorizationError.d.ts +8 -0
- package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
- package/lib/http/errors/AuthorizationError.js +10 -0
- package/lib/http/errors/AuthorizationError.js.map +1 -0
- package/lib/http/errors/BadRequestError.d.ts +8 -0
- package/lib/http/errors/BadRequestError.d.ts.map +1 -0
- package/lib/http/errors/BadRequestError.js +10 -0
- package/lib/http/errors/BadRequestError.js.map +1 -0
- package/lib/http/errors/ConflictError.d.ts +8 -0
- package/lib/http/errors/ConflictError.d.ts.map +1 -0
- package/lib/http/errors/ConflictError.js +10 -0
- package/lib/http/errors/ConflictError.js.map +1 -0
- package/lib/http/errors/InternalServerError.d.ts +8 -0
- package/lib/http/errors/InternalServerError.d.ts.map +1 -0
- package/lib/http/errors/InternalServerError.js +10 -0
- package/lib/http/errors/InternalServerError.js.map +1 -0
- package/lib/http/errors/NotFoundError.d.ts +8 -0
- package/lib/http/errors/NotFoundError.d.ts.map +1 -0
- package/lib/http/errors/NotFoundError.js +10 -0
- package/lib/http/errors/NotFoundError.js.map +1 -0
- package/lib/http/errors/RateLimitError.d.ts +13 -0
- package/lib/http/errors/RateLimitError.d.ts.map +1 -0
- package/lib/http/errors/RateLimitError.js +16 -0
- package/lib/http/errors/RateLimitError.js.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.js +10 -0
- package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
- package/lib/http/errors/ValidationError.d.ts +9 -0
- package/lib/http/errors/ValidationError.d.ts.map +1 -0
- package/lib/http/errors/ValidationError.js +12 -0
- package/lib/http/errors/ValidationError.js.map +1 -0
- package/lib/http/errors/index.d.ts +11 -0
- package/lib/http/errors/index.d.ts.map +1 -0
- package/lib/http/errors/index.js +12 -0
- package/lib/http/errors/index.js.map +1 -0
- package/lib/http/middleware/apiKey.d.ts +9 -0
- package/lib/http/middleware/apiKey.d.ts.map +1 -0
- package/lib/http/middleware/apiKey.js +71 -0
- package/lib/http/middleware/apiKey.js.map +1 -0
- package/lib/http/middleware/csrf.d.ts +63 -0
- package/lib/http/middleware/csrf.d.ts.map +1 -0
- package/lib/http/middleware/csrf.js +169 -0
- package/lib/http/middleware/csrf.js.map +1 -0
- package/lib/http/middleware/httpLogger.d.ts +39 -0
- package/lib/http/middleware/httpLogger.d.ts.map +1 -0
- package/lib/http/middleware/httpLogger.js +118 -0
- package/lib/http/middleware/httpLogger.js.map +1 -0
- package/lib/http/middleware/idempotency.d.ts +48 -0
- package/lib/http/middleware/idempotency.d.ts.map +1 -0
- package/lib/http/middleware/idempotency.js +180 -0
- package/lib/http/middleware/idempotency.js.map +1 -0
- package/lib/http/middleware/rateLimit.d.ts +105 -0
- package/lib/http/middleware/rateLimit.d.ts.map +1 -0
- package/lib/http/middleware/rateLimit.js +84 -0
- package/lib/http/middleware/rateLimit.js.map +1 -0
- package/lib/http/middleware/requireAuth.d.ts +58 -0
- package/lib/http/middleware/requireAuth.d.ts.map +1 -0
- package/lib/http/middleware/requireAuth.js +63 -0
- package/lib/http/middleware/requireAuth.js.map +1 -0
- package/lib/http/middleware/requirePermission.d.ts +23 -0
- package/lib/http/middleware/requirePermission.d.ts.map +1 -0
- package/lib/http/middleware/requirePermission.js +50 -0
- package/lib/http/middleware/requirePermission.js.map +1 -0
- package/lib/http/middleware/resolveTenant.d.ts +41 -0
- package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
- package/lib/http/middleware/resolveTenant.js +17 -0
- package/lib/http/middleware/resolveTenant.js.map +1 -0
- package/lib/http/streaming/sse.d.ts +31 -0
- package/lib/http/streaming/sse.d.ts.map +1 -0
- package/lib/http/streaming/sse.js +11 -0
- package/lib/http/streaming/sse.js.map +1 -0
- package/lib/http/streaming/streamLLM.d.ts +94 -0
- package/lib/http/streaming/streamLLM.d.ts.map +1 -0
- package/lib/http/streaming/streamLLM.js +94 -0
- package/lib/http/streaming/streamLLM.js.map +1 -0
- package/lib/http/utils/authCookies.d.ts +74 -0
- package/lib/http/utils/authCookies.d.ts.map +1 -0
- package/lib/http/utils/authCookies.js +102 -0
- package/lib/http/utils/authCookies.js.map +1 -0
- package/lib/http/utils/clientIp.d.ts +85 -0
- package/lib/http/utils/clientIp.d.ts.map +1 -0
- package/lib/http/utils/clientIp.js +249 -0
- package/lib/http/utils/clientIp.js.map +1 -0
- package/lib/http/utils/index.d.ts +4 -0
- package/lib/http/utils/index.d.ts.map +1 -0
- package/lib/http/utils/index.js +5 -0
- package/lib/http/utils/index.js.map +1 -0
- package/lib/http/utils/metaTags.d.ts +49 -0
- package/lib/http/utils/metaTags.d.ts.map +1 -0
- package/lib/http/utils/metaTags.js +32 -0
- package/lib/http/utils/metaTags.js.map +1 -0
- package/lib/http/utils/publicSuffix.d.ts +34 -0
- package/lib/http/utils/publicSuffix.d.ts.map +1 -0
- package/lib/http/utils/publicSuffix.js +276 -0
- package/lib/http/utils/publicSuffix.js.map +1 -0
- package/lib/http/utils/uploads.d.ts +92 -0
- package/lib/http/utils/uploads.d.ts.map +1 -0
- package/lib/http/utils/uploads.js +126 -0
- package/lib/http/utils/uploads.js.map +1 -0
- package/lib/http/utils/validate.d.ts +41 -0
- package/lib/http/utils/validate.d.ts.map +1 -0
- package/lib/http/utils/validate.js +55 -0
- package/lib/http/utils/validate.js.map +1 -0
- package/lib/http/utils/webhooks.d.ts +63 -0
- package/lib/http/utils/webhooks.d.ts.map +1 -0
- package/lib/http/utils/webhooks.js +133 -0
- package/lib/http/utils/webhooks.js.map +1 -0
- package/lib/http/ws/auth.d.ts +46 -0
- package/lib/http/ws/auth.d.ts.map +1 -0
- package/lib/http/ws/auth.js +123 -0
- package/lib/http/ws/auth.js.map +1 -0
- package/lib/index.d.ts +80 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +61 -0
- package/lib/index.js.map +1 -0
- package/lib/kernel/index.d.ts +3 -0
- package/lib/kernel/index.d.ts.map +1 -0
- package/lib/kernel/index.js +3 -0
- package/lib/kernel/index.js.map +1 -0
- package/lib/libraries/.gitkeep +0 -0
- package/lib/libraries/ai/CHANGELOG.md +17 -0
- package/lib/libraries/ai/README.md +164 -0
- package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
- package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
- package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
- package/lib/libraries/ai/experimental/index.ts +20 -0
- package/lib/libraries/ai/index.ts +128 -0
- package/lib/libraries/ai/library.json +19 -0
- package/lib/libraries/ai/loop/agentLoop.ts +377 -0
- package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
- package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
- package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
- package/lib/libraries/ai/structured/completeStructured.ts +143 -0
- package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
- package/lib/libraries/ai/tools/defineTool.ts +208 -0
- package/lib/libraries/ai/types.ts +260 -0
- package/lib/libraries/chunking/ChunkingService.ts +103 -0
- package/lib/libraries/chunking/README.md +104 -0
- package/lib/libraries/chunking/docs/api-reference.md +549 -0
- package/lib/libraries/chunking/docs/best-practices.md +321 -0
- package/lib/libraries/chunking/docs/code-organization.md +538 -0
- package/lib/libraries/chunking/docs/configuration.md +418 -0
- package/lib/libraries/chunking/docs/index.md +236 -0
- package/lib/libraries/chunking/docs/quick-start.md +298 -0
- package/lib/libraries/chunking/docs/strategies.md +407 -0
- package/lib/libraries/chunking/docs/summary.md +258 -0
- package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
- package/lib/libraries/chunking/index.ts +17 -0
- package/lib/libraries/chunking/library.json +16 -0
- package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
- package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
- package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
- package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
- package/lib/libraries/chunking/types/index.ts +63 -0
- package/lib/libraries/email/EmailService.ts +591 -0
- package/lib/libraries/email/README.md +777 -0
- package/lib/libraries/email/TemplateRegistry.ts +148 -0
- package/lib/libraries/email/TemplateRenderer.ts +273 -0
- package/lib/libraries/email/index.ts +4 -0
- package/lib/libraries/email/initializeEmailService.ts +60 -0
- package/lib/libraries/email/library.json +12 -0
- package/lib/libraries/email/types/EmailAddress.ts +4 -0
- package/lib/libraries/email/types/EmailAttachment.ts +11 -0
- package/lib/libraries/email/types/EmailTag.ts +9 -0
- package/lib/libraries/email/types/EmailTemplate.ts +124 -0
- package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
- package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
- package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
- package/lib/libraries/email/types/SendEmailResult.ts +9 -0
- package/lib/libraries/email/types/index.ts +8 -0
- package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
- package/lib/libraries/weaviate/README.md +284 -0
- package/lib/libraries/weaviate/Weaviate.ts +1419 -0
- package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
- package/lib/libraries/weaviate/docs/.gitkeep +1 -0
- package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
- package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
- package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
- package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
- package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
- package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
- package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
- package/lib/libraries/weaviate/docs/README.md +269 -0
- package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
- package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
- package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
- package/lib/libraries/weaviate/errors/index.ts +1 -0
- package/lib/libraries/weaviate/index.ts +35 -0
- package/lib/libraries/weaviate/library.json +26 -0
- package/lib/libraries/weaviate/plugins/index.ts +2 -0
- package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
- package/lib/libraries/weaviate/schemas/index.ts +2 -0
- package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
- package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
- package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
- package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
- package/lib/libraries/weaviate/types/Plugin.ts +17 -0
- package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
- package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
- package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
- package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
- package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
- package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
- package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
- package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
- package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
- package/lib/libraries/weaviate/types/index.ts +29 -0
- package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
- package/lib/modules/accounts/index.ts +47 -0
- package/lib/modules/accounts/module.json +15 -0
- package/lib/modules/accounts/permissions.ts +33 -0
- package/lib/modules/accounts/routes.ts +200 -0
- package/lib/modules/accounts/schema.ts +219 -0
- package/lib/modules/accounts/services/AccountService.ts +44 -0
- package/lib/modules/accounts/validation/schemas.ts +70 -0
- package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
- package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
- package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
- package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
- package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
- package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
- package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
- package/lib/modules/oauth/index.ts +79 -0
- package/lib/modules/oauth/module.json +23 -0
- package/lib/modules/oauth/permissions.ts +39 -0
- package/lib/modules/oauth/routes.ts +497 -0
- package/lib/modules/oauth/schema.ts +127 -0
- package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
- package/lib/modules/oauth/state.ts +234 -0
- package/lib/modules/oauth/stateJtiCache.ts +85 -0
- package/lib/modules/oauth/verifyIdToken.ts +178 -0
- package/lib/modules/outbox/EventEmitter.ts +106 -0
- package/lib/modules/outbox/OutboxDrainer.ts +163 -0
- package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
- package/lib/modules/outbox/index.ts +43 -0
- package/lib/modules/outbox/module.json +15 -0
- package/lib/modules/outbox/permissions.ts +36 -0
- package/lib/modules/outbox/routes.ts +219 -0
- package/lib/modules/outbox/schema.ts +207 -0
- package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
- package/lib/observability/logger.d.ts +30 -0
- package/lib/observability/logger.d.ts.map +1 -0
- package/lib/observability/logger.js +110 -0
- package/lib/observability/logger.js.map +1 -0
- package/lib/observability/metrics.d.ts +3 -0
- package/lib/observability/metrics.d.ts.map +1 -0
- package/lib/observability/metrics.js +3 -0
- package/lib/observability/metrics.js.map +1 -0
- package/lib/observability/otel.d.ts +3 -0
- package/lib/observability/otel.d.ts.map +1 -0
- package/lib/observability/otel.js +3 -0
- package/lib/observability/otel.js.map +1 -0
- package/lib/observability/safeErrorFields.d.ts +14 -0
- package/lib/observability/safeErrorFields.d.ts.map +1 -0
- package/lib/observability/safeErrorFields.js +14 -0
- package/lib/observability/safeErrorFields.js.map +1 -0
- package/lib/observability/tracing.d.ts +3 -0
- package/lib/observability/tracing.d.ts.map +1 -0
- package/lib/observability/tracing.js +3 -0
- package/lib/observability/tracing.js.map +1 -0
- package/lib/package.json +4 -0
- package/lib/testing.d.ts +3 -0
- package/lib/testing.d.ts.map +1 -0
- package/lib/testing.js +3 -0
- package/lib/testing.js.map +1 -0
- package/package.json +193 -3
- package/templates/default/.claude/agents/qa-brief.md +106 -0
- package/templates/default/.claude/commands/sherpa-brief.md +23 -0
- package/templates/default/.cursor/rules/api.mdc +80 -0
- package/templates/default/.cursor/rules/commits.mdc +88 -0
- package/templates/default/.cursor/rules/security.mdc +92 -0
- package/templates/default/.cursor/rules/testing.mdc +123 -0
- package/templates/default/.cursor/rules/typescript.mdc +86 -0
- package/templates/default/.env.example +79 -0
- package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
- package/templates/default/AGENTS.md +166 -0
- package/templates/default/CLAUDE.md +17 -0
- package/templates/default/README.md +97 -0
- package/templates/default/_gitignore +27 -0
- package/templates/default/docker-compose.yml +83 -0
- package/templates/default/drizzle.config.ts +34 -0
- package/templates/default/eslint.config.mjs +106 -0
- package/templates/default/package.json +57 -0
- package/templates/default/ship-api.config.ts +21 -0
- package/templates/default/src/client.ts +34 -0
- package/templates/default/src/config/modules.ts +23 -0
- package/templates/default/src/db/schema.ts +26 -0
- package/templates/default/src/environment.ts +81 -0
- package/templates/default/src/index.test.ts +53 -0
- package/templates/default/src/index.ts +11 -0
- package/templates/default/src/instrumentation.ts +13 -0
- package/templates/default/src/server.ts +90 -0
- package/templates/default/tsconfig.json +24 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
import fs from "fs/promises";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Install npm dependencies
|
|
12
|
+
* Supports two formats:
|
|
13
|
+
* - Array of package names: ["lodash", "uuid"] (installs latest version)
|
|
14
|
+
* - Object with versions: {"lodash": "^4.17.21", "uuid": "^9.0.0"}
|
|
15
|
+
*
|
|
16
|
+
* @param {string[] | Record<string, string>} npmDependencies - Dependencies to install
|
|
17
|
+
* @param {string} projectPath - Path to the project
|
|
18
|
+
*/
|
|
19
|
+
async function installNpmDependencies(npmDependencies, projectPath) {
|
|
20
|
+
if (!npmDependencies) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let packages;
|
|
25
|
+
|
|
26
|
+
if (Array.isArray(npmDependencies)) {
|
|
27
|
+
// Array format: ["lodash", "uuid"]
|
|
28
|
+
if (npmDependencies.length === 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
packages = npmDependencies.join(" ");
|
|
32
|
+
} else if (typeof npmDependencies === "object") {
|
|
33
|
+
// Object format: {"lodash": "^4.17.21"}
|
|
34
|
+
if (Object.keys(npmDependencies).length === 0) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
packages = Object.entries(npmDependencies)
|
|
38
|
+
.map(([name, version]) => `${name}@${version}`)
|
|
39
|
+
.join(" ");
|
|
40
|
+
} else {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.log(chalk.blue(`📦 Installing npm dependencies...`));
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
execSync(`npm install ${packages}`, {
|
|
48
|
+
cwd: projectPath,
|
|
49
|
+
stdio: "inherit",
|
|
50
|
+
});
|
|
51
|
+
console.log(chalk.green(`✅ Dependencies installed successfully`));
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error(chalk.red(`❌ Failed to install dependencies: ${error.message}`));
|
|
54
|
+
console.log(chalk.yellow(`\nYou can install them manually:`));
|
|
55
|
+
console.log(chalk.yellow(` npm install ${packages}`));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function addModule(moduleName, options, _installedDeps = new Set()) {
|
|
60
|
+
// Track installed dependencies to prevent circular installs
|
|
61
|
+
if (_installedDeps.has(moduleName)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
console.log(chalk.blue(`📦 Adding module: ${moduleName}`));
|
|
66
|
+
|
|
67
|
+
const projectPath = process.cwd();
|
|
68
|
+
|
|
69
|
+
// Check if we're in a ShipAPI project
|
|
70
|
+
const packageJsonPath = path.join(projectPath, "package.json");
|
|
71
|
+
try {
|
|
72
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
|
|
73
|
+
if (!packageJson.dependencies?.["@sixthsummit/ship-api"]) {
|
|
74
|
+
throw new Error("Not a ShipAPI project. Run this command from your project root.");
|
|
75
|
+
}
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error.code === "ENOENT") {
|
|
78
|
+
throw new Error("No package.json found. Run this command from your project root.");
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Find the module in the modules directory
|
|
84
|
+
// In development, modules are at ../../modules relative to cli/commands
|
|
85
|
+
// When published, modules are copied to lib/modules
|
|
86
|
+
let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
|
|
87
|
+
|
|
88
|
+
// Check if we're running from the published package (lib/modules exists)
|
|
89
|
+
const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
|
|
90
|
+
try {
|
|
91
|
+
await fs.access(libModulesDir);
|
|
92
|
+
modulesDir = libModulesDir;
|
|
93
|
+
} catch {
|
|
94
|
+
// Use the repo modules directory
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const moduleSourcePath = path.join(modulesDir, moduleName);
|
|
98
|
+
const moduleJsonPath = path.join(moduleSourcePath, "module.json");
|
|
99
|
+
|
|
100
|
+
// Check if module exists
|
|
101
|
+
try {
|
|
102
|
+
await fs.access(moduleSourcePath);
|
|
103
|
+
} catch {
|
|
104
|
+
console.error(chalk.red(`❌ Module '${moduleName}' not found.`));
|
|
105
|
+
console.log(chalk.yellow(`\nAvailable modules:`));
|
|
106
|
+
await listAvailableModules(modulesDir);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Read module metadata
|
|
111
|
+
let moduleInfo = { name: moduleName, description: "", postInstall: [], dependencies: [] };
|
|
112
|
+
try {
|
|
113
|
+
moduleInfo = JSON.parse(await fs.readFile(moduleJsonPath, "utf8"));
|
|
114
|
+
} catch {
|
|
115
|
+
// No module.json, use defaults
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Install ShipAPI dependencies first (other modules or libraries)
|
|
119
|
+
if (moduleInfo.dependencies && moduleInfo.dependencies.length > 0) {
|
|
120
|
+
console.log(chalk.blue(`\n📋 Installing dependencies for ${moduleName}...`));
|
|
121
|
+
for (const dep of moduleInfo.dependencies) {
|
|
122
|
+
if (_installedDeps.has(dep)) {
|
|
123
|
+
console.log(chalk.gray(` ⏭️ ${dep} already installed`));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Try to install as module first, then as library
|
|
128
|
+
const isModule = await isAvailableModule(dep, modulesDir);
|
|
129
|
+
const librariesDir = await getLibrariesDir();
|
|
130
|
+
const isLibrary = await isAvailableLibrary(dep, librariesDir);
|
|
131
|
+
|
|
132
|
+
if (isModule) {
|
|
133
|
+
await addModule(dep, { ...options, force: false }, _installedDeps);
|
|
134
|
+
} else if (isLibrary) {
|
|
135
|
+
await addLibrary(dep, { ...options, force: false }, _installedDeps);
|
|
136
|
+
} else {
|
|
137
|
+
console.log(chalk.yellow(` ⚠️ Dependency '${dep}' not found as module or library`));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
console.log(chalk.blue(`\n📦 Continuing with ${moduleName}...`));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Mark this module as being installed
|
|
144
|
+
_installedDeps.add(moduleName);
|
|
145
|
+
|
|
146
|
+
// Check if module already exists in project
|
|
147
|
+
const destPath = path.join(projectPath, "src", "modules", moduleName);
|
|
148
|
+
try {
|
|
149
|
+
await fs.access(destPath);
|
|
150
|
+
if (!options.force) {
|
|
151
|
+
console.log(chalk.gray(` ⏭️ Module '${moduleName}' already exists, skipping`));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
console.log(chalk.yellow(`⚠️ Overwriting existing module: ${moduleName}`));
|
|
155
|
+
await fs.rm(destPath, { recursive: true });
|
|
156
|
+
} catch (error) {
|
|
157
|
+
if (error.code !== "ENOENT") throw error;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Copy module files (excluding module.json)
|
|
161
|
+
await copyModuleFiles(moduleSourcePath, destPath);
|
|
162
|
+
|
|
163
|
+
// Install npm dependencies if specified
|
|
164
|
+
if (moduleInfo.npmDependencies) {
|
|
165
|
+
await installNpmDependencies(moduleInfo.npmDependencies, projectPath);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
console.log(chalk.green(`✅ Module '${moduleName}' added successfully!`));
|
|
169
|
+
|
|
170
|
+
// Print post-install instructions
|
|
171
|
+
if (moduleInfo.postInstall && moduleInfo.postInstall.length > 0) {
|
|
172
|
+
console.log(chalk.cyan(`\nNext steps:`));
|
|
173
|
+
moduleInfo.postInstall.forEach((step) => {
|
|
174
|
+
console.log(chalk.cyan(` • ${step}`));
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (moduleInfo.requiredEnvVars && moduleInfo.requiredEnvVars.length > 0) {
|
|
179
|
+
console.log(chalk.yellow(`\nRequired environment variables:`));
|
|
180
|
+
moduleInfo.requiredEnvVars.forEach((envVar) => {
|
|
181
|
+
console.log(chalk.yellow(` • ${envVar}`));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (moduleInfo.optionalEnvVars && moduleInfo.optionalEnvVars.length > 0) {
|
|
186
|
+
console.log(chalk.gray(`\nOptional environment variables:`));
|
|
187
|
+
moduleInfo.optionalEnvVars.forEach((envVar) => {
|
|
188
|
+
console.log(chalk.gray(` • ${envVar}`));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Check if a module is available
|
|
195
|
+
*/
|
|
196
|
+
async function isAvailableModule(name, modulesDir) {
|
|
197
|
+
try {
|
|
198
|
+
await fs.access(path.join(modulesDir, name));
|
|
199
|
+
return true;
|
|
200
|
+
} catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Check if a library is available
|
|
207
|
+
*/
|
|
208
|
+
async function isAvailableLibrary(name, librariesDir) {
|
|
209
|
+
try {
|
|
210
|
+
await fs.access(path.join(librariesDir, name));
|
|
211
|
+
return true;
|
|
212
|
+
} catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Get the libraries directory path
|
|
219
|
+
*/
|
|
220
|
+
async function getLibrariesDir() {
|
|
221
|
+
const librariesDir = path.join(__dirname, "..", "..", "..", "..", "libraries");
|
|
222
|
+
const libLibrariesDir = path.join(__dirname, "..", "..", "lib", "libraries");
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
await fs.access(libLibrariesDir);
|
|
226
|
+
return libLibrariesDir;
|
|
227
|
+
} catch {
|
|
228
|
+
return librariesDir;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function copyModuleFiles(src, dest) {
|
|
233
|
+
await fs.mkdir(dest, { recursive: true });
|
|
234
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
235
|
+
|
|
236
|
+
for (const entry of entries) {
|
|
237
|
+
// Skip module.json - it's only for CLI metadata
|
|
238
|
+
if (entry.name === "module.json") continue;
|
|
239
|
+
|
|
240
|
+
const srcPath = path.join(src, entry.name);
|
|
241
|
+
const destPath = path.join(dest, entry.name);
|
|
242
|
+
|
|
243
|
+
if (entry.isDirectory()) {
|
|
244
|
+
await copyModuleFiles(srcPath, destPath);
|
|
245
|
+
} else {
|
|
246
|
+
await fs.copyFile(srcPath, destPath);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export async function listModules() {
|
|
252
|
+
console.log(chalk.blue(`📦 Available modules:\n`));
|
|
253
|
+
|
|
254
|
+
// Find modules directory
|
|
255
|
+
let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
|
|
256
|
+
const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
|
|
257
|
+
|
|
258
|
+
try {
|
|
259
|
+
await fs.access(libModulesDir);
|
|
260
|
+
modulesDir = libModulesDir;
|
|
261
|
+
} catch {
|
|
262
|
+
// Use the repo modules directory
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
await listAvailableModules(modulesDir);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function listAvailableModules(modulesDir) {
|
|
269
|
+
try {
|
|
270
|
+
const entries = await fs.readdir(modulesDir, { withFileTypes: true });
|
|
271
|
+
const modules = entries.filter((e) => e.isDirectory());
|
|
272
|
+
|
|
273
|
+
for (const mod of modules) {
|
|
274
|
+
const moduleJsonPath = path.join(modulesDir, mod.name, "module.json");
|
|
275
|
+
let description = "";
|
|
276
|
+
|
|
277
|
+
try {
|
|
278
|
+
const moduleInfo = JSON.parse(await fs.readFile(moduleJsonPath, "utf8"));
|
|
279
|
+
description = moduleInfo.description || "";
|
|
280
|
+
} catch {
|
|
281
|
+
// No module.json
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
console.log(chalk.white(` ${mod.name.padEnd(20)} ${chalk.gray(description)}`));
|
|
285
|
+
}
|
|
286
|
+
} catch (_error) {
|
|
287
|
+
console.log(chalk.yellow(` No modules found.`));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Library Functions
|
|
293
|
+
// ============================================================================
|
|
294
|
+
|
|
295
|
+
export async function addLibrary(libraryName, options, _installedDeps = new Set()) {
|
|
296
|
+
// Track installed dependencies to prevent circular installs
|
|
297
|
+
if (_installedDeps.has(libraryName)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
console.log(chalk.blue(`📚 Adding library: ${libraryName}`));
|
|
302
|
+
|
|
303
|
+
const projectPath = process.cwd();
|
|
304
|
+
|
|
305
|
+
// Check if we're in a ShipAPI project
|
|
306
|
+
const packageJsonPath = path.join(projectPath, "package.json");
|
|
307
|
+
try {
|
|
308
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
|
|
309
|
+
if (!packageJson.dependencies?.["@sixthsummit/ship-api"]) {
|
|
310
|
+
throw new Error("Not a ShipAPI project. Run this command from your project root.");
|
|
311
|
+
}
|
|
312
|
+
} catch (error) {
|
|
313
|
+
if (error.code === "ENOENT") {
|
|
314
|
+
throw new Error("No package.json found. Run this command from your project root.");
|
|
315
|
+
}
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Find the library in the libraries directory
|
|
320
|
+
// In development, libraries are at ../../libraries relative to cli/commands
|
|
321
|
+
// When published, libraries are copied to lib/libraries
|
|
322
|
+
const librariesDir = await getLibrariesDir();
|
|
323
|
+
|
|
324
|
+
const librarySourcePath = path.join(librariesDir, libraryName);
|
|
325
|
+
const libraryJsonPath = path.join(librarySourcePath, "library.json");
|
|
326
|
+
|
|
327
|
+
// Check if library exists
|
|
328
|
+
try {
|
|
329
|
+
await fs.access(librarySourcePath);
|
|
330
|
+
} catch {
|
|
331
|
+
console.error(chalk.red(`❌ Library '${libraryName}' not found.`));
|
|
332
|
+
console.log(chalk.yellow(`\nAvailable libraries:`));
|
|
333
|
+
await listAvailableLibraries(librariesDir);
|
|
334
|
+
process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Read library metadata
|
|
338
|
+
let libraryInfo = { name: libraryName, description: "", postInstall: [], dependencies: [] };
|
|
339
|
+
try {
|
|
340
|
+
libraryInfo = JSON.parse(await fs.readFile(libraryJsonPath, "utf8"));
|
|
341
|
+
} catch {
|
|
342
|
+
// No library.json, use defaults
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Install ShipAPI dependencies first (other modules or libraries)
|
|
346
|
+
if (libraryInfo.dependencies && libraryInfo.dependencies.length > 0) {
|
|
347
|
+
console.log(chalk.blue(`\n📋 Installing dependencies for ${libraryName}...`));
|
|
348
|
+
|
|
349
|
+
// Get modules directory for checking
|
|
350
|
+
let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
|
|
351
|
+
const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
|
|
352
|
+
try {
|
|
353
|
+
await fs.access(libModulesDir);
|
|
354
|
+
modulesDir = libModulesDir;
|
|
355
|
+
} catch {
|
|
356
|
+
// Use the repo modules directory
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
for (const dep of libraryInfo.dependencies) {
|
|
360
|
+
if (_installedDeps.has(dep)) {
|
|
361
|
+
console.log(chalk.gray(` ⏭️ ${dep} already installed`));
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Try to install as module first, then as library
|
|
366
|
+
const isModule = await isAvailableModule(dep, modulesDir);
|
|
367
|
+
const isLibrary = await isAvailableLibrary(dep, librariesDir);
|
|
368
|
+
|
|
369
|
+
if (isModule) {
|
|
370
|
+
await addModule(dep, { ...options, force: false }, _installedDeps);
|
|
371
|
+
} else if (isLibrary) {
|
|
372
|
+
await addLibrary(dep, { ...options, force: false }, _installedDeps);
|
|
373
|
+
} else {
|
|
374
|
+
console.log(chalk.yellow(` ⚠️ Dependency '${dep}' not found as module or library`));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
console.log(chalk.blue(`\n📚 Continuing with ${libraryName}...`));
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Mark this library as being installed
|
|
381
|
+
_installedDeps.add(libraryName);
|
|
382
|
+
|
|
383
|
+
// Check if library already exists in project (destination: src/lib/)
|
|
384
|
+
const destPath = path.join(projectPath, "src", "lib", libraryName);
|
|
385
|
+
try {
|
|
386
|
+
await fs.access(destPath);
|
|
387
|
+
if (!options.force) {
|
|
388
|
+
console.log(chalk.gray(` ⏭️ Library '${libraryName}' already exists, skipping`));
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
console.log(chalk.yellow(`⚠️ Overwriting existing library: ${libraryName}`));
|
|
392
|
+
await fs.rm(destPath, { recursive: true });
|
|
393
|
+
} catch (error) {
|
|
394
|
+
if (error.code !== "ENOENT") throw error;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Ensure src/lib directory exists
|
|
398
|
+
await fs.mkdir(path.join(projectPath, "src", "lib"), { recursive: true });
|
|
399
|
+
|
|
400
|
+
// Copy library files (excluding library.json)
|
|
401
|
+
await copyLibraryFiles(librarySourcePath, destPath);
|
|
402
|
+
|
|
403
|
+
// AI-A3: stamp the vendored library version into the consumer so the
|
|
404
|
+
// independently-versioned `library.json#version` is recorded + diffable on
|
|
405
|
+
// `ship-api update`. Mirrors the g-scaffold provenance breadcrumb; the
|
|
406
|
+
// `library.json` itself stays CLI-only metadata (skipped on copy above).
|
|
407
|
+
await writeLibraryStamp(destPath, libraryName, libraryInfo, options);
|
|
408
|
+
|
|
409
|
+
// NOTE: Libraries don't update config/modules.ts
|
|
410
|
+
|
|
411
|
+
// Install npm dependencies if specified
|
|
412
|
+
if (libraryInfo.npmDependencies) {
|
|
413
|
+
await installNpmDependencies(libraryInfo.npmDependencies, projectPath);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
console.log(chalk.green(`✅ Library '${libraryName}' added successfully!`));
|
|
417
|
+
|
|
418
|
+
// Print usage example
|
|
419
|
+
console.log(chalk.cyan(`\nUsage:`));
|
|
420
|
+
console.log(chalk.gray(` import { ... } from "./lib/${libraryName}/index.js";`));
|
|
421
|
+
|
|
422
|
+
// Print post-install instructions
|
|
423
|
+
if (libraryInfo.postInstall && libraryInfo.postInstall.length > 0) {
|
|
424
|
+
console.log(chalk.cyan(`\nNext steps:`));
|
|
425
|
+
libraryInfo.postInstall.forEach((step) => {
|
|
426
|
+
console.log(chalk.cyan(` • ${step}`));
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (libraryInfo.requiredEnvVars && libraryInfo.requiredEnvVars.length > 0) {
|
|
431
|
+
console.log(chalk.yellow(`\nRequired environment variables:`));
|
|
432
|
+
libraryInfo.requiredEnvVars.forEach((envVar) => {
|
|
433
|
+
console.log(chalk.yellow(` • ${envVar}`));
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (libraryInfo.optionalEnvVars && libraryInfo.optionalEnvVars.length > 0) {
|
|
438
|
+
console.log(chalk.gray(`\nOptional environment variables:`));
|
|
439
|
+
libraryInfo.optionalEnvVars.forEach((envVar) => {
|
|
440
|
+
console.log(chalk.gray(` • ${envVar}`));
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async function copyLibraryFiles(src, dest) {
|
|
446
|
+
await fs.mkdir(dest, { recursive: true });
|
|
447
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
448
|
+
|
|
449
|
+
for (const entry of entries) {
|
|
450
|
+
// Skip library.json - it's only for CLI metadata
|
|
451
|
+
if (entry.name === "library.json") continue;
|
|
452
|
+
|
|
453
|
+
const srcPath = path.join(src, entry.name);
|
|
454
|
+
const destPath = path.join(dest, entry.name);
|
|
455
|
+
|
|
456
|
+
if (entry.isDirectory()) {
|
|
457
|
+
await copyLibraryFiles(srcPath, destPath);
|
|
458
|
+
} else {
|
|
459
|
+
await fs.copyFile(srcPath, destPath);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* AI-A3 — write the vendored-library provenance stamp into the consumer's
|
|
466
|
+
* copied library dir. Records the library's independent `version` (from its
|
|
467
|
+
* `library.json`, which itself isn't copied) so staleness is detectable and
|
|
468
|
+
* `ship-api update` has an anchor to diff against. `options.now` /
|
|
469
|
+
* `options.frameworkVersion` are injectable for deterministic tests.
|
|
470
|
+
*/
|
|
471
|
+
export async function writeLibraryStamp(destPath, libraryName, libraryInfo, options = {}) {
|
|
472
|
+
const stamp = {
|
|
473
|
+
name: libraryInfo.name ?? libraryName,
|
|
474
|
+
version: libraryInfo.version ?? "unknown",
|
|
475
|
+
source: "ship-api add -l",
|
|
476
|
+
at: options.now ?? new Date().toISOString(),
|
|
477
|
+
frameworkVersion: options.frameworkVersion ?? (await resolveFrameworkVersion()),
|
|
478
|
+
};
|
|
479
|
+
await fs.writeFile(path.join(destPath, ".ship-lib.json"), JSON.stringify(stamp, null, 2) + "\n");
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/** The running `@sixthsummit/ship-api` version (packages/core/package.json). */
|
|
483
|
+
async function resolveFrameworkVersion() {
|
|
484
|
+
try {
|
|
485
|
+
const pkg = JSON.parse(
|
|
486
|
+
await fs.readFile(path.join(__dirname, "..", "..", "package.json"), "utf8"),
|
|
487
|
+
);
|
|
488
|
+
return typeof pkg.version === "string" ? pkg.version : "unknown";
|
|
489
|
+
} catch {
|
|
490
|
+
return "unknown";
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export async function listLibraries() {
|
|
495
|
+
console.log(chalk.blue(`📚 Available libraries:\n`));
|
|
496
|
+
|
|
497
|
+
// Find libraries directory
|
|
498
|
+
let librariesDir = path.join(__dirname, "..", "..", "..", "..", "libraries");
|
|
499
|
+
const libLibrariesDir = path.join(__dirname, "..", "..", "lib", "libraries");
|
|
500
|
+
|
|
501
|
+
try {
|
|
502
|
+
await fs.access(libLibrariesDir);
|
|
503
|
+
librariesDir = libLibrariesDir;
|
|
504
|
+
} catch {
|
|
505
|
+
// Use the repo libraries directory
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
await listAvailableLibraries(librariesDir);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
async function listAvailableLibraries(librariesDir) {
|
|
512
|
+
try {
|
|
513
|
+
const entries = await fs.readdir(librariesDir, { withFileTypes: true });
|
|
514
|
+
const libraries = entries.filter((e) => e.isDirectory());
|
|
515
|
+
|
|
516
|
+
if (libraries.length === 0) {
|
|
517
|
+
console.log(chalk.yellow(` No libraries available yet.`));
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
for (const lib of libraries) {
|
|
522
|
+
const libraryJsonPath = path.join(librariesDir, lib.name, "library.json");
|
|
523
|
+
let description = "";
|
|
524
|
+
|
|
525
|
+
try {
|
|
526
|
+
const libraryInfo = JSON.parse(await fs.readFile(libraryJsonPath, "utf8"));
|
|
527
|
+
description = libraryInfo.description || "";
|
|
528
|
+
} catch {
|
|
529
|
+
// No library.json
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
console.log(chalk.white(` ${lib.name.padEnd(20)} ${chalk.gray(description)}`));
|
|
533
|
+
}
|
|
534
|
+
} catch (_error) {
|
|
535
|
+
console.log(chalk.yellow(` No libraries found.`));
|
|
536
|
+
}
|
|
537
|
+
}
|