@rebasepro/server-core 0.0.1-canary.09e5ec5
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 +6 -0
- package/README.md +40 -0
- package/build-errors.txt +52 -0
- package/coverage/clover.xml +3739 -0
- package/coverage/coverage-final.json +31 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +266 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/api/ast-schema-editor.ts.html +952 -0
- package/coverage/lcov-report/src/api/errors.ts.html +472 -0
- package/coverage/lcov-report/src/api/graphql/graphql-schema-generator.ts.html +1069 -0
- package/coverage/lcov-report/src/api/graphql/index.html +116 -0
- package/coverage/lcov-report/src/api/index.html +176 -0
- package/coverage/lcov-report/src/api/openapi-generator.ts.html +565 -0
- package/coverage/lcov-report/src/api/rest/api-generator.ts.html +994 -0
- package/coverage/lcov-report/src/api/rest/index.html +131 -0
- package/coverage/lcov-report/src/api/rest/query-parser.ts.html +550 -0
- package/coverage/lcov-report/src/api/schema-editor-routes.ts.html +202 -0
- package/coverage/lcov-report/src/api/server.ts.html +823 -0
- package/coverage/lcov-report/src/auth/admin-routes.ts.html +973 -0
- package/coverage/lcov-report/src/auth/index.html +176 -0
- package/coverage/lcov-report/src/auth/jwt.ts.html +574 -0
- package/coverage/lcov-report/src/auth/middleware.ts.html +745 -0
- package/coverage/lcov-report/src/auth/password.ts.html +310 -0
- package/coverage/lcov-report/src/auth/services.ts.html +2074 -0
- package/coverage/lcov-report/src/collections/index.html +116 -0
- package/coverage/lcov-report/src/collections/loader.ts.html +232 -0
- package/coverage/lcov-report/src/db/auth-schema.ts.html +523 -0
- package/coverage/lcov-report/src/db/data-transformer.ts.html +1753 -0
- package/coverage/lcov-report/src/db/entityService.ts.html +700 -0
- package/coverage/lcov-report/src/db/index.html +146 -0
- package/coverage/lcov-report/src/db/services/EntityFetchService.ts.html +4048 -0
- package/coverage/lcov-report/src/db/services/EntityPersistService.ts.html +883 -0
- package/coverage/lcov-report/src/db/services/RelationService.ts.html +3121 -0
- package/coverage/lcov-report/src/db/services/entity-helpers.ts.html +442 -0
- package/coverage/lcov-report/src/db/services/index.html +176 -0
- package/coverage/lcov-report/src/db/services/index.ts.html +124 -0
- package/coverage/lcov-report/src/generate-drizzle-schema-logic.ts.html +1960 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/services/driver-registry.ts.html +631 -0
- package/coverage/lcov-report/src/services/index.html +131 -0
- package/coverage/lcov-report/src/services/postgresDataDriver.ts.html +3025 -0
- package/coverage/lcov-report/src/storage/LocalStorageController.ts.html +1189 -0
- package/coverage/lcov-report/src/storage/S3StorageController.ts.html +970 -0
- package/coverage/lcov-report/src/storage/index.html +161 -0
- package/coverage/lcov-report/src/storage/storage-registry.ts.html +646 -0
- package/coverage/lcov-report/src/storage/types.ts.html +451 -0
- package/coverage/lcov-report/src/utils/drizzle-conditions.ts.html +3082 -0
- package/coverage/lcov-report/src/utils/index.html +116 -0
- package/coverage/lcov.info +7179 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +58 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +22 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/index-DXVBFp5V.js +37 -0
- package/dist/index-DXVBFp5V.js.map +1 -0
- package/dist/index.es.js +49934 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +49968 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/server-core/src/api/ast-schema-editor.d.ts +21 -0
- package/dist/server-core/src/api/collections_for_test/callbacks_test_collection.d.ts +2 -0
- package/dist/server-core/src/api/errors.d.ts +35 -0
- package/dist/server-core/src/api/graphql/graphql-schema-generator.d.ts +35 -0
- package/dist/server-core/src/api/graphql/index.d.ts +1 -0
- package/dist/server-core/src/api/index.d.ts +9 -0
- package/dist/server-core/src/api/openapi-generator.d.ts +16 -0
- package/dist/server-core/src/api/rest/api-generator.d.ts +64 -0
- package/dist/server-core/src/api/rest/index.d.ts +1 -0
- package/dist/server-core/src/api/rest/query-parser.d.ts +9 -0
- package/dist/server-core/src/api/schema-editor-routes.d.ts +3 -0
- package/dist/server-core/src/api/server.d.ts +40 -0
- package/dist/server-core/src/api/types.d.ts +90 -0
- package/dist/server-core/src/auth/admin-routes.d.ts +16 -0
- package/dist/server-core/src/auth/apple-oauth.d.ts +30 -0
- package/dist/server-core/src/auth/bitbucket-oauth.d.ts +11 -0
- package/dist/server-core/src/auth/discord-oauth.d.ts +14 -0
- package/dist/server-core/src/auth/facebook-oauth.d.ts +14 -0
- package/dist/server-core/src/auth/github-oauth.d.ts +15 -0
- package/dist/server-core/src/auth/gitlab-oauth.d.ts +13 -0
- package/dist/server-core/src/auth/google-oauth.d.ts +14 -0
- package/dist/server-core/src/auth/index.d.ts +23 -0
- package/dist/server-core/src/auth/interfaces.d.ts +309 -0
- package/dist/server-core/src/auth/jwt.d.ts +43 -0
- package/dist/server-core/src/auth/linkedin-oauth.d.ts +18 -0
- package/dist/server-core/src/auth/microsoft-oauth.d.ts +16 -0
- package/dist/server-core/src/auth/middleware.d.ts +81 -0
- package/dist/server-core/src/auth/password.d.ts +22 -0
- package/dist/server-core/src/auth/rate-limiter.d.ts +31 -0
- package/dist/server-core/src/auth/routes.d.ts +27 -0
- package/dist/server-core/src/auth/slack-oauth.d.ts +12 -0
- package/dist/server-core/src/auth/spotify-oauth.d.ts +12 -0
- package/dist/server-core/src/auth/twitter-oauth.d.ts +18 -0
- package/dist/server-core/src/bootstrappers/index.d.ts +0 -0
- package/dist/server-core/src/collections/BackendCollectionRegistry.d.ts +13 -0
- package/dist/server-core/src/collections/loader.d.ts +5 -0
- package/dist/server-core/src/cron/cron-loader.d.ts +17 -0
- package/dist/server-core/src/cron/cron-routes.d.ts +14 -0
- package/dist/server-core/src/cron/cron-scheduler.d.ts +61 -0
- package/dist/server-core/src/cron/cron-store.d.ts +32 -0
- package/dist/server-core/src/cron/index.d.ts +6 -0
- package/dist/server-core/src/db/interfaces.d.ts +18 -0
- package/dist/server-core/src/email/index.d.ts +6 -0
- package/dist/server-core/src/email/smtp-email-service.d.ts +25 -0
- package/dist/server-core/src/email/templates.d.ts +42 -0
- package/dist/server-core/src/email/types.d.ts +107 -0
- package/dist/server-core/src/functions/function-loader.d.ts +17 -0
- package/dist/server-core/src/functions/function-routes.d.ts +10 -0
- package/dist/server-core/src/functions/index.d.ts +3 -0
- package/dist/server-core/src/history/history-routes.d.ts +23 -0
- package/dist/server-core/src/history/index.d.ts +1 -0
- package/dist/server-core/src/index.d.ts +29 -0
- package/dist/server-core/src/init.d.ts +159 -0
- package/dist/server-core/src/serve-spa.d.ts +30 -0
- package/dist/server-core/src/services/driver-registry.d.ts +78 -0
- package/dist/server-core/src/singleton.d.ts +35 -0
- package/dist/server-core/src/storage/LocalStorageController.d.ts +46 -0
- package/dist/server-core/src/storage/S3StorageController.d.ts +36 -0
- package/dist/server-core/src/storage/index.d.ts +25 -0
- package/dist/server-core/src/storage/routes.d.ts +38 -0
- package/dist/server-core/src/storage/storage-registry.d.ts +78 -0
- package/dist/server-core/src/storage/types.d.ts +103 -0
- package/dist/server-core/src/types/index.d.ts +11 -0
- package/dist/server-core/src/utils/dev-port.d.ts +35 -0
- package/dist/server-core/src/utils/logger.d.ts +31 -0
- package/dist/server-core/src/utils/logging.d.ts +9 -0
- package/dist/server-core/src/utils/request-logger.d.ts +19 -0
- package/dist/server-core/src/utils/sql.d.ts +27 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +119 -0
- package/dist/types/src/controllers/client.d.ts +170 -0
- package/dist/types/src/controllers/collection_registry.d.ts +45 -0
- package/dist/types/src/controllers/customization_controller.d.ts +60 -0
- package/dist/types/src/controllers/data.d.ts +168 -0
- package/dist/types/src/controllers/data_driver.d.ts +160 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/email.d.ts +34 -0
- package/dist/types/src/controllers/index.d.ts +18 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +54 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +171 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +105 -0
- package/dist/types/src/types/backend.d.ts +536 -0
- package/dist/types/src/types/builders.d.ts +15 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +856 -0
- package/dist/types/src/types/cron.d.ts +102 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +10 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +23 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +279 -0
- package/dist/types/src/types/properties.d.ts +1176 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +252 -0
- package/dist/types/src/types/translations.d.ts +870 -0
- package/dist/types/src/types/user_management_delegate.d.ts +121 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/history_diff.log +385 -0
- package/jest.config.cjs +16 -0
- package/package.json +86 -0
- package/scratch.ts +9 -0
- package/src/api/ast-schema-editor.ts +289 -0
- package/src/api/collections_for_test/callbacks_test_collection.ts +60 -0
- package/src/api/errors.ts +179 -0
- package/src/api/graphql/graphql-schema-generator.ts +336 -0
- package/src/api/graphql/index.ts +2 -0
- package/src/api/index.ts +11 -0
- package/src/api/openapi-generator.ts +715 -0
- package/src/api/rest/api-generator.ts +472 -0
- package/src/api/rest/index.ts +2 -0
- package/src/api/rest/query-parser.ts +155 -0
- package/src/api/schema-editor-routes.ts +41 -0
- package/src/api/server.ts +248 -0
- package/src/api/types.ts +90 -0
- package/src/auth/admin-routes.ts +529 -0
- package/src/auth/apple-oauth.ts +130 -0
- package/src/auth/bitbucket-oauth.ts +82 -0
- package/src/auth/discord-oauth.ts +83 -0
- package/src/auth/facebook-oauth.ts +72 -0
- package/src/auth/github-oauth.ts +110 -0
- package/src/auth/gitlab-oauth.ts +70 -0
- package/src/auth/google-oauth.ts +48 -0
- package/src/auth/index.ts +34 -0
- package/src/auth/interfaces.ts +363 -0
- package/src/auth/jwt.ts +181 -0
- package/src/auth/linkedin-oauth.ts +81 -0
- package/src/auth/microsoft-oauth.ts +88 -0
- package/src/auth/middleware.ts +384 -0
- package/src/auth/password.ts +77 -0
- package/src/auth/rate-limiter.ts +129 -0
- package/src/auth/routes.ts +788 -0
- package/src/auth/slack-oauth.ts +71 -0
- package/src/auth/spotify-oauth.ts +67 -0
- package/src/auth/twitter-oauth.ts +120 -0
- package/src/bootstrappers/index.ts +1 -0
- package/src/collections/BackendCollectionRegistry.ts +20 -0
- package/src/collections/loader.ts +49 -0
- package/src/cron/cron-loader.ts +89 -0
- package/src/cron/cron-routes.test.ts +265 -0
- package/src/cron/cron-routes.ts +85 -0
- package/src/cron/cron-scheduler.test.ts +421 -0
- package/src/cron/cron-scheduler.ts +413 -0
- package/src/cron/cron-store.ts +163 -0
- package/src/cron/index.ts +6 -0
- package/src/db/interfaces.ts +60 -0
- package/src/email/index.ts +18 -0
- package/src/email/smtp-email-service.ts +91 -0
- package/src/email/templates.ts +388 -0
- package/src/email/types.ts +105 -0
- package/src/functions/function-loader.ts +119 -0
- package/src/functions/function-routes.ts +31 -0
- package/src/functions/index.ts +3 -0
- package/src/history/history-routes.ts +129 -0
- package/src/history/index.ts +2 -0
- package/src/index.ts +66 -0
- package/src/init.ts +727 -0
- package/src/serve-spa.ts +81 -0
- package/src/services/driver-registry.ts +182 -0
- package/src/singleton.test.ts +28 -0
- package/src/singleton.ts +70 -0
- package/src/storage/LocalStorageController.ts +365 -0
- package/src/storage/S3StorageController.ts +298 -0
- package/src/storage/index.ts +43 -0
- package/src/storage/routes.ts +264 -0
- package/src/storage/storage-registry.ts +187 -0
- package/src/storage/types.ts +134 -0
- package/src/types/index.ts +27 -0
- package/src/utils/dev-port.ts +176 -0
- package/src/utils/logger.ts +143 -0
- package/src/utils/logging.ts +38 -0
- package/src/utils/request-logger.ts +66 -0
- package/src/utils/sql.ts +38 -0
- package/test/admin-routes.test.ts +640 -0
- package/test/api-generator.test.ts +501 -0
- package/test/ast-schema-editor.test.ts +63 -0
- package/test/auth-middleware-hono.test.ts +556 -0
- package/test/auth-routes.test.ts +1047 -0
- package/test/driver-registry.test.ts +282 -0
- package/test/error-propagation.test.ts +226 -0
- package/test/errors-hono.test.ts +133 -0
- package/test/errors.test.ts +155 -0
- package/test/jwt-security.test.ts +182 -0
- package/test/jwt.test.ts +324 -0
- package/test/middleware.test.ts +300 -0
- package/test/password.test.ts +165 -0
- package/test/query-parser.test.ts +263 -0
- package/test/rate-limiter.test.ts +102 -0
- package/test/safe-compare.test.ts +66 -0
- package/test/singleton.test.ts +59 -0
- package/test/storage-local.test.ts +271 -0
- package/test/storage-registry.test.ts +282 -0
- package/test/storage-routes.test.ts +222 -0
- package/test/storage-s3.test.ts +304 -0
- package/test-ast.ts +28 -0
- package/test.ts +6 -0
- package/test_output.txt +1133 -0
- package/tsconfig.json +49 -0
- package/tsconfig.prod.json +20 -0
- package/vite.config.ts +80 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class AstSchemaEditor {
|
|
2
|
+
private project;
|
|
3
|
+
private collectionsDir;
|
|
4
|
+
constructor(collectionsDir: string);
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize collectionId to prevent path traversal attacks.
|
|
7
|
+
* Only allows alphanumeric characters, underscores, and hyphens.
|
|
8
|
+
*/
|
|
9
|
+
private sanitizeCollectionId;
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a file path and ensure it falls within the collectionsDir.
|
|
12
|
+
*/
|
|
13
|
+
private safePath;
|
|
14
|
+
private getCollectionFile;
|
|
15
|
+
private getCollectionObject;
|
|
16
|
+
private convertJsonToAstString;
|
|
17
|
+
saveProperty(collectionId: string, propertyKey: string, propertyConfig: Record<string, unknown>): Promise<void>;
|
|
18
|
+
deleteProperty(collectionId: string, propertyKey: string): Promise<void>;
|
|
19
|
+
saveCollection(collectionId: string, collectionData: Record<string, unknown>): Promise<void>;
|
|
20
|
+
deleteCollection(collectionId: string): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ErrorHandler } from "hono";
|
|
2
|
+
/**
|
|
3
|
+
* Standardized API error class.
|
|
4
|
+
* Throw this from any route handler — the errorHandler middleware
|
|
5
|
+
* will format it into `{ error: { message, code, details? } }`.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ApiError extends Error {
|
|
8
|
+
readonly statusCode: number;
|
|
9
|
+
readonly code: string;
|
|
10
|
+
readonly details?: unknown;
|
|
11
|
+
constructor(statusCode: number, code: string, message: string, details?: unknown);
|
|
12
|
+
static badRequest(message: string, code?: string, details?: unknown): ApiError;
|
|
13
|
+
static unauthorized(message: string, code?: string): ApiError;
|
|
14
|
+
static forbidden(message: string, code?: string): ApiError;
|
|
15
|
+
static notFound(message: string, code?: string): ApiError;
|
|
16
|
+
static conflict(message: string, code?: string): ApiError;
|
|
17
|
+
static internal(message: string, code?: string): ApiError;
|
|
18
|
+
static serviceUnavailable(message: string, code?: string): ApiError;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Canonical error response shape:
|
|
22
|
+
* `{ error: { message: string, code: string, details?: unknown } }`
|
|
23
|
+
*/
|
|
24
|
+
export interface ErrorResponse {
|
|
25
|
+
error: {
|
|
26
|
+
message: string;
|
|
27
|
+
code: string;
|
|
28
|
+
details?: unknown;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Hono error-handling middleware (`app.onError`).
|
|
33
|
+
* Converts any error into the canonical `{ error: { message, code } }` shape.
|
|
34
|
+
*/
|
|
35
|
+
export declare const errorHandler: ErrorHandler;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { GraphQLSchema } from "graphql";
|
|
2
|
+
import { DataDriver, EntityCollection } from "@rebasepro/types";
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight GraphQL schema generator that leverages existing DataDriver
|
|
5
|
+
* No duplication - uses your existing data layer and services
|
|
6
|
+
*/
|
|
7
|
+
export declare class GraphQLSchemaGenerator {
|
|
8
|
+
private collections;
|
|
9
|
+
private driver;
|
|
10
|
+
private typeRegistry;
|
|
11
|
+
private inputTypeRegistry;
|
|
12
|
+
constructor(collections: EntityCollection[], driver: DataDriver);
|
|
13
|
+
/**
|
|
14
|
+
* Generate complete GraphQL schema using existing DataDriver
|
|
15
|
+
*/
|
|
16
|
+
generateSchema(): GraphQLSchema;
|
|
17
|
+
/**
|
|
18
|
+
* Create GraphQL type for an entity collection
|
|
19
|
+
*/
|
|
20
|
+
private createEntityType;
|
|
21
|
+
private convertPropertyToField;
|
|
22
|
+
private createInputType;
|
|
23
|
+
private convertPropertyToInputType;
|
|
24
|
+
/**
|
|
25
|
+
* Create Query type using existing DataDriver methods
|
|
26
|
+
*/
|
|
27
|
+
private createQueryType;
|
|
28
|
+
/**
|
|
29
|
+
* Create Mutation type using existing DataDriver methods
|
|
30
|
+
*/
|
|
31
|
+
private createMutationType;
|
|
32
|
+
private getTypeName;
|
|
33
|
+
private getSingleQueryName;
|
|
34
|
+
private getListQueryName;
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./graphql-schema-generator";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API generation infrastructure for Rebase
|
|
3
|
+
* Automatically generates GraphQL and REST APIs from EntityCollection definitions
|
|
4
|
+
*/
|
|
5
|
+
export * from "./graphql";
|
|
6
|
+
export * from "./rest";
|
|
7
|
+
export * from "./types";
|
|
8
|
+
export * from "./errors";
|
|
9
|
+
export * from "./server";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EntityCollection } from "@rebasepro/types";
|
|
2
|
+
/**
|
|
3
|
+
* OpenAPI 3.0.3 specification generator.
|
|
4
|
+
*
|
|
5
|
+
* Produces a spec that exactly mirrors the REST API consumed by the
|
|
6
|
+
* Rebase SDK client (`@rebasepro/client`).
|
|
7
|
+
*
|
|
8
|
+
* Routes are mounted at `{basePath}/data/{slug}` by `initializeRebaseBackend`.
|
|
9
|
+
*/
|
|
10
|
+
export interface OpenApiGeneratorOptions {
|
|
11
|
+
/** Base path for the API (e.g. "/api"). Defaults to "/api". */
|
|
12
|
+
basePath?: string;
|
|
13
|
+
/** Whether auth is enabled on data routes. Defaults to true. */
|
|
14
|
+
requireAuth?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function generateOpenApiSpec(collections: EntityCollection[], options?: OpenApiGeneratorOptions): Record<string, unknown>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { DataDriver, EntityCollection } from "@rebasepro/types";
|
|
3
|
+
import { HonoEnv } from "../types";
|
|
4
|
+
/**
|
|
5
|
+
* Lightweight REST API generator that leverages existing Rebase DataDriver.
|
|
6
|
+
* Supports `include` query parameter for eager-loading relations via Drizzle.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RestApiGenerator {
|
|
9
|
+
private collections;
|
|
10
|
+
private router;
|
|
11
|
+
private driver;
|
|
12
|
+
constructor(collections: EntityCollection[], driver: DataDriver);
|
|
13
|
+
/**
|
|
14
|
+
* Generate REST routes using existing DataDriver
|
|
15
|
+
*/
|
|
16
|
+
generateRoutes(): Hono<HonoEnv>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the EntityFetchService from a driver if it exposes one (for include support)
|
|
19
|
+
*/
|
|
20
|
+
private getFetchService;
|
|
21
|
+
/**
|
|
22
|
+
* Create REST routes for a collection using existing Rebase patterns
|
|
23
|
+
*/
|
|
24
|
+
private createCollectionRoutes;
|
|
25
|
+
/**
|
|
26
|
+
* Catch-all routes for subcollection paths.
|
|
27
|
+
*
|
|
28
|
+
* Matches URL patterns like:
|
|
29
|
+
* GET /authors/111094/posts → list child collection
|
|
30
|
+
* GET /authors/111094/posts/43 → get child entity
|
|
31
|
+
* POST /authors/111094/posts → create child entity
|
|
32
|
+
* PUT /authors/111094/posts/43 → update child entity
|
|
33
|
+
* DELETE /authors/111094/posts/43 → delete child entity
|
|
34
|
+
*
|
|
35
|
+
* The `:rest{.+}` regex param captures the full remainder of the URL
|
|
36
|
+
* path (Hono v4 `*` wildcard does not populate `c.req.param("*")`).
|
|
37
|
+
* We split it into segments and reconstruct the `collectionPath`
|
|
38
|
+
* (e.g. "authors/111094/posts") and optional `entityId` (e.g. "43").
|
|
39
|
+
*
|
|
40
|
+
* The DataDriver.saveEntity / fetchCollection / etc. already know how to
|
|
41
|
+
* resolve multi-segment relation paths, so we just forward to them.
|
|
42
|
+
*/
|
|
43
|
+
private createSubcollectionRoutes;
|
|
44
|
+
/**
|
|
45
|
+
* Format successful API response - flattened for traditional REST API
|
|
46
|
+
*/
|
|
47
|
+
private formatResponse;
|
|
48
|
+
/**
|
|
49
|
+
* Flatten Rebase entity structure to traditional REST format
|
|
50
|
+
*/
|
|
51
|
+
private flattenEntity;
|
|
52
|
+
/**
|
|
53
|
+
* Fetch raw collection data without Entity wrapper (fallback for non-Postgres)
|
|
54
|
+
*/
|
|
55
|
+
private fetchRawCollection;
|
|
56
|
+
/**
|
|
57
|
+
* Count raw entities for a collection
|
|
58
|
+
*/
|
|
59
|
+
private countRawEntities;
|
|
60
|
+
/**
|
|
61
|
+
* Fetch single entity raw data without Entity wrapper (fallback)
|
|
62
|
+
*/
|
|
63
|
+
private fetchRawEntity;
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./api-generator";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { QueryOptions } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Map PostgREST-style operators to Rebase WhereFilterOp
|
|
4
|
+
*/
|
|
5
|
+
export declare function mapOperator(op: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Parse query parameters into QueryOptions
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseQueryOptions(query: Record<string, unknown>): QueryOptions;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { DataDriver } from "@rebasepro/types";
|
|
3
|
+
import { ApiConfig, HonoEnv } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* Simplified API server that leverages existing Rebase infrastructure
|
|
6
|
+
* Can be used standalone or mounted on existing Hono app
|
|
7
|
+
*/
|
|
8
|
+
export declare class RebaseApiServer {
|
|
9
|
+
private app;
|
|
10
|
+
private router;
|
|
11
|
+
private config;
|
|
12
|
+
private driver;
|
|
13
|
+
private constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Factory method to create an asynchronously initialized ApiServer instance
|
|
16
|
+
*/
|
|
17
|
+
static create(config: ApiConfig & {
|
|
18
|
+
driver: DataDriver;
|
|
19
|
+
}): Promise<RebaseApiServer>;
|
|
20
|
+
/**
|
|
21
|
+
* Setup Hono middleware
|
|
22
|
+
*/
|
|
23
|
+
private setupMiddleware;
|
|
24
|
+
/**
|
|
25
|
+
* Setup API routes using existing services
|
|
26
|
+
*/
|
|
27
|
+
private setupRoutes;
|
|
28
|
+
/**
|
|
29
|
+
* Get the Hono router with all API routes
|
|
30
|
+
*/
|
|
31
|
+
getRouter(): Hono<HonoEnv>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the standalone Hono app
|
|
34
|
+
*/
|
|
35
|
+
getApp(): Hono<HonoEnv>;
|
|
36
|
+
/**
|
|
37
|
+
* Start the server (standalone mode) via @hono/node-server
|
|
38
|
+
*/
|
|
39
|
+
listen(port?: number, callback?: () => void): void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { EntityCollection } from "@rebasepro/types";
|
|
2
|
+
import { AuthResult } from "../auth/middleware";
|
|
3
|
+
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
4
|
+
import { DataDriver } from "@rebasepro/types";
|
|
5
|
+
/**
|
|
6
|
+
* Hono Environment Variables
|
|
7
|
+
* Passed to generic Hono<HonoEnv> to type `c.get()`
|
|
8
|
+
*/
|
|
9
|
+
export type HonoEnv = {
|
|
10
|
+
Variables: {
|
|
11
|
+
user?: AuthResult | {
|
|
12
|
+
userId?: string;
|
|
13
|
+
roles?: string[];
|
|
14
|
+
};
|
|
15
|
+
driver?: DataDriver;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Configuration for API generation
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Configuration for API generation
|
|
23
|
+
*/
|
|
24
|
+
export interface ApiConfig {
|
|
25
|
+
collections?: EntityCollection[];
|
|
26
|
+
collectionsDir?: string;
|
|
27
|
+
basePath?: string;
|
|
28
|
+
enableGraphQL?: boolean;
|
|
29
|
+
enableREST?: boolean;
|
|
30
|
+
cors?: {
|
|
31
|
+
origin?: string | string[] | boolean;
|
|
32
|
+
credentials?: boolean;
|
|
33
|
+
};
|
|
34
|
+
/** Whether auth is required for API endpoints (default: true) */
|
|
35
|
+
requireAuth?: boolean;
|
|
36
|
+
/** Optional custom validator for authentication */
|
|
37
|
+
authValidator?: (c: import("hono").Context<import("./types").HonoEnv>) => Promise<AuthResult>;
|
|
38
|
+
pagination?: {
|
|
39
|
+
defaultLimit: number;
|
|
40
|
+
maxLimit: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Context passed to resolvers and handlers
|
|
45
|
+
*/
|
|
46
|
+
export interface ApiContext {
|
|
47
|
+
user?: AuthResult;
|
|
48
|
+
collections: Map<string, EntityCollection>;
|
|
49
|
+
db: NodePgDatabase;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Standard API response format
|
|
53
|
+
*/
|
|
54
|
+
export interface ApiResponse<T = unknown> {
|
|
55
|
+
data?: T;
|
|
56
|
+
error?: {
|
|
57
|
+
message: string;
|
|
58
|
+
code?: string;
|
|
59
|
+
details?: unknown;
|
|
60
|
+
};
|
|
61
|
+
meta?: {
|
|
62
|
+
total?: number;
|
|
63
|
+
page?: number;
|
|
64
|
+
limit?: number;
|
|
65
|
+
hasMore?: boolean;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Query options for API endpoints
|
|
70
|
+
*/
|
|
71
|
+
export interface QueryOptions {
|
|
72
|
+
limit?: number;
|
|
73
|
+
offset?: number;
|
|
74
|
+
where?: Record<string, unknown>;
|
|
75
|
+
orderBy?: Array<{
|
|
76
|
+
field: string;
|
|
77
|
+
direction: "asc" | "desc";
|
|
78
|
+
}>;
|
|
79
|
+
include?: string[];
|
|
80
|
+
/** Columns to return in the response (field-level selection) */
|
|
81
|
+
fields?: string[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Relation resolution configuration
|
|
85
|
+
*/
|
|
86
|
+
export interface RelationConfig {
|
|
87
|
+
relationName: string;
|
|
88
|
+
depth?: number;
|
|
89
|
+
include?: string[];
|
|
90
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { AuthModuleConfig } from "./routes";
|
|
3
|
+
interface AdminRouteOptions extends AuthModuleConfig {
|
|
4
|
+
serviceKey?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Callback to persistently mark bootstrap as completed.
|
|
7
|
+
* Invoked after the first admin user is promoted via POST /admin/bootstrap.
|
|
8
|
+
*/
|
|
9
|
+
setBootstrapCompleted?: () => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
import { HonoEnv } from "../api/types";
|
|
12
|
+
/**
|
|
13
|
+
* Create admin routes for user and role management
|
|
14
|
+
*/
|
|
15
|
+
export declare function createAdminRoutes(config: AdminRouteOptions): Hono<HonoEnv>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates an Apple Sign In OAuth Provider integration.
|
|
4
|
+
*
|
|
5
|
+
* Apple requires a client secret that is a signed JWT, regenerated on each
|
|
6
|
+
* token exchange (valid up to 6 months). This provider handles that automatically.
|
|
7
|
+
*
|
|
8
|
+
* Required Apple Developer configuration:
|
|
9
|
+
* - Services ID (clientId)
|
|
10
|
+
* - Key ID from the private key registered with Apple
|
|
11
|
+
* - Team ID from Apple Developer account
|
|
12
|
+
* - Private key (.p8 file contents) downloaded from Apple Developer portal
|
|
13
|
+
*/
|
|
14
|
+
export declare function createAppleProvider(config: {
|
|
15
|
+
clientId: string;
|
|
16
|
+
teamId: string;
|
|
17
|
+
keyId: string;
|
|
18
|
+
/** The raw PEM contents of the .p8 private key file */
|
|
19
|
+
privateKey: string;
|
|
20
|
+
}): OAuthProvider<{
|
|
21
|
+
code: string;
|
|
22
|
+
redirectUri: string;
|
|
23
|
+
user?: {
|
|
24
|
+
name?: {
|
|
25
|
+
firstName?: string;
|
|
26
|
+
lastName?: string;
|
|
27
|
+
};
|
|
28
|
+
email?: string;
|
|
29
|
+
};
|
|
30
|
+
}>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Bitbucket OAuth Provider integration (OAuth 2.0 consumer).
|
|
4
|
+
*/
|
|
5
|
+
export declare function createBitbucketProvider(config: {
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
}): OAuthProvider<{
|
|
9
|
+
code: string;
|
|
10
|
+
redirectUri: string;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Discord OAuth2 Provider integration.
|
|
4
|
+
*
|
|
5
|
+
* Uses the authorization code flow. Requires the "identify" and "email"
|
|
6
|
+
* scopes to retrieve the user's email and profile information.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createDiscordProvider(config: {
|
|
9
|
+
clientId: string;
|
|
10
|
+
clientSecret: string;
|
|
11
|
+
}): OAuthProvider<{
|
|
12
|
+
code: string;
|
|
13
|
+
redirectUri: string;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Facebook / Meta OAuth Provider integration.
|
|
4
|
+
*
|
|
5
|
+
* Uses the authorization code flow to exchange a code for an access token,
|
|
6
|
+
* then fetches user profile from the Facebook Graph API.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createFacebookProvider(config: {
|
|
9
|
+
clientId: string;
|
|
10
|
+
clientSecret: string;
|
|
11
|
+
}): OAuthProvider<{
|
|
12
|
+
code: string;
|
|
13
|
+
redirectUri: string;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a GitHub OAuth Provider integration.
|
|
4
|
+
*
|
|
5
|
+
* Flow: Frontend receives an authorization `code` via the GitHub OAuth redirect.
|
|
6
|
+
* This provider exchanges the code for an access token, then fetches the user's
|
|
7
|
+
* profile and primary email from the GitHub API.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createGitHubProvider(config: {
|
|
10
|
+
clientId: string;
|
|
11
|
+
clientSecret: string;
|
|
12
|
+
}): OAuthProvider<{
|
|
13
|
+
code: string;
|
|
14
|
+
redirectUri: string;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a GitLab OAuth Provider integration.
|
|
4
|
+
* Works with both GitLab.com and self-hosted instances.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createGitLabProvider(config: {
|
|
7
|
+
clientId: string;
|
|
8
|
+
clientSecret: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}): OAuthProvider<{
|
|
11
|
+
code: string;
|
|
12
|
+
redirectUri: string;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OAuthProvider } from "./interfaces";
|
|
2
|
+
export interface GoogleUserInfo {
|
|
3
|
+
googleId: string;
|
|
4
|
+
email: string;
|
|
5
|
+
displayName: string | null;
|
|
6
|
+
photoUrl: string | null;
|
|
7
|
+
emailVerified: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a Google OAuth Provider integration
|
|
11
|
+
*/
|
|
12
|
+
export declare function createGoogleProvider(clientId: string): OAuthProvider<{
|
|
13
|
+
idToken: string;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from "./interfaces";
|
|
2
|
+
export { configureJwt, generateAccessToken, verifyAccessToken, generateRefreshToken, hashRefreshToken, getRefreshTokenExpiry, getAccessTokenExpiry } from "./jwt";
|
|
3
|
+
export type { JwtConfig, AccessTokenPayload } from "./jwt";
|
|
4
|
+
export { hashPassword, verifyPassword, validatePasswordStrength } from "./password";
|
|
5
|
+
export type { PasswordValidationResult } from "./password";
|
|
6
|
+
export { createGoogleProvider } from "./google-oauth";
|
|
7
|
+
export { createLinkedinProvider } from "./linkedin-oauth";
|
|
8
|
+
export { createGitHubProvider } from "./github-oauth";
|
|
9
|
+
export { createMicrosoftProvider } from "./microsoft-oauth";
|
|
10
|
+
export { createAppleProvider } from "./apple-oauth";
|
|
11
|
+
export { createFacebookProvider } from "./facebook-oauth";
|
|
12
|
+
export { createTwitterProvider } from "./twitter-oauth";
|
|
13
|
+
export { createDiscordProvider } from "./discord-oauth";
|
|
14
|
+
export { createGitLabProvider } from "./gitlab-oauth";
|
|
15
|
+
export { createBitbucketProvider } from "./bitbucket-oauth";
|
|
16
|
+
export { createSlackProvider } from "./slack-oauth";
|
|
17
|
+
export { createSpotifyProvider } from "./spotify-oauth";
|
|
18
|
+
export { requireAuth, requireAdmin, optionalAuth, extractUserFromToken, createAuthMiddleware } from "./middleware";
|
|
19
|
+
export type { AuthMiddlewareOptions, AuthResult } from "./middleware";
|
|
20
|
+
export { createAuthRoutes } from "./routes";
|
|
21
|
+
export type { AuthModuleConfig } from "./routes";
|
|
22
|
+
export { createAdminRoutes } from "./admin-routes";
|
|
23
|
+
export { createRateLimiter, defaultAuthLimiter, strictAuthLimiter } from "./rate-limiter";
|