@phtngyn/cms 0.2.0-beta.1 → 0.2.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +38 -45
- package/package.json +3 -1
- package/src/ApplicationTypes.d.ts +7 -5
- package/src/{Configuration-CjVUBBwa.js → Configuration-BU-UyGoH.js} +4 -4
- package/src/{Configuration-CjVUBBwa.js.map → Configuration-BU-UyGoH.js.map} +1 -1
- package/src/Configuration.d.ts +41 -24
- package/src/Configuration.js.map +1 -1
- package/src/Content.js +1 -1
- package/src/{ContentTransfer-CTzGGKFV.js → ContentTransfer-BhF9G56s.js} +2 -2
- package/src/{ContentTransfer-CTzGGKFV.js.map → ContentTransfer-BhF9G56s.js.map} +1 -1
- package/src/{DocumentEngine-BbhfnTAc.js → DocumentEngine-ClhFXW9M.js} +4 -4
- package/src/{DocumentEngine-BbhfnTAc.js.map → DocumentEngine-ClhFXW9M.js.map} +1 -1
- package/src/DocumentModel.d.ts +6 -1
- package/src/DocumentModel.js +4 -3
- package/src/DocumentModel.js.map +1 -1
- package/src/{Forms-CfcI3tPU.js → Forms-BbkE7QfC.js} +47 -16
- package/src/Forms-BbkE7QfC.js.map +1 -0
- package/src/{Forms-02-p8qEw.js → Forms-DoB56hfe.js} +24 -7
- package/src/Forms-DoB56hfe.js.map +1 -0
- package/src/{Forms-BorTcIlp.d.ts → Forms-R0HoTR-o.d.ts} +30 -9
- package/src/Forms.d.ts +16 -15
- package/src/Forms.js.map +1 -1
- package/src/{I18n-BXlVunfa.d.ts → I18n-zbqpWxki.d.ts} +3 -1
- package/src/I18n.d.ts +1 -1
- package/src/Module.js +4 -2
- package/src/Module.js.map +1 -1
- package/src/{S3MediaObjects-DC0c8sYC.js → S3MediaObjects-D5Ns4FM6.js} +14 -12
- package/src/S3MediaObjects-D5Ns4FM6.js.map +1 -0
- package/src/cli.js +60 -34
- package/src/cli.js.map +1 -1
- package/src/{connection-BPf4BQUZ.js → connection-D5S9Iph-.js} +2 -2
- package/src/{connection-BPf4BQUZ.js.map → connection-D5S9Iph-.js.map} +1 -1
- package/src/{dev-lifecycle-vQLxwCFq.js → dev-lifecycle-CZ7iCzG9.js} +129 -42
- package/src/dev-lifecycle-CZ7iCzG9.js.map +1 -0
- package/src/{installation-DsGst1BH.js → installation-BNuoRDOz.js} +43 -31
- package/src/installation-BNuoRDOz.js.map +1 -0
- package/src/internal/authoring-catalog.js +2 -2
- package/src/internal/authoring-metadata.js +1 -1
- package/src/internal/configuration.js +149 -50
- package/src/internal/configuration.js.map +1 -1
- package/src/internal/dev-lifecycle.js +2 -2
- package/src/internal/diagnostics.js +47 -0
- package/src/internal/diagnostics.js.map +1 -0
- package/src/internal/document-model.js +2 -2
- package/src/internal/form-capabilities.js +1 -1
- package/src/internal/i18n.js +6 -1
- package/src/internal/i18n.js.map +1 -1
- package/src/{location-BgYhXEZp.js → location-CPX7oj0o.js} +2 -2
- package/src/{location-BgYhXEZp.js.map → location-CPX7oj0o.js.map} +1 -1
- package/src/{models-k2nXyD6q.js → models-C9kF9JlQ.js} +2 -2
- package/src/{models-k2nXyD6q.js.map → models-C9kF9JlQ.js.map} +1 -1
- package/src/{models-DgkGTFus.js → models-ChRxBChy.js} +4 -2
- package/src/{models-DgkGTFus.js.map → models-ChRxBChy.js.map} +1 -1
- package/src/runtime/delivery/context.js +1 -1
- package/src/runtime/delivery/plugin.js +3 -2
- package/src/runtime/delivery/plugin.js.map +1 -1
- package/src/runtime/forms/document.js +1 -1
- package/src/runtime/forms/useCmsForm.js +28 -24
- package/src/runtime/forms/useCmsForm.js.map +1 -1
- package/src/runtime/i18n/useCmsI18n.d.ts +1 -1
- package/src/runtime/installation.js +1 -1
- package/src/runtime/plugin.js +12 -4
- package/src/runtime/plugin.js.map +1 -1
- package/src/runtime/preview/connection.js +1 -1
- package/src/runtime/preview/controller.js +2 -2
- package/src/runtime/preview/plugin.client.js +3 -3
- package/src/runtime/preview/store.js +1 -1
- package/src/runtime/sitemap.js +1 -1
- package/src/{store-BYgSt7E3.js → store-B49J21NA.js} +3 -3
- package/src/{store-BYgSt7E3.js.map → store-B49J21NA.js.map} +1 -1
- package/studio/{CreateDocumentDialog-BdiM77bb.js → CreateDocumentDialog-DJ8c0WZb.js} +3 -3
- package/studio/{documentPlanning-B7fyUj9r.js → documentPlanning-CDb31mnl.js} +6417 -6358
- package/studio/host.css +1 -1
- package/studio/host.js +7608 -7250
- package/src/Forms-02-p8qEw.js.map +0 -1
- package/src/Forms-CfcI3tPU.js.map +0 -1
- package/src/S3MediaObjects-DC0c8sYC.js.map +0 -1
- package/src/dev-lifecycle-vQLxwCFq.js.map +0 -1
- package/src/installation-DsGst1BH.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-lifecycle-vQLxwCFq.js","names":["AuthoringCatalogSchema"],"sources":["../../../../sql-pg/src/Migration.ts","../../../../auth/src/LocalDevelopment.ts","../../../src/internal/dev-lifecycle.ts"],"sourcesContent":["import type { PgPoolConfig } from '@effect/sql-pg/PgClient'\nimport { Effect, Schema } from 'effect'\nimport { embeddedMigrations } from './internal/database/embedded-migrations.generated'\nimport { migrateCmsDatabase } from './internal/database/migrations'\nimport { schemaClientLayer } from './internal/postgres/scoped-client'\n\nexport interface PostgresMigration {\n readonly createdAt: number\n readonly hash: string\n readonly name: string\n readonly statements: ReadonlyArray<string>\n}\n\n/** Migration history used by development tooling to verify pending SQL without mutating the database. */\nexport const postgresMigrations: ReadonlyArray<PostgresMigration> = Object.freeze(\n embeddedMigrations.map((migration) =>\n Object.freeze({\n createdAt: migration.folderMillis,\n hash: migration.hash,\n name: migration.name,\n statements: Object.freeze([...migration.sql]),\n }),\n ),\n)\n\nexport class MigrationFailed extends Schema.TaggedError<MigrationFailed>()('Postgres.MigrationFailed', {\n cause: Schema.Defect(),\n operation: Schema.String,\n}) {}\n\nexport interface PostgresMigrationOptions extends PgPoolConfig {\n readonly schema: string\n}\n\nexport function migratePostgres(options: PostgresMigrationOptions): Effect.Effect<void, MigrationFailed> {\n const { schema, ...poolOptions } = options\n\n return migrateCmsDatabase(schema).pipe(\n Effect.provide(\n schemaClientLayer({ ...poolOptions, applicationName: options.applicationName ?? '@internal/migrate' }, schema),\n ),\n Effect.mapError((cause) => new MigrationFailed({ cause, operation: 'Postgres.migrate' })),\n )\n}\n","import type { BetterAuthOptions } from 'better-auth'\nimport { Effect, Schema } from 'effect'\nimport { createCmsBetterAuth } from './internal/better-auth'\n\nexport interface LocalAdministratorOptions {\n readonly baseUrl: string\n readonly database: NonNullable<BetterAuthOptions['database']>\n readonly email: string\n readonly name: string\n readonly password: string\n readonly secret: string\n}\n\nexport type LocalAdministratorResult = 'created' | 'updated' | 'verified'\n\nexport class LocalAdministratorFailed extends Schema.TaggedError<LocalAdministratorFailed>()(\n 'LocalAdministrator.Failed',\n { cause: Schema.Defect() },\n) {}\n\n/** Reconciles the one local-development administrator without exposing Better Auth's admin routes. */\nexport const reconcileLocalAdministrator = Effect.fn('LocalAdministrator.reconcile')(function* (\n options: LocalAdministratorOptions,\n) {\n const auth = createCmsBetterAuth({\n baseURL: options.baseUrl,\n database: options.database,\n secret: options.secret,\n })\n\n return yield* Effect.tryPromise({\n // Better Auth's internal adapter exposes its transaction as one Promise workflow.\n // oxlint-disable-next-line effecttsgo/async-function\n try: async () => {\n const context = await auth.$context\n const existing = await context.internalAdapter.findUserByEmail(options.email, { includeAccounts: true })\n\n if (!existing) {\n const user = await context.internalAdapter.createUser(\n { email: options.email, name: options.name, role: 'administrator' },\n { method: 'admin' },\n )\n\n const password = await context.password.hash(options.password)\n await context.internalAdapter.linkAccount({\n accountId: user.id,\n password,\n providerId: 'credential',\n userId: user.id,\n })\n\n return 'created' as const\n }\n\n const isAdministrator =\n Schema.is(Schema.Struct({ role: Schema.String }))(existing.user) && existing.user.role === 'administrator'\n\n let changed = existing.user.name !== options.name || !isAdministrator\n\n if (changed)\n await context.internalAdapter.updateUser(existing.user.id, {\n name: options.name,\n role: 'administrator',\n })\n\n const credential = existing.accounts.find(\n (account) => account.providerId === 'credential' && account.accountId === existing.user.id,\n )\n\n const passwordMatches = credential?.password\n ? await context.password.verify({ hash: credential.password, password: options.password })\n : false\n\n if (!passwordMatches) {\n const password = await context.password.hash(options.password)\n\n if (credential) await context.internalAdapter.updatePassword(existing.user.id, password)\n else\n await context.internalAdapter.createAccount({\n accountId: existing.user.id,\n password,\n providerId: 'credential',\n userId: existing.user.id,\n })\n\n changed = true\n }\n\n return changed ? ('updated' as const) : ('verified' as const)\n },\n catch: (cause) => new LocalAdministratorFailed({ cause }),\n })\n})\n","/* oxlint-disable effecttsgo/async-function effecttsgo/global-fetch effecttsgo/global-timers effecttsgo/new-promise effecttsgo/node-builtin-import -- The CLI boundary coordinates Promise-based Nuxt, pg, S3, fetch, WebSocket, and filesystem APIs. */\nimport type { CmsConfiguration } from '../Configuration'\nimport type { AuthoringCatalog } from '@internal/protocol/Configuration'\nimport { AuthoringCatalog as AuthoringCatalogSchema } from '@internal/protocol/Configuration'\nimport { CMS_READINESS_PATH, STUDIO_API_PATH, STUDIO_COLLABORATION_PATH } from '@internal/protocol/HttpPaths'\nimport { NodeCrypto, NodeFileSystem, NodePath } from '@effect/platform-node-shared'\nimport {\n DeleteObjectCommand,\n HeadBucketCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n} from '@aws-sdk/client-s3'\nimport { loadNuxt } from '@nuxt/kit'\nimport { Effect, Layer, Result, Schema } from 'effect'\nimport { Pool } from 'pg'\nimport { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { randomUUID } from 'node:crypto'\nimport { resolve } from 'node:path'\nimport { createCmsContentClient, readCmsContentDirectory } from '../Content'\nimport { postgresMigrations } from '@internal/sql-pg/Migration'\nimport { reconcileLocalAdministrator } from '@internal/auth/LocalDevelopment'\nimport { loadCmsConfiguration } from './cms-config'\nimport { compileCmsConfiguration, resolveCmsInstallation } from './configuration'\nimport { installCms, scopedDatabaseUrl } from '../runtime/installation'\n\nexport type CmsDoctorStatus = 'pass' | 'fail' | 'not-verified'\n\nexport interface CmsDoctorCheck {\n readonly id: string\n readonly label: string\n readonly status: CmsDoctorStatus\n readonly detail?: string\n}\n\nexport interface CmsDoctorReport {\n readonly ok: boolean\n readonly checks: ReadonlyArray<CmsDoctorCheck>\n}\n\nexport interface CmsBootstrapOptions {\n readonly content?: string\n readonly email: string\n readonly name: string\n readonly password: string\n readonly publish: boolean\n readonly rootDir: string\n}\n\nexport interface CmsBootstrapReport {\n readonly administrator: 'created' | 'updated' | 'verified'\n readonly contentApplied: boolean\n}\n\nexport interface CmsResetOptions {\n readonly bootstrap?: Omit<CmsBootstrapOptions, 'rootDir'>\n readonly database: boolean\n readonly media: boolean\n readonly rootDir: string\n readonly yes: boolean\n}\n\nexport interface CmsResetReport {\n readonly executed: boolean\n readonly targets: ReadonlyArray<string>\n readonly bootstrapped: boolean\n}\n\nconst nodeLayer = Layer.merge(NodeCrypto.layer, Layer.merge(NodeFileSystem.layer, NodePath.layer))\n\nconst InitializationStatus = Schema.Struct({ needsAdministrator: Schema.optionalKey(Schema.Boolean) })\n\nconst CauseCarrier = Schema.Struct({ cause: Schema.Unknown })\n\nexport async function doctorCmsDevelopment(rootDir: string, full = false): Promise<CmsDoctorReport> {\n const checks: CmsDoctorCheck[] = []\n let configuration: CmsConfiguration\n\n try {\n const authored = await loadConfiguration(rootDir)\n configuration = authored.configuration\n compileCmsConfiguration(configuration)\n checks.push(pass('configuration', 'Configuration loaded'))\n } catch (cause) {\n checks.push(fail('configuration', 'Configuration loaded', message(cause)))\n\n return report(checks)\n }\n\n const pool = new Pool({ connectionString: configuration.database.url })\n\n try {\n await pool.query('select 1')\n checks.push(pass('postgres', 'PostgreSQL reachable'))\n\n try {\n const pending = await verifyMigrations(pool, configuration.database.schema)\n checks.push(\n pending === 0\n ? pass('migrations', 'Database schema current')\n : fail(\n 'migrations',\n 'Database schema current',\n `${pending} migration${pending === 1 ? ' is' : 's are'} pending; run cms dev bootstrap.`,\n ),\n )\n } catch (cause) {\n checks.push(fail('migrations', 'Database schema current', message(cause)))\n }\n\n if (full) {\n await pool.query('begin')\n\n try {\n await pool.query(\n `create table \"${configuration.database.schema}\".\"__cms_doctor_${randomUUID().replaceAll('-', '')}\" (id integer)`,\n )\n checks.push(pass('postgres-write', 'PostgreSQL write access'))\n } finally {\n await pool.query('rollback')\n }\n } else {\n checks.push(notVerified('postgres-write', 'PostgreSQL write access', 'Use --full for a transient write check.'))\n }\n } catch (cause) {\n checks.push(fail('postgres', 'PostgreSQL reachable', message(cause)))\n } finally {\n await pool.end()\n }\n\n if (configuration.media === false || configuration.media === undefined) {\n checks.push(pass('s3', 'Media storage disabled'))\n } else {\n const storage = configuration.media.storage\n const client = s3Client(storage)\n let publicProbeKey: string | undefined\n\n try {\n await client.send(new HeadBucketCommand({ Bucket: storage.bucket }))\n checks.push(pass('s3', 'S3 bucket reachable'))\n\n if (full) {\n const key = `${storage.prefix}.doctor/${randomUUID()}`\n await client.send(new PutObjectCommand({ Bucket: storage.bucket, Key: key, Body: new Uint8Array() }))\n publicProbeKey = key\n checks.push(pass('s3-write', 'S3 write access'))\n } else {\n checks.push(notVerified('s3-write', 'S3 write access', 'Use --full for a transient write check.'))\n }\n } catch (cause) {\n checks.push(fail('s3', 'S3 bucket reachable', message(cause)))\n }\n\n try {\n if (full && !publicProbeKey) {\n checks.push(notVerified('media-url', 'Public media URL reachable', 'The transient S3 upload failed.'))\n } else {\n const url = publicProbeKey\n ? publicObjectUrl(configuration.media.publicBaseUrl, publicProbeKey)\n : new URL(configuration.media.publicBaseUrl)\n\n const response = await fetch(url, { method: 'HEAD' })\n checks.push(\n response.ok || (!full && response.status === 404)\n ? pass('media-url', 'Public media URL reachable')\n : fail('media-url', 'Public media URL reachable', `${url.href} returned HTTP ${response.status}.`),\n )\n }\n } catch (cause) {\n checks.push(fail('media-url', 'Public media URL reachable', message(cause)))\n } finally {\n if (publicProbeKey)\n try {\n await client.send(new DeleteObjectCommand({ Bucket: storage.bucket, Key: publicProbeKey }))\n } catch (cause) {\n checks.push(fail('s3-cleanup', 'S3 doctor cleanup', message(cause)))\n }\n\n client.destroy()\n }\n }\n\n const bundledStudio = new URL('../studio/host.js', import.meta.url)\n const publishedStudio = new URL('../../studio/host.js', import.meta.url)\n const workspaceStudio = new URL('../../../../apps/studio/dist/host.js', import.meta.url)\n checks.push(\n existsSync(bundledStudio) || existsSync(publishedStudio) || existsSync(workspaceStudio)\n ? pass('assets', 'CMS and Studio package assets complete')\n : fail('assets', 'CMS and Studio package assets complete', 'Run the package build before publishing.'),\n )\n\n try {\n const readiness = await fetch(new URL(CMS_READINESS_PATH, configuration.baseUrl), {\n signal: AbortSignal.timeout(2_000),\n })\n\n checks.push(\n readiness.ok\n ? pass('server', 'Running server readiness')\n : fail('server', 'Running server readiness', `Returned HTTP ${readiness.status}.`),\n )\n\n if (readiness.ok) {\n try {\n await probeWebSocket(new URL(STUDIO_COLLABORATION_PATH, configuration.baseUrl))\n checks.push(pass('websocket', 'Running server WebSocket support'))\n } catch (cause) {\n checks.push(fail('websocket', 'Running server WebSocket support', message(cause)))\n }\n } else {\n checks.push(notVerified('websocket', 'Running server WebSocket support', 'Readiness did not succeed.'))\n }\n } catch {\n checks.push(notVerified('server', 'Running server readiness', 'Start Nuxt to verify the readiness endpoint.'))\n checks.push(notVerified('websocket', 'Running server WebSocket support', 'Start Nuxt to verify WebSockets.'))\n }\n\n return report(checks)\n}\n\nexport async function bootstrapCmsDevelopment(options: CmsBootstrapOptions): Promise<CmsBootstrapReport> {\n if (!options.email || !options.password) throw new Error('CMS_EMAIL and CMS_PASSWORD are required for bootstrap.')\n const { configuration } = await loadConfiguration(options.rootDir)\n const authoring = await prepareAuthoring(options.rootDir)\n const resolved = resolveCmsInstallation(configuration, authoring)\n const installation = await Effect.runPromise(installCms(resolved))\n\n const localFetch: typeof globalThis.fetch = (input, init) =>\n installation.fetch(input instanceof Request ? input : new Request(input, init))\n\n try {\n const status = await localFetch(new URL(`${STUDIO_API_PATH}/initialization`, configuration.baseUrl))\n const state = Result.getOrThrow(Schema.decodeUnknownResult(InitializationStatus)(await status.json()))\n let initialized = false\n\n if (state.needsAdministrator) {\n const claimed = await localFetch(new URL(`${STUDIO_API_PATH}/initialization`, configuration.baseUrl), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n email: options.email,\n initializationToken: configuration.initializationToken,\n name: options.name,\n password: options.password,\n }),\n })\n\n if (!claimed.ok) throw new Error(`Administrator initialization failed (${claimed.status}).`)\n initialized = true\n }\n\n const administrator = initialized\n ? 'created'\n : await reconcileAdministrator(configuration, {\n email: options.email,\n name: options.name,\n password: options.password,\n })\n\n const content = createCmsContentClient({\n baseUrl: configuration.baseUrl,\n credentials: { email: options.email, password: options.password },\n fetch: localFetch,\n })\n\n if (!options.content) {\n await content.diff({ sources: [] })\n\n return { administrator, contentApplied: false }\n }\n\n const source = await readCmsContentDirectory(options.content)\n const plan = await content.plan(source, { overwrite: true, publish: options.publish })\n\n if (!plan.valid) throw new Error('Bootstrap content has conflicts or validation errors.')\n await content.apply(plan)\n\n return { administrator, contentApplied: true }\n } finally {\n await installation.close()\n }\n}\n\nasync function reconcileAdministrator(\n configuration: CmsConfiguration,\n administrator: Pick<CmsBootstrapOptions, 'email' | 'name' | 'password'>,\n): Promise<CmsBootstrapReport['administrator']> {\n const pool = new Pool({ connectionString: scopedDatabaseUrl(configuration.database) })\n\n try {\n return await Effect.runPromise(\n reconcileLocalAdministrator({\n baseUrl: configuration.baseUrl,\n database: pool,\n email: administrator.email,\n name: administrator.name,\n password: administrator.password,\n secret: `cms-authentication:${configuration.secret}`,\n }),\n )\n } finally {\n await pool.end()\n }\n}\n\nexport async function resetCmsDevelopment(options: CmsResetOptions): Promise<CmsResetReport> {\n const { configuration } = await loadConfiguration(options.rootDir)\n\n const targets = [\n ...(options.database ? [`PostgreSQL schema ${configuration.database.schema}`] : []),\n ...(options.media && configuration.media !== false && configuration.media !== undefined\n ? [`S3 prefix ${configuration.media.storage.bucket}/${configuration.media.storage.prefix}`]\n : []),\n ]\n\n if (!options.yes) return { executed: false, targets, bootstrapped: false }\n await refuseRunningInstallation(configuration.baseUrl)\n\n if (options.database) await resetDatabase(configuration.database)\n\n if (options.media && configuration.media !== false && configuration.media !== undefined)\n await resetMedia(configuration.media.storage)\n\n if (options.bootstrap) await bootstrapCmsDevelopment({ rootDir: options.rootDir, ...options.bootstrap })\n\n return { executed: true, targets, bootstrapped: options.bootstrap !== undefined }\n}\n\nasync function loadConfiguration(rootDir: string) {\n return Effect.runPromise(loadCmsConfiguration(resolve(rootDir)).pipe(Effect.provide(nodeLayer)))\n}\n\nasync function prepareAuthoring(rootDir: string): Promise<AuthoringCatalog> {\n const nuxt = await loadNuxt({ cwd: rootDir, dev: true, ready: true })\n\n try {\n const source = (await readFile(resolve(nuxt.options.buildDir, 'cms/authoring.mjs'), 'utf8'))\n .replace(/^export default /u, '')\n .trim()\n\n return Result.getOrThrow(Schema.decodeUnknownResult(AuthoringCatalogSchema)(JSON.parse(source)))\n } finally {\n await nuxt.close()\n }\n}\n\nasync function refuseRunningInstallation(baseUrl: string): Promise<void> {\n try {\n await fetch(new URL(CMS_READINESS_PATH, baseUrl), { signal: AbortSignal.timeout(1_000) })\n throw new Error('Refusing to reset while the CMS server is running.')\n } catch (cause) {\n if (cause instanceof Error && cause.message.startsWith('Refusing')) throw cause\n }\n}\n\nasync function verifyMigrations(pool: Pool, schema: string): Promise<number> {\n const ledger = await pool.query<{ exists: boolean }>(\n 'select exists(select 1 from information_schema.tables where table_schema = $1 and table_name = $2) as exists',\n [schema, '__drizzle_migrations'],\n )\n\n const applied = ledger.rows[0]?.exists\n ? (\n await pool.query<{ createdAt: string; hash: string }>(\n `select created_at as \"createdAt\", hash from \"${schema}\".\"__drizzle_migrations\" order by created_at`,\n )\n ).rows\n : []\n\n const matches = applied.every(\n (migration, index) =>\n migration.hash === postgresMigrations[index]?.hash &&\n Number(migration.createdAt) === postgresMigrations[index]?.createdAt,\n )\n\n if (!matches || applied.length > postgresMigrations.length)\n throw new Error('The applied migration history does not match this CMS release.')\n\n const pending = postgresMigrations.slice(applied.length)\n const connection = await pool.connect()\n\n try {\n await connection.query('begin')\n await connection.query(`create schema if not exists \"${schema}\"`)\n await connection.query(`set local search_path to \"${schema}\"`)\n\n for (const migration of pending) for (const statement of migration.statements) await connection.query(statement)\n } finally {\n await connection.query('rollback')\n connection.release()\n }\n\n return pending.length\n}\n\nfunction publicObjectUrl(baseUrl: string, key: string): URL {\n const base = new URL(baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`)\n\n return new URL(key.split('/').map(encodeURIComponent).join('/'), base)\n}\n\nasync function probeWebSocket(httpUrl: URL): Promise<void> {\n const url = new URL(httpUrl)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n\n await new Promise<void>((resolve, reject) => {\n const socket = new WebSocket(url)\n\n const timeout = setTimeout(() => {\n socket.close()\n reject(new Error('The WebSocket handshake timed out.'))\n }, 2_000)\n\n socket.addEventListener('open', () => {\n clearTimeout(timeout)\n socket.close()\n resolve()\n })\n socket.addEventListener('error', () => {\n clearTimeout(timeout)\n reject(new Error(`Could not open ${url.href}.`))\n })\n })\n}\n\nasync function resetDatabase(database: CmsConfiguration['database']): Promise<void> {\n const pool = new Pool({ connectionString: database.url })\n\n try {\n const client = await pool.connect()\n\n try {\n await client.query('select pg_advisory_lock(hashtextextended($1, 0))', ['cms:development-reset:v1'])\n await client.query(`drop schema if exists \"${database.schema}\" cascade`)\n await client.query(`create schema \"${database.schema}\"`)\n } finally {\n client.release()\n }\n } finally {\n await pool.end()\n }\n}\n\nasync function resetMedia(storage: NonNullable<Exclude<CmsConfiguration['media'], false>>['storage']): Promise<void> {\n const client = s3Client(storage)\n\n try {\n let continuationToken: string | undefined\n\n do {\n const page = await client.send(\n new ListObjectsV2Command({\n Bucket: storage.bucket,\n Prefix: storage.prefix,\n ContinuationToken: continuationToken,\n }),\n )\n\n for (const object of page.Contents ?? [])\n if (object.Key) await client.send(new DeleteObjectCommand({ Bucket: storage.bucket, Key: object.Key }))\n continuationToken = page.IsTruncated ? page.NextContinuationToken : undefined\n } while (continuationToken)\n } finally {\n client.destroy()\n }\n}\n\nfunction s3Client(storage: NonNullable<Exclude<CmsConfiguration['media'], false>>['storage']): S3Client {\n return new S3Client({\n region: storage.region,\n endpoint: storage.endpoint,\n forcePathStyle: storage.forcePathStyle,\n credentials: storage.credentials,\n })\n}\n\nfunction pass(id: string, label: string): CmsDoctorCheck {\n return { id, label, status: 'pass' }\n}\n\nfunction fail(id: string, label: string, detail: string): CmsDoctorCheck {\n return { id, label, status: 'fail', detail }\n}\n\nfunction notVerified(id: string, label: string, detail: string): CmsDoctorCheck {\n return { id, label, status: 'not-verified', detail }\n}\n\nfunction report(checks: ReadonlyArray<CmsDoctorCheck>): CmsDoctorReport {\n return { ok: checks.every((check) => check.status !== 'fail'), checks }\n}\n\nfunction message(cause: unknown): string {\n if (cause instanceof Error && cause.message) return cause.message\n\n if (Schema.is(CauseCarrier)(cause)) return message(cause.cause)\n\n return String(cause)\n}\n"],"mappings":"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"}
|