@mdguggenbichler/slugbase-core 0.0.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/backend/dist/app-factory.d.ts +17 -0
- package/backend/dist/app-factory.d.ts.map +1 -0
- package/backend/dist/app-factory.js +106 -0
- package/backend/dist/app-factory.js.map +1 -0
- package/backend/dist/auth/authorization.d.ts +25 -0
- package/backend/dist/auth/authorization.d.ts.map +1 -0
- package/backend/dist/auth/authorization.js +100 -0
- package/backend/dist/auth/authorization.js.map +1 -0
- package/backend/dist/auth/jwt.d.ts +5 -0
- package/backend/dist/auth/jwt.d.ts.map +1 -0
- package/backend/dist/auth/jwt.js +34 -0
- package/backend/dist/auth/jwt.js.map +1 -0
- package/backend/dist/auth/oidc.d.ts +4 -0
- package/backend/dist/auth/oidc.d.ts.map +1 -0
- package/backend/dist/auth/oidc.js +201 -0
- package/backend/dist/auth/oidc.js.map +1 -0
- package/backend/dist/config/cloud-providers.d.ts +18 -0
- package/backend/dist/config/cloud-providers.d.ts.map +1 -0
- package/backend/dist/config/cloud-providers.js +60 -0
- package/backend/dist/config/cloud-providers.js.map +1 -0
- package/backend/dist/config/cookies.d.ts +17 -0
- package/backend/dist/config/cookies.d.ts.map +1 -0
- package/backend/dist/config/cookies.js +26 -0
- package/backend/dist/config/cookies.js.map +1 -0
- package/backend/dist/config/mode.d.ts +7 -0
- package/backend/dist/config/mode.d.ts.map +1 -0
- package/backend/dist/config/mode.js +7 -0
- package/backend/dist/config/mode.js.map +1 -0
- package/backend/dist/config/swagger.d.ts +2 -0
- package/backend/dist/config/swagger.d.ts.map +1 -0
- package/backend/dist/config/swagger.js +76 -0
- package/backend/dist/config/swagger.js.map +1 -0
- package/backend/dist/config.d.ts +29 -0
- package/backend/dist/config.d.ts.map +1 -0
- package/backend/dist/config.js +41 -0
- package/backend/dist/config.js.map +1 -0
- package/backend/dist/db/index.d.ts +14 -0
- package/backend/dist/db/index.d.ts.map +1 -0
- package/backend/dist/db/index.js +114 -0
- package/backend/dist/db/index.js.map +1 -0
- package/backend/dist/db/migrate-slug-nullable.d.ts +10 -0
- package/backend/dist/db/migrate-slug-nullable.d.ts.map +1 -0
- package/backend/dist/db/migrate-slug-nullable.js +87 -0
- package/backend/dist/db/migrate-slug-nullable.js.map +1 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts +10 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts.map +1 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.js +103 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.js.map +1 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts +11 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts.map +1 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js +92 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js.map +1 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.d.ts +5 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.d.ts.map +1 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.js +98 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.js.map +1 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts +12 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts.map +1 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.js +152 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.js.map +1 -0
- package/backend/dist/db/migrations/005_add_email_verification.d.ts +5 -0
- package/backend/dist/db/migrations/005_add_email_verification.d.ts.map +1 -0
- package/backend/dist/db/migrations/005_add_email_verification.js +102 -0
- package/backend/dist/db/migrations/005_add_email_verification.js.map +1 -0
- package/backend/dist/db/migrations/006_refresh_tokens.d.ts +9 -0
- package/backend/dist/db/migrations/006_refresh_tokens.d.ts.map +1 -0
- package/backend/dist/db/migrations/006_refresh_tokens.js +61 -0
- package/backend/dist/db/migrations/006_refresh_tokens.js.map +1 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.js +40 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/008_slug_preferences.d.ts +8 -0
- package/backend/dist/db/migrations/008_slug_preferences.d.ts.map +1 -0
- package/backend/dist/db/migrations/008_slug_preferences.js +24 -0
- package/backend/dist/db/migrations/008_slug_preferences.js.map +1 -0
- package/backend/dist/db/migrations/009_signup_email_verified.d.ts +5 -0
- package/backend/dist/db/migrations/009_signup_email_verified.d.ts.map +1 -0
- package/backend/dist/db/migrations/009_signup_email_verified.js +79 -0
- package/backend/dist/db/migrations/009_signup_email_verified.js.map +1 -0
- package/backend/dist/db/migrations/010_organizations.d.ts +5 -0
- package/backend/dist/db/migrations/010_organizations.d.ts.map +1 -0
- package/backend/dist/db/migrations/010_organizations.js +113 -0
- package/backend/dist/db/migrations/010_organizations.js.map +1 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.d.ts +11 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.d.ts.map +1 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.js +59 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.js.map +1 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.js +40 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.js +39 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/014_stats_indexes.d.ts +8 -0
- package/backend/dist/db/migrations/014_stats_indexes.d.ts.map +1 -0
- package/backend/dist/db/migrations/014_stats_indexes.js +19 -0
- package/backend/dist/db/migrations/014_stats_indexes.js.map +1 -0
- package/backend/dist/db/migrations/015_api_tokens.d.ts +9 -0
- package/backend/dist/db/migrations/015_api_tokens.d.ts.map +1 -0
- package/backend/dist/db/migrations/015_api_tokens.js +48 -0
- package/backend/dist/db/migrations/015_api_tokens.js.map +1 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts +9 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts.map +1 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js +50 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js.map +1 -0
- package/backend/dist/db/migrations/017_ai_suggestions.d.ts +11 -0
- package/backend/dist/db/migrations/017_ai_suggestions.d.ts.map +1 -0
- package/backend/dist/db/migrations/017_ai_suggestions.js +78 -0
- package/backend/dist/db/migrations/017_ai_suggestions.js.map +1 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts +10 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts.map +1 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.js +89 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.js.map +1 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts +10 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts.map +1 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.js +47 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.js.map +1 -0
- package/backend/dist/db/migrations/020_tenant_scope.d.ts +5 -0
- package/backend/dist/db/migrations/020_tenant_scope.d.ts.map +1 -0
- package/backend/dist/db/migrations/020_tenant_scope.js +105 -0
- package/backend/dist/db/migrations/020_tenant_scope.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts +5 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js +113 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts +11 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js +59 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js +40 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts +9 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js +50 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts +11 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js +78 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js.map +1 -0
- package/backend/dist/db/migrations/index.d.ts +22 -0
- package/backend/dist/db/migrations/index.d.ts.map +1 -0
- package/backend/dist/db/migrations/index.js +194 -0
- package/backend/dist/db/migrations/index.js.map +1 -0
- package/backend/dist/db/pool.d.ts +13 -0
- package/backend/dist/db/pool.d.ts.map +1 -0
- package/backend/dist/db/pool.js +41 -0
- package/backend/dist/db/pool.js.map +1 -0
- package/backend/dist/db/seed-data.d.ts +66 -0
- package/backend/dist/db/seed-data.d.ts.map +1 -0
- package/backend/dist/db/seed-data.js +394 -0
- package/backend/dist/db/seed-data.js.map +1 -0
- package/backend/dist/db/seed.d.ts +19 -0
- package/backend/dist/db/seed.d.ts.map +1 -0
- package/backend/dist/db/seed.js +406 -0
- package/backend/dist/db/seed.js.map +1 -0
- package/backend/dist/index.d.ts +3 -0
- package/backend/dist/index.d.ts.map +1 -0
- package/backend/dist/index.js +64 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/instrument.d.ts +2 -0
- package/backend/dist/instrument.d.ts.map +1 -0
- package/backend/dist/instrument.js +16 -0
- package/backend/dist/instrument.js.map +1 -0
- package/backend/dist/load-env.d.ts +2 -0
- package/backend/dist/load-env.d.ts.map +1 -0
- package/backend/dist/load-env.js +33 -0
- package/backend/dist/load-env.js.map +1 -0
- package/backend/dist/middleware/auth.d.ts +23 -0
- package/backend/dist/middleware/auth.d.ts.map +1 -0
- package/backend/dist/middleware/auth.js +69 -0
- package/backend/dist/middleware/auth.js.map +1 -0
- package/backend/dist/middleware/error-handler.d.ts +11 -0
- package/backend/dist/middleware/error-handler.d.ts.map +1 -0
- package/backend/dist/middleware/error-handler.js +40 -0
- package/backend/dist/middleware/error-handler.js.map +1 -0
- package/backend/dist/middleware/security.d.ts +26 -0
- package/backend/dist/middleware/security.d.ts.map +1 -0
- package/backend/dist/middleware/security.js +162 -0
- package/backend/dist/middleware/security.js.map +1 -0
- package/backend/dist/middleware/stats-auth.d.ts +7 -0
- package/backend/dist/middleware/stats-auth.d.ts.map +1 -0
- package/backend/dist/middleware/stats-auth.js +20 -0
- package/backend/dist/middleware/stats-auth.js.map +1 -0
- package/backend/dist/middleware/tenant.d.ts +3 -0
- package/backend/dist/middleware/tenant.d.ts.map +1 -0
- package/backend/dist/middleware/tenant.js +13 -0
- package/backend/dist/middleware/tenant.js.map +1 -0
- package/backend/dist/register-routes.d.ts +12 -0
- package/backend/dist/register-routes.d.ts.map +1 -0
- package/backend/dist/register-routes.js +59 -0
- package/backend/dist/register-routes.js.map +1 -0
- package/backend/dist/routes/admin/demo-reset.d.ts +8 -0
- package/backend/dist/routes/admin/demo-reset.d.ts.map +1 -0
- package/backend/dist/routes/admin/demo-reset.js +66 -0
- package/backend/dist/routes/admin/demo-reset.js.map +1 -0
- package/backend/dist/routes/admin/settings.d.ts +3 -0
- package/backend/dist/routes/admin/settings.d.ts.map +1 -0
- package/backend/dist/routes/admin/settings.js +452 -0
- package/backend/dist/routes/admin/settings.js.map +1 -0
- package/backend/dist/routes/admin/stats.d.ts +7 -0
- package/backend/dist/routes/admin/stats.d.ts.map +1 -0
- package/backend/dist/routes/admin/stats.js +66 -0
- package/backend/dist/routes/admin/stats.js.map +1 -0
- package/backend/dist/routes/admin/teams.d.ts +3 -0
- package/backend/dist/routes/admin/teams.d.ts.map +1 -0
- package/backend/dist/routes/admin/teams.js +509 -0
- package/backend/dist/routes/admin/teams.js.map +1 -0
- package/backend/dist/routes/admin/users.d.ts +3 -0
- package/backend/dist/routes/admin/users.d.ts.map +1 -0
- package/backend/dist/routes/admin/users.js +525 -0
- package/backend/dist/routes/admin/users.js.map +1 -0
- package/backend/dist/routes/auth.d.ts +3 -0
- package/backend/dist/routes/auth.d.ts.map +1 -0
- package/backend/dist/routes/auth.js +992 -0
- package/backend/dist/routes/auth.js.map +1 -0
- package/backend/dist/routes/billing.d.ts +8 -0
- package/backend/dist/routes/billing.d.ts.map +1 -0
- package/backend/dist/routes/billing.js +481 -0
- package/backend/dist/routes/billing.js.map +1 -0
- package/backend/dist/routes/bookmarks.d.ts +3 -0
- package/backend/dist/routes/bookmarks.d.ts.map +1 -0
- package/backend/dist/routes/bookmarks.js +1593 -0
- package/backend/dist/routes/bookmarks.js.map +1 -0
- package/backend/dist/routes/config.d.ts +7 -0
- package/backend/dist/routes/config.d.ts.map +1 -0
- package/backend/dist/routes/config.js +52 -0
- package/backend/dist/routes/config.js.map +1 -0
- package/backend/dist/routes/contact.d.ts +9 -0
- package/backend/dist/routes/contact.d.ts.map +1 -0
- package/backend/dist/routes/contact.js +99 -0
- package/backend/dist/routes/contact.js.map +1 -0
- package/backend/dist/routes/csrf.d.ts +3 -0
- package/backend/dist/routes/csrf.d.ts.map +1 -0
- package/backend/dist/routes/csrf.js +39 -0
- package/backend/dist/routes/csrf.js.map +1 -0
- package/backend/dist/routes/dashboard.d.ts +3 -0
- package/backend/dist/routes/dashboard.d.ts.map +1 -0
- package/backend/dist/routes/dashboard.js +212 -0
- package/backend/dist/routes/dashboard.js.map +1 -0
- package/backend/dist/routes/email-verification.d.ts +3 -0
- package/backend/dist/routes/email-verification.d.ts.map +1 -0
- package/backend/dist/routes/email-verification.js +124 -0
- package/backend/dist/routes/email-verification.js.map +1 -0
- package/backend/dist/routes/folders.d.ts +3 -0
- package/backend/dist/routes/folders.d.ts.map +1 -0
- package/backend/dist/routes/folders.js +524 -0
- package/backend/dist/routes/folders.js.map +1 -0
- package/backend/dist/routes/go-helpers.d.ts +18 -0
- package/backend/dist/routes/go-helpers.d.ts.map +1 -0
- package/backend/dist/routes/go-helpers.js +64 -0
- package/backend/dist/routes/go-helpers.js.map +1 -0
- package/backend/dist/routes/go.d.ts +23 -0
- package/backend/dist/routes/go.d.ts.map +1 -0
- package/backend/dist/routes/go.js +361 -0
- package/backend/dist/routes/go.js.map +1 -0
- package/backend/dist/routes/health.d.ts +6 -0
- package/backend/dist/routes/health.d.ts.map +1 -0
- package/backend/dist/routes/health.js +79 -0
- package/backend/dist/routes/health.js.map +1 -0
- package/backend/dist/routes/invitations.d.ts +3 -0
- package/backend/dist/routes/invitations.d.ts.map +1 -0
- package/backend/dist/routes/invitations.js +172 -0
- package/backend/dist/routes/invitations.js.map +1 -0
- package/backend/dist/routes/oidc-providers.d.ts +3 -0
- package/backend/dist/routes/oidc-providers.d.ts.map +1 -0
- package/backend/dist/routes/oidc-providers.js +495 -0
- package/backend/dist/routes/oidc-providers.js.map +1 -0
- package/backend/dist/routes/organizations.d.ts +3 -0
- package/backend/dist/routes/organizations.d.ts.map +1 -0
- package/backend/dist/routes/organizations.js +538 -0
- package/backend/dist/routes/organizations.js.map +1 -0
- package/backend/dist/routes/password-reset.d.ts +3 -0
- package/backend/dist/routes/password-reset.d.ts.map +1 -0
- package/backend/dist/routes/password-reset.js +212 -0
- package/backend/dist/routes/password-reset.js.map +1 -0
- package/backend/dist/routes/redirect.d.ts +3 -0
- package/backend/dist/routes/redirect.d.ts.map +1 -0
- package/backend/dist/routes/redirect.js +124 -0
- package/backend/dist/routes/redirect.js.map +1 -0
- package/backend/dist/routes/tags.d.ts +3 -0
- package/backend/dist/routes/tags.d.ts.map +1 -0
- package/backend/dist/routes/tags.js +302 -0
- package/backend/dist/routes/tags.js.map +1 -0
- package/backend/dist/routes/teams.d.ts +3 -0
- package/backend/dist/routes/teams.d.ts.map +1 -0
- package/backend/dist/routes/teams.js +60 -0
- package/backend/dist/routes/teams.js.map +1 -0
- package/backend/dist/routes/tokens.d.ts +3 -0
- package/backend/dist/routes/tokens.d.ts.map +1 -0
- package/backend/dist/routes/tokens.js +157 -0
- package/backend/dist/routes/tokens.js.map +1 -0
- package/backend/dist/routes/users.d.ts +3 -0
- package/backend/dist/routes/users.d.ts.map +1 -0
- package/backend/dist/routes/users.js +199 -0
- package/backend/dist/routes/users.js.map +1 -0
- package/backend/dist/services/ai-suggestions.d.ts +29 -0
- package/backend/dist/services/ai-suggestions.d.ts.map +1 -0
- package/backend/dist/services/ai-suggestions.js +163 -0
- package/backend/dist/services/ai-suggestions.js.map +1 -0
- package/backend/dist/services/api-tokens.d.ts +66 -0
- package/backend/dist/services/api-tokens.d.ts.map +1 -0
- package/backend/dist/services/api-tokens.js +129 -0
- package/backend/dist/services/api-tokens.js.map +1 -0
- package/backend/dist/services/fetch-page-metadata.d.ts +15 -0
- package/backend/dist/services/fetch-page-metadata.d.ts.map +1 -0
- package/backend/dist/services/fetch-page-metadata.js +205 -0
- package/backend/dist/services/fetch-page-metadata.js.map +1 -0
- package/backend/dist/services/stats.d.ts +73 -0
- package/backend/dist/services/stats.d.ts.map +1 -0
- package/backend/dist/services/stats.js +145 -0
- package/backend/dist/services/stats.js.map +1 -0
- package/backend/dist/types/oidc-provider.d.ts +17 -0
- package/backend/dist/types/oidc-provider.d.ts.map +1 -0
- package/backend/dist/types/oidc-provider.js +2 -0
- package/backend/dist/types/oidc-provider.js.map +1 -0
- package/backend/dist/types.d.ts +86 -0
- package/backend/dist/types.d.ts.map +1 -0
- package/backend/dist/types.js +2 -0
- package/backend/dist/types.js.map +1 -0
- package/backend/dist/utils/ai-feature.d.ts +23 -0
- package/backend/dist/utils/ai-feature.d.ts.map +1 -0
- package/backend/dist/utils/ai-feature.js +62 -0
- package/backend/dist/utils/ai-feature.js.map +1 -0
- package/backend/dist/utils/email.d.ts +40 -0
- package/backend/dist/utils/email.d.ts.map +1 -0
- package/backend/dist/utils/email.js +456 -0
- package/backend/dist/utils/email.js.map +1 -0
- package/backend/dist/utils/encryption.d.ts +18 -0
- package/backend/dist/utils/encryption.d.ts.map +1 -0
- package/backend/dist/utils/encryption.js +95 -0
- package/backend/dist/utils/encryption.js.map +1 -0
- package/backend/dist/utils/env-validation.d.ts +6 -0
- package/backend/dist/utils/env-validation.d.ts.map +1 -0
- package/backend/dist/utils/env-validation.js +51 -0
- package/backend/dist/utils/env-validation.js.map +1 -0
- package/backend/dist/utils/jwt.d.ts +20 -0
- package/backend/dist/utils/jwt.d.ts.map +1 -0
- package/backend/dist/utils/jwt.js +48 -0
- package/backend/dist/utils/jwt.js.map +1 -0
- package/backend/dist/utils/org-cleanup.d.ts +6 -0
- package/backend/dist/utils/org-cleanup.d.ts.map +1 -0
- package/backend/dist/utils/org-cleanup.js +37 -0
- package/backend/dist/utils/org-cleanup.js.map +1 -0
- package/backend/dist/utils/organizations.d.ts +12 -0
- package/backend/dist/utils/organizations.d.ts.map +1 -0
- package/backend/dist/utils/organizations.js +24 -0
- package/backend/dist/utils/organizations.js.map +1 -0
- package/backend/dist/utils/plan-errors.d.ts +18 -0
- package/backend/dist/utils/plan-errors.d.ts.map +1 -0
- package/backend/dist/utils/plan-errors.js +21 -0
- package/backend/dist/utils/plan-errors.js.map +1 -0
- package/backend/dist/utils/refresh-token.d.ts +31 -0
- package/backend/dist/utils/refresh-token.d.ts.map +1 -0
- package/backend/dist/utils/refresh-token.js +63 -0
- package/backend/dist/utils/refresh-token.js.map +1 -0
- package/backend/dist/utils/session-store.d.ts +46 -0
- package/backend/dist/utils/session-store.d.ts.map +1 -0
- package/backend/dist/utils/session-store.js +222 -0
- package/backend/dist/utils/session-store.js.map +1 -0
- package/backend/dist/utils/tenant.d.ts +5 -0
- package/backend/dist/utils/tenant.d.ts.map +1 -0
- package/backend/dist/utils/tenant.js +12 -0
- package/backend/dist/utils/tenant.js.map +1 -0
- package/backend/dist/utils/user-key.d.ts +24 -0
- package/backend/dist/utils/user-key.d.ts.map +1 -0
- package/backend/dist/utils/user-key.js +116 -0
- package/backend/dist/utils/user-key.js.map +1 -0
- package/backend/dist/utils/validation.d.ts +91 -0
- package/backend/dist/utils/validation.d.ts.map +1 -0
- package/backend/dist/utils/validation.js +337 -0
- package/backend/dist/utils/validation.js.map +1 -0
- package/backend/index.js +15 -0
- package/frontend/index.js +5 -0
- package/frontend/index.tsx +7 -0
- package/package.json +16 -0
- package/types/index.js +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-providers.js","sourceRoot":"","sources":["../../src/config/cloud-providers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,QAAQ,CAAC;AACvE,MAAM,gBAAgB,GAAG,qCAAqC,gBAAgB,OAAO,CAAC;AACtF,MAAM,WAAW,GAAG,0CAA0C,CAAC;AAC/D,MAAM,YAAY,GAAG,6CAA6C,CAAC;AACnE,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,sBAAsB;YAC9B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,gBAAgB;YAC5B,iBAAiB,EAAE,GAAG,gBAAgB,YAAY;YAClD,SAAS,EAAE,GAAG,gBAAgB,QAAQ;YACtC,YAAY,EAAE,2CAA2C;YACzD,MAAM,EAAE,sBAAsB;YAC9B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,oBAAoB;YAChC,iBAAiB,EAAE,WAAW;YAC9B,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,mBAAmB;YAC3B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth cookie options for self-hosted runtime.
|
|
3
|
+
* Import only after load-env.js (used by routes/auth.ts).
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthCookieOptions {
|
|
6
|
+
httpOnly: boolean;
|
|
7
|
+
secure: boolean;
|
|
8
|
+
sameSite: 'strict';
|
|
9
|
+
maxAge?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function getAuthCookieOptions(maxAgeMs?: number): AuthCookieOptions;
|
|
12
|
+
export declare function getClearAuthCookieOptions(): {
|
|
13
|
+
httpOnly: boolean;
|
|
14
|
+
secure: boolean;
|
|
15
|
+
sameSite: 'strict';
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=cookies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/config/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAQzE;AAED,wBAAgB,yBAAyB,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAOtG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth cookie options for self-hosted runtime.
|
|
3
|
+
* Import only after load-env.js (used by routes/auth.ts).
|
|
4
|
+
*/
|
|
5
|
+
const baseUrl = process.env.BASE_URL || 'http://localhost:5000';
|
|
6
|
+
const isHttps = baseUrl.startsWith('https://');
|
|
7
|
+
const isProduction = process.env.NODE_ENV === 'production' && isHttps;
|
|
8
|
+
export function getAuthCookieOptions(maxAgeMs) {
|
|
9
|
+
const opts = {
|
|
10
|
+
httpOnly: true,
|
|
11
|
+
secure: isProduction,
|
|
12
|
+
sameSite: 'strict',
|
|
13
|
+
};
|
|
14
|
+
if (maxAgeMs != null)
|
|
15
|
+
opts.maxAge = maxAgeMs;
|
|
16
|
+
return opts;
|
|
17
|
+
}
|
|
18
|
+
export function getClearAuthCookieOptions() {
|
|
19
|
+
const opts = {
|
|
20
|
+
httpOnly: true,
|
|
21
|
+
secure: isProduction,
|
|
22
|
+
sameSite: 'strict',
|
|
23
|
+
};
|
|
24
|
+
return opts;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/config/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB,CAAC;AAChE,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC;AAStE,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,MAAM,IAAI,GAAsB;QAC9B,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,QAAQ;KACnB,CAAC;IACF,IAAI,QAAQ,IAAI,IAAI;QAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,QAAiB;KAC5B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/config/mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,YAA2B,CAAC;AAC/C,eAAO,MAAM,OAAO,QAAQ,CAAC;AAC7B,eAAO,MAAM,YAAY,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/config/mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAiB,YAAY,CAAC;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../src/config/swagger.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,WAAW,QAAwB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import swaggerJsdoc from 'swagger-jsdoc';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
// Determine if we're running from compiled JS (production) or TS source (development)
|
|
7
|
+
// When running from dist/, __dirname will be dist/config, and routes will be at ../routes/
|
|
8
|
+
// In production, files are .js, in development they're .ts
|
|
9
|
+
const isProduction = __dirname.includes('dist');
|
|
10
|
+
const fileExtension = isProduction ? 'js' : 'ts';
|
|
11
|
+
const options = {
|
|
12
|
+
definition: {
|
|
13
|
+
openapi: '3.0.0',
|
|
14
|
+
info: {
|
|
15
|
+
title: 'SlugBase API',
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
description: `API documentation for SlugBase - A bookmark management system.
|
|
18
|
+
|
|
19
|
+
**Authentication:**
|
|
20
|
+
- **JWT (cookie or Bearer):** Session-based, short-lived. Used when logging in via the web app.
|
|
21
|
+
- **Personal API Token (Bearer):** Long-lived tokens with prefix \`sb_\`. Use for scripts, CLI, or CI/CD. Create tokens at Profile > API Access. Send as \`Authorization: Bearer <token>\`.`,
|
|
22
|
+
contact: {
|
|
23
|
+
name: 'SlugBase',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
servers: [
|
|
27
|
+
{
|
|
28
|
+
url: process.env.BASE_URL || 'http://localhost:5000',
|
|
29
|
+
description: 'Development server',
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
components: {
|
|
33
|
+
securitySchemes: {
|
|
34
|
+
cookieAuth: {
|
|
35
|
+
type: 'apiKey',
|
|
36
|
+
in: 'cookie',
|
|
37
|
+
name: 'token',
|
|
38
|
+
description: 'JWT in httpOnly cookie (web app session)',
|
|
39
|
+
},
|
|
40
|
+
bearerAuth: {
|
|
41
|
+
type: 'http',
|
|
42
|
+
scheme: 'bearer',
|
|
43
|
+
bearerFormat: 'JWT',
|
|
44
|
+
description: 'JWT token (short-lived session)',
|
|
45
|
+
},
|
|
46
|
+
apiTokenAuth: {
|
|
47
|
+
type: 'http',
|
|
48
|
+
scheme: 'bearer',
|
|
49
|
+
bearerFormat: 'API Token',
|
|
50
|
+
description: 'Personal API token (prefix sb_). Long-lived. Create at Profile > API Access.',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
security: [
|
|
55
|
+
{
|
|
56
|
+
cookieAuth: [],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
bearerAuth: [],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
apiTokenAuth: [],
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
apis: [
|
|
67
|
+
// Use appropriate file extension based on environment
|
|
68
|
+
// In development: scans .ts files from src/
|
|
69
|
+
// In production: scans .js files from dist/
|
|
70
|
+
join(__dirname, `../routes/*.${fileExtension}`),
|
|
71
|
+
join(__dirname, `../routes/**/*.${fileExtension}`),
|
|
72
|
+
join(__dirname, `../**/*.${fileExtension}`),
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
export const swaggerSpec = swaggerJsdoc(options);
|
|
76
|
+
//# sourceMappingURL=swagger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swagger.js","sourceRoot":"","sources":["../../src/config/swagger.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,sFAAsF;AACtF,2FAA2F;AAC3F,2DAA2D;AAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjD,MAAM,OAAO,GAAyB;IACpC,UAAU,EAAE;QACV,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE;;;;4LAIyK;YACtL,OAAO,EAAE;gBACP,IAAI,EAAE,UAAU;aACjB;SACF;QACD,OAAO,EAAE;YACP;gBACE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB;gBACpD,WAAW,EAAE,oBAAoB;aAClC;SACF;QACD,UAAU,EAAE;YACV,eAAe,EAAE;gBACf,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,0CAA0C;iBACxD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,KAAK;oBACnB,WAAW,EAAE,iCAAiC;iBAC/C;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,WAAW;oBACzB,WAAW,EAAE,8EAA8E;iBAC5F;aACF;SACF;QACD,QAAQ,EAAE;YACR;gBACE,UAAU,EAAE,EAAE;aACf;YACD;gBACE,UAAU,EAAE,EAAE;aACf;YACD;gBACE,YAAY,EAAE,EAAE;aACjB;SACF;KACF;IACD,IAAI,EAAE;QACJ,sDAAsD;QACtD,4CAA4C;QAC5C,4CAA4C;QAC5C,IAAI,CAAC,SAAS,EAAE,eAAe,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,kBAAkB,aAAa,EAAE,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,WAAW,aAAa,EAAE,CAAC;KAC5C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core config from environment. Used by app entrypoints and by @slugbase/core/backend.
|
|
3
|
+
*/
|
|
4
|
+
export interface DbConfig {
|
|
5
|
+
type: 'sqlite' | 'postgresql';
|
|
6
|
+
path?: string;
|
|
7
|
+
connectionString?: string;
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
database?: string;
|
|
11
|
+
user?: string;
|
|
12
|
+
password?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CoreConfig {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
frontendUrl: string;
|
|
17
|
+
db: DbConfig;
|
|
18
|
+
jwtSecret: string;
|
|
19
|
+
encryptionKey: string;
|
|
20
|
+
sessionSecret: string;
|
|
21
|
+
nodeEnv: string;
|
|
22
|
+
registrationsEnabled: boolean;
|
|
23
|
+
port: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read and return typed config from env. Does not validate secrets (use validateEnvironmentVariables for that).
|
|
27
|
+
*/
|
|
28
|
+
export declare function getConfig(env?: NodeJS.ProcessEnv): CoreConfig;
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,CA6B1E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core config from environment. Used by app entrypoints and by @slugbase/core/backend.
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_PORT = 5000;
|
|
5
|
+
const DEFAULT_FRONTEND = 'http://localhost:3000';
|
|
6
|
+
const DEFAULT_BASE = 'http://localhost:5000';
|
|
7
|
+
/**
|
|
8
|
+
* Read and return typed config from env. Does not validate secrets (use validateEnvironmentVariables for that).
|
|
9
|
+
*/
|
|
10
|
+
export function getConfig(env = process.env) {
|
|
11
|
+
const dbType = (env.DB_TYPE || 'sqlite');
|
|
12
|
+
const db = { type: dbType };
|
|
13
|
+
if (dbType === 'postgresql') {
|
|
14
|
+
if (env.DATABASE_URL) {
|
|
15
|
+
db.connectionString = env.DATABASE_URL;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
db.host = env.DB_HOST || 'localhost';
|
|
19
|
+
db.port = parseInt(env.DB_PORT || '5432', 10);
|
|
20
|
+
db.database = env.DB_NAME || 'slugbase';
|
|
21
|
+
db.user = env.DB_USER || 'postgres';
|
|
22
|
+
db.password = env.DB_PASSWORD || '';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
db.path = env.DB_PATH;
|
|
27
|
+
}
|
|
28
|
+
const sessionSecret = env.SESSION_SECRET || env.JWT_SECRET || 'slugbase-session-secret-change-in-production';
|
|
29
|
+
return {
|
|
30
|
+
baseUrl: env.BASE_URL || DEFAULT_BASE,
|
|
31
|
+
frontendUrl: (env.FRONTEND_URL || DEFAULT_FRONTEND).replace(/\/$/, ''),
|
|
32
|
+
db,
|
|
33
|
+
jwtSecret: (env.JWT_SECRET || ''),
|
|
34
|
+
encryptionKey: (env.ENCRYPTION_KEY || ''),
|
|
35
|
+
sessionSecret,
|
|
36
|
+
nodeEnv: env.NODE_ENV || 'development',
|
|
37
|
+
registrationsEnabled: env.REGISTRATIONS_ENABLED !== 'false',
|
|
38
|
+
port: parseInt(env.PORT || String(DEFAULT_PORT), 10),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAA4B,CAAC;IACpE,MAAM,EAAE,GAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,EAAE,CAAC,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,WAAW,CAAC;YACrC,EAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;YACxC,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;YACpC,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,UAAU,IAAI,8CAA8C,CAAC;IAC7G,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,YAAY;QACrC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACtE,EAAE;QACF,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAW;QAC3C,aAAa,EAAE,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAW;QACnD,aAAa;QACb,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,aAAa;QACtC,oBAAoB,EAAE,GAAG,CAAC,qBAAqB,KAAK,OAAO;QAC3D,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { type DbPool } from './pool.js';
|
|
3
|
+
export declare function setDb(pool: DbPool, type: 'sqlite' | 'postgresql'): void;
|
|
4
|
+
export declare function getDb(): DbPool;
|
|
5
|
+
export declare function getDbType(): 'sqlite' | 'postgresql';
|
|
6
|
+
export declare function initDatabase(): Promise<void>;
|
|
7
|
+
export declare function query(sql: string, params?: any[]): Promise<any[]>;
|
|
8
|
+
export declare function queryOne(sql: string, params?: any[]): Promise<any>;
|
|
9
|
+
export declare function execute(sql: string, params?: any[]): Promise<Database.RunResult | {
|
|
10
|
+
changes: number;
|
|
11
|
+
lastInsertRowid: null;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function isInitialized(): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAQtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAGvE;AAED,wBAAgB,KAAK,IAAI,MAAM,CAG9B;AAED,wBAAgB,SAAS,IAAI,QAAQ,GAAG,YAAY,CAEnD;AAiBD,wBAAsB,YAAY,kBAqCjC;AAED,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,kBAO1D;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,gBAO7D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO;;;GAW5D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
import { getConfig } from '../config.js';
|
|
6
|
+
import { createDbPool } from './pool.js';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
let db = null;
|
|
10
|
+
let dbType = 'sqlite';
|
|
11
|
+
export function setDb(pool, type) {
|
|
12
|
+
db = pool;
|
|
13
|
+
dbType = type;
|
|
14
|
+
}
|
|
15
|
+
export function getDb() {
|
|
16
|
+
if (!db)
|
|
17
|
+
throw new Error('Database not initialized. Call initDatabase() first.');
|
|
18
|
+
return db;
|
|
19
|
+
}
|
|
20
|
+
export function getDbType() {
|
|
21
|
+
return dbType;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Convert boolean to database-compatible value
|
|
25
|
+
*/
|
|
26
|
+
function boolToDb(value) {
|
|
27
|
+
if (value === null || value === undefined)
|
|
28
|
+
return null;
|
|
29
|
+
if (dbType === 'postgresql')
|
|
30
|
+
return value;
|
|
31
|
+
return value ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
/** Convert ? placeholders to $1, $2, ... for PostgreSQL */
|
|
34
|
+
function toPg(sql) {
|
|
35
|
+
let n = 0;
|
|
36
|
+
return sql.replace(/\?/g, () => `$${++n}`);
|
|
37
|
+
}
|
|
38
|
+
export async function initDatabase() {
|
|
39
|
+
const config = getConfig(process.env);
|
|
40
|
+
const pool = createDbPool(config.db);
|
|
41
|
+
setDb(pool, config.db.type);
|
|
42
|
+
let schema = readFileSync(join(__dirname, 'schema.sql'), 'utf-8');
|
|
43
|
+
if (dbType === 'postgresql') {
|
|
44
|
+
const pg = pool;
|
|
45
|
+
schema = schema.replace(/VARCHAR\((\d+)\)/g, 'VARCHAR($1)');
|
|
46
|
+
const statements = schema.split(';').filter((s) => s.trim().length > 0);
|
|
47
|
+
for (const statement of statements) {
|
|
48
|
+
if (statement.trim()) {
|
|
49
|
+
try {
|
|
50
|
+
await pg.query(statement);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (!error.message?.includes('already exists') && !error.message?.includes('duplicate')) {
|
|
54
|
+
console.error('Schema error:', error.message, 'Statement:', statement.substring(0, 100));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const sqlite = pool;
|
|
62
|
+
schema = schema
|
|
63
|
+
.replace(/VARCHAR\((\d+)\)/g, 'TEXT')
|
|
64
|
+
.replace(/TIMESTAMP/g, 'DATETIME');
|
|
65
|
+
sqlite.exec(schema);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const { runMigrations } = await import('./migrations/index.js');
|
|
69
|
+
await runMigrations();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Error running migrations:', error);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function query(sql, params = []) {
|
|
77
|
+
const current = getDb();
|
|
78
|
+
if (dbType === 'postgresql') {
|
|
79
|
+
const result = await current.query(toPg(sql), params);
|
|
80
|
+
return result.rows;
|
|
81
|
+
}
|
|
82
|
+
return current.prepare(sql).all(...params);
|
|
83
|
+
}
|
|
84
|
+
export async function queryOne(sql, params = []) {
|
|
85
|
+
const current = getDb();
|
|
86
|
+
if (dbType === 'postgresql') {
|
|
87
|
+
const result = await current.query(toPg(sql), params);
|
|
88
|
+
return result.rows[0] || null;
|
|
89
|
+
}
|
|
90
|
+
return current.prepare(sql).get(...params) || null;
|
|
91
|
+
}
|
|
92
|
+
export async function execute(sql, params = []) {
|
|
93
|
+
const processedParams = params.map((param) => {
|
|
94
|
+
if (typeof param === 'boolean')
|
|
95
|
+
return boolToDb(param);
|
|
96
|
+
return param;
|
|
97
|
+
});
|
|
98
|
+
const current = getDb();
|
|
99
|
+
if (dbType === 'postgresql') {
|
|
100
|
+
const result = await current.query(toPg(sql), processedParams);
|
|
101
|
+
return { changes: result.rowCount || 0, lastInsertRowid: null };
|
|
102
|
+
}
|
|
103
|
+
return current.prepare(sql).run(...processedParams);
|
|
104
|
+
}
|
|
105
|
+
export async function isInitialized() {
|
|
106
|
+
try {
|
|
107
|
+
const result = await queryOne('SELECT COUNT(*) as count FROM users', []);
|
|
108
|
+
return result && parseInt(result.count) > 0;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration script to:
|
|
3
|
+
* 1. Make slug column nullable
|
|
4
|
+
* 2. Convert all _internal_ placeholder slugs to NULL
|
|
5
|
+
* 3. Remove UNIQUE constraint issues with NULL slugs
|
|
6
|
+
*
|
|
7
|
+
* Run this once to migrate existing database
|
|
8
|
+
*/
|
|
9
|
+
export declare function migrateSlugNullable(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=migrate-slug-nullable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-slug-nullable.d.ts","sourceRoot":"","sources":["../../src/db/migrate-slug-nullable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,wBAAsB,mBAAmB,kBA4ExC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration script to:
|
|
3
|
+
* 1. Make slug column nullable
|
|
4
|
+
* 2. Convert all _internal_ placeholder slugs to NULL
|
|
5
|
+
* 3. Remove UNIQUE constraint issues with NULL slugs
|
|
6
|
+
*
|
|
7
|
+
* Run this once to migrate existing database
|
|
8
|
+
*/
|
|
9
|
+
import { execute } from './index.js';
|
|
10
|
+
export async function migrateSlugNullable() {
|
|
11
|
+
try {
|
|
12
|
+
console.log('Starting slug migration...');
|
|
13
|
+
// For SQLite, we need to recreate the table to make slug nullable
|
|
14
|
+
// For PostgreSQL, we can use ALTER TABLE
|
|
15
|
+
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
|
|
16
|
+
if (DB_TYPE === 'postgresql') {
|
|
17
|
+
// PostgreSQL: Just alter the column
|
|
18
|
+
await execute('ALTER TABLE bookmarks ALTER COLUMN slug DROP NOT NULL', []);
|
|
19
|
+
console.log('Made slug column nullable');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// SQLite: Need to recreate table
|
|
23
|
+
console.log('SQLite detected - recreating bookmarks table...');
|
|
24
|
+
// Create new table with nullable slug
|
|
25
|
+
await execute(`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS bookmarks_new (
|
|
27
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
28
|
+
user_id VARCHAR(255) NOT NULL,
|
|
29
|
+
title TEXT NOT NULL,
|
|
30
|
+
url TEXT NOT NULL,
|
|
31
|
+
slug VARCHAR(255),
|
|
32
|
+
forwarding_enabled BOOLEAN DEFAULT FALSE,
|
|
33
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
34
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
35
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
36
|
+
)
|
|
37
|
+
`, []);
|
|
38
|
+
// Copy data, converting _internal_ slugs to NULL
|
|
39
|
+
await execute(`
|
|
40
|
+
INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
|
|
41
|
+
SELECT
|
|
42
|
+
id,
|
|
43
|
+
user_id,
|
|
44
|
+
title,
|
|
45
|
+
url,
|
|
46
|
+
CASE
|
|
47
|
+
WHEN slug IS NULL OR slug = '' OR slug LIKE '_internal_%' THEN NULL
|
|
48
|
+
ELSE slug
|
|
49
|
+
END as slug,
|
|
50
|
+
forwarding_enabled,
|
|
51
|
+
created_at,
|
|
52
|
+
updated_at
|
|
53
|
+
FROM bookmarks
|
|
54
|
+
`, []);
|
|
55
|
+
// Drop old table
|
|
56
|
+
await execute('DROP TABLE bookmarks', []);
|
|
57
|
+
// Rename new table
|
|
58
|
+
await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
|
|
59
|
+
// Recreate indexes
|
|
60
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
|
|
61
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
|
|
62
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
|
|
63
|
+
console.log('Recreated bookmarks table with nullable slug');
|
|
64
|
+
}
|
|
65
|
+
// Clean up any remaining _internal_ slugs (set to NULL)
|
|
66
|
+
const result = await execute(`UPDATE bookmarks SET slug = NULL WHERE slug LIKE '_internal_%' OR slug = ''`, []);
|
|
67
|
+
console.log(`Cleaned up ${result.changes || 0} internal placeholder slugs`);
|
|
68
|
+
console.log('Slug migration completed successfully!');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error('Migration error:', error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Run migration if called directly
|
|
76
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
77
|
+
migrateSlugNullable()
|
|
78
|
+
.then(() => {
|
|
79
|
+
console.log('Migration complete');
|
|
80
|
+
process.exit(0);
|
|
81
|
+
})
|
|
82
|
+
.catch((error) => {
|
|
83
|
+
console.error('Migration failed:', error);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=migrate-slug-nullable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-slug-nullable.js","sourceRoot":"","sources":["../../src/db/migrate-slug-nullable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAS,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,kEAAkE;QAClE,yCAAyC;QAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;QAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,oCAAoC;YACpC,MAAM,OAAO,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAE/D,sCAAsC;YACtC,MAAM,OAAO,CAAC;;;;;;;;;;;;OAYb,EAAE,EAAE,CAAC,CAAC;YAEP,iDAAiD;YACjD,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;OAeb,EAAE,EAAE,CAAC,CAAC;YAEP,iBAAiB;YACjB,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;YAE1C,mBAAmB;YACnB,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;YAEnE,mBAAmB;YACnB,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;YAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;YACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;YAEpG,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,6EAA6E,EAC7E,EAAE,CACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAE5E,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,mBAAmB,EAAE;SAClB,IAAI,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Make slug column nullable in bookmarks table
|
|
3
|
+
* Date: 2024-01-01
|
|
4
|
+
* Description: Makes the slug column nullable and converts all _internal_ placeholder slugs to NULL
|
|
5
|
+
*/
|
|
6
|
+
export declare const migrationId = "001_migrate_slug_nullable";
|
|
7
|
+
export declare const migrationName = "Make slug column nullable";
|
|
8
|
+
export declare function up(): Promise<void>;
|
|
9
|
+
export declare function down(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=001_migrate_slug_nullable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"001_migrate_slug_nullable.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/001_migrate_slug_nullable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAEzD,wBAAsB,EAAE,kBA0DvB;AAED,wBAAsB,IAAI,kBA6CzB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Make slug column nullable in bookmarks table
|
|
3
|
+
* Date: 2024-01-01
|
|
4
|
+
* Description: Makes the slug column nullable and converts all _internal_ placeholder slugs to NULL
|
|
5
|
+
*/
|
|
6
|
+
import { execute } from '../index.js';
|
|
7
|
+
export const migrationId = '001_migrate_slug_nullable';
|
|
8
|
+
export const migrationName = 'Make slug column nullable';
|
|
9
|
+
export async function up() {
|
|
10
|
+
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
|
|
11
|
+
if (DB_TYPE === 'postgresql') {
|
|
12
|
+
// PostgreSQL: Just alter the column
|
|
13
|
+
await execute('ALTER TABLE bookmarks ALTER COLUMN slug DROP NOT NULL', []);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
// SQLite: Need to recreate table
|
|
17
|
+
// Create new table with nullable slug
|
|
18
|
+
await execute(`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS bookmarks_new (
|
|
20
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
21
|
+
user_id VARCHAR(255) NOT NULL,
|
|
22
|
+
title TEXT NOT NULL,
|
|
23
|
+
url TEXT NOT NULL,
|
|
24
|
+
slug VARCHAR(255),
|
|
25
|
+
forwarding_enabled BOOLEAN DEFAULT FALSE,
|
|
26
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
27
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
28
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
29
|
+
)
|
|
30
|
+
`, []);
|
|
31
|
+
// Copy data, converting _internal_ slugs to NULL
|
|
32
|
+
await execute(`
|
|
33
|
+
INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
|
|
34
|
+
SELECT
|
|
35
|
+
id,
|
|
36
|
+
user_id,
|
|
37
|
+
title,
|
|
38
|
+
url,
|
|
39
|
+
CASE
|
|
40
|
+
WHEN slug IS NULL OR slug = '' OR slug LIKE '_internal_%' THEN NULL
|
|
41
|
+
ELSE slug
|
|
42
|
+
END as slug,
|
|
43
|
+
forwarding_enabled,
|
|
44
|
+
created_at,
|
|
45
|
+
updated_at
|
|
46
|
+
FROM bookmarks
|
|
47
|
+
`, []);
|
|
48
|
+
// Drop old table
|
|
49
|
+
await execute('DROP TABLE bookmarks', []);
|
|
50
|
+
// Rename new table
|
|
51
|
+
await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
|
|
52
|
+
// Recreate indexes
|
|
53
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
|
|
54
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
|
|
55
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
|
|
56
|
+
}
|
|
57
|
+
// Clean up any remaining _internal_ slugs (set to NULL)
|
|
58
|
+
await execute(`UPDATE bookmarks SET slug = NULL WHERE slug LIKE '_internal_%' OR slug = ''`, []);
|
|
59
|
+
}
|
|
60
|
+
export async function down() {
|
|
61
|
+
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
|
|
62
|
+
if (DB_TYPE === 'postgresql') {
|
|
63
|
+
// For PostgreSQL, we can't easily make it NOT NULL if there are NULL values
|
|
64
|
+
// So we'll set a default value first, then make it NOT NULL
|
|
65
|
+
await execute(`UPDATE bookmarks SET slug = '_internal_' || id WHERE slug IS NULL`, []);
|
|
66
|
+
await execute('ALTER TABLE bookmarks ALTER COLUMN slug SET NOT NULL', []);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// SQLite: Need to recreate table
|
|
70
|
+
await execute(`
|
|
71
|
+
CREATE TABLE IF NOT EXISTS bookmarks_new (
|
|
72
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
73
|
+
user_id VARCHAR(255) NOT NULL,
|
|
74
|
+
title TEXT NOT NULL,
|
|
75
|
+
url TEXT NOT NULL,
|
|
76
|
+
slug VARCHAR(255) NOT NULL,
|
|
77
|
+
forwarding_enabled BOOLEAN DEFAULT FALSE,
|
|
78
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
79
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
80
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
81
|
+
)
|
|
82
|
+
`, []);
|
|
83
|
+
await execute(`
|
|
84
|
+
INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
|
|
85
|
+
SELECT
|
|
86
|
+
id,
|
|
87
|
+
user_id,
|
|
88
|
+
title,
|
|
89
|
+
url,
|
|
90
|
+
COALESCE(slug, '_internal_' || id) as slug,
|
|
91
|
+
forwarding_enabled,
|
|
92
|
+
created_at,
|
|
93
|
+
updated_at
|
|
94
|
+
FROM bookmarks
|
|
95
|
+
`, []);
|
|
96
|
+
await execute('DROP TABLE bookmarks', []);
|
|
97
|
+
await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
|
|
98
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
|
|
99
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
|
|
100
|
+
await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=001_migrate_slug_nullable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"001_migrate_slug_nullable.js","sourceRoot":"","sources":["../../../src/db/migrations/001_migrate_slug_nullable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,oCAAoC;QACpC,MAAM,OAAO,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,sCAAsC;QACtC,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,iDAAiD;QACjD,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;KAeb,EAAE,EAAE,CAAC,CAAC;QAEP,iBAAiB;QACjB,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAE1C,mBAAmB;QACnB,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;QAEnE,mBAAmB;QACnB,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,wDAAwD;IACxD,MAAM,OAAO,CACX,6EAA6E,EAC7E,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,OAAO,CAAC,mEAAmE,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,CAAC,sDAAsD,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;QAEnE,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Add custom OIDC endpoint fields
|
|
3
|
+
* Date: 2026-01-12
|
|
4
|
+
* Description: Adds optional custom endpoint fields (authorization_url, token_url, userinfo_url) to oidc_providers table
|
|
5
|
+
* to allow providers with non-standard endpoint paths
|
|
6
|
+
*/
|
|
7
|
+
export declare const migrationId = "002_add_oidc_custom_endpoints";
|
|
8
|
+
export declare const migrationName = "Add custom OIDC endpoint fields";
|
|
9
|
+
export declare function up(): Promise<void>;
|
|
10
|
+
export declare function down(): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=002_add_oidc_custom_endpoints.d.ts.map
|