@embedpdf/core 2.3.0 → 2.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-registry.svelte.ts","../../src/svelte/hooks/use-plugin.svelte.ts","../../src/svelte/hooks/use-capability.svelte.ts","../../src/svelte/hooks/use-core-state.svelte.ts","../../src/svelte/hooks/use-document-state.svelte.ts","../../src/lib/types/permissions.ts","../../src/lib/store/selectors.ts","../../src/svelte/hooks/use-document-permissions.svelte.ts","../../src/svelte/components/NestedWrapper.svelte","../../src/svelte/components/AutoMount.svelte","../../src/svelte/components/EmbedPDF.svelte"],"sourcesContent":["import type { PluginRegistry, CoreState, DocumentState } from '@embedpdf/core';\n\nexport interface PDFContextState {\n registry: PluginRegistry | null;\n coreState: CoreState | null;\n isInitializing: boolean;\n pluginsReady: boolean;\n\n // Convenience accessors (always safe to use)\n activeDocumentId: string | null;\n activeDocument: DocumentState | null;\n documents: Record<string, DocumentState>;\n documentStates: DocumentState[];\n}\n\nexport const pdfContext = $state<PDFContextState>({\n registry: null,\n coreState: null,\n isInitializing: true,\n pluginsReady: false,\n activeDocumentId: null,\n activeDocument: null,\n documents: {},\n documentStates: [],\n});\n\n/**\n * Hook to access the PDF registry context.\n * @returns The PDF registry or null during initialization\n */\n\nexport const useRegistry = () => pdfContext;\n","import type { BasePlugin } from '@embedpdf/core';\nimport { pdfContext } from './use-registry.svelte.js';\n\n/**\n * Hook to access a plugin.\n * @param pluginId The ID of the plugin to access\n * @returns The plugin or null during initialization\n * @example\n * // Get zoom plugin\n * const zoom = usePlugin<ZoomPlugin>(ZoomPlugin.id);\n */\nexport function usePlugin<T extends BasePlugin>(pluginId: T['id']) {\n const { registry } = pdfContext;\n\n const state = $state({\n plugin: null as T | null,\n isLoading: true,\n ready: new Promise<void>(() => {}),\n });\n\n if (registry === null) {\n return state;\n }\n\n const plugin = registry.getPlugin<T>(pluginId);\n\n if (!plugin) {\n throw new Error(`Plugin ${pluginId} not found`);\n }\n\n state.plugin = plugin;\n state.isLoading = false;\n state.ready = plugin.ready();\n\n return state;\n}\n","import type { BasePlugin } from '@embedpdf/core';\nimport { usePlugin } from './use-plugin.svelte.js';\n\n/**\n * Hook to access a plugin's capability.\n * @param pluginId The ID of the plugin to access\n * @returns The capability provided by the plugin or null during initialization\n * @example\n * // Get zoom capability\n * const zoom = useCapability<ZoomPlugin>(ZoomPlugin.id);\n */\nexport function useCapability<T extends BasePlugin>(pluginId: T['id']) {\n const p = usePlugin<T>(pluginId);\n\n const state = $state({\n provides: null as ReturnType<NonNullable<T['provides']>> | null,\n isLoading: true,\n ready: new Promise<void>(() => {}),\n });\n\n // Use $effect to reactively update when plugin loads\n $effect(() => {\n if (!p.plugin) {\n state.provides = null;\n state.isLoading = p.isLoading;\n state.ready = p.ready;\n return;\n }\n\n if (!p.plugin.provides) {\n throw new Error(`Plugin ${pluginId} does not provide a capability`);\n }\n\n state.provides = p.plugin.provides() as ReturnType<NonNullable<T['provides']>>;\n state.isLoading = p.isLoading;\n state.ready = p.ready;\n });\n\n return state;\n}\n","import { useRegistry } from './use-registry.svelte';\n\n/**\n * Hook that provides access to the current core state.\n *\n * Note: This reads from the context which is already subscribed to core state changes\n * in the EmbedPDF component, so there's no additional subscription overhead.\n */\nexport function useCoreState() {\n const context = useRegistry();\n\n return {\n get current() {\n return context.coreState;\n },\n };\n}\n","import { useCoreState } from './use-core-state.svelte';\n\n/**\n * Hook that provides reactive access to a specific document's state from the core store.\n *\n * @param getDocumentId Function that returns the document ID\n * @returns The reactive DocumentState object or null if not found.\n */\nexport function useDocumentState(getDocumentId: () => string | null) {\n const coreStateRef = useCoreState();\n\n // Reactive documentId\n const documentId = $derived(getDocumentId());\n\n const documentState = $derived(\n coreStateRef.current && documentId\n ? (coreStateRef.current.documents[documentId] ?? null)\n : null,\n );\n\n return {\n get current() {\n return documentState;\n },\n };\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\n\n/**\n * Human-readable permission names for use in configuration.\n */\nexport type PermissionName =\n | 'print'\n | 'modifyContents'\n | 'copyContents'\n | 'modifyAnnotations'\n | 'fillForms'\n | 'extractForAccessibility'\n | 'assembleDocument'\n | 'printHighQuality';\n\n/**\n * Map from human-readable names to PdfPermissionFlag values.\n */\nexport const PERMISSION_NAME_TO_FLAG: Record<PermissionName, PdfPermissionFlag> = {\n print: PdfPermissionFlag.Print,\n modifyContents: PdfPermissionFlag.ModifyContents,\n copyContents: PdfPermissionFlag.CopyContents,\n modifyAnnotations: PdfPermissionFlag.ModifyAnnotations,\n fillForms: PdfPermissionFlag.FillForms,\n extractForAccessibility: PdfPermissionFlag.ExtractForAccessibility,\n assembleDocument: PdfPermissionFlag.AssembleDocument,\n printHighQuality: PdfPermissionFlag.PrintHighQuality,\n};\n\n/**\n * Permission overrides can use either numeric flags or human-readable string names.\n */\nexport type PermissionOverrides = Partial<\n Record<PdfPermissionFlag, boolean> & Record<PermissionName, boolean>\n>;\n\n/**\n * Configuration for overriding document permissions.\n * Can be applied globally (at PluginRegistry level) or per-document (when opening).\n */\nexport interface PermissionConfig {\n /**\n * When true (default): use PDF's permissions as the base, then apply overrides.\n * When false: treat document as having all permissions allowed, then apply overrides.\n */\n enforceDocumentPermissions?: boolean;\n\n /**\n * Explicit per-flag overrides. Supports both numeric flags and string names.\n * - true = force allow (even if PDF denies)\n * - false = force deny (even if PDF allows)\n * - undefined = use base permissions\n *\n * @example\n * // Using string names (recommended)\n * overrides: { print: false, modifyAnnotations: true }\n *\n * @example\n * // Using numeric flags\n * overrides: { [PdfPermissionFlag.Print]: false }\n */\n overrides?: PermissionOverrides;\n}\n\n/**\n * All permission flags for iteration when computing effective permissions.\n */\nexport const ALL_PERMISSION_FLAGS: PdfPermissionFlag[] = [\n PdfPermissionFlag.Print,\n PdfPermissionFlag.ModifyContents,\n PdfPermissionFlag.CopyContents,\n PdfPermissionFlag.ModifyAnnotations,\n PdfPermissionFlag.FillForms,\n PdfPermissionFlag.ExtractForAccessibility,\n PdfPermissionFlag.AssembleDocument,\n PdfPermissionFlag.PrintHighQuality,\n];\n\n/**\n * All permission names for iteration.\n */\nexport const ALL_PERMISSION_NAMES: PermissionName[] = [\n 'print',\n 'modifyContents',\n 'copyContents',\n 'modifyAnnotations',\n 'fillForms',\n 'extractForAccessibility',\n 'assembleDocument',\n 'printHighQuality',\n];\n\n/**\n * Map from PdfPermissionFlag to human-readable name.\n */\nexport const PERMISSION_FLAG_TO_NAME: Record<PdfPermissionFlag, PermissionName> = {\n [PdfPermissionFlag.Print]: 'print',\n [PdfPermissionFlag.ModifyContents]: 'modifyContents',\n [PdfPermissionFlag.CopyContents]: 'copyContents',\n [PdfPermissionFlag.ModifyAnnotations]: 'modifyAnnotations',\n [PdfPermissionFlag.FillForms]: 'fillForms',\n [PdfPermissionFlag.ExtractForAccessibility]: 'extractForAccessibility',\n [PdfPermissionFlag.AssembleDocument]: 'assembleDocument',\n [PdfPermissionFlag.PrintHighQuality]: 'printHighQuality',\n};\n\n/**\n * Helper to get the override value for a permission flag, checking both numeric and string keys.\n */\nexport function getPermissionOverride(\n overrides: PermissionOverrides | undefined,\n flag: PdfPermissionFlag,\n): boolean | undefined {\n if (!overrides) return undefined;\n\n // Check numeric key first\n if (flag in overrides) {\n return (overrides as Record<PdfPermissionFlag, boolean>)[flag];\n }\n\n // Check string key\n const name = PERMISSION_FLAG_TO_NAME[flag];\n if (name && name in overrides) {\n return (overrides as Record<PermissionName, boolean>)[name];\n }\n\n return undefined;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { CoreState, DocumentState } from './initial-state';\nimport { ALL_PERMISSION_FLAGS, getPermissionOverride } from '../types/permissions';\n\n/**\n * Get the active document state\n */\nexport const getActiveDocumentState = (state: CoreState): DocumentState | null => {\n if (!state.activeDocumentId) return null;\n return state.documents[state.activeDocumentId] ?? null;\n};\n\n/**\n * Get document state by ID\n */\nexport const getDocumentState = (state: CoreState, documentId: string): DocumentState | null => {\n return state.documents[documentId] ?? null;\n};\n\n/**\n * Get all document IDs\n */\nexport const getDocumentIds = (state: CoreState): string[] => {\n return Object.keys(state.documents);\n};\n\n/**\n * Check if a document is loaded\n */\nexport const isDocumentLoaded = (state: CoreState, documentId: string): boolean => {\n return !!state.documents[documentId];\n};\n\n/**\n * Get the number of open documents\n */\nexport const getDocumentCount = (state: CoreState): number => {\n return Object.keys(state.documents).length;\n};\n\n// ─────────────────────────────────────────────────────────\n// Permission Selectors\n// ─────────────────────────────────────────────────────────\n\n/**\n * Check if a specific permission flag is effectively allowed for a document.\n * Applies layered resolution: per-document override → global override → enforceDocumentPermissions → PDF permission.\n *\n * @param state - The core state\n * @param documentId - The document ID to check permissions for\n * @param flag - The permission flag to check\n * @returns true if the permission is allowed, false otherwise\n */\nexport function getEffectivePermission(\n state: CoreState,\n documentId: string,\n flag: PdfPermissionFlag,\n): boolean {\n const docState = state.documents[documentId];\n const docConfig = docState?.permissions;\n const globalConfig = state.globalPermissions;\n const pdfPermissions = docState?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n // 1. Per-document override wins (supports both numeric and string keys)\n const docOverride = getPermissionOverride(docConfig?.overrides, flag);\n if (docOverride !== undefined) {\n return docOverride;\n }\n\n // 2. Global override (supports both numeric and string keys)\n const globalOverride = getPermissionOverride(globalConfig?.overrides, flag);\n if (globalOverride !== undefined) {\n return globalOverride;\n }\n\n // 3. Check enforce setting (per-doc takes precedence over global)\n const enforce =\n docConfig?.enforceDocumentPermissions ?? globalConfig?.enforceDocumentPermissions ?? true;\n\n if (!enforce) return true; // Not enforcing = allow all\n\n // 4. Use PDF permission\n return (pdfPermissions & flag) !== 0;\n}\n\n/**\n * Get all effective permissions as a bitmask for a document.\n * Combines all individual permission checks into a single bitmask.\n *\n * @param state - The core state\n * @param documentId - The document ID to get permissions for\n * @returns A bitmask of all effective permissions\n */\nexport function getEffectivePermissions(state: CoreState, documentId: string): number {\n return ALL_PERMISSION_FLAGS.reduce((acc, flag) => {\n return getEffectivePermission(state, documentId, flag) ? acc | flag : acc;\n }, 0);\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { useCoreState } from './use-core-state.svelte';\nimport { getEffectivePermission, getEffectivePermissions } from '../../lib/store/selectors';\n\nexport interface DocumentPermissions {\n /** Effective permission flags after applying overrides */\n permissions: number;\n /** Raw PDF permission flags (before overrides) */\n pdfPermissions: number;\n /** Check if a specific permission flag is effectively allowed */\n hasPermission: (flag: PdfPermissionFlag) => boolean;\n /** Check if all specified flags are effectively allowed */\n hasAllPermissions: (...flags: PdfPermissionFlag[]) => boolean;\n\n // Shorthand booleans for all permission flags (using effective permissions):\n /** Can print (possibly degraded quality) */\n canPrint: boolean;\n /** Can modify document contents */\n canModifyContents: boolean;\n /** Can copy/extract text and graphics */\n canCopyContents: boolean;\n /** Can add/modify annotations and fill forms */\n canModifyAnnotations: boolean;\n /** Can fill in existing form fields */\n canFillForms: boolean;\n /** Can extract for accessibility */\n canExtractForAccessibility: boolean;\n /** Can assemble document (insert, rotate, delete pages) */\n canAssembleDocument: boolean;\n /** Can print high quality */\n canPrintHighQuality: boolean;\n}\n\n/**\n * Hook that provides reactive access to a document's effective permission flags.\n * Applies layered resolution: per-document override → global override → PDF permission.\n *\n * @param getDocumentId Function that returns the document ID\n * @returns An object with reactive permission properties.\n */\nexport function useDocumentPermissions(getDocumentId: () => string): DocumentPermissions {\n const coreStateRef = useCoreState();\n\n const documentId = $derived(getDocumentId());\n const coreState = $derived(coreStateRef.current);\n\n const effectivePermissions = $derived(\n coreState ? getEffectivePermissions(coreState, documentId) : PdfPermissionFlag.AllowAll,\n );\n\n const pdfPermissions = $derived(\n coreState?.documents[documentId]?.document?.permissions ?? PdfPermissionFlag.AllowAll,\n );\n\n const hasPermission = (flag: PdfPermissionFlag) =>\n coreState ? getEffectivePermission(coreState, documentId, flag) : true;\n\n const hasAllPermissions = (...flags: PdfPermissionFlag[]) =>\n flags.every((flag) => (coreState ? getEffectivePermission(coreState, documentId, flag) : true));\n\n return {\n get permissions() {\n return effectivePermissions;\n },\n get pdfPermissions() {\n return pdfPermissions;\n },\n hasPermission,\n hasAllPermissions,\n get canPrint() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.Print)\n : true;\n },\n get canModifyContents() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ModifyContents)\n : true;\n },\n get canCopyContents() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.CopyContents)\n : true;\n },\n get canModifyAnnotations() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ModifyAnnotations)\n : true;\n },\n get canFillForms() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.FillForms)\n : true;\n },\n get canExtractForAccessibility() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ExtractForAccessibility)\n : true;\n },\n get canAssembleDocument() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.AssembleDocument)\n : true;\n },\n get canPrintHighQuality() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.PrintHighQuality)\n : true;\n },\n };\n}\n","<script lang=\"ts\">\n import { type Component, type Snippet } from 'svelte';\n import NestedWrapper from './NestedWrapper.svelte';\n\n interface Props {\n wrappers: Component[];\n children?: Snippet;\n }\n\n let { wrappers, children }: Props = $props();\n</script>\n\n{#if wrappers.length > 1}\n {@const Wrapper = wrappers[0]}\n <Wrapper>\n <NestedWrapper wrappers={wrappers.slice(1)}>\n {@render children?.()}\n </NestedWrapper>\n </Wrapper>\n{:else}\n {@const Wrapper = wrappers[0]}\n <Wrapper>\n {@render children?.()}\n </Wrapper>\n{/if}\n","<script lang=\"ts\">\n import { hasAutoMountElements, type PluginBatchRegistration, type IPlugin } from '@embedpdf/core';\n import NestedWrapper from './NestedWrapper.svelte';\n import type { Snippet } from 'svelte';\n\n type Props = {\n plugins: PluginBatchRegistration<IPlugin<any>, any>[];\n children: Snippet;\n };\n\n let { plugins, children }: Props = $props();\n let utilities: any[] = $state([]);\n let wrappers: any[] = $state([]);\n\n // recompute when plugins change\n $effect(() => {\n const nextUtilities: any[] = [];\n const nextWrappers: any[] = [];\n\n for (const reg of plugins) {\n const pkg = reg.package;\n if (hasAutoMountElements(pkg)) {\n const elements = pkg.autoMountElements?.() ?? [];\n for (const element of elements) {\n if (element.type === 'utility') {\n nextUtilities.push(element.component);\n } else if (element.type === 'wrapper') {\n nextWrappers.push(element.component);\n }\n }\n }\n }\n\n utilities = nextUtilities;\n wrappers = nextWrappers;\n });\n</script>\n\n{#if wrappers.length > 0}\n <!-- wrap slot content inside all wrappers -->\n <NestedWrapper {wrappers} {children} />\n{:else}\n {@render children?.()}\n{/if}\n\n<!-- mount all utilities -->\n{#each utilities as Utility, i (`utility-${i}`)}\n <Utility />\n{/each}\n","<script lang=\"ts\">\n import type { Logger, PdfEngine } from '@embedpdf/models';\n import {\n type IPlugin,\n type PluginBatchRegistrations,\n type PluginRegistryConfig,\n PluginRegistry,\n } from '@embedpdf/core';\n import { type Snippet } from 'svelte';\n import AutoMount from './AutoMount.svelte';\n import { pdfContext, type PDFContextState } from '../hooks';\n\n export type { PluginBatchRegistrations };\n\n interface EmbedPDFProps {\n /**\n * The PDF engine to use for the PDF viewer.\n */\n engine: PdfEngine;\n /**\n * Registry configuration including logger, permissions, and defaults.\n */\n config?: PluginRegistryConfig;\n /**\n * @deprecated Use config.logger instead. Will be removed in next major version.\n */\n logger?: Logger;\n /**\n * The callback to call when the PDF viewer is initialized.\n */\n onInitialized?: (registry: PluginRegistry) => Promise<void>;\n /**\n * The plugins to use for the PDF viewer.\n */\n plugins: PluginBatchRegistrations;\n /**\n * The children to render for the PDF viewer.\n */\n children: Snippet<[PDFContextState]>;\n /**\n * Whether to auto-mount specific non-visual DOM elements from plugins.\n * @default true\n */\n autoMountDomElements?: boolean;\n }\n\n let {\n engine,\n config,\n logger,\n onInitialized,\n plugins,\n children,\n autoMountDomElements = true,\n }: EmbedPDFProps = $props();\n\n let latestInit = onInitialized;\n\n $effect(() => {\n if (onInitialized) {\n latestInit = onInitialized;\n }\n });\n\n $effect(() => {\n if (engine || (engine && plugins)) {\n // Merge deprecated logger prop into config (config.logger takes precedence)\n const finalConfig: PluginRegistryConfig = {\n ...config,\n logger: config?.logger ?? logger,\n };\n const reg = new PluginRegistry(engine, finalConfig);\n reg.registerPluginBatch(plugins);\n\n const initialize = async () => {\n await reg.initialize();\n\n // if the registry is destroyed, don't do anything\n if (reg.isDestroyed()) {\n return;\n }\n\n const store = reg.getStore();\n pdfContext.coreState = store.getState().core;\n\n const unsubscribe = store.subscribe((action, newState, oldState) => {\n // Only update if it's a core action and the core state changed\n if (store.isCoreAction(action) && newState.core !== oldState.core) {\n pdfContext.coreState = newState.core;\n\n // Update convenience accessors\n const activeDocumentId = newState.core.activeDocumentId ?? null;\n const documents = newState.core.documents ?? {};\n const documentOrder = newState.core.documentOrder ?? [];\n\n pdfContext.activeDocumentId = activeDocumentId;\n pdfContext.activeDocument =\n activeDocumentId && documents[activeDocumentId] ? documents[activeDocumentId] : null;\n pdfContext.documents = documents;\n pdfContext.documentStates = documentOrder\n .map((docId) => documents[docId])\n .filter(\n (doc): doc is import('@embedpdf/core').DocumentState =>\n doc !== null && doc !== undefined,\n );\n }\n });\n\n /* always call the *latest* callback */\n await latestInit?.(reg);\n\n // if the registry is destroyed, don't do anything\n if (reg.isDestroyed()) {\n unsubscribe();\n return;\n }\n\n reg.pluginsReady().then(() => {\n if (!reg.isDestroyed()) {\n pdfContext.pluginsReady = true;\n }\n });\n\n // Provide the registry to children via context\n pdfContext.registry = reg;\n pdfContext.isInitializing = false;\n\n return unsubscribe;\n };\n\n let cleanup: (() => void) | undefined;\n initialize()\n .then((unsub) => {\n cleanup = unsub;\n })\n .catch(console.error);\n\n return () => {\n cleanup?.();\n reg.destroy();\n pdfContext.registry = null;\n pdfContext.coreState = null;\n pdfContext.isInitializing = true;\n pdfContext.pluginsReady = false;\n pdfContext.activeDocumentId = null;\n pdfContext.activeDocument = null;\n pdfContext.documents = {};\n pdfContext.documentStates = [];\n };\n }\n });\n</script>\n\n{#if pdfContext.pluginsReady && autoMountDomElements}\n <AutoMount {plugins}>{@render children(pdfContext)}</AutoMount>\n{:else}\n {@render children(pdfContext)}\n{/if}\n"],"names":["$$anchor","NestedWrapper"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-registry.svelte.ts","../../src/svelte/hooks/use-plugin.svelte.ts","../../src/svelte/hooks/use-capability.svelte.ts","../../src/svelte/hooks/use-core-state.svelte.ts","../../src/svelte/hooks/use-document-state.svelte.ts","../../src/lib/types/permissions.ts","../../src/lib/store/selectors.ts","../../src/svelte/hooks/use-document-permissions.svelte.ts","../../src/svelte/components/NestedWrapper.svelte","../../src/svelte/components/AutoMount.svelte","../../src/svelte/components/EmbedPDF.svelte"],"sourcesContent":["import type { PluginRegistry, CoreState, DocumentState } from '@embedpdf/core';\n\nexport interface PDFContextState {\n registry: PluginRegistry | null;\n coreState: CoreState | null;\n isInitializing: boolean;\n pluginsReady: boolean;\n\n // Convenience accessors (always safe to use)\n activeDocumentId: string | null;\n activeDocument: DocumentState | null;\n documents: Record<string, DocumentState>;\n documentStates: DocumentState[];\n}\n\nexport const pdfContext = $state<PDFContextState>({\n registry: null,\n coreState: null,\n isInitializing: true,\n pluginsReady: false,\n activeDocumentId: null,\n activeDocument: null,\n documents: {},\n documentStates: [],\n});\n\n/**\n * Hook to access the PDF registry context.\n * @returns The PDF registry or null during initialization\n */\n\nexport const useRegistry = () => pdfContext;\n","import type { BasePlugin } from '@embedpdf/core';\nimport { pdfContext } from './use-registry.svelte.js';\n\n/**\n * Hook to access a plugin.\n * @param pluginId The ID of the plugin to access\n * @returns The plugin or null during initialization\n * @example\n * // Get zoom plugin\n * const zoom = usePlugin<ZoomPlugin>(ZoomPlugin.id);\n */\nexport function usePlugin<T extends BasePlugin>(pluginId: T['id']) {\n const { registry } = pdfContext;\n\n const state = $state({\n plugin: null as T | null,\n isLoading: true,\n ready: new Promise<void>(() => {}),\n });\n\n if (registry === null) {\n return state;\n }\n\n const plugin = registry.getPlugin<T>(pluginId);\n\n if (!plugin) {\n throw new Error(`Plugin ${pluginId} not found`);\n }\n\n state.plugin = plugin;\n state.isLoading = false;\n state.ready = plugin.ready();\n\n return state;\n}\n","import type { BasePlugin } from '@embedpdf/core';\nimport { usePlugin } from './use-plugin.svelte.js';\n\n/**\n * Hook to access a plugin's capability.\n * @param pluginId The ID of the plugin to access\n * @returns The capability provided by the plugin or null during initialization\n * @example\n * // Get zoom capability\n * const zoom = useCapability<ZoomPlugin>(ZoomPlugin.id);\n */\nexport function useCapability<T extends BasePlugin>(pluginId: T['id']) {\n const p = usePlugin<T>(pluginId);\n\n const state = $state({\n provides: null as ReturnType<NonNullable<T['provides']>> | null,\n isLoading: true,\n ready: new Promise<void>(() => {}),\n });\n\n // Use $effect to reactively update when plugin loads\n $effect(() => {\n if (!p.plugin) {\n state.provides = null;\n state.isLoading = p.isLoading;\n state.ready = p.ready;\n return;\n }\n\n if (!p.plugin.provides) {\n throw new Error(`Plugin ${pluginId} does not provide a capability`);\n }\n\n state.provides = p.plugin.provides() as ReturnType<NonNullable<T['provides']>>;\n state.isLoading = p.isLoading;\n state.ready = p.ready;\n });\n\n return state;\n}\n","import { useRegistry } from './use-registry.svelte';\n\n/**\n * Hook that provides access to the current core state.\n *\n * Note: This reads from the context which is already subscribed to core state changes\n * in the EmbedPDF component, so there's no additional subscription overhead.\n */\nexport function useCoreState() {\n const context = useRegistry();\n\n return {\n get current() {\n return context.coreState;\n },\n };\n}\n","import { useCoreState } from './use-core-state.svelte';\n\n/**\n * Hook that provides reactive access to a specific document's state from the core store.\n *\n * @param getDocumentId Function that returns the document ID\n * @returns The reactive DocumentState object or null if not found.\n */\nexport function useDocumentState(getDocumentId: () => string | null) {\n const coreStateRef = useCoreState();\n\n // Reactive documentId\n const documentId = $derived(getDocumentId());\n\n const documentState = $derived(\n coreStateRef.current && documentId\n ? (coreStateRef.current.documents[documentId] ?? null)\n : null,\n );\n\n return {\n get current() {\n return documentState;\n },\n };\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\n\n/**\n * Human-readable permission names for use in configuration.\n */\nexport type PermissionName =\n | 'print'\n | 'modifyContents'\n | 'copyContents'\n | 'modifyAnnotations'\n | 'fillForms'\n | 'extractForAccessibility'\n | 'assembleDocument'\n | 'printHighQuality';\n\n/**\n * Map from human-readable names to PdfPermissionFlag values.\n */\nexport const PERMISSION_NAME_TO_FLAG: Record<PermissionName, PdfPermissionFlag> = {\n print: PdfPermissionFlag.Print,\n modifyContents: PdfPermissionFlag.ModifyContents,\n copyContents: PdfPermissionFlag.CopyContents,\n modifyAnnotations: PdfPermissionFlag.ModifyAnnotations,\n fillForms: PdfPermissionFlag.FillForms,\n extractForAccessibility: PdfPermissionFlag.ExtractForAccessibility,\n assembleDocument: PdfPermissionFlag.AssembleDocument,\n printHighQuality: PdfPermissionFlag.PrintHighQuality,\n};\n\n/**\n * Permission overrides can use either numeric flags or human-readable string names.\n */\nexport type PermissionOverrides = Partial<\n Record<PdfPermissionFlag, boolean> & Record<PermissionName, boolean>\n>;\n\n/**\n * Configuration for overriding document permissions.\n * Can be applied globally (at PluginRegistry level) or per-document (when opening).\n */\nexport interface PermissionConfig {\n /**\n * When true (default): use PDF's permissions as the base, then apply overrides.\n * When false: treat document as having all permissions allowed, then apply overrides.\n */\n enforceDocumentPermissions?: boolean;\n\n /**\n * Explicit per-flag overrides. Supports both numeric flags and string names.\n * - true = force allow (even if PDF denies)\n * - false = force deny (even if PDF allows)\n * - undefined = use base permissions\n *\n * @example\n * // Using string names (recommended)\n * overrides: { print: false, modifyAnnotations: true }\n *\n * @example\n * // Using numeric flags\n * overrides: { [PdfPermissionFlag.Print]: false }\n */\n overrides?: PermissionOverrides;\n}\n\n/**\n * All permission flags for iteration when computing effective permissions.\n */\nexport const ALL_PERMISSION_FLAGS: PdfPermissionFlag[] = [\n PdfPermissionFlag.Print,\n PdfPermissionFlag.ModifyContents,\n PdfPermissionFlag.CopyContents,\n PdfPermissionFlag.ModifyAnnotations,\n PdfPermissionFlag.FillForms,\n PdfPermissionFlag.ExtractForAccessibility,\n PdfPermissionFlag.AssembleDocument,\n PdfPermissionFlag.PrintHighQuality,\n];\n\n/**\n * All permission names for iteration.\n */\nexport const ALL_PERMISSION_NAMES: PermissionName[] = [\n 'print',\n 'modifyContents',\n 'copyContents',\n 'modifyAnnotations',\n 'fillForms',\n 'extractForAccessibility',\n 'assembleDocument',\n 'printHighQuality',\n];\n\n/**\n * Map from PdfPermissionFlag to human-readable name.\n */\nexport const PERMISSION_FLAG_TO_NAME: Record<PdfPermissionFlag, PermissionName> = {\n [PdfPermissionFlag.Print]: 'print',\n [PdfPermissionFlag.ModifyContents]: 'modifyContents',\n [PdfPermissionFlag.CopyContents]: 'copyContents',\n [PdfPermissionFlag.ModifyAnnotations]: 'modifyAnnotations',\n [PdfPermissionFlag.FillForms]: 'fillForms',\n [PdfPermissionFlag.ExtractForAccessibility]: 'extractForAccessibility',\n [PdfPermissionFlag.AssembleDocument]: 'assembleDocument',\n [PdfPermissionFlag.PrintHighQuality]: 'printHighQuality',\n};\n\n/**\n * Helper to get the override value for a permission flag, checking both numeric and string keys.\n */\nexport function getPermissionOverride(\n overrides: PermissionOverrides | undefined,\n flag: PdfPermissionFlag,\n): boolean | undefined {\n if (!overrides) return undefined;\n\n // Check numeric key first\n if (flag in overrides) {\n return (overrides as Record<PdfPermissionFlag, boolean>)[flag];\n }\n\n // Check string key\n const name = PERMISSION_FLAG_TO_NAME[flag];\n if (name && name in overrides) {\n return (overrides as Record<PermissionName, boolean>)[name];\n }\n\n return undefined;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { CoreState, DocumentState } from './initial-state';\nimport { ALL_PERMISSION_FLAGS, getPermissionOverride } from '../types/permissions';\n\n/**\n * Get the active document state\n */\nexport const getActiveDocumentState = (state: CoreState): DocumentState | null => {\n if (!state.activeDocumentId) return null;\n return state.documents[state.activeDocumentId] ?? null;\n};\n\n/**\n * Get document state by ID\n */\nexport const getDocumentState = (state: CoreState, documentId: string): DocumentState | null => {\n return state.documents[documentId] ?? null;\n};\n\n/**\n * Get all document IDs\n */\nexport const getDocumentIds = (state: CoreState): string[] => {\n return Object.keys(state.documents);\n};\n\n/**\n * Check if a document is loaded\n */\nexport const isDocumentLoaded = (state: CoreState, documentId: string): boolean => {\n return !!state.documents[documentId];\n};\n\n/**\n * Get the number of open documents\n */\nexport const getDocumentCount = (state: CoreState): number => {\n return Object.keys(state.documents).length;\n};\n\n// ─────────────────────────────────────────────────────────\n// Permission Selectors\n// ─────────────────────────────────────────────────────────\n\n/**\n * Check if a specific permission flag is effectively allowed for a document.\n * Applies layered resolution: per-document override → global override → enforceDocumentPermissions → PDF permission.\n *\n * @param state - The core state\n * @param documentId - The document ID to check permissions for\n * @param flag - The permission flag to check\n * @returns true if the permission is allowed, false otherwise\n */\nexport function getEffectivePermission(\n state: CoreState,\n documentId: string,\n flag: PdfPermissionFlag,\n): boolean {\n const docState = state.documents[documentId];\n const docConfig = docState?.permissions;\n const globalConfig = state.globalPermissions;\n const pdfPermissions = docState?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n // 1. Per-document override wins (supports both numeric and string keys)\n const docOverride = getPermissionOverride(docConfig?.overrides, flag);\n if (docOverride !== undefined) {\n return docOverride;\n }\n\n // 2. Global override (supports both numeric and string keys)\n const globalOverride = getPermissionOverride(globalConfig?.overrides, flag);\n if (globalOverride !== undefined) {\n return globalOverride;\n }\n\n // 3. Check enforce setting (per-doc takes precedence over global)\n const enforce =\n docConfig?.enforceDocumentPermissions ?? globalConfig?.enforceDocumentPermissions ?? true;\n\n if (!enforce) return true; // Not enforcing = allow all\n\n // 4. Use PDF permission\n return (pdfPermissions & flag) !== 0;\n}\n\n/**\n * Get all effective permissions as a bitmask for a document.\n * Combines all individual permission checks into a single bitmask.\n *\n * @param state - The core state\n * @param documentId - The document ID to get permissions for\n * @returns A bitmask of all effective permissions\n */\nexport function getEffectivePermissions(state: CoreState, documentId: string): number {\n return ALL_PERMISSION_FLAGS.reduce((acc, flag) => {\n return getEffectivePermission(state, documentId, flag) ? acc | flag : acc;\n }, 0);\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { useCoreState } from './use-core-state.svelte';\nimport { getEffectivePermission, getEffectivePermissions } from '../../lib/store/selectors';\n\nexport interface DocumentPermissions {\n /** Effective permission flags after applying overrides */\n permissions: number;\n /** Raw PDF permission flags (before overrides) */\n pdfPermissions: number;\n /** Check if a specific permission flag is effectively allowed */\n hasPermission: (flag: PdfPermissionFlag) => boolean;\n /** Check if all specified flags are effectively allowed */\n hasAllPermissions: (...flags: PdfPermissionFlag[]) => boolean;\n\n // Shorthand booleans for all permission flags (using effective permissions):\n /** Can print (possibly degraded quality) */\n canPrint: boolean;\n /** Can modify document contents */\n canModifyContents: boolean;\n /** Can copy/extract text and graphics */\n canCopyContents: boolean;\n /** Can add/modify annotations and fill forms */\n canModifyAnnotations: boolean;\n /** Can fill in existing form fields */\n canFillForms: boolean;\n /** Can extract for accessibility */\n canExtractForAccessibility: boolean;\n /** Can assemble document (insert, rotate, delete pages) */\n canAssembleDocument: boolean;\n /** Can print high quality */\n canPrintHighQuality: boolean;\n}\n\n/**\n * Hook that provides reactive access to a document's effective permission flags.\n * Applies layered resolution: per-document override → global override → PDF permission.\n *\n * @param getDocumentId Function that returns the document ID\n * @returns An object with reactive permission properties.\n */\nexport function useDocumentPermissions(getDocumentId: () => string): DocumentPermissions {\n const coreStateRef = useCoreState();\n\n const documentId = $derived(getDocumentId());\n const coreState = $derived(coreStateRef.current);\n\n const effectivePermissions = $derived(\n coreState ? getEffectivePermissions(coreState, documentId) : PdfPermissionFlag.AllowAll,\n );\n\n const pdfPermissions = $derived(\n coreState?.documents[documentId]?.document?.permissions ?? PdfPermissionFlag.AllowAll,\n );\n\n const hasPermission = (flag: PdfPermissionFlag) =>\n coreState ? getEffectivePermission(coreState, documentId, flag) : true;\n\n const hasAllPermissions = (...flags: PdfPermissionFlag[]) =>\n flags.every((flag) => (coreState ? getEffectivePermission(coreState, documentId, flag) : true));\n\n return {\n get permissions() {\n return effectivePermissions;\n },\n get pdfPermissions() {\n return pdfPermissions;\n },\n hasPermission,\n hasAllPermissions,\n get canPrint() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.Print)\n : true;\n },\n get canModifyContents() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ModifyContents)\n : true;\n },\n get canCopyContents() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.CopyContents)\n : true;\n },\n get canModifyAnnotations() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ModifyAnnotations)\n : true;\n },\n get canFillForms() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.FillForms)\n : true;\n },\n get canExtractForAccessibility() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.ExtractForAccessibility)\n : true;\n },\n get canAssembleDocument() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.AssembleDocument)\n : true;\n },\n get canPrintHighQuality() {\n return coreState\n ? getEffectivePermission(coreState, documentId, PdfPermissionFlag.PrintHighQuality)\n : true;\n },\n };\n}\n","<script lang=\"ts\">\n import { type Component, type Snippet } from 'svelte';\n import NestedWrapper from './NestedWrapper.svelte';\n\n interface Props {\n wrappers: Component[];\n utilities?: Component[];\n children?: Snippet;\n }\n\n let { wrappers, utilities = [], children }: Props = $props();\n</script>\n\n{#if wrappers.length > 1}\n {@const Wrapper = wrappers[0]}\n <Wrapper>\n <NestedWrapper wrappers={wrappers.slice(1)} {utilities}>\n {@render children?.()}\n </NestedWrapper>\n </Wrapper>\n{:else}\n {@const Wrapper = wrappers[0]}\n <Wrapper>\n {@render children?.()}\n <!-- Render utilities inside the innermost wrapper -->\n {#each utilities as Utility, i (`utility-${i}`)}\n <Utility />\n {/each}\n </Wrapper>\n{/if}\n","<script lang=\"ts\">\n import { hasAutoMountElements, type PluginBatchRegistration, type IPlugin } from '@embedpdf/core';\n import NestedWrapper from './NestedWrapper.svelte';\n import type { Snippet } from 'svelte';\n\n type Props = {\n plugins: PluginBatchRegistration<IPlugin<any>, any>[];\n children: Snippet;\n };\n\n let { plugins, children }: Props = $props();\n let utilities: any[] = $state([]);\n let wrappers: any[] = $state([]);\n\n // recompute when plugins change\n $effect(() => {\n const nextUtilities: any[] = [];\n const nextWrappers: any[] = [];\n\n for (const reg of plugins) {\n const pkg = reg.package;\n if (hasAutoMountElements(pkg)) {\n const elements = pkg.autoMountElements?.() ?? [];\n for (const element of elements) {\n if (element.type === 'utility') {\n nextUtilities.push(element.component);\n } else if (element.type === 'wrapper') {\n nextWrappers.push(element.component);\n }\n }\n }\n }\n\n utilities = nextUtilities;\n wrappers = nextWrappers;\n });\n</script>\n\n{#if wrappers.length > 0}\n <!-- wrap slot content and utilities inside all wrappers -->\n <NestedWrapper {wrappers} {utilities} {children} />\n{:else}\n <!-- No wrappers - render children and utilities directly -->\n {@render children?.()}\n {#each utilities as Utility, i (`utility-${i}`)}\n <Utility />\n {/each}\n{/if}\n","<script lang=\"ts\">\n import type { Logger, PdfEngine } from '@embedpdf/models';\n import {\n type IPlugin,\n type PluginBatchRegistrations,\n type PluginRegistryConfig,\n PluginRegistry,\n } from '@embedpdf/core';\n import { type Snippet } from 'svelte';\n import AutoMount from './AutoMount.svelte';\n import { pdfContext, type PDFContextState } from '../hooks';\n\n export type { PluginBatchRegistrations };\n\n interface EmbedPDFProps {\n /**\n * The PDF engine to use for the PDF viewer.\n */\n engine: PdfEngine;\n /**\n * Registry configuration including logger, permissions, and defaults.\n */\n config?: PluginRegistryConfig;\n /**\n * @deprecated Use config.logger instead. Will be removed in next major version.\n */\n logger?: Logger;\n /**\n * The callback to call when the PDF viewer is initialized.\n */\n onInitialized?: (registry: PluginRegistry) => Promise<void>;\n /**\n * The plugins to use for the PDF viewer.\n */\n plugins: PluginBatchRegistrations;\n /**\n * The children to render for the PDF viewer.\n */\n children: Snippet<[PDFContextState]>;\n /**\n * Whether to auto-mount specific non-visual DOM elements from plugins.\n * @default true\n */\n autoMountDomElements?: boolean;\n }\n\n let {\n engine,\n config,\n logger,\n onInitialized,\n plugins,\n children,\n autoMountDomElements = true,\n }: EmbedPDFProps = $props();\n\n let latestInit = onInitialized;\n\n $effect(() => {\n if (onInitialized) {\n latestInit = onInitialized;\n }\n });\n\n $effect(() => {\n if (engine || (engine && plugins)) {\n // Merge deprecated logger prop into config (config.logger takes precedence)\n const finalConfig: PluginRegistryConfig = {\n ...config,\n logger: config?.logger ?? logger,\n };\n const reg = new PluginRegistry(engine, finalConfig);\n reg.registerPluginBatch(plugins);\n\n const initialize = async () => {\n await reg.initialize();\n\n // if the registry is destroyed, don't do anything\n if (reg.isDestroyed()) {\n return;\n }\n\n const store = reg.getStore();\n pdfContext.coreState = store.getState().core;\n\n const unsubscribe = store.subscribe((action, newState, oldState) => {\n // Only update if it's a core action and the core state changed\n if (store.isCoreAction(action) && newState.core !== oldState.core) {\n pdfContext.coreState = newState.core;\n\n // Update convenience accessors\n const activeDocumentId = newState.core.activeDocumentId ?? null;\n const documents = newState.core.documents ?? {};\n const documentOrder = newState.core.documentOrder ?? [];\n\n pdfContext.activeDocumentId = activeDocumentId;\n pdfContext.activeDocument =\n activeDocumentId && documents[activeDocumentId] ? documents[activeDocumentId] : null;\n pdfContext.documents = documents;\n pdfContext.documentStates = documentOrder\n .map((docId) => documents[docId])\n .filter(\n (doc): doc is import('@embedpdf/core').DocumentState =>\n doc !== null && doc !== undefined,\n );\n }\n });\n\n /* always call the *latest* callback */\n await latestInit?.(reg);\n\n // if the registry is destroyed, don't do anything\n if (reg.isDestroyed()) {\n unsubscribe();\n return;\n }\n\n reg.pluginsReady().then(() => {\n if (!reg.isDestroyed()) {\n pdfContext.pluginsReady = true;\n }\n });\n\n // Provide the registry to children via context\n pdfContext.registry = reg;\n pdfContext.isInitializing = false;\n\n return unsubscribe;\n };\n\n let cleanup: (() => void) | undefined;\n initialize()\n .then((unsub) => {\n cleanup = unsub;\n })\n .catch(console.error);\n\n return () => {\n cleanup?.();\n reg.destroy();\n pdfContext.registry = null;\n pdfContext.coreState = null;\n pdfContext.isInitializing = true;\n pdfContext.pluginsReady = false;\n pdfContext.activeDocumentId = null;\n pdfContext.activeDocument = null;\n pdfContext.documents = {};\n pdfContext.documentStates = [];\n };\n }\n });\n</script>\n\n{#if pdfContext.pluginsReady && autoMountDomElements}\n <AutoMount {plugins}>{@render children(pdfContext)}</AutoMount>\n{:else}\n {@render children(pdfContext)}\n{/if}\n"],"names":["$$anchor","NestedWrapper"],"mappings":"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"}
@@ -2,11 +2,11 @@ import { PluginBatchRegistration, IPlugin } from '../../lib/index.ts';
2
2
  type __VLS_Props = {
3
3
  plugins: PluginBatchRegistration<IPlugin<any>, any>[];
4
4
  };
5
- declare var __VLS_7: {}, __VLS_9: {};
5
+ declare var __VLS_8: {}, __VLS_10: {};
6
6
  type __VLS_Slots = {} & {
7
- default?: (props: typeof __VLS_7) => any;
7
+ default?: (props: typeof __VLS_8) => any;
8
8
  } & {
9
- default?: (props: typeof __VLS_9) => any;
9
+ default?: (props: typeof __VLS_10) => any;
10
10
  };
11
11
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
12
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,5 +1,6 @@
1
1
  type __VLS_Props = {
2
2
  wrappers: any[];
3
+ utilities?: any[];
3
4
  };
4
5
  declare var __VLS_14: {}, __VLS_16: {};
5
6
  type __VLS_Slots = {} & {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),n=require("@embedpdf/models"),t=require("@embedpdf/core"),o=Symbol("pdfKey");function i(){const n=e.inject(o);if(!n)throw new Error("useRegistry must be used inside <EmbedPDF>");return n}function s(){const{coreState:e}=i();return e}n.PdfPermissionFlag.Print,n.PdfPermissionFlag.ModifyContents,n.PdfPermissionFlag.CopyContents,n.PdfPermissionFlag.ModifyAnnotations,n.PdfPermissionFlag.FillForms,n.PdfPermissionFlag.ExtractForAccessibility,n.PdfPermissionFlag.AssembleDocument,n.PdfPermissionFlag.PrintHighQuality;const r=[n.PdfPermissionFlag.Print,n.PdfPermissionFlag.ModifyContents,n.PdfPermissionFlag.CopyContents,n.PdfPermissionFlag.ModifyAnnotations,n.PdfPermissionFlag.FillForms,n.PdfPermissionFlag.ExtractForAccessibility,n.PdfPermissionFlag.AssembleDocument,n.PdfPermissionFlag.PrintHighQuality],l={[n.PdfPermissionFlag.Print]:"print",[n.PdfPermissionFlag.ModifyContents]:"modifyContents",[n.PdfPermissionFlag.CopyContents]:"copyContents",[n.PdfPermissionFlag.ModifyAnnotations]:"modifyAnnotations",[n.PdfPermissionFlag.FillForms]:"fillForms",[n.PdfPermissionFlag.ExtractForAccessibility]:"extractForAccessibility",[n.PdfPermissionFlag.AssembleDocument]:"assembleDocument",[n.PdfPermissionFlag.PrintHighQuality]:"printHighQuality"};function u(e,n){if(!e)return;if(n in e)return e[n];const t=l[n];return t&&t in e?e[t]:void 0}function a(e,t,o){var i;const s=e.documents[t],r=null==s?void 0:s.permissions,l=e.globalPermissions,a=(null==(i=null==s?void 0:s.document)?void 0:i.permissions)??n.PdfPermissionFlag.AllowAll,c=u(null==r?void 0:r.overrides,o);if(void 0!==c)return c;const d=u(null==l?void 0:l.overrides,o);if(void 0!==d)return d;return!((null==r?void 0:r.enforceDocumentPermissions)??(null==l?void 0:l.enforceDocumentPermissions)??!0)||0!==(a&o)}function c(n){const{registry:t}=i(),o=e.shallowRef(null),s=e.ref(!0),r=e.ref(new Promise(()=>{})),l=()=>{var e;if(!t.value)return;const i=t.value.getPlugin(n);if(!i)throw new Error(`Plugin ${n} not found`);o.value=i,s.value=!1,r.value=(null==(e=i.ready)?void 0:e.call(i))??Promise.resolve()};return e.onMounted(l),e.watch(t,l),{plugin:o,isLoading:s,ready:r}}const d=e.defineComponent({__name:"nested-wrapper",props:{wrappers:{}},setup:n=>(t,o)=>{const i=e.resolveComponent("NestedWrapper",!0);return e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.wrappers[0]),null,{default:e.withCtx(()=>[n.wrappers.length>1?(e.openBlock(),e.createBlock(i,{key:0,wrappers:n.wrappers.slice(1)},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default")]),_:3},8,["wrappers"])):e.renderSlot(t.$slots,"default",{key:1})]),_:3})}}),m=e.defineComponent({__name:"auto-mount",props:{plugins:{}},setup(n){const o=n,i=e.computed(()=>{const e=[],n=[];for(const i of o.plugins){const o=i.package;if(t.hasAutoMountElements(o)){const t=o.autoMountElements()||[];for(const o of t)"utility"===o.type?e.push(o.component):"wrapper"===o.type&&n.push(o.component)}}return{utilities:e,wrappers:n}});return(n,t)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[i.value.wrappers.length>0?(e.openBlock(),e.createBlock(d,{key:0,wrappers:i.value.wrappers},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["wrappers"])):e.renderSlot(n.$slots,"default",{key:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value.utilities,(n,t)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n),{key:`utility-${t}`}))),128))],64))}}),p=e.defineComponent({__name:"embed-pdf",props:{engine:{},config:{},logger:{},plugins:{},onInitialized:{},autoMountDomElements:{type:Boolean,default:!0}},setup(n){const i=n,s=e.shallowRef(null),r=e.ref(null),l=e.ref(!0),u=e.ref(!1),a=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.activeDocumentId)??null}),c=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.documents)??{}}),d=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.documentOrder)??[]}),p=e.computed(()=>{const e=a.value,n=c.value;return e&&n[e]?n[e]:null}),f=e.computed(()=>{const e=c.value;return d.value.map(n=>e[n]).filter(e=>null!=e)});return e.provide(o,{registry:s,coreState:r,isInitializing:l,pluginsReady:u,activeDocumentId:a,activeDocument:p,documents:c,documentStates:f}),e.onMounted(async()=>{var n,o;const a={...i.config,logger:(null==(n=i.config)?void 0:n.logger)??i.logger},c=new t.PluginRegistry(i.engine,a);if(c.registerPluginBatch(i.plugins),await c.initialize(),c.isDestroyed())return;const d=c.getStore();r.value=d.getState().core;const m=d.subscribe((e,n,t)=>{d.isCoreAction(e)&&n.core!==t.core&&(r.value=n.core)});await(null==(o=i.onInitialized)?void 0:o.call(i,c)),c.isDestroyed()?m():(s.value=c,l.value=!1,c.pluginsReady().then(()=>{c.isDestroyed()||(u.value=!0)}),e.onBeforeUnmount(()=>{var e;m(),null==(e=s.value)||e.destroy()}))}),(t,o)=>u.value&&n.autoMountDomElements?(e.openBlock(),e.createBlock(m,{key:0,plugins:n.plugins},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default",{registry:s.value,coreState:r.value,isInitializing:l.value,pluginsReady:u.value,activeDocumentId:a.value,activeDocument:p.value,documents:c.value,documentStates:f.value})]),_:3},8,["plugins"])):e.renderSlot(t.$slots,"default",{key:1,registry:s.value,coreState:r.value,isInitializing:l.value,pluginsReady:u.value,activeDocumentId:a.value,activeDocument:p.value,documents:c.value,documentStates:f.value})}});exports.EmbedPDF=p,exports.useCapability=function(n){const{plugin:t,isLoading:o,ready:i}=c(n);return{provides:e.computed(()=>{if(!t.value)return null;if(!t.value.provides)throw new Error(`Plugin ${n} does not implement provides()`);return t.value.provides()}),isLoading:o,ready:i}},exports.useCoreState=s,exports.useDocumentPermissions=function(t){const o=s();return e.computed(()=>{var i,s;const l=e.toValue(t),u=o.value;if(!u)return{permissions:n.PdfPermissionFlag.AllowAll,pdfPermissions:n.PdfPermissionFlag.AllowAll,hasPermission:()=>!0,hasAllPermissions:()=>!0,canPrint:!0,canModifyContents:!0,canCopyContents:!0,canModifyAnnotations:!0,canFillForms:!0,canExtractForAccessibility:!0,canAssembleDocument:!0,canPrintHighQuality:!0};const c=function(e,n){return r.reduce((t,o)=>a(e,n,o)?t|o:t,0)}(u,l),d=e=>a(u,l,e);return{permissions:c,pdfPermissions:(null==(s=null==(i=u.documents[l])?void 0:i.document)?void 0:s.permissions)??n.PdfPermissionFlag.AllowAll,hasPermission:d,hasAllPermissions:(...e)=>e.every(e=>a(u,l,e)),canPrint:d(n.PdfPermissionFlag.Print),canModifyContents:d(n.PdfPermissionFlag.ModifyContents),canCopyContents:d(n.PdfPermissionFlag.CopyContents),canModifyAnnotations:d(n.PdfPermissionFlag.ModifyAnnotations),canFillForms:d(n.PdfPermissionFlag.FillForms),canExtractForAccessibility:d(n.PdfPermissionFlag.ExtractForAccessibility),canAssembleDocument:d(n.PdfPermissionFlag.AssembleDocument),canPrintHighQuality:d(n.PdfPermissionFlag.PrintHighQuality)}})},exports.useDocumentState=function(n){const t=s();return e.computed(()=>{const o=t.value,i=e.toValue(n);return o&&i?o.documents[i]??null:null})},exports.usePlugin=c,exports.useRegistry=i,exports.useStoreState=function(){const{registry:n}=i(),t=e.ref();function o(){return n.value?(t.value=n.value.getStore().getState(),n.value.getStore().subscribe((e,n)=>t.value=n)):()=>{}}let s=o();return e.watch(n,()=>{null==s||s(),s=o()}),e.onBeforeUnmount(()=>null==s?void 0:s()),t};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),n=require("@embedpdf/models"),t=require("@embedpdf/core"),o=Symbol("pdfKey");function i(){const n=e.inject(o);if(!n)throw new Error("useRegistry must be used inside <EmbedPDF>");return n}function s(){const{coreState:e}=i();return e}n.PdfPermissionFlag.Print,n.PdfPermissionFlag.ModifyContents,n.PdfPermissionFlag.CopyContents,n.PdfPermissionFlag.ModifyAnnotations,n.PdfPermissionFlag.FillForms,n.PdfPermissionFlag.ExtractForAccessibility,n.PdfPermissionFlag.AssembleDocument,n.PdfPermissionFlag.PrintHighQuality;const r=[n.PdfPermissionFlag.Print,n.PdfPermissionFlag.ModifyContents,n.PdfPermissionFlag.CopyContents,n.PdfPermissionFlag.ModifyAnnotations,n.PdfPermissionFlag.FillForms,n.PdfPermissionFlag.ExtractForAccessibility,n.PdfPermissionFlag.AssembleDocument,n.PdfPermissionFlag.PrintHighQuality],l={[n.PdfPermissionFlag.Print]:"print",[n.PdfPermissionFlag.ModifyContents]:"modifyContents",[n.PdfPermissionFlag.CopyContents]:"copyContents",[n.PdfPermissionFlag.ModifyAnnotations]:"modifyAnnotations",[n.PdfPermissionFlag.FillForms]:"fillForms",[n.PdfPermissionFlag.ExtractForAccessibility]:"extractForAccessibility",[n.PdfPermissionFlag.AssembleDocument]:"assembleDocument",[n.PdfPermissionFlag.PrintHighQuality]:"printHighQuality"};function u(e,n){if(!e)return;if(n in e)return e[n];const t=l[n];return t&&t in e?e[t]:void 0}function a(e,t,o){var i;const s=e.documents[t],r=null==s?void 0:s.permissions,l=e.globalPermissions,a=(null==(i=null==s?void 0:s.document)?void 0:i.permissions)??n.PdfPermissionFlag.AllowAll,c=u(null==r?void 0:r.overrides,o);if(void 0!==c)return c;const d=u(null==l?void 0:l.overrides,o);if(void 0!==d)return d;return!((null==r?void 0:r.enforceDocumentPermissions)??(null==l?void 0:l.enforceDocumentPermissions)??!0)||0!==(a&o)}function c(n){const{registry:t}=i(),o=e.shallowRef(null),s=e.ref(!0),r=e.ref(new Promise(()=>{})),l=()=>{var e;if(!t.value)return;const i=t.value.getPlugin(n);if(!i)throw new Error(`Plugin ${n} not found`);o.value=i,s.value=!1,r.value=(null==(e=i.ready)?void 0:e.call(i))??Promise.resolve()};return e.onMounted(l),e.watch(t,l),{plugin:o,isLoading:s,ready:r}}const d=e.defineComponent({__name:"nested-wrapper",props:{wrappers:{},utilities:{}},setup:n=>(t,o)=>{const i=e.resolveComponent("NestedWrapper",!0);return e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.wrappers[0]),null,{default:e.withCtx(()=>[n.wrappers.length>1?(e.openBlock(),e.createBlock(i,{key:0,wrappers:n.wrappers.slice(1),utilities:n.utilities},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default")]),_:3},8,["wrappers","utilities"])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.renderSlot(t.$slots,"default"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.utilities,(n,t)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n),{key:`utility-${t}`}))),128))],64))]),_:3})}}),m=e.defineComponent({__name:"auto-mount",props:{plugins:{}},setup(n){const o=n,i=e.computed(()=>{const e=[],n=[];for(const i of o.plugins){const o=i.package;if(t.hasAutoMountElements(o)){const t=o.autoMountElements()||[];for(const o of t)"utility"===o.type?e.push(o.component):"wrapper"===o.type&&n.push(o.component)}}return{utilities:e,wrappers:n}});return(n,t)=>i.value.wrappers.length>0?(e.openBlock(),e.createBlock(d,{key:0,wrappers:i.value.wrappers,utilities:i.value.utilities},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["wrappers","utilities"])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.renderSlot(n.$slots,"default"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value.utilities,(n,t)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n),{key:`utility-${t}`}))),128))],64))}}),p=e.defineComponent({__name:"embed-pdf",props:{engine:{},config:{},logger:{},plugins:{},onInitialized:{},autoMountDomElements:{type:Boolean,default:!0}},setup(n){const i=n,s=e.shallowRef(null),r=e.ref(null),l=e.ref(!0),u=e.ref(!1),a=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.activeDocumentId)??null}),c=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.documents)??{}}),d=e.computed(()=>{var e;return(null==(e=r.value)?void 0:e.documentOrder)??[]}),p=e.computed(()=>{const e=a.value,n=c.value;return e&&n[e]?n[e]:null}),f=e.computed(()=>{const e=c.value;return d.value.map(n=>e[n]).filter(e=>null!=e)});return e.provide(o,{registry:s,coreState:r,isInitializing:l,pluginsReady:u,activeDocumentId:a,activeDocument:p,documents:c,documentStates:f}),e.onMounted(async()=>{var n,o;const a={...i.config,logger:(null==(n=i.config)?void 0:n.logger)??i.logger},c=new t.PluginRegistry(i.engine,a);if(c.registerPluginBatch(i.plugins),await c.initialize(),c.isDestroyed())return;const d=c.getStore();r.value=d.getState().core;const m=d.subscribe((e,n,t)=>{d.isCoreAction(e)&&n.core!==t.core&&(r.value=n.core)});await(null==(o=i.onInitialized)?void 0:o.call(i,c)),c.isDestroyed()?m():(s.value=c,l.value=!1,c.pluginsReady().then(()=>{c.isDestroyed()||(u.value=!0)}),e.onBeforeUnmount(()=>{var e;m(),null==(e=s.value)||e.destroy()}))}),(t,o)=>u.value&&n.autoMountDomElements?(e.openBlock(),e.createBlock(m,{key:0,plugins:n.plugins},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default",{registry:s.value,coreState:r.value,isInitializing:l.value,pluginsReady:u.value,activeDocumentId:a.value,activeDocument:p.value,documents:c.value,documentStates:f.value})]),_:3},8,["plugins"])):e.renderSlot(t.$slots,"default",{key:1,registry:s.value,coreState:r.value,isInitializing:l.value,pluginsReady:u.value,activeDocumentId:a.value,activeDocument:p.value,documents:c.value,documentStates:f.value})}});exports.EmbedPDF=p,exports.useCapability=function(n){const{plugin:t,isLoading:o,ready:i}=c(n);return{provides:e.computed(()=>{if(!t.value)return null;if(!t.value.provides)throw new Error(`Plugin ${n} does not implement provides()`);return t.value.provides()}),isLoading:o,ready:i}},exports.useCoreState=s,exports.useDocumentPermissions=function(t){const o=s();return e.computed(()=>{var i,s;const l=e.toValue(t),u=o.value;if(!u)return{permissions:n.PdfPermissionFlag.AllowAll,pdfPermissions:n.PdfPermissionFlag.AllowAll,hasPermission:()=>!0,hasAllPermissions:()=>!0,canPrint:!0,canModifyContents:!0,canCopyContents:!0,canModifyAnnotations:!0,canFillForms:!0,canExtractForAccessibility:!0,canAssembleDocument:!0,canPrintHighQuality:!0};const c=function(e,n){return r.reduce((t,o)=>a(e,n,o)?t|o:t,0)}(u,l),d=e=>a(u,l,e);return{permissions:c,pdfPermissions:(null==(s=null==(i=u.documents[l])?void 0:i.document)?void 0:s.permissions)??n.PdfPermissionFlag.AllowAll,hasPermission:d,hasAllPermissions:(...e)=>e.every(e=>a(u,l,e)),canPrint:d(n.PdfPermissionFlag.Print),canModifyContents:d(n.PdfPermissionFlag.ModifyContents),canCopyContents:d(n.PdfPermissionFlag.CopyContents),canModifyAnnotations:d(n.PdfPermissionFlag.ModifyAnnotations),canFillForms:d(n.PdfPermissionFlag.FillForms),canExtractForAccessibility:d(n.PdfPermissionFlag.ExtractForAccessibility),canAssembleDocument:d(n.PdfPermissionFlag.AssembleDocument),canPrintHighQuality:d(n.PdfPermissionFlag.PrintHighQuality)}})},exports.useDocumentState=function(n){const t=s();return e.computed(()=>{const o=t.value,i=e.toValue(n);return o&&i?o.documents[i]??null:null})},exports.usePlugin=c,exports.useRegistry=i,exports.useStoreState=function(){const{registry:n}=i(),t=e.ref();function o(){return n.value?(t.value=n.value.getStore().getState(),n.value.getStore().subscribe((e,n)=>t.value=n)):()=>{}}let s=o();return e.watch(n,()=>{null==s||s(),s=o()}),e.onBeforeUnmount(()=>null==s?void 0:s()),t};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/vue/context.ts","../../src/vue/composables/use-registry.ts","../../src/vue/composables/use-core-state.ts","../../src/lib/types/permissions.ts","../../src/lib/store/selectors.ts","../../src/vue/composables/use-plugin.ts","../../src/vue/components/nested-wrapper.vue","../../src/vue/components/auto-mount.vue","../../src/vue/components/embed-pdf.vue","../../src/vue/composables/use-capability.ts","../../src/vue/composables/use-document-permissions.ts","../../src/vue/composables/use-document-state.ts","../../src/vue/composables/use-store-state.ts"],"sourcesContent":["import { InjectionKey, Ref, ShallowRef } from 'vue';\nimport type { PluginRegistry, CoreState, DocumentState } from '@embedpdf/core';\n\nexport interface PDFContextState {\n registry: ShallowRef<PluginRegistry | null>;\n coreState: Ref<CoreState | null>;\n isInitializing: Ref<boolean>;\n pluginsReady: Ref<boolean>;\n\n // Convenience accessors (always safe to use)\n activeDocumentId: Ref<string | null>;\n activeDocument: Ref<DocumentState | null>;\n documents: Ref<Record<string, DocumentState>>;\n documentStates: Ref<DocumentState[]>;\n}\n\nexport const pdfKey: InjectionKey<PDFContextState> = Symbol('pdfKey');\n","import { inject } from 'vue';\nimport { pdfKey } from '../context';\n\nexport function useRegistry() {\n const ctx = inject(pdfKey);\n if (!ctx) throw new Error('useRegistry must be used inside <EmbedPDF>');\n return ctx;\n}\n","import { Ref } from 'vue';\nimport { type CoreState } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\n/**\n * Hook that provides access to the current core state.\n *\n * Note: This reads from the context which is already subscribed to core state changes\n * in the EmbedPDF component, so there's no additional subscription overhead.\n */\nexport function useCoreState(): Ref<CoreState | null> {\n const { coreState } = useRegistry();\n return coreState;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\n\n/**\n * Human-readable permission names for use in configuration.\n */\nexport type PermissionName =\n | 'print'\n | 'modifyContents'\n | 'copyContents'\n | 'modifyAnnotations'\n | 'fillForms'\n | 'extractForAccessibility'\n | 'assembleDocument'\n | 'printHighQuality';\n\n/**\n * Map from human-readable names to PdfPermissionFlag values.\n */\nexport const PERMISSION_NAME_TO_FLAG: Record<PermissionName, PdfPermissionFlag> = {\n print: PdfPermissionFlag.Print,\n modifyContents: PdfPermissionFlag.ModifyContents,\n copyContents: PdfPermissionFlag.CopyContents,\n modifyAnnotations: PdfPermissionFlag.ModifyAnnotations,\n fillForms: PdfPermissionFlag.FillForms,\n extractForAccessibility: PdfPermissionFlag.ExtractForAccessibility,\n assembleDocument: PdfPermissionFlag.AssembleDocument,\n printHighQuality: PdfPermissionFlag.PrintHighQuality,\n};\n\n/**\n * Permission overrides can use either numeric flags or human-readable string names.\n */\nexport type PermissionOverrides = Partial<\n Record<PdfPermissionFlag, boolean> & Record<PermissionName, boolean>\n>;\n\n/**\n * Configuration for overriding document permissions.\n * Can be applied globally (at PluginRegistry level) or per-document (when opening).\n */\nexport interface PermissionConfig {\n /**\n * When true (default): use PDF's permissions as the base, then apply overrides.\n * When false: treat document as having all permissions allowed, then apply overrides.\n */\n enforceDocumentPermissions?: boolean;\n\n /**\n * Explicit per-flag overrides. Supports both numeric flags and string names.\n * - true = force allow (even if PDF denies)\n * - false = force deny (even if PDF allows)\n * - undefined = use base permissions\n *\n * @example\n * // Using string names (recommended)\n * overrides: { print: false, modifyAnnotations: true }\n *\n * @example\n * // Using numeric flags\n * overrides: { [PdfPermissionFlag.Print]: false }\n */\n overrides?: PermissionOverrides;\n}\n\n/**\n * All permission flags for iteration when computing effective permissions.\n */\nexport const ALL_PERMISSION_FLAGS: PdfPermissionFlag[] = [\n PdfPermissionFlag.Print,\n PdfPermissionFlag.ModifyContents,\n PdfPermissionFlag.CopyContents,\n PdfPermissionFlag.ModifyAnnotations,\n PdfPermissionFlag.FillForms,\n PdfPermissionFlag.ExtractForAccessibility,\n PdfPermissionFlag.AssembleDocument,\n PdfPermissionFlag.PrintHighQuality,\n];\n\n/**\n * All permission names for iteration.\n */\nexport const ALL_PERMISSION_NAMES: PermissionName[] = [\n 'print',\n 'modifyContents',\n 'copyContents',\n 'modifyAnnotations',\n 'fillForms',\n 'extractForAccessibility',\n 'assembleDocument',\n 'printHighQuality',\n];\n\n/**\n * Map from PdfPermissionFlag to human-readable name.\n */\nexport const PERMISSION_FLAG_TO_NAME: Record<PdfPermissionFlag, PermissionName> = {\n [PdfPermissionFlag.Print]: 'print',\n [PdfPermissionFlag.ModifyContents]: 'modifyContents',\n [PdfPermissionFlag.CopyContents]: 'copyContents',\n [PdfPermissionFlag.ModifyAnnotations]: 'modifyAnnotations',\n [PdfPermissionFlag.FillForms]: 'fillForms',\n [PdfPermissionFlag.ExtractForAccessibility]: 'extractForAccessibility',\n [PdfPermissionFlag.AssembleDocument]: 'assembleDocument',\n [PdfPermissionFlag.PrintHighQuality]: 'printHighQuality',\n};\n\n/**\n * Helper to get the override value for a permission flag, checking both numeric and string keys.\n */\nexport function getPermissionOverride(\n overrides: PermissionOverrides | undefined,\n flag: PdfPermissionFlag,\n): boolean | undefined {\n if (!overrides) return undefined;\n\n // Check numeric key first\n if (flag in overrides) {\n return (overrides as Record<PdfPermissionFlag, boolean>)[flag];\n }\n\n // Check string key\n const name = PERMISSION_FLAG_TO_NAME[flag];\n if (name && name in overrides) {\n return (overrides as Record<PermissionName, boolean>)[name];\n }\n\n return undefined;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { CoreState, DocumentState } from './initial-state';\nimport { ALL_PERMISSION_FLAGS, getPermissionOverride } from '../types/permissions';\n\n/**\n * Get the active document state\n */\nexport const getActiveDocumentState = (state: CoreState): DocumentState | null => {\n if (!state.activeDocumentId) return null;\n return state.documents[state.activeDocumentId] ?? null;\n};\n\n/**\n * Get document state by ID\n */\nexport const getDocumentState = (state: CoreState, documentId: string): DocumentState | null => {\n return state.documents[documentId] ?? null;\n};\n\n/**\n * Get all document IDs\n */\nexport const getDocumentIds = (state: CoreState): string[] => {\n return Object.keys(state.documents);\n};\n\n/**\n * Check if a document is loaded\n */\nexport const isDocumentLoaded = (state: CoreState, documentId: string): boolean => {\n return !!state.documents[documentId];\n};\n\n/**\n * Get the number of open documents\n */\nexport const getDocumentCount = (state: CoreState): number => {\n return Object.keys(state.documents).length;\n};\n\n// ─────────────────────────────────────────────────────────\n// Permission Selectors\n// ─────────────────────────────────────────────────────────\n\n/**\n * Check if a specific permission flag is effectively allowed for a document.\n * Applies layered resolution: per-document override → global override → enforceDocumentPermissions → PDF permission.\n *\n * @param state - The core state\n * @param documentId - The document ID to check permissions for\n * @param flag - The permission flag to check\n * @returns true if the permission is allowed, false otherwise\n */\nexport function getEffectivePermission(\n state: CoreState,\n documentId: string,\n flag: PdfPermissionFlag,\n): boolean {\n const docState = state.documents[documentId];\n const docConfig = docState?.permissions;\n const globalConfig = state.globalPermissions;\n const pdfPermissions = docState?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n // 1. Per-document override wins (supports both numeric and string keys)\n const docOverride = getPermissionOverride(docConfig?.overrides, flag);\n if (docOverride !== undefined) {\n return docOverride;\n }\n\n // 2. Global override (supports both numeric and string keys)\n const globalOverride = getPermissionOverride(globalConfig?.overrides, flag);\n if (globalOverride !== undefined) {\n return globalOverride;\n }\n\n // 3. Check enforce setting (per-doc takes precedence over global)\n const enforce =\n docConfig?.enforceDocumentPermissions ?? globalConfig?.enforceDocumentPermissions ?? true;\n\n if (!enforce) return true; // Not enforcing = allow all\n\n // 4. Use PDF permission\n return (pdfPermissions & flag) !== 0;\n}\n\n/**\n * Get all effective permissions as a bitmask for a document.\n * Combines all individual permission checks into a single bitmask.\n *\n * @param state - The core state\n * @param documentId - The document ID to get permissions for\n * @returns A bitmask of all effective permissions\n */\nexport function getEffectivePermissions(state: CoreState, documentId: string): number {\n return ALL_PERMISSION_FLAGS.reduce((acc, flag) => {\n return getEffectivePermission(state, documentId, flag) ? acc | flag : acc;\n }, 0);\n}\n","import { shallowRef, ref, onMounted, watch, type ShallowRef, type Ref } from 'vue';\nimport type { BasePlugin } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\nexport interface PluginState<T extends BasePlugin> {\n plugin: ShallowRef<T | null>;\n isLoading: Ref<boolean>;\n ready: Ref<Promise<void>>;\n}\n\nexport function usePlugin<T extends BasePlugin>(pluginId: T['id']): PluginState<T> {\n const { registry } = useRegistry();\n\n const plugin = shallowRef(null) as ShallowRef<T | null>;\n\n const isLoading = ref(true);\n const ready = ref<Promise<void>>(new Promise(() => {}));\n\n const load = () => {\n if (!registry.value) return;\n\n const p = registry.value.getPlugin<T>(pluginId);\n if (!p) throw new Error(`Plugin ${pluginId} not found`);\n\n plugin.value = p;\n isLoading.value = false;\n ready.value = p.ready?.() ?? Promise.resolve();\n };\n\n onMounted(load);\n watch(registry, load);\n\n return { plugin, isLoading, ready };\n}\n","<script setup lang=\"ts\">\ndefineProps<{\n wrappers: any[];\n}>();\n</script>\n\n<template>\n <component :is=\"wrappers[0]\">\n <NestedWrapper v-if=\"wrappers.length > 1\" :wrappers=\"wrappers.slice(1)\">\n <slot />\n </NestedWrapper>\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { hasAutoMountElements, type PluginBatchRegistration, type IPlugin } from '@embedpdf/core';\nimport NestedWrapper from './nested-wrapper.vue';\n\nconst props = defineProps<{\n plugins: PluginBatchRegistration<IPlugin<any>, any>[];\n}>();\n\nconst elements = computed(() => {\n const utilities: any[] = [];\n const wrappers: any[] = [];\n\n for (const reg of props.plugins) {\n const pkg = reg.package;\n if (hasAutoMountElements(pkg)) {\n const elements = pkg.autoMountElements() || [];\n\n for (const element of elements) {\n if (element.type === 'utility') {\n utilities.push(element.component);\n } else if (element.type === 'wrapper') {\n wrappers.push(element.component);\n }\n }\n }\n }\n\n return { utilities, wrappers };\n});\n</script>\n\n<template>\n <NestedWrapper v-if=\"elements.wrappers.length > 0\" :wrappers=\"elements.wrappers\">\n <slot />\n </NestedWrapper>\n <slot v-else />\n\n <component\n v-for=\"(utility, index) in elements.utilities\"\n :key=\"`utility-${index}`\"\n :is=\"utility\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, provide, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue';\nimport {\n PluginRegistry,\n PluginBatchRegistrations,\n PluginRegistryConfig,\n CoreState,\n DocumentState,\n} from '@embedpdf/core';\nimport { Logger, PdfEngine } from '@embedpdf/models';\nimport { pdfKey, PDFContextState } from '../context';\nimport AutoMount from './auto-mount.vue';\n\nexport type { PluginBatchRegistrations };\n\nconst props = withDefaults(\n defineProps<{\n engine: PdfEngine;\n /** Registry configuration including logger, permissions, and defaults. */\n config?: PluginRegistryConfig;\n /** @deprecated Use config.logger instead. Will be removed in next major version. */\n logger?: Logger;\n plugins: PluginBatchRegistrations;\n onInitialized?: (registry: PluginRegistry) => Promise<void>;\n autoMountDomElements?: boolean;\n }>(),\n {\n autoMountDomElements: true,\n },\n);\n\n/* reactive state */\nconst registry = shallowRef<PluginRegistry | null>(null);\nconst coreState = ref<CoreState | null>(null);\nconst isInit = ref(true);\nconst pluginsOk = ref(false);\n\n// Compute convenience accessors\nconst activeDocumentId = computed(() => coreState.value?.activeDocumentId ?? null);\nconst documents = computed(() => coreState.value?.documents ?? {});\nconst documentOrder = computed(() => coreState.value?.documentOrder ?? []);\n\nconst activeDocument = computed(() => {\n const docId = activeDocumentId.value;\n const docs = documents.value;\n return docId && docs[docId] ? docs[docId] : null;\n});\n\nconst documentStates = computed(() => {\n const docs = documents.value;\n const order = documentOrder.value;\n return order\n .map((docId) => docs[docId])\n .filter((doc): doc is DocumentState => doc !== null && doc !== undefined);\n});\n\n/* expose to children */\nprovide<PDFContextState>(pdfKey, {\n registry,\n coreState,\n isInitializing: isInit,\n pluginsReady: pluginsOk,\n activeDocumentId,\n activeDocument,\n documents,\n documentStates,\n});\n\nonMounted(async () => {\n // Merge deprecated logger prop into config (config.logger takes precedence)\n const finalConfig: PluginRegistryConfig = {\n ...props.config,\n logger: props.config?.logger ?? props.logger,\n };\n const reg = new PluginRegistry(props.engine, finalConfig);\n reg.registerPluginBatch(props.plugins);\n await reg.initialize();\n\n if (reg.isDestroyed()) {\n return;\n }\n\n const store = reg.getStore();\n coreState.value = store.getState().core;\n\n const unsubscribe = store.subscribe((action, newState, oldState) => {\n // Only update if it's a core action and the core state changed\n if (store.isCoreAction(action) && newState.core !== oldState.core) {\n coreState.value = newState.core;\n }\n });\n\n await props.onInitialized?.(reg);\n\n if (reg.isDestroyed()) {\n unsubscribe();\n return;\n }\n\n registry.value = reg;\n isInit.value = false;\n\n reg.pluginsReady().then(() => {\n if (!reg.isDestroyed()) {\n pluginsOk.value = true;\n }\n });\n\n onBeforeUnmount(() => {\n unsubscribe();\n registry.value?.destroy();\n });\n});\n</script>\n\n<template>\n <AutoMount v-if=\"pluginsOk && autoMountDomElements\" :plugins=\"plugins\">\n <!-- scoped slot keeps API parity with React version -->\n <slot\n :registry=\"registry\"\n :coreState=\"coreState\"\n :isInitializing=\"isInit\"\n :pluginsReady=\"pluginsOk\"\n :activeDocumentId=\"activeDocumentId\"\n :activeDocument=\"activeDocument\"\n :documents=\"documents\"\n :documentStates=\"documentStates\"\n />\n </AutoMount>\n\n <!-- No auto-mount or not ready yet -->\n <slot\n v-else\n :registry=\"registry\"\n :coreState=\"coreState\"\n :isInitializing=\"isInit\"\n :pluginsReady=\"pluginsOk\"\n :activeDocumentId=\"activeDocumentId\"\n :activeDocument=\"activeDocument\"\n :documents=\"documents\"\n :documentStates=\"documentStates\"\n />\n</template>\n","import type { BasePlugin } from '@embedpdf/core';\nimport { computed, type Ref } from 'vue';\nimport { usePlugin } from './use-plugin';\n\nexport interface CapabilityState<C> {\n provides: Ref<C | null>;\n isLoading: Ref<boolean>;\n ready: Ref<Promise<void>>;\n}\n\n/**\n * Access the public capability exposed by a plugin.\n *\n * @example\n * const { provides: zoom } = useCapability<ZoomPlugin>(ZoomPlugin.id);\n * zoom.value?.zoomIn();\n */\nexport function useCapability<T extends BasePlugin>(\n pluginId: T['id'],\n): CapabilityState<ReturnType<NonNullable<T['provides']>>> {\n const { plugin, isLoading, ready } = usePlugin<T>(pluginId);\n\n const provides = computed(() => {\n if (!plugin.value) return null;\n if (!plugin.value.provides) {\n throw new Error(`Plugin ${pluginId} does not implement provides()`);\n }\n return plugin.value.provides() as ReturnType<NonNullable<T['provides']>>;\n });\n\n return { provides, isLoading, ready };\n}\n","import { computed, toValue, type MaybeRefOrGetter, ComputedRef } from 'vue';\nimport { PdfPermissionFlag } from '@embedpdf/models';\nimport { useCoreState } from './use-core-state';\nimport { getEffectivePermission, getEffectivePermissions } from '../../lib/store/selectors';\n\nexport interface DocumentPermissions {\n /** Effective permission flags after applying overrides */\n permissions: number;\n /** Raw PDF permission flags (before overrides) */\n pdfPermissions: number;\n /** Check if a specific permission flag is effectively allowed */\n hasPermission: (flag: PdfPermissionFlag) => boolean;\n /** Check if all specified flags are effectively allowed */\n hasAllPermissions: (...flags: PdfPermissionFlag[]) => boolean;\n\n // Shorthand booleans for all permission flags (using effective permissions):\n /** Can print (possibly degraded quality) */\n canPrint: boolean;\n /** Can modify document contents */\n canModifyContents: boolean;\n /** Can copy/extract text and graphics */\n canCopyContents: boolean;\n /** Can add/modify annotations and fill forms */\n canModifyAnnotations: boolean;\n /** Can fill in existing form fields */\n canFillForms: boolean;\n /** Can extract for accessibility */\n canExtractForAccessibility: boolean;\n /** Can assemble document (insert, rotate, delete pages) */\n canAssembleDocument: boolean;\n /** Can print high quality */\n canPrintHighQuality: boolean;\n}\n\n/**\n * Composable that provides reactive access to a document's effective permission flags.\n * Applies layered resolution: per-document override → global override → PDF permission.\n *\n * @param documentId The ID of the document to check permissions for (can be ref, computed, getter, or plain value).\n * @returns A computed ref with the permission object.\n */\nexport function useDocumentPermissions(\n documentId: MaybeRefOrGetter<string>,\n): ComputedRef<DocumentPermissions> {\n const coreState = useCoreState();\n\n return computed(() => {\n const docId = toValue(documentId);\n const state = coreState.value;\n\n if (!state) {\n return {\n permissions: PdfPermissionFlag.AllowAll,\n pdfPermissions: PdfPermissionFlag.AllowAll,\n hasPermission: () => true,\n hasAllPermissions: () => true,\n canPrint: true,\n canModifyContents: true,\n canCopyContents: true,\n canModifyAnnotations: true,\n canFillForms: true,\n canExtractForAccessibility: true,\n canAssembleDocument: true,\n canPrintHighQuality: true,\n };\n }\n\n const effectivePermissions = getEffectivePermissions(state, docId);\n const pdfPermissions =\n state.documents[docId]?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n const hasPermission = (flag: PdfPermissionFlag) => getEffectivePermission(state, docId, flag);\n const hasAllPermissions = (...flags: PdfPermissionFlag[]) =>\n flags.every((flag) => getEffectivePermission(state, docId, flag));\n\n return {\n permissions: effectivePermissions,\n pdfPermissions,\n hasPermission,\n hasAllPermissions,\n canPrint: hasPermission(PdfPermissionFlag.Print),\n canModifyContents: hasPermission(PdfPermissionFlag.ModifyContents),\n canCopyContents: hasPermission(PdfPermissionFlag.CopyContents),\n canModifyAnnotations: hasPermission(PdfPermissionFlag.ModifyAnnotations),\n canFillForms: hasPermission(PdfPermissionFlag.FillForms),\n canExtractForAccessibility: hasPermission(PdfPermissionFlag.ExtractForAccessibility),\n canAssembleDocument: hasPermission(PdfPermissionFlag.AssembleDocument),\n canPrintHighQuality: hasPermission(PdfPermissionFlag.PrintHighQuality),\n };\n });\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCoreState } from './use-core-state';\n\n/**\n * Hook that provides reactive access to a specific document's state from the core store.\n *\n * @param documentId The ID of the document to retrieve (can be ref, computed, getter, or plain value).\n * @returns A computed ref containing the DocumentState object or null if not found.\n */\nexport function useDocumentState(documentId: MaybeRefOrGetter<string | null>) {\n const coreState = useCoreState();\n\n const documentState = computed(() => {\n const core = coreState.value;\n const docId = toValue(documentId);\n\n if (!core || !docId) return null;\n return core.documents[docId] ?? null;\n });\n\n return documentState;\n}\n","import { ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport type { CoreState, StoreState } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\n/**\n * Reactive getter for the *entire* global store.\n * Re‑emits whenever any slice changes.\n *\n * @example\n * const state = useStoreState(); // Ref<StoreState<CoreState>>\n * console.log(state.value.core.scale);\n */\nexport function useStoreState<T = CoreState>() {\n const { registry } = useRegistry();\n const state = ref<StoreState<T>>();\n\n function attach() {\n if (!registry.value) return () => {};\n\n // initial snapshot\n state.value = registry.value.getStore().getState() as StoreState<T>;\n\n // live updates\n return registry.value\n .getStore()\n .subscribe((_action, newState) => (state.value = newState as StoreState<T>));\n }\n\n /* attach now and re‑attach if registry instance ever changes */\n let unsubscribe = attach();\n watch(registry, () => {\n unsubscribe?.();\n unsubscribe = attach();\n });\n\n onBeforeUnmount(() => unsubscribe?.());\n\n return state;\n}\n"],"names":["pdfKey","Symbol","useRegistry","ctx","inject","Error","useCoreState","coreState","PdfPermissionFlag","Print","ModifyContents","CopyContents","ModifyAnnotations","FillForms","ExtractForAccessibility","AssembleDocument","PrintHighQuality","ALL_PERMISSION_FLAGS","PERMISSION_FLAG_TO_NAME","getPermissionOverride","overrides","flag","name","getEffectivePermission","state","documentId","docState","documents","docConfig","permissions","globalConfig","globalPermissions","pdfPermissions","_a","document","AllowAll","docOverride","globalOverride","enforceDocumentPermissions","usePlugin","pluginId","registry","plugin","shallowRef","isLoading","ref","ready","Promise","load","value","p","getPlugin","call","resolve","onMounted","watch","_openBlock","_createBlock","_resolveDynamicComponent","__props","wrappers","length","_component_NestedWrapper","slice","_renderSlot","_ctx","$slots","key","props","elements","computed","utilities","reg","plugins","pkg","package","hasAutoMountElements","autoMountElements","element","type","push","component","NestedWrapper","_createElementBlock","_Fragment","utility","index","isInit","pluginsOk","activeDocumentId","documentOrder","activeDocument","docId","docs","documentStates","map","filter","doc","provide","isInitializing","pluginsReady","async","finalConfig","config","logger","PluginRegistry","engine","registerPluginBatch","initialize","isDestroyed","store","getStore","getState","core","unsubscribe","subscribe","action","newState","oldState","isCoreAction","_b","onInitialized","then","onBeforeUnmount","destroy","autoMountDomElements","AutoMount","provides","toValue","hasPermission","hasAllPermissions","canPrint","canModifyContents","canCopyContents","canModifyAnnotations","canFillForms","canExtractForAccessibility","canAssembleDocument","canPrintHighQuality","effectivePermissions","reduce","acc","getEffectivePermissions","flags","every","attach","_action"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/vue/context.ts","../../src/vue/composables/use-registry.ts","../../src/vue/composables/use-core-state.ts","../../src/lib/types/permissions.ts","../../src/lib/store/selectors.ts","../../src/vue/composables/use-plugin.ts","../../src/vue/components/nested-wrapper.vue","../../src/vue/components/auto-mount.vue","../../src/vue/components/embed-pdf.vue","../../src/vue/composables/use-capability.ts","../../src/vue/composables/use-document-permissions.ts","../../src/vue/composables/use-document-state.ts","../../src/vue/composables/use-store-state.ts"],"sourcesContent":["import { InjectionKey, Ref, ShallowRef } from 'vue';\nimport type { PluginRegistry, CoreState, DocumentState } from '@embedpdf/core';\n\nexport interface PDFContextState {\n registry: ShallowRef<PluginRegistry | null>;\n coreState: Ref<CoreState | null>;\n isInitializing: Ref<boolean>;\n pluginsReady: Ref<boolean>;\n\n // Convenience accessors (always safe to use)\n activeDocumentId: Ref<string | null>;\n activeDocument: Ref<DocumentState | null>;\n documents: Ref<Record<string, DocumentState>>;\n documentStates: Ref<DocumentState[]>;\n}\n\nexport const pdfKey: InjectionKey<PDFContextState> = Symbol('pdfKey');\n","import { inject } from 'vue';\nimport { pdfKey } from '../context';\n\nexport function useRegistry() {\n const ctx = inject(pdfKey);\n if (!ctx) throw new Error('useRegistry must be used inside <EmbedPDF>');\n return ctx;\n}\n","import { Ref } from 'vue';\nimport { type CoreState } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\n/**\n * Hook that provides access to the current core state.\n *\n * Note: This reads from the context which is already subscribed to core state changes\n * in the EmbedPDF component, so there's no additional subscription overhead.\n */\nexport function useCoreState(): Ref<CoreState | null> {\n const { coreState } = useRegistry();\n return coreState;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\n\n/**\n * Human-readable permission names for use in configuration.\n */\nexport type PermissionName =\n | 'print'\n | 'modifyContents'\n | 'copyContents'\n | 'modifyAnnotations'\n | 'fillForms'\n | 'extractForAccessibility'\n | 'assembleDocument'\n | 'printHighQuality';\n\n/**\n * Map from human-readable names to PdfPermissionFlag values.\n */\nexport const PERMISSION_NAME_TO_FLAG: Record<PermissionName, PdfPermissionFlag> = {\n print: PdfPermissionFlag.Print,\n modifyContents: PdfPermissionFlag.ModifyContents,\n copyContents: PdfPermissionFlag.CopyContents,\n modifyAnnotations: PdfPermissionFlag.ModifyAnnotations,\n fillForms: PdfPermissionFlag.FillForms,\n extractForAccessibility: PdfPermissionFlag.ExtractForAccessibility,\n assembleDocument: PdfPermissionFlag.AssembleDocument,\n printHighQuality: PdfPermissionFlag.PrintHighQuality,\n};\n\n/**\n * Permission overrides can use either numeric flags or human-readable string names.\n */\nexport type PermissionOverrides = Partial<\n Record<PdfPermissionFlag, boolean> & Record<PermissionName, boolean>\n>;\n\n/**\n * Configuration for overriding document permissions.\n * Can be applied globally (at PluginRegistry level) or per-document (when opening).\n */\nexport interface PermissionConfig {\n /**\n * When true (default): use PDF's permissions as the base, then apply overrides.\n * When false: treat document as having all permissions allowed, then apply overrides.\n */\n enforceDocumentPermissions?: boolean;\n\n /**\n * Explicit per-flag overrides. Supports both numeric flags and string names.\n * - true = force allow (even if PDF denies)\n * - false = force deny (even if PDF allows)\n * - undefined = use base permissions\n *\n * @example\n * // Using string names (recommended)\n * overrides: { print: false, modifyAnnotations: true }\n *\n * @example\n * // Using numeric flags\n * overrides: { [PdfPermissionFlag.Print]: false }\n */\n overrides?: PermissionOverrides;\n}\n\n/**\n * All permission flags for iteration when computing effective permissions.\n */\nexport const ALL_PERMISSION_FLAGS: PdfPermissionFlag[] = [\n PdfPermissionFlag.Print,\n PdfPermissionFlag.ModifyContents,\n PdfPermissionFlag.CopyContents,\n PdfPermissionFlag.ModifyAnnotations,\n PdfPermissionFlag.FillForms,\n PdfPermissionFlag.ExtractForAccessibility,\n PdfPermissionFlag.AssembleDocument,\n PdfPermissionFlag.PrintHighQuality,\n];\n\n/**\n * All permission names for iteration.\n */\nexport const ALL_PERMISSION_NAMES: PermissionName[] = [\n 'print',\n 'modifyContents',\n 'copyContents',\n 'modifyAnnotations',\n 'fillForms',\n 'extractForAccessibility',\n 'assembleDocument',\n 'printHighQuality',\n];\n\n/**\n * Map from PdfPermissionFlag to human-readable name.\n */\nexport const PERMISSION_FLAG_TO_NAME: Record<PdfPermissionFlag, PermissionName> = {\n [PdfPermissionFlag.Print]: 'print',\n [PdfPermissionFlag.ModifyContents]: 'modifyContents',\n [PdfPermissionFlag.CopyContents]: 'copyContents',\n [PdfPermissionFlag.ModifyAnnotations]: 'modifyAnnotations',\n [PdfPermissionFlag.FillForms]: 'fillForms',\n [PdfPermissionFlag.ExtractForAccessibility]: 'extractForAccessibility',\n [PdfPermissionFlag.AssembleDocument]: 'assembleDocument',\n [PdfPermissionFlag.PrintHighQuality]: 'printHighQuality',\n};\n\n/**\n * Helper to get the override value for a permission flag, checking both numeric and string keys.\n */\nexport function getPermissionOverride(\n overrides: PermissionOverrides | undefined,\n flag: PdfPermissionFlag,\n): boolean | undefined {\n if (!overrides) return undefined;\n\n // Check numeric key first\n if (flag in overrides) {\n return (overrides as Record<PdfPermissionFlag, boolean>)[flag];\n }\n\n // Check string key\n const name = PERMISSION_FLAG_TO_NAME[flag];\n if (name && name in overrides) {\n return (overrides as Record<PermissionName, boolean>)[name];\n }\n\n return undefined;\n}\n","import { PdfPermissionFlag } from '@embedpdf/models';\nimport { CoreState, DocumentState } from './initial-state';\nimport { ALL_PERMISSION_FLAGS, getPermissionOverride } from '../types/permissions';\n\n/**\n * Get the active document state\n */\nexport const getActiveDocumentState = (state: CoreState): DocumentState | null => {\n if (!state.activeDocumentId) return null;\n return state.documents[state.activeDocumentId] ?? null;\n};\n\n/**\n * Get document state by ID\n */\nexport const getDocumentState = (state: CoreState, documentId: string): DocumentState | null => {\n return state.documents[documentId] ?? null;\n};\n\n/**\n * Get all document IDs\n */\nexport const getDocumentIds = (state: CoreState): string[] => {\n return Object.keys(state.documents);\n};\n\n/**\n * Check if a document is loaded\n */\nexport const isDocumentLoaded = (state: CoreState, documentId: string): boolean => {\n return !!state.documents[documentId];\n};\n\n/**\n * Get the number of open documents\n */\nexport const getDocumentCount = (state: CoreState): number => {\n return Object.keys(state.documents).length;\n};\n\n// ─────────────────────────────────────────────────────────\n// Permission Selectors\n// ─────────────────────────────────────────────────────────\n\n/**\n * Check if a specific permission flag is effectively allowed for a document.\n * Applies layered resolution: per-document override → global override → enforceDocumentPermissions → PDF permission.\n *\n * @param state - The core state\n * @param documentId - The document ID to check permissions for\n * @param flag - The permission flag to check\n * @returns true if the permission is allowed, false otherwise\n */\nexport function getEffectivePermission(\n state: CoreState,\n documentId: string,\n flag: PdfPermissionFlag,\n): boolean {\n const docState = state.documents[documentId];\n const docConfig = docState?.permissions;\n const globalConfig = state.globalPermissions;\n const pdfPermissions = docState?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n // 1. Per-document override wins (supports both numeric and string keys)\n const docOverride = getPermissionOverride(docConfig?.overrides, flag);\n if (docOverride !== undefined) {\n return docOverride;\n }\n\n // 2. Global override (supports both numeric and string keys)\n const globalOverride = getPermissionOverride(globalConfig?.overrides, flag);\n if (globalOverride !== undefined) {\n return globalOverride;\n }\n\n // 3. Check enforce setting (per-doc takes precedence over global)\n const enforce =\n docConfig?.enforceDocumentPermissions ?? globalConfig?.enforceDocumentPermissions ?? true;\n\n if (!enforce) return true; // Not enforcing = allow all\n\n // 4. Use PDF permission\n return (pdfPermissions & flag) !== 0;\n}\n\n/**\n * Get all effective permissions as a bitmask for a document.\n * Combines all individual permission checks into a single bitmask.\n *\n * @param state - The core state\n * @param documentId - The document ID to get permissions for\n * @returns A bitmask of all effective permissions\n */\nexport function getEffectivePermissions(state: CoreState, documentId: string): number {\n return ALL_PERMISSION_FLAGS.reduce((acc, flag) => {\n return getEffectivePermission(state, documentId, flag) ? acc | flag : acc;\n }, 0);\n}\n","import { shallowRef, ref, onMounted, watch, type ShallowRef, type Ref } from 'vue';\nimport type { BasePlugin } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\nexport interface PluginState<T extends BasePlugin> {\n plugin: ShallowRef<T | null>;\n isLoading: Ref<boolean>;\n ready: Ref<Promise<void>>;\n}\n\nexport function usePlugin<T extends BasePlugin>(pluginId: T['id']): PluginState<T> {\n const { registry } = useRegistry();\n\n const plugin = shallowRef(null) as ShallowRef<T | null>;\n\n const isLoading = ref(true);\n const ready = ref<Promise<void>>(new Promise(() => {}));\n\n const load = () => {\n if (!registry.value) return;\n\n const p = registry.value.getPlugin<T>(pluginId);\n if (!p) throw new Error(`Plugin ${pluginId} not found`);\n\n plugin.value = p;\n isLoading.value = false;\n ready.value = p.ready?.() ?? Promise.resolve();\n };\n\n onMounted(load);\n watch(registry, load);\n\n return { plugin, isLoading, ready };\n}\n","<script setup lang=\"ts\">\ndefineProps<{\n wrappers: any[];\n utilities?: any[];\n}>();\n</script>\n\n<template>\n <component :is=\"wrappers[0]\">\n <NestedWrapper v-if=\"wrappers.length > 1\" :wrappers=\"wrappers.slice(1)\" :utilities=\"utilities\">\n <slot />\n </NestedWrapper>\n <template v-else>\n <slot />\n <!-- Render utilities inside the innermost wrapper -->\n <component v-for=\"(utility, index) in utilities\" :key=\"`utility-${index}`\" :is=\"utility\" />\n </template>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { hasAutoMountElements, type PluginBatchRegistration, type IPlugin } from '@embedpdf/core';\nimport NestedWrapper from './nested-wrapper.vue';\n\nconst props = defineProps<{\n plugins: PluginBatchRegistration<IPlugin<any>, any>[];\n}>();\n\nconst elements = computed(() => {\n const utilities: any[] = [];\n const wrappers: any[] = [];\n\n for (const reg of props.plugins) {\n const pkg = reg.package;\n if (hasAutoMountElements(pkg)) {\n const elements = pkg.autoMountElements() || [];\n\n for (const element of elements) {\n if (element.type === 'utility') {\n utilities.push(element.component);\n } else if (element.type === 'wrapper') {\n wrappers.push(element.component);\n }\n }\n }\n }\n\n return { utilities, wrappers };\n});\n</script>\n\n<template>\n <NestedWrapper\n v-if=\"elements.wrappers.length > 0\"\n :wrappers=\"elements.wrappers\"\n :utilities=\"elements.utilities\"\n >\n <slot />\n </NestedWrapper>\n <template v-else>\n <!-- No wrappers - render children and utilities directly -->\n <slot />\n <component\n v-for=\"(utility, index) in elements.utilities\"\n :key=\"`utility-${index}`\"\n :is=\"utility\"\n />\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, provide, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue';\nimport {\n PluginRegistry,\n PluginBatchRegistrations,\n PluginRegistryConfig,\n CoreState,\n DocumentState,\n} from '@embedpdf/core';\nimport { Logger, PdfEngine } from '@embedpdf/models';\nimport { pdfKey, PDFContextState } from '../context';\nimport AutoMount from './auto-mount.vue';\n\nexport type { PluginBatchRegistrations };\n\nconst props = withDefaults(\n defineProps<{\n engine: PdfEngine;\n /** Registry configuration including logger, permissions, and defaults. */\n config?: PluginRegistryConfig;\n /** @deprecated Use config.logger instead. Will be removed in next major version. */\n logger?: Logger;\n plugins: PluginBatchRegistrations;\n onInitialized?: (registry: PluginRegistry) => Promise<void>;\n autoMountDomElements?: boolean;\n }>(),\n {\n autoMountDomElements: true,\n },\n);\n\n/* reactive state */\nconst registry = shallowRef<PluginRegistry | null>(null);\nconst coreState = ref<CoreState | null>(null);\nconst isInit = ref(true);\nconst pluginsOk = ref(false);\n\n// Compute convenience accessors\nconst activeDocumentId = computed(() => coreState.value?.activeDocumentId ?? null);\nconst documents = computed(() => coreState.value?.documents ?? {});\nconst documentOrder = computed(() => coreState.value?.documentOrder ?? []);\n\nconst activeDocument = computed(() => {\n const docId = activeDocumentId.value;\n const docs = documents.value;\n return docId && docs[docId] ? docs[docId] : null;\n});\n\nconst documentStates = computed(() => {\n const docs = documents.value;\n const order = documentOrder.value;\n return order\n .map((docId) => docs[docId])\n .filter((doc): doc is DocumentState => doc !== null && doc !== undefined);\n});\n\n/* expose to children */\nprovide<PDFContextState>(pdfKey, {\n registry,\n coreState,\n isInitializing: isInit,\n pluginsReady: pluginsOk,\n activeDocumentId,\n activeDocument,\n documents,\n documentStates,\n});\n\nonMounted(async () => {\n // Merge deprecated logger prop into config (config.logger takes precedence)\n const finalConfig: PluginRegistryConfig = {\n ...props.config,\n logger: props.config?.logger ?? props.logger,\n };\n const reg = new PluginRegistry(props.engine, finalConfig);\n reg.registerPluginBatch(props.plugins);\n await reg.initialize();\n\n if (reg.isDestroyed()) {\n return;\n }\n\n const store = reg.getStore();\n coreState.value = store.getState().core;\n\n const unsubscribe = store.subscribe((action, newState, oldState) => {\n // Only update if it's a core action and the core state changed\n if (store.isCoreAction(action) && newState.core !== oldState.core) {\n coreState.value = newState.core;\n }\n });\n\n await props.onInitialized?.(reg);\n\n if (reg.isDestroyed()) {\n unsubscribe();\n return;\n }\n\n registry.value = reg;\n isInit.value = false;\n\n reg.pluginsReady().then(() => {\n if (!reg.isDestroyed()) {\n pluginsOk.value = true;\n }\n });\n\n onBeforeUnmount(() => {\n unsubscribe();\n registry.value?.destroy();\n });\n});\n</script>\n\n<template>\n <AutoMount v-if=\"pluginsOk && autoMountDomElements\" :plugins=\"plugins\">\n <!-- scoped slot keeps API parity with React version -->\n <slot\n :registry=\"registry\"\n :coreState=\"coreState\"\n :isInitializing=\"isInit\"\n :pluginsReady=\"pluginsOk\"\n :activeDocumentId=\"activeDocumentId\"\n :activeDocument=\"activeDocument\"\n :documents=\"documents\"\n :documentStates=\"documentStates\"\n />\n </AutoMount>\n\n <!-- No auto-mount or not ready yet -->\n <slot\n v-else\n :registry=\"registry\"\n :coreState=\"coreState\"\n :isInitializing=\"isInit\"\n :pluginsReady=\"pluginsOk\"\n :activeDocumentId=\"activeDocumentId\"\n :activeDocument=\"activeDocument\"\n :documents=\"documents\"\n :documentStates=\"documentStates\"\n />\n</template>\n","import type { BasePlugin } from '@embedpdf/core';\nimport { computed, type Ref } from 'vue';\nimport { usePlugin } from './use-plugin';\n\nexport interface CapabilityState<C> {\n provides: Ref<C | null>;\n isLoading: Ref<boolean>;\n ready: Ref<Promise<void>>;\n}\n\n/**\n * Access the public capability exposed by a plugin.\n *\n * @example\n * const { provides: zoom } = useCapability<ZoomPlugin>(ZoomPlugin.id);\n * zoom.value?.zoomIn();\n */\nexport function useCapability<T extends BasePlugin>(\n pluginId: T['id'],\n): CapabilityState<ReturnType<NonNullable<T['provides']>>> {\n const { plugin, isLoading, ready } = usePlugin<T>(pluginId);\n\n const provides = computed(() => {\n if (!plugin.value) return null;\n if (!plugin.value.provides) {\n throw new Error(`Plugin ${pluginId} does not implement provides()`);\n }\n return plugin.value.provides() as ReturnType<NonNullable<T['provides']>>;\n });\n\n return { provides, isLoading, ready };\n}\n","import { computed, toValue, type MaybeRefOrGetter, ComputedRef } from 'vue';\nimport { PdfPermissionFlag } from '@embedpdf/models';\nimport { useCoreState } from './use-core-state';\nimport { getEffectivePermission, getEffectivePermissions } from '../../lib/store/selectors';\n\nexport interface DocumentPermissions {\n /** Effective permission flags after applying overrides */\n permissions: number;\n /** Raw PDF permission flags (before overrides) */\n pdfPermissions: number;\n /** Check if a specific permission flag is effectively allowed */\n hasPermission: (flag: PdfPermissionFlag) => boolean;\n /** Check if all specified flags are effectively allowed */\n hasAllPermissions: (...flags: PdfPermissionFlag[]) => boolean;\n\n // Shorthand booleans for all permission flags (using effective permissions):\n /** Can print (possibly degraded quality) */\n canPrint: boolean;\n /** Can modify document contents */\n canModifyContents: boolean;\n /** Can copy/extract text and graphics */\n canCopyContents: boolean;\n /** Can add/modify annotations and fill forms */\n canModifyAnnotations: boolean;\n /** Can fill in existing form fields */\n canFillForms: boolean;\n /** Can extract for accessibility */\n canExtractForAccessibility: boolean;\n /** Can assemble document (insert, rotate, delete pages) */\n canAssembleDocument: boolean;\n /** Can print high quality */\n canPrintHighQuality: boolean;\n}\n\n/**\n * Composable that provides reactive access to a document's effective permission flags.\n * Applies layered resolution: per-document override → global override → PDF permission.\n *\n * @param documentId The ID of the document to check permissions for (can be ref, computed, getter, or plain value).\n * @returns A computed ref with the permission object.\n */\nexport function useDocumentPermissions(\n documentId: MaybeRefOrGetter<string>,\n): ComputedRef<DocumentPermissions> {\n const coreState = useCoreState();\n\n return computed(() => {\n const docId = toValue(documentId);\n const state = coreState.value;\n\n if (!state) {\n return {\n permissions: PdfPermissionFlag.AllowAll,\n pdfPermissions: PdfPermissionFlag.AllowAll,\n hasPermission: () => true,\n hasAllPermissions: () => true,\n canPrint: true,\n canModifyContents: true,\n canCopyContents: true,\n canModifyAnnotations: true,\n canFillForms: true,\n canExtractForAccessibility: true,\n canAssembleDocument: true,\n canPrintHighQuality: true,\n };\n }\n\n const effectivePermissions = getEffectivePermissions(state, docId);\n const pdfPermissions =\n state.documents[docId]?.document?.permissions ?? PdfPermissionFlag.AllowAll;\n\n const hasPermission = (flag: PdfPermissionFlag) => getEffectivePermission(state, docId, flag);\n const hasAllPermissions = (...flags: PdfPermissionFlag[]) =>\n flags.every((flag) => getEffectivePermission(state, docId, flag));\n\n return {\n permissions: effectivePermissions,\n pdfPermissions,\n hasPermission,\n hasAllPermissions,\n canPrint: hasPermission(PdfPermissionFlag.Print),\n canModifyContents: hasPermission(PdfPermissionFlag.ModifyContents),\n canCopyContents: hasPermission(PdfPermissionFlag.CopyContents),\n canModifyAnnotations: hasPermission(PdfPermissionFlag.ModifyAnnotations),\n canFillForms: hasPermission(PdfPermissionFlag.FillForms),\n canExtractForAccessibility: hasPermission(PdfPermissionFlag.ExtractForAccessibility),\n canAssembleDocument: hasPermission(PdfPermissionFlag.AssembleDocument),\n canPrintHighQuality: hasPermission(PdfPermissionFlag.PrintHighQuality),\n };\n });\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCoreState } from './use-core-state';\n\n/**\n * Hook that provides reactive access to a specific document's state from the core store.\n *\n * @param documentId The ID of the document to retrieve (can be ref, computed, getter, or plain value).\n * @returns A computed ref containing the DocumentState object or null if not found.\n */\nexport function useDocumentState(documentId: MaybeRefOrGetter<string | null>) {\n const coreState = useCoreState();\n\n const documentState = computed(() => {\n const core = coreState.value;\n const docId = toValue(documentId);\n\n if (!core || !docId) return null;\n return core.documents[docId] ?? null;\n });\n\n return documentState;\n}\n","import { ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport type { CoreState, StoreState } from '@embedpdf/core';\nimport { useRegistry } from './use-registry';\n\n/**\n * Reactive getter for the *entire* global store.\n * Re‑emits whenever any slice changes.\n *\n * @example\n * const state = useStoreState(); // Ref<StoreState<CoreState>>\n * console.log(state.value.core.scale);\n */\nexport function useStoreState<T = CoreState>() {\n const { registry } = useRegistry();\n const state = ref<StoreState<T>>();\n\n function attach() {\n if (!registry.value) return () => {};\n\n // initial snapshot\n state.value = registry.value.getStore().getState() as StoreState<T>;\n\n // live updates\n return registry.value\n .getStore()\n .subscribe((_action, newState) => (state.value = newState as StoreState<T>));\n }\n\n /* attach now and re‑attach if registry instance ever changes */\n let unsubscribe = attach();\n watch(registry, () => {\n unsubscribe?.();\n unsubscribe = attach();\n });\n\n onBeforeUnmount(() => unsubscribe?.());\n\n return state;\n}\n"],"names":["pdfKey","Symbol","useRegistry","ctx","inject","Error","useCoreState","coreState","PdfPermissionFlag","Print","ModifyContents","CopyContents","ModifyAnnotations","FillForms","ExtractForAccessibility","AssembleDocument","PrintHighQuality","ALL_PERMISSION_FLAGS","PERMISSION_FLAG_TO_NAME","getPermissionOverride","overrides","flag","name","getEffectivePermission","state","documentId","docState","documents","docConfig","permissions","globalConfig","globalPermissions","pdfPermissions","_a","document","AllowAll","docOverride","globalOverride","enforceDocumentPermissions","usePlugin","pluginId","registry","plugin","shallowRef","isLoading","ref","ready","Promise","load","value","p","getPlugin","call","resolve","onMounted","watch","_openBlock","_createBlock","_resolveDynamicComponent","__props","wrappers","length","_component_NestedWrapper","slice","utilities","_renderSlot","_ctx","$slots","_createElementBlock","_Fragment","key","_renderList","utility","index","props","elements","computed","reg","plugins","pkg","package","hasAutoMountElements","autoMountElements","element","type","push","component","NestedWrapper","isInit","pluginsOk","activeDocumentId","documentOrder","activeDocument","docId","docs","documentStates","map","filter","doc","provide","isInitializing","pluginsReady","async","finalConfig","config","logger","PluginRegistry","engine","registerPluginBatch","initialize","isDestroyed","store","getStore","getState","core","unsubscribe","subscribe","action","newState","oldState","isCoreAction","_b","onInitialized","then","onBeforeUnmount","destroy","autoMountDomElements","AutoMount","provides","toValue","hasPermission","hasAllPermissions","canPrint","canModifyContents","canCopyContents","canModifyAnnotations","canFillForms","canExtractForAccessibility","canAssembleDocument","canPrintHighQuality","effectivePermissions","reduce","acc","getEffectivePermissions","flags","every","attach","_action"],"mappings":"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"}
package/dist/vue/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { inject, computed, toValue, shallowRef, ref, onMounted, watch, onBeforeUnmount, defineComponent, resolveComponent, createBlock, openBlock, resolveDynamicComponent, withCtx, renderSlot, createElementBlock, Fragment, renderList, provide } from "vue";
1
+ import { inject, computed, toValue, shallowRef, ref, onMounted, watch, onBeforeUnmount, defineComponent, resolveComponent, createBlock, openBlock, resolveDynamicComponent, withCtx, createElementBlock, renderSlot, Fragment, renderList, provide } from "vue";
2
2
  import { PdfPermissionFlag } from "@embedpdf/models";
3
3
  import { hasAutoMountElements, PluginRegistry } from "@embedpdf/core";
4
4
  const pdfKey = Symbol("pdfKey");
@@ -177,7 +177,8 @@ function useStoreState() {
177
177
  const _sfc_main$2 = /* @__PURE__ */ defineComponent({
178
178
  __name: "nested-wrapper",
179
179
  props: {
180
- wrappers: {}
180
+ wrappers: {},
181
+ utilities: {}
181
182
  },
182
183
  setup(__props) {
183
184
  return (_ctx, _cache) => {
@@ -186,13 +187,21 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
186
187
  default: withCtx(() => [
187
188
  __props.wrappers.length > 1 ? (openBlock(), createBlock(_component_NestedWrapper, {
188
189
  key: 0,
189
- wrappers: __props.wrappers.slice(1)
190
+ wrappers: __props.wrappers.slice(1),
191
+ utilities: __props.utilities
190
192
  }, {
191
193
  default: withCtx(() => [
192
194
  renderSlot(_ctx.$slots, "default")
193
195
  ]),
194
196
  _: 3
195
- }, 8, ["wrappers"])) : renderSlot(_ctx.$slots, "default", { key: 1 })
197
+ }, 8, ["wrappers", "utilities"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
198
+ renderSlot(_ctx.$slots, "default"),
199
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.utilities, (utility, index) => {
200
+ return openBlock(), createBlock(resolveDynamicComponent(utility), {
201
+ key: `utility-${index}`
202
+ });
203
+ }), 128))
204
+ ], 64))
196
205
  ]),
197
206
  _: 3
198
207
  });
@@ -225,22 +234,23 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
225
234
  return { utilities, wrappers };
226
235
  });
227
236
  return (_ctx, _cache) => {
228
- return openBlock(), createElementBlock(Fragment, null, [
229
- elements.value.wrappers.length > 0 ? (openBlock(), createBlock(_sfc_main$2, {
230
- key: 0,
231
- wrappers: elements.value.wrappers
232
- }, {
233
- default: withCtx(() => [
234
- renderSlot(_ctx.$slots, "default")
235
- ]),
236
- _: 3
237
- }, 8, ["wrappers"])) : renderSlot(_ctx.$slots, "default", { key: 1 }),
237
+ return elements.value.wrappers.length > 0 ? (openBlock(), createBlock(_sfc_main$2, {
238
+ key: 0,
239
+ wrappers: elements.value.wrappers,
240
+ utilities: elements.value.utilities
241
+ }, {
242
+ default: withCtx(() => [
243
+ renderSlot(_ctx.$slots, "default")
244
+ ]),
245
+ _: 3
246
+ }, 8, ["wrappers", "utilities"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
247
+ renderSlot(_ctx.$slots, "default"),
238
248
  (openBlock(true), createElementBlock(Fragment, null, renderList(elements.value.utilities, (utility, index) => {
239
249
  return openBlock(), createBlock(resolveDynamicComponent(utility), {
240
250
  key: `utility-${index}`
241
251
  });
242
252
  }), 128))
243
- ], 64);
253
+ ], 64));
244
254
  };
245
255
  }
246
256
  });