@mastra/core
Version:
1 lines • 26 kB
Source Map (JSON)
{"version":3,"file":"filesystem-CceZwSX7.cjs","names":["VersionedStorageDomain","normalizePerPage","deepEqual","calculatePagination","FilesystemVersionedHelpers"],"sources":["../src/storage/domains/prompt-blocks/base.ts","../src/storage/domains/prompt-blocks/inmemory.ts","../src/storage/domains/prompt-blocks/filesystem.ts"],"sourcesContent":["import type {\n StoragePromptBlockType,\n StoragePromptBlockSnapshotType,\n StorageResolvedPromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Prompt Block Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a prompt block's content.\n * Config fields are top-level on the version row (no nested snapshot object).\n */\nexport interface PromptBlockVersion extends StoragePromptBlockSnapshotType, VersionBase {\n /** ID of the prompt block this version belongs to */\n blockId: string;\n}\n\n/**\n * Input for creating a new prompt block version.\n * Config fields are top-level (no nested snapshot object).\n */\nexport interface CreatePromptBlockVersionInput extends StoragePromptBlockSnapshotType, CreateVersionInputBase {\n /** ID of the prompt block this version belongs to */\n blockId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type PromptBlockVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type PromptBlockVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing prompt block versions with pagination and sorting.\n */\nexport interface ListPromptBlockVersionsInput extends ListVersionsInputBase {\n /** ID of the prompt block to list versions for */\n blockId: string;\n}\n\n/**\n * Output for listing prompt block versions with pagination info.\n */\nexport interface ListPromptBlockVersionsOutput extends ListVersionsOutputBase<PromptBlockVersion> {}\n\n// ============================================================================\n// PromptBlocksStorage Base Class\n// ============================================================================\n\nexport abstract class PromptBlocksStorage extends VersionedStorageDomain<\n StoragePromptBlockType,\n StoragePromptBlockSnapshotType,\n StorageResolvedPromptBlockType,\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n { promptBlock: StorageCreatePromptBlockInput },\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput | undefined,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput\n> {\n protected readonly listKey = 'promptBlocks';\n protected readonly versionMetadataFields = [\n 'id',\n 'blockId',\n 'versionNumber',\n 'changedFields',\n 'changeMessage',\n 'createdAt',\n ] satisfies (keyof PromptBlockVersion)[];\n\n constructor() {\n super({\n component: 'STORAGE',\n name: 'PROMPT_BLOCKS',\n });\n }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n ThreadOrderBy,\n ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n PromptBlockVersionOrderBy,\n PromptBlockVersionSortDirection,\n} from './base';\nimport { PromptBlocksStorage } from './base';\n\nexport class InMemoryPromptBlocksStorage extends PromptBlocksStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.promptBlocks.clear();\n this.db.promptBlockVersions.clear();\n }\n\n // ==========================================================================\n // Prompt Block CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n const block = this.db.promptBlocks.get(id);\n return block ? this.deepCopyBlock(block) : null;\n }\n\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n\n if (this.db.promptBlocks.has(promptBlock.id)) {\n throw new Error(`Prompt block with id ${promptBlock.id} already exists`);\n }\n\n const now = new Date();\n const newBlock: StoragePromptBlockType = {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db.promptBlocks.set(promptBlock.id, newBlock);\n\n // Extract config fields from the flat input (everything except block-record fields)\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n\n // Create version 1 from the config\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n // Return the thin block record\n return this.deepCopyBlock(newBlock);\n }\n\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n\n const existingBlock = this.db.promptBlocks.get(id);\n if (!existingBlock) {\n throw new Error(`Prompt block with id ${id} not found`);\n }\n\n // Separate metadata fields from config fields\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Update metadata fields on the block record\n const updatedBlock: StoragePromptBlockType = {\n ...existingBlock,\n ...(authorId !== undefined && { authorId }),\n ...(activeVersionId !== undefined && { activeVersionId }),\n ...(status !== undefined && { status: status as StoragePromptBlockType['status'] }),\n ...(metadata !== undefined && {\n metadata: { ...existingBlock.metadata, ...metadata },\n }),\n updatedAt: new Date(),\n };\n\n // Save the updated block record\n this.db.promptBlocks.set(id, updatedBlock);\n return this.deepCopyBlock(updatedBlock);\n }\n\n async delete(id: string): Promise<void> {\n // Idempotent delete\n this.db.promptBlocks.delete(id);\n // Also delete all versions for this block\n await this.deleteVersionsByParentId(id);\n }\n\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Get all blocks and apply filters\n let blocks = Array.from(this.db.promptBlocks.values());\n\n // Filter by status\n if (status) {\n blocks = blocks.filter(block => block.status === status);\n }\n\n // Filter by authorId if provided\n if (authorId !== undefined) {\n blocks = blocks.filter(block => block.authorId === authorId);\n }\n\n // Filter by metadata if provided (AND logic)\n if (metadata && Object.keys(metadata).length > 0) {\n blocks = blocks.filter(block => {\n if (!block.metadata) return false;\n return Object.entries(metadata).every(([key, value]) => deepEqual(block.metadata![key], value));\n });\n }\n\n // Sort filtered blocks\n const sortedBlocks = this.sortBlocks(blocks, field, direction);\n\n // Deep clone blocks to avoid mutation\n const clonedBlocks = sortedBlocks.map(block => this.deepCopyBlock(block));\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n promptBlocks: clonedBlocks.slice(offset, offset + perPage),\n total: clonedBlocks.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < clonedBlocks.length,\n };\n }\n\n // ==========================================================================\n // Prompt Block Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n // Check if version with this ID already exists\n if (this.db.promptBlockVersions.has(input.id)) {\n throw new Error(`Version with id ${input.id} already exists`);\n }\n\n // Check for duplicate (blockId, versionNumber) pair\n for (const version of this.db.promptBlockVersions.values()) {\n if (version.blockId === input.blockId && version.versionNumber === input.versionNumber) {\n throw new Error(`Version number ${input.versionNumber} already exists for prompt block ${input.blockId}`);\n }\n }\n\n const version: PromptBlockVersion = {\n ...input,\n createdAt: new Date(),\n };\n\n // Deep clone before storing\n this.db.promptBlockVersions.set(input.id, this.deepCopyVersion(version));\n return this.deepCopyVersion(version);\n }\n\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n const version = this.db.promptBlockVersions.get(id);\n return version ? this.deepCopyVersion(version) : null;\n }\n\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n for (const version of this.db.promptBlockVersions.values()) {\n if (version.blockId === blockId && version.versionNumber === versionNumber) {\n return this.deepCopyVersion(version);\n }\n }\n return null;\n }\n\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n let latest: PromptBlockVersion | null = null;\n for (const version of this.db.promptBlockVersions.values()) {\n if (version.blockId === blockId) {\n if (!latest || version.versionNumber > latest.versionNumber) {\n latest = version;\n }\n }\n }\n return latest ? this.deepCopyVersion(latest) : null;\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n const perPage = normalizePerPage(perPageInput, 20);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Filter versions by blockId\n let versions = Array.from(this.db.promptBlockVersions.values()).filter(v => v.blockId === blockId);\n\n // Sort versions\n versions = this.sortVersions(versions, field, direction);\n\n // Deep clone\n const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n const total = clonedVersions.length;\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n return {\n versions: paginatedVersions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n }\n\n async deleteVersion(id: string): Promise<void> {\n this.db.promptBlockVersions.delete(id);\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n const idsToDelete: string[] = [];\n for (const [id, version] of this.db.promptBlockVersions.entries()) {\n if (version.blockId === entityId) {\n idsToDelete.push(id);\n }\n }\n\n for (const id of idsToDelete) {\n this.db.promptBlockVersions.delete(id);\n }\n }\n\n async countVersions(blockId: string): Promise<number> {\n let count = 0;\n for (const version of this.db.promptBlockVersions.values()) {\n if (version.blockId === blockId) {\n count++;\n }\n }\n return count;\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private deepCopyBlock(block: StoragePromptBlockType): StoragePromptBlockType {\n return {\n ...block,\n metadata: block.metadata ? { ...block.metadata } : block.metadata,\n };\n }\n\n private deepCopyVersion(version: PromptBlockVersion): PromptBlockVersion {\n return {\n ...version,\n rules: version.rules ? JSON.parse(JSON.stringify(version.rules)) : version.rules,\n changedFields: version.changedFields ? [...version.changedFields] : version.changedFields,\n };\n }\n\n private sortBlocks(\n blocks: StoragePromptBlockType[],\n field: ThreadOrderBy,\n direction: ThreadSortDirection,\n ): StoragePromptBlockType[] {\n return blocks.sort((a, b) => {\n const aValue = a[field].getTime();\n const bValue = b[field].getTime();\n\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n }\n\n private sortVersions(\n versions: PromptBlockVersion[],\n field: PromptBlockVersionOrderBy,\n direction: PromptBlockVersionSortDirection,\n ): PromptBlockVersion[] {\n return versions.sort((a, b) => {\n let aVal: number;\n let bVal: number;\n\n if (field === 'createdAt') {\n aVal = a.createdAt.getTime();\n bVal = b.createdAt.getTime();\n } else {\n // versionNumber\n aVal = a.versionNumber;\n bVal = b.versionNumber;\n }\n\n return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n });\n }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n} from '../../types';\nimport type {\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n} from './base';\nimport { PromptBlocksStorage } from './base';\n\nexport class FilesystemPromptBlocksStorage extends PromptBlocksStorage {\n private helpers: FilesystemVersionedHelpers<StoragePromptBlockType, PromptBlockVersion>;\n\n constructor({ db }: { db: FilesystemDB }) {\n super();\n this.helpers = new FilesystemVersionedHelpers({\n db,\n entitiesFile: 'prompt-blocks.json',\n parentIdField: 'blockId',\n name: 'FilesystemPromptBlocksStorage',\n versionMetadataFields: ['id', 'blockId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n });\n }\n\n override async init(): Promise<void> {\n await this.helpers.db.init();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.helpers.dangerouslyClearAll();\n }\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n return this.helpers.getById(id);\n }\n\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n const now = new Date();\n const entity: StoragePromptBlockType = {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.helpers.createEntity(promptBlock.id, entity);\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n } as CreatePromptBlockVersionInput);\n\n return structuredClone(entity);\n }\n\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n return this.helpers.updateEntity(id, updates);\n }\n\n async delete(id: string): Promise<void> {\n await this.helpers.deleteEntity(id);\n }\n\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n const result = await this.helpers.listEntities({\n page,\n perPage,\n orderBy,\n listKey: 'promptBlocks',\n filters: { authorId, metadata, status },\n });\n return result as unknown as StorageListPromptBlocksOutput;\n }\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n return this.helpers.createVersion(input as PromptBlockVersion);\n }\n\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n return this.helpers.getVersion(id);\n }\n\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n return this.helpers.getVersionByNumber(blockId, versionNumber);\n }\n\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n return this.helpers.getLatestVersion(blockId);\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const result = await this.helpers.listVersions(input, 'blockId');\n return result as ListPromptBlockVersionsOutput;\n }\n\n async deleteVersion(id: string): Promise<void> {\n await this.helpers.deleteVersion(id);\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n await this.helpers.deleteVersionsByParentId(entityId);\n }\n\n async countVersions(blockId: string): Promise<number> {\n return this.helpers.countVersions(blockId);\n }\n}\n"],"mappings":"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"}