/** * Given a usage key like `lb:org:lib:html:id`, get the type (e.g. `html`) * @param usageKey e.g. `lb:org:lib:html:id` * @returns The block type as a string */ export function getBlockType(usageKey: string): string { if (usageKey && (usageKey.startsWith('lb:') || usageKey.startsWith('lct:'))) { const blockType = usageKey.split(':')[3]; if (blockType) { return blockType; } } throw new Error(`Invalid usageKey: ${usageKey}`); } /** * Given a usage key like `lb:org:lib:html:id`, get the library key * @param usageKey e.g. `lb:org:lib:html:id` * @returns The library key, e.g. `lib:org:lib` */ export function getLibraryId(usageKey: string): string { const [blockType, org, lib] = usageKey?.split(':') || []; if (['lb', 'lib-collection', 'lct'].includes(blockType) && org && lib) { return `lib:${org}:${lib}`; } throw new Error(`Invalid usageKey: ${usageKey}`); } /** Check if this is a V2 library key. */ export function isLibraryKey(learningContextKey: string | undefined | null): learningContextKey is string { return typeof learningContextKey === 'string' && learningContextKey.startsWith('lib:'); } /** Check if this is a V1 library key. */ export function isLibraryV1Key(learningContextKey: string | undefined | null): learningContextKey is string { return typeof learningContextKey === 'string' && learningContextKey.startsWith('library-v1:'); } /** * Build a collection usage key from library V2 context key and collection Id. * This Collection Usage Key is only used on tagging. */ export const buildCollectionUsageKey = (learningContextKey: string, collectionId: string) => { if (!isLibraryKey(learningContextKey)) { return ''; } const orgLib = learningContextKey.replace('lib:', ''); return `lib-collection:${orgLib}:${collectionId}`; }; export enum ContainerType { Section = 'section', Subsection = 'subsection', Unit = 'unit', /** * Chapter, Sequential and Vertical are the old names for section, subsection and unit. * Generally, **please avoid using this term entirely in any libraries code** or * anything based on the new Learning Core "Containers" framework - just call it a unit, section or subsection. We * do still need to use this in the modulestore-based courseware, and currently the /xblock/ API used to copy * library containers into courses also requires specifying this, though that should change to a better API * that does the unit->vertical conversion automatically in the future. */ Chapter = 'chapter', Sequential = 'sequential', Vertical = 'vertical', }