@slamb2k/dvx 1.0.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/utils/cli.ts","../src/client/create-client.ts","../src/auth/auth-manager.ts","../src/auth/auth-profile.ts","../src/auth/msal-cache-plugin.ts","../src/utils/browser.ts","../src/client/dataverse-client.ts","../src/schema/schema-cache.ts","../src/utils/retry.ts","../src/utils/validation.ts","../src/utils/fetchxml.ts","../src/schema/sqlite-schema-cache.ts","../src/utils/batch-builder.ts"],"sourcesContent":["export class DvxError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DvxError'\n }\n}\n\nexport class AuthError extends DvxError {\n constructor(message: string) {\n super(message)\n this.name = 'AuthError'\n }\n}\n\nexport class AuthProfileNotFoundError extends AuthError {\n constructor(profileName: string) {\n super(`Auth profile '${profileName}' not found`)\n this.name = 'AuthProfileNotFoundError'\n }\n}\n\nexport class AuthProfileExistsError extends AuthError {\n constructor(profileName: string) {\n super(`Auth profile '${profileName}' already exists`)\n this.name = 'AuthProfileExistsError'\n }\n}\n\nexport class TokenAcquisitionError extends AuthError {\n constructor(message: string) {\n super(`Failed to acquire token: ${message}`)\n this.name = 'TokenAcquisitionError'\n }\n}\n\nexport class DataverseError extends DvxError {\n public readonly statusCode: number\n public readonly errorCode?: string | undefined\n public readonly retryAfterSeconds?: number | undefined\n\n constructor(message: string, statusCode: number, errorCode?: string, retryAfterSeconds?: number) {\n super(message)\n this.name = 'DataverseError'\n this.statusCode = statusCode\n this.errorCode = errorCode\n this.retryAfterSeconds = retryAfterSeconds\n }\n}\n\nexport class EntityNotFoundError extends DataverseError {\n constructor(entity: string) {\n super(`Entity '${entity}' not found`, 404)\n this.name = 'EntityNotFoundError'\n }\n}\n\nexport class RecordNotFoundError extends DataverseError {\n constructor(entity: string, id: string) {\n super(`Record '${id}' not found in '${entity}'`, 404)\n this.name = 'RecordNotFoundError'\n }\n}\n\nexport class ValidationError extends DvxError {\n constructor(message: string) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\nexport class SchemaError extends DvxError {\n constructor(message: string) {\n super(message)\n this.name = 'SchemaError'\n }\n}\n\nexport class FetchXmlValidationError extends DvxError {\n constructor(message: string) {\n super(message)\n this.name = 'FetchXmlValidationError'\n }\n}\n\nexport class BatchError extends DvxError {\n public readonly operationErrors: Array<{ index: number; message: string }>\n\n constructor(message: string, operationErrors: Array<{ index: number; message: string }> = []) {\n super(message)\n this.name = 'BatchError'\n this.operationErrors = operationErrors\n }\n}\n\nexport class ActionError extends DvxError {\n constructor(message: string, public readonly statusCode?: number) {\n super(message)\n this.name = 'ActionError'\n }\n}\n\nexport class ImpersonationPrivilegeError extends DataverseError {\n constructor(message = 'Caller does not have the Act on Behalf of Another User privilege (prvActOnBehalfOfAnotherUser)') {\n super(message, 403)\n this.name = 'ImpersonationPrivilegeError'\n }\n}\n\nexport class PkceFlowError extends AuthError {\n constructor(message: string) {\n super(message)\n this.name = 'PkceFlowError'\n }\n}\n","import * as clack from '@clack/prompts'\n\nexport interface UxOptions {\n quiet: boolean\n noColor: boolean\n}\n\nlet uxState: UxOptions = { quiet: false, noColor: false }\n\nexport function setUxOptions(opts: UxOptions): void {\n uxState = opts\n}\n\nexport function getUxOptions(): UxOptions {\n return uxState\n}\n\nexport function isInteractive(): boolean {\n return Boolean(process.stderr.isTTY) && !uxState.quiet\n}\n\nexport interface SpinnerHandle {\n start(msg: string): void\n stop(msg: string): void\n message(msg: string): void\n error(msg: string): void\n}\n\nexport function createSpinner(): SpinnerHandle {\n if (!isInteractive()) {\n return { start() {}, stop() {}, message() {}, error() {} }\n }\n const s = clack.spinner()\n return {\n start(msg: string) { s.start(msg) },\n stop(msg: string) { s.stop(msg) },\n message(msg: string) { s.message(msg) },\n error(msg: string) { s.stop(msg) },\n }\n}\n\nexport function logSuccess(msg: string): void {\n if (isInteractive()) {\n clack.log.success(msg)\n } else {\n process.stderr.write(`${msg}\\n`)\n }\n}\n\nexport function logError(msg: string): void {\n if (isInteractive()) {\n clack.log.error(msg)\n } else {\n process.stderr.write(`Error: ${msg}\\n`)\n }\n}\n\nexport function logWarn(msg: string): void {\n if (!isInteractive()) return\n clack.log.warn(msg)\n}\n\nexport function logInfo(msg: string): void {\n if (isInteractive()) {\n clack.log.info(msg)\n } else {\n process.stderr.write(`Hint: ${msg}\\n`)\n }\n}\n\nexport function logStep(msg: string): void {\n if (!isInteractive()) return\n clack.log.step(msg)\n}\n\nexport function logDryRun(method: string, url: string, body?: unknown): void {\n if (isInteractive()) {\n clack.log.warn(`[DRY RUN] ${method} ${url}`)\n if (body !== undefined) {\n clack.log.info(`Body: ${JSON.stringify(body)}`)\n }\n } else {\n process.stderr.write(`[DRY RUN] ${method} ${url}\\n`)\n if (body !== undefined) {\n process.stderr.write(`[DRY RUN] Body: ${JSON.stringify(body)}\\n`)\n }\n }\n}\n\nexport function logMutationSuccess(msg: string): void {\n if (!isInteractive()) return\n clack.log.success(msg)\n}\n\nexport async function promptConfirmClack(msg: string): Promise<boolean> {\n if (!isInteractive()) return false\n const result = await clack.confirm({ message: msg })\n if (clack.isCancel(result)) return false\n return result\n}\n\nexport async function promptUrl(msg: string, placeholder?: string): Promise<string> {\n const url = await clack.text({\n message: msg,\n placeholder: placeholder ?? 'https://org.crm.dynamics.com',\n validate: (value) => {\n if (!value) return 'Please enter a valid URL'\n try {\n new URL(value)\n } catch {\n return 'Please enter a valid URL'\n }\n },\n })\n\n if (clack.isCancel(url)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n return url as string\n}\n\nexport function stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '')\n}\n","import * as path from 'node:path'\nimport { AuthManager } from '../auth/auth-manager.js'\nimport { DataverseClient } from './dataverse-client.js'\nimport { SqliteSchemaCache } from '../schema/sqlite-schema-cache.js'\n\nexport async function createClient(opts?: { dryRun?: boolean | undefined; callerObjectId?: string | undefined }): Promise<{ authManager: AuthManager; client: DataverseClient }> {\n const authManager = new AuthManager()\n const dbPath = process.env['DVX_SCHEMA_CACHE_PATH'] ?? path.join(process.cwd(), '.dvx', 'cache.db')\n const ttlMs = Number(process.env['DVX_SCHEMA_CACHE_TTL_MS']) || 300_000\n const schemaCache = new SqliteSchemaCache(dbPath, ttlMs)\n const client = new DataverseClient(authManager, schemaCache, opts)\n return { authManager, client }\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { ConfidentialClientApplication, PublicClientApplication } from '@azure/msal-node'\nimport {\n AuthProfileNotFoundError,\n AuthProfileExistsError,\n TokenAcquisitionError,\n PkceFlowError,\n} from '../errors.js'\nimport { AuthConfig, AuthConfigSchema, AuthProfile } from './auth-profile.js'\nimport { MsalCachePlugin } from './msal-cache-plugin.js'\nimport { openBrowser } from '../utils/browser.js'\n\nconst CONFIG_DIR = '.dvx'\nconst CONFIG_FILE = 'config.json'\n\nexport class AuthManager {\n private configPath: string\n private basePath: string\n private config: AuthConfig\n\n constructor(basePath?: string) {\n this.basePath = basePath ?? process.cwd()\n this.configPath = path.join(this.basePath, CONFIG_DIR, CONFIG_FILE)\n this.config = this.loadConfig()\n }\n\n private loadConfig(): AuthConfig {\n try {\n const raw = fs.readFileSync(this.configPath, 'utf-8')\n return AuthConfigSchema.parse(JSON.parse(raw))\n } catch {\n return { profiles: {} }\n }\n }\n\n private saveConfig(): void {\n const dir = path.dirname(this.configPath)\n fs.mkdirSync(dir, { recursive: true })\n\n // Save config without secrets\n const safeConfig: AuthConfig = {\n activeProfile: this.config.activeProfile,\n profiles: {},\n }\n for (const [name, profile] of Object.entries(this.config.profiles)) {\n const { clientSecret: _secret, ...rest } = profile\n safeConfig.profiles[name] = rest as AuthProfile\n }\n\n fs.writeFileSync(this.configPath, JSON.stringify(safeConfig, null, 2))\n }\n\n createProfile(profile: AuthProfile): void {\n if (this.config.profiles[profile.name]) {\n throw new AuthProfileExistsError(profile.name)\n }\n this.config.profiles[profile.name] = profile\n if (!this.config.activeProfile) {\n this.config.activeProfile = profile.name\n }\n this.saveConfig()\n }\n\n getActiveProfile(): AuthProfile {\n const name = this.config.activeProfile\n if (!name || !this.config.profiles[name]) {\n throw new AuthProfileNotFoundError(name ?? 'default')\n }\n return this.config.profiles[name]\n }\n\n listProfiles(): Array<{ name: string; active: boolean; profile: AuthProfile }> {\n return Object.entries(this.config.profiles).map(([name, profile]) => ({\n name,\n active: name === this.config.activeProfile,\n profile,\n }))\n }\n\n selectProfile(name: string): void {\n if (!this.config.profiles[name]) {\n throw new AuthProfileNotFoundError(name)\n }\n this.config.activeProfile = name\n this.saveConfig()\n }\n\n deleteProfile(name: string): void {\n if (!this.config.profiles[name]) {\n throw new AuthProfileNotFoundError(name)\n }\n delete this.config.profiles[name]\n if (this.config.activeProfile === name) {\n const remaining = Object.keys(this.config.profiles)\n this.config.activeProfile = remaining.length > 0 ? remaining[0] : undefined\n }\n this.saveConfig()\n }\n\n deleteAllProfiles(): void {\n this.config.profiles = {}\n this.config.activeProfile = undefined\n this.saveConfig()\n }\n\n private saveProfile(profile: AuthProfile): void {\n this.config.profiles[profile.name] = profile\n this.saveConfig()\n }\n\n private async getTokenDelegated(profile: AuthProfile): Promise<string> {\n const cacheFilePath = path.join(this.basePath, '.dvx', 'msal-cache.json')\n const pca = new PublicClientApplication({\n auth: {\n clientId: profile.clientId,\n authority: `https://login.microsoftonline.com/${profile.tenantId}`,\n },\n cache: {\n cachePlugin: new MsalCachePlugin(cacheFilePath),\n },\n })\n\n const scopes = [`${profile.environmentUrl}/user_impersonation`]\n const accounts = await pca.getAllAccounts()\n\n if (accounts.length > 0 && accounts[0]) {\n try {\n const result = await pca.acquireTokenSilent({\n account: accounts[0],\n scopes,\n })\n if (result?.accessToken) return result.accessToken\n } catch {\n // Fall through to interactive\n }\n }\n\n const result = await pca.acquireTokenInteractive({\n scopes,\n openBrowser: async (url) => {\n openBrowser(url)\n },\n successTemplate: '<h1>Authentication complete. You may close this tab.</h1>',\n errorTemplate: '<h1>Authentication failed: {error}</h1>',\n })\n\n if (!result?.accessToken) throw new PkceFlowError('No access token returned from interactive login')\n\n if (result.account?.homeAccountId) {\n profile.homeAccountId = result.account.homeAccountId\n // Note: saveProfile does a full config read-modify-write; safe for single-process CLI use\n this.saveProfile(profile)\n }\n\n return result.accessToken\n }\n\n async getToken(profileOrName?: AuthProfile | string): Promise<string> {\n let p: AuthProfile\n if (typeof profileOrName === 'string') {\n if (!this.config.profiles[profileOrName]) {\n throw new AuthProfileNotFoundError(profileOrName)\n }\n p = this.config.profiles[profileOrName]\n } else {\n p = profileOrName ?? this.getActiveProfile()\n }\n\n if (p.type === 'delegated') {\n return this.getTokenDelegated(p)\n }\n\n const clientSecret = p.clientSecret ?? process.env['DATAVERSE_CLIENT_SECRET']\n if (!clientSecret) {\n throw new TokenAcquisitionError(\n 'Client secret not found. Set DATAVERSE_CLIENT_SECRET environment variable.',\n )\n }\n\n const app = new ConfidentialClientApplication({\n auth: {\n clientId: p.clientId,\n clientSecret,\n authority: `https://login.microsoftonline.com/${p.tenantId}`,\n },\n })\n\n const result = await app.acquireTokenByClientCredential({\n scopes: [`${p.environmentUrl}/.default`],\n })\n\n if (!result?.accessToken) {\n throw new TokenAcquisitionError('No access token returned from Entra ID')\n }\n\n return result.accessToken\n }\n}\n","import { z } from 'zod'\n\nexport const AuthProfileSchema = z.object({\n name: z.string().min(1),\n type: z.enum(['service-principal', 'delegated']),\n environmentUrl: z.string().url(),\n tenantId: z.string().uuid(),\n clientId: z.string().uuid(),\n clientSecret: z.string().optional(),\n homeAccountId: z.string().optional(),\n})\n\nexport type AuthProfile = z.infer<typeof AuthProfileSchema>\n\nexport const AuthConfigSchema = z.object({\n activeProfile: z.string().optional(),\n profiles: z.record(z.string(), AuthProfileSchema),\n})\n\nexport type AuthConfig = z.infer<typeof AuthConfigSchema>\n","import { ICachePlugin, TokenCacheContext } from '@azure/msal-node'\nimport { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nexport class MsalCachePlugin implements ICachePlugin {\n constructor(private readonly cacheFilePath: string) {}\n\n async beforeCacheAccess(ctx: TokenCacheContext): Promise<void> {\n try {\n const data = readFileSync(this.cacheFilePath, 'utf-8')\n ctx.tokenCache.deserialize(data)\n } catch {\n // File doesn't exist yet — start with empty cache\n }\n }\n\n async afterCacheAccess(ctx: TokenCacheContext): Promise<void> {\n if (ctx.cacheHasChanged) {\n mkdirSync(dirname(this.cacheFilePath), { recursive: true })\n writeFileSync(this.cacheFilePath, ctx.tokenCache.serialize(), { encoding: 'utf-8', mode: 0o600 })\n }\n }\n}\n","import { execFile } from 'node:child_process';\n\nexport function openBrowser(url: string): void {\n const platform = process.platform;\n const cmd = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';\n execFile(cmd, [url], (err) => {\n if (err) {\n console.error(`Failed to open browser: ${err.message}`);\n console.error(`Please open this URL manually: ${url}`);\n }\n });\n}\n","import { z } from 'zod'\nimport { ActionError, DataverseError, EntityNotFoundError, ImpersonationPrivilegeError, RecordNotFoundError } from '../errors.js'\nimport { AuthManager } from '../auth/auth-manager.js'\nimport { ISchemaCache, SchemaCache, EntitySchemaCacheEntry, AttributeDefinition } from '../schema/schema-cache.js'\nimport { withRetry } from '../utils/retry.js'\nimport { validateEntityName, validateGuid, validateActionName } from '../utils/validation.js'\nimport { injectPagingCookie } from '../utils/fetchxml.js'\nimport { logDryRun } from '../utils/cli.js'\n\nconst ODataResponseSchema = z.object({\n value: z.array(z.record(z.string(), z.unknown())),\n '@odata.nextLink': z.string().optional(),\n '@odata.count': z.number().optional(),\n})\n\nconst EntityDefinitionSchema = z.object({\n LogicalName: z.string(),\n DisplayName: z.object({\n UserLocalizedLabel: z.object({ Label: z.string() }).nullable().optional(),\n }),\n EntitySetName: z.string(),\n PrimaryIdAttribute: z.string(),\n PrimaryNameAttribute: z.string().nullable(),\n})\n\nconst EntityListResponseSchema = z.object({\n value: z.array(EntityDefinitionSchema),\n})\n\nconst SingleEntityDefinitionSchema = EntityDefinitionSchema.extend({\n Attributes: z.array(z.object({\n LogicalName: z.string(),\n DisplayName: z.object({\n UserLocalizedLabel: z.object({ Label: z.string() }).nullable().optional(),\n }),\n AttributeType: z.string(),\n RequiredLevel: z.object({ Value: z.string() }),\n IsCustomAttribute: z.boolean(),\n MaxLength: z.number().optional(),\n Targets: z.array(z.string()).optional(),\n })),\n})\n\ninterface QueryOptions {\n fields?: string[] | undefined\n pageAll?: boolean | undefined\n maxRows?: number | undefined\n onRecord?: ((record: Record<string, unknown>) => void) | undefined\n onProgress?: ((info: { recordCount: number; pageNumber: number }) => void) | undefined\n onRetry?: ((attempt: number, delayMs: number, error: import('../errors.js').DataverseError) => void) | undefined\n}\n\nexport class DataverseClient {\n private authManager: AuthManager\n private schemaCache: ISchemaCache\n private baseUrl: string | undefined\n private debug: boolean\n private dryRun: boolean\n private callerObjectId: string | undefined\n\n constructor(authManager: AuthManager, schemaCache?: ISchemaCache, opts?: { dryRun?: boolean | undefined; callerObjectId?: string | undefined }) {\n this.authManager = authManager\n this.schemaCache = schemaCache ?? new SchemaCache()\n this.debug = process.env['DVX_DEBUG'] === 'true'\n this.dryRun = opts?.dryRun ?? false\n this.callerObjectId = opts?.callerObjectId\n }\n\n private async getBaseUrl(): Promise<string> {\n if (this.baseUrl) return this.baseUrl\n const profile = this.authManager.getActiveProfile()\n this.baseUrl = `${profile.environmentUrl}/api/data/v9.2`\n return this.baseUrl\n }\n\n private async request(url: string, options: RequestInit = {}): Promise<Response> {\n const token = await this.authManager.getToken()\n const method = options.method ?? 'GET'\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json',\n 'OData-MaxVersion': '4.0',\n 'OData-Version': '4.0',\n ...(options.headers as Record<string, string> ?? {}),\n }\n\n if (this.callerObjectId) {\n headers['CallerObjectId'] = this.callerObjectId\n }\n\n if (this.debug) {\n console.error(`[DVX] ${method} ${url}`)\n }\n\n const response = await fetch(url, { ...options, headers })\n\n if (!response.ok) {\n let errorMessage = response.statusText\n let errorCode: string | undefined\n try {\n const body = await response.json() as { error?: { message?: string; code?: string } }\n if (body.error) {\n errorMessage = body.error.message ?? errorMessage\n errorCode = body.error.code\n }\n } catch {\n // ignore parse errors\n }\n\n let retryAfterSeconds: number | undefined\n const retryAfterHeader = response.headers.get('Retry-After')\n if (retryAfterHeader) {\n const parsed = Number(retryAfterHeader)\n if (!Number.isNaN(parsed) && parsed > 0) {\n retryAfterSeconds = parsed\n }\n }\n\n if (response.status === 403 && this.callerObjectId && errorMessage.includes('prvActOnBehalfOfAnotherUser')) {\n throw new ImpersonationPrivilegeError(errorMessage)\n }\n\n throw new DataverseError(errorMessage, response.status, errorCode, retryAfterSeconds)\n }\n\n return response\n }\n\n async listEntities(): Promise<Array<{ logicalName: string; displayName: string; entitySetName: string }>> {\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/EntityDefinitions?$select=LogicalName,DisplayName,EntitySetName,PrimaryIdAttribute,PrimaryNameAttribute`\n\n const response = await withRetry(() => this.request(url))\n const json = await response.json()\n const parsed = EntityListResponseSchema.parse(json)\n\n return parsed.value.map((e) => ({\n logicalName: e.LogicalName,\n displayName: e.DisplayName.UserLocalizedLabel?.Label ?? e.LogicalName,\n entitySetName: e.EntitySetName,\n }))\n }\n\n async getEntitySchema(entityName: string, noCache = false): Promise<EntitySchemaCacheEntry> {\n const name = validateEntityName(entityName)\n\n if (!noCache) {\n const cached = this.schemaCache.get(name)\n if (cached) return cached\n }\n\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/EntityDefinitions(LogicalName='${name}')?$expand=Attributes`\n\n const response = await withRetry(() => this.request(url))\n const json = await response.json()\n\n let parsed: z.infer<typeof SingleEntityDefinitionSchema>\n try {\n parsed = SingleEntityDefinitionSchema.parse(json)\n } catch {\n throw new EntityNotFoundError(name)\n }\n\n const entry: EntitySchemaCacheEntry = {\n logicalName: parsed.LogicalName,\n displayName: parsed.DisplayName.UserLocalizedLabel?.Label ?? parsed.LogicalName,\n entitySetName: parsed.EntitySetName,\n primaryIdAttribute: parsed.PrimaryIdAttribute,\n primaryNameAttribute: parsed.PrimaryNameAttribute ?? '',\n attributes: parsed.Attributes.map((a): AttributeDefinition => ({\n logicalName: a.LogicalName,\n displayName: a.DisplayName.UserLocalizedLabel?.Label ?? a.LogicalName,\n attributeType: a.AttributeType,\n requiredLevel: a.RequiredLevel.Value as AttributeDefinition['requiredLevel'],\n isCustomAttribute: a.IsCustomAttribute,\n maxLength: a.MaxLength,\n targets: a.Targets,\n })),\n cachedAt: new Date(),\n ttlMs: 0, // will be set by cache\n }\n\n this.schemaCache.set(entry)\n return entry\n }\n\n async query(\n entitySetName: string,\n odata: string,\n options: QueryOptions = {},\n ): Promise<Record<string, unknown>[]> {\n const baseUrl = await this.getBaseUrl()\n const maxRows = options.maxRows ?? (Number(process.env['DVX_MAX_ROWS']) || 5000)\n let totalRecords = 0\n const records: Record<string, unknown>[] = []\n\n let url = `${baseUrl}/${entitySetName}?${odata}`\n\n if (options.fields?.length) {\n const separator = odata.includes('$select') ? '' : `&$select=${options.fields.join(',')}`\n if (separator) url += separator\n }\n\n let pageNumber = 0\n\n do {\n const retryOpts = options.onRetry ? { onRetry: options.onRetry } : {}\n const response = await withRetry(() => this.request(url), retryOpts)\n const json = await response.json()\n const parsed = ODataResponseSchema.parse(json)\n\n for (const record of parsed.value) {\n if (totalRecords >= maxRows) break\n totalRecords++\n\n if (options.onRecord) {\n options.onRecord(record)\n } else {\n records.push(record)\n }\n }\n\n pageNumber++\n options.onProgress?.({ recordCount: totalRecords, pageNumber })\n\n if (totalRecords >= maxRows) break\n url = parsed['@odata.nextLink'] ?? ''\n } while (url && options.pageAll)\n\n return records\n }\n\n async getRecord(\n entityName: string,\n id: string,\n fields?: string[],\n ): Promise<Record<string, unknown>> {\n const name = validateEntityName(entityName)\n const guid = validateGuid(id)\n\n // Need entity set name from schema\n const schema = await this.getEntitySchema(name)\n const baseUrl = await this.getBaseUrl()\n\n let url = `${baseUrl}/${schema.entitySetName}(${guid})`\n if (fields?.length) {\n url += `?$select=${fields.join(',')}`\n }\n\n let response: Response\n try {\n response = await withRetry(() => this.request(url))\n } catch (e) {\n if (e instanceof DataverseError && e.statusCode === 404) {\n throw new RecordNotFoundError(name, guid)\n }\n throw e\n }\n\n const json = await response.json() as Record<string, unknown>\n return json\n }\n\n async createRecord(entityName: string, data: Record<string, unknown>): Promise<string> {\n const name = validateEntityName(entityName)\n const schema = await this.getEntitySchema(name)\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/${schema.entitySetName}`\n\n if (this.dryRun) {\n logDryRun('POST', url, data)\n return 'dry-run'\n }\n\n const response = await withRetry(() => this.request(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n }))\n\n const entityIdHeader = response.headers.get('OData-EntityId') ?? ''\n const match = /\\(([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\)/i.exec(entityIdHeader)\n if (!match?.[1]) {\n throw new DataverseError('Create succeeded but OData-EntityId header missing', 201)\n }\n return match[1]\n }\n\n async updateRecord(entityName: string, id: string, data: Record<string, unknown>): Promise<void> {\n const name = validateEntityName(entityName)\n const guid = validateGuid(id)\n const schema = await this.getEntitySchema(name)\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/${schema.entitySetName}(${guid})`\n\n if (this.dryRun) {\n logDryRun('PATCH', url, data)\n return\n }\n\n await withRetry(() => this.request(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n }))\n }\n\n async deleteRecord(entityName: string, id: string): Promise<void> {\n const name = validateEntityName(entityName)\n const guid = validateGuid(id)\n const schema = await this.getEntitySchema(name)\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/${schema.entitySetName}(${guid})`\n\n if (this.dryRun) {\n logDryRun('DELETE', url)\n return\n }\n\n await withRetry(() => this.request(url, { method: 'DELETE' }))\n }\n\n async queryFetchXml(\n entityName: string,\n fetchXml: string,\n onRecord?: (record: unknown) => void,\n options?: { onProgress?: (info: { recordCount: number; pageNumber: number }) => void; onRetry?: (attempt: number, delayMs: number, error: import('../errors.js').DataverseError) => void },\n ): Promise<unknown[]> {\n const name = validateEntityName(entityName)\n const schema = await this.getEntitySchema(name)\n const baseUrl = await this.getBaseUrl()\n const maxRows = Number(process.env['DVX_MAX_ROWS']) || 5000\n let totalRecords = 0\n const records: unknown[] = []\n let page = 1\n let currentXml = fetchXml\n\n do {\n const encoded = encodeURIComponent(currentXml)\n const url = `${baseUrl}/${schema.entitySetName}?fetchXml=${encoded}`\n\n const fetchRetryOpts = options?.onRetry ? { onRetry: options.onRetry } : {}\n const response = await withRetry(() => this.request(url), fetchRetryOpts)\n const json = await response.json() as Record<string, unknown>\n const parsed = ODataResponseSchema.parse(json)\n\n for (const record of parsed.value) {\n if (totalRecords >= maxRows) break\n totalRecords++\n\n if (onRecord) {\n onRecord(record)\n } else {\n records.push(record)\n }\n }\n\n options?.onProgress?.({ recordCount: totalRecords, pageNumber: page })\n\n if (totalRecords >= maxRows) break\n\n const cookie = json['@Microsoft.Dynamics.CRM.fetchxmlpagingcookie'] as string | undefined\n if (!cookie) break\n\n page++\n currentXml = injectPagingCookie(currentXml, cookie, page)\n } while (true)\n\n return records\n }\n\n async executeAction(\n actionName: string,\n payload: Record<string, unknown>,\n opts?: { entityName?: string | undefined; id?: string | undefined },\n ): Promise<Record<string, unknown> | null> {\n validateActionName(actionName)\n\n const baseUrl = await this.getBaseUrl()\n let url: string\n if (opts?.entityName && opts?.id) {\n const guid = validateGuid(opts.id)\n const schema = await this.getEntitySchema(opts.entityName)\n url = `${baseUrl}/${schema.entitySetName}(${guid})/Microsoft.Dynamics.CRM.${actionName}`\n } else {\n url = `${baseUrl}/${actionName}`\n }\n\n if (this.dryRun) {\n logDryRun('POST', url, payload)\n return null\n }\n\n try {\n return await withRetry(async () => {\n const response = await this.request(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (response.status === 204) return null\n const data = await response.json() as unknown\n return z.record(z.string(), z.unknown()).parse(data)\n })\n } catch (err) {\n if (err instanceof DataverseError) {\n throw new ActionError(err.message, err.statusCode)\n }\n throw err\n }\n }\n\n invalidateSchema(entityName: string): void {\n this.schemaCache.invalidate(entityName)\n }\n\n clearSchemaCache(): void {\n this.schemaCache.clear()\n }\n\n async executeBatch(body: string, boundary: string): Promise<string> {\n const baseUrl = await this.getBaseUrl()\n const url = `${baseUrl}/$batch`\n\n if (this.dryRun) {\n logDryRun('POST', url, { batchBodyLength: body.length })\n return ''\n }\n\n const response = await withRetry(() => this.request(url, {\n method: 'POST',\n headers: { 'Content-Type': `multipart/mixed;boundary=${boundary}` },\n body,\n }))\n\n return await response.text()\n }\n}\n","export interface ISchemaCache {\n get(entityName: string): EntitySchemaCacheEntry | undefined\n set(entry: EntitySchemaCacheEntry): void\n invalidate(entityName: string): void\n clear(): void\n}\n\nexport interface AttributeDefinition {\n logicalName: string\n displayName: string\n attributeType: string\n requiredLevel: 'None' | 'SystemRequired' | 'ApplicationRequired' | 'Recommended'\n isCustomAttribute: boolean\n maxLength?: number | undefined\n targets?: string[] | undefined\n}\n\nexport interface EntitySchemaCacheEntry {\n logicalName: string\n displayName: string\n entitySetName: string\n primaryIdAttribute: string\n primaryNameAttribute: string\n attributes: AttributeDefinition[]\n cachedAt: Date\n ttlMs: number\n}\n\nconst DEFAULT_TTL_MS = 300_000 // 5 minutes\n\nexport class SchemaCache implements ISchemaCache {\n private cache = new Map<string, EntitySchemaCacheEntry>()\n private ttlMs: number\n\n constructor(ttlMs?: number) {\n this.ttlMs = ttlMs ?? (Number(process.env['DVX_SCHEMA_CACHE_TTL_MS']) || DEFAULT_TTL_MS)\n }\n\n get(entityName: string): EntitySchemaCacheEntry | undefined {\n const entry = this.cache.get(entityName.toLowerCase())\n if (!entry) return undefined\n\n const age = Date.now() - entry.cachedAt.getTime()\n if (age > entry.ttlMs) {\n this.cache.delete(entityName.toLowerCase())\n return undefined\n }\n\n return entry\n }\n\n set(entry: EntitySchemaCacheEntry): void {\n this.cache.set(entry.logicalName.toLowerCase(), {\n ...entry,\n cachedAt: new Date(),\n ttlMs: this.ttlMs,\n })\n }\n\n invalidate(entityName: string): void {\n this.cache.delete(entityName.toLowerCase())\n }\n\n clear(): void {\n this.cache.clear()\n }\n}\n","import { DataverseError } from '../errors.js'\n\ninterface RetryOptions {\n maxRetries?: number\n baseDelayMs?: number\n maxDelayMs?: number\n onRetry?: ((attempt: number, delayMs: number, error: DataverseError) => void) | undefined\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, 'onRetry'>> = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const opts = { ...DEFAULT_OPTIONS, ...options }\n let lastError: unknown\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n\n if (attempt === opts.maxRetries) break\n\n // Only retry on 429 (rate limited) or 5xx (server errors)\n if (error instanceof DataverseError) {\n if (error.statusCode === 429 || error.statusCode >= 500) {\n // Use Retry-After header value if available, otherwise exponential backoff\n const delay = error.retryAfterSeconds\n ? Math.min(error.retryAfterSeconds * 1000, opts.maxDelayMs)\n : Math.min(opts.baseDelayMs * Math.pow(2, attempt), opts.maxDelayMs)\n opts.onRetry?.(attempt + 1, delay, error)\n await sleep(delay)\n continue\n }\n }\n\n // Don't retry other errors\n throw error\n }\n }\n\n throw lastError\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { ValidationError } from '../errors.js'\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst ENTITY_NAME_REGEX = /^[a-z][a-z0-9_]*$/i\nconst DANGEROUS_CHARS = /[?#%]/\n\nexport function validateGuid(value: string, label = 'ID'): string {\n if (!UUID_REGEX.test(value)) {\n throw new ValidationError(`Invalid GUID for ${label}: '${value}'`)\n }\n return value.toLowerCase()\n}\n\nexport function validateEntityName(name: string): string {\n if (DANGEROUS_CHARS.test(name)) {\n throw new ValidationError(`Entity name contains invalid characters: '${name}'`)\n }\n if (!ENTITY_NAME_REGEX.test(name)) {\n throw new ValidationError(`Invalid entity logical name: '${name}'`)\n }\n return name.toLowerCase()\n}\n\nexport function validateActionName(name: string): string {\n if (!/^[A-Z][A-Za-z0-9_]*$/.test(name)) {\n throw new ValidationError(\n `Invalid action name \"${name}\": must start with uppercase letter and contain only letters, digits, or underscores`\n )\n }\n return name\n}\n\nexport function validateUrl(url: string): string {\n try {\n const parsed = new URL(url)\n if (parsed.protocol !== 'https:') {\n throw new ValidationError(`Environment URL must use HTTPS: '${url}'`)\n }\n return parsed.origin\n } catch (e) {\n if (e instanceof ValidationError) throw e\n throw new ValidationError(`Invalid URL: '${url}'`)\n }\n}\n","import { XMLParser } from 'fast-xml-parser'\nimport { FetchXmlValidationError } from '../errors.js'\n\nconst parser = new XMLParser({ ignoreAttributes: false })\n\nexport function validateFetchXml(xml: string): void {\n let parsed: Record<string, unknown>\n try {\n parsed = parser.parse(xml) as Record<string, unknown>\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n throw new FetchXmlValidationError(`Invalid FetchXML: ${message}`)\n }\n\n if (!parsed['fetch']) {\n throw new FetchXmlValidationError('Invalid FetchXML: root element must be <fetch>')\n }\n}\n\nexport function injectPagingCookie(xml: string, cookie: string, page: number): string {\n const decoded = decodeURIComponent(cookie)\n // Strip existing paging-cookie and page attributes before injecting new ones\n const cleaned = xml.replace(/<fetch([^>]*)>/, (_match, attrs: string) => {\n const stripped = attrs\n .replace(/\\s+paging-cookie=\"[^\"]*\"/g, '')\n .replace(/\\s+page=\"[^\"]*\"/g, '')\n return `<fetch${stripped}>`\n })\n return cleaned.replace(\n /<fetch/,\n `<fetch paging-cookie=\"${decoded.replace(/\"/g, '&quot;')}\" page=\"${page}\"`,\n )\n}\n","import Database from 'better-sqlite3'\nimport { mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport type { ISchemaCache, EntitySchemaCacheEntry } from './schema-cache.js'\n\nexport class SqliteSchemaCache implements ISchemaCache {\n private db: Database.Database\n private ttlMs: number\n\n constructor(dbPath: string, ttlMs = 300_000) {\n mkdirSync(dirname(dbPath), { recursive: true })\n this.db = new Database(dbPath)\n this.ttlMs = ttlMs\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS schema_cache (\n logical_name TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n cached_at INTEGER NOT NULL,\n ttl_ms INTEGER NOT NULL\n )\n `)\n }\n\n get(entityName: string): EntitySchemaCacheEntry | undefined {\n const row = this.db.prepare(\n 'SELECT data, cached_at, ttl_ms FROM schema_cache WHERE logical_name = ?'\n ).get(entityName.toLowerCase()) as { data: string; cached_at: number; ttl_ms: number } | undefined\n if (!row) return undefined\n if (Date.now() - row.cached_at >= row.ttl_ms) {\n this.db.prepare('DELETE FROM schema_cache WHERE logical_name = ?').run(entityName.toLowerCase())\n return undefined\n }\n const entry = JSON.parse(row.data) as EntitySchemaCacheEntry\n entry.cachedAt = new Date(entry.cachedAt)\n return entry\n }\n\n set(entry: EntitySchemaCacheEntry): void {\n this.db.prepare(\n 'INSERT OR REPLACE INTO schema_cache (logical_name, data, cached_at, ttl_ms) VALUES (?, ?, ?, ?)'\n ).run(entry.logicalName.toLowerCase(), JSON.stringify(entry), Date.now(), this.ttlMs)\n }\n\n invalidate(entityName: string): void {\n this.db.prepare('DELETE FROM schema_cache WHERE logical_name = ?').run(entityName.toLowerCase())\n }\n\n clear(): void {\n this.db.prepare('DELETE FROM schema_cache').run()\n }\n\n close(): void {\n this.db.close()\n }\n}\n","export interface BatchOperation {\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE'\n path: string\n headers?: Record<string, string>\n body?: unknown\n contentId?: string\n}\n\nexport function chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\nfunction serializeOperation(op: BatchOperation, boundary: string, autoContentId?: string): string[] {\n const parts: string[] = []\n parts.push(`--${boundary}`)\n parts.push('Content-Type: application/http')\n parts.push('Content-Transfer-Encoding: binary')\n const contentId = op.contentId ?? autoContentId\n if (contentId) {\n parts.push(`Content-ID: ${contentId}`)\n }\n parts.push('')\n parts.push(`${op.method} ${op.path} HTTP/1.1`)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...(op.headers ?? {}),\n }\n const serializedBody = op.body !== undefined ? JSON.stringify(op.body) : undefined\n if (serializedBody !== undefined) {\n headers['Content-Length'] = String(Buffer.byteLength(serializedBody, 'utf-8'))\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`${key}: ${value}`)\n }\n parts.push('')\n if (serializedBody !== undefined) {\n parts.push(serializedBody)\n }\n parts.push('')\n return parts\n}\n\nexport function buildBatchBody(\n operations: BatchOperation[],\n batchBoundary: string,\n options?: { atomic?: boolean; changesetSize?: number },\n): string {\n const parts: string[] = []\n const changesetSize = options?.changesetSize ?? 100\n\n if (options?.atomic) {\n const chunks = chunkArray(operations, changesetSize)\n for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {\n const chunk = chunks[chunkIndex]!\n const changesetBoundary = `changeset_${batchBoundary}_${chunkIndex}`\n parts.push(`--${batchBoundary}`)\n parts.push(`Content-Type: multipart/mixed;boundary=${changesetBoundary}`)\n parts.push('')\n\n for (let opIndex = 0; opIndex < chunk.length; opIndex++) {\n const op = chunk[opIndex]!\n parts.push(...serializeOperation(op, changesetBoundary, String(chunkIndex * changesetSize + opIndex + 1)))\n }\n\n parts.push(`--${changesetBoundary}--`)\n }\n } else {\n for (const op of operations) {\n parts.push(...serializeOperation(op, batchBoundary))\n }\n }\n\n parts.push(`--${batchBoundary}--`)\n return parts.join('\\r\\n')\n}\n"],"mappings":"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","names":["path","result","z","z","mkdirSync","dirname"]}
@@ -0,0 +1,3 @@
1
+ declare function main(): Promise<void>;
2
+
3
+ export { main as default };