UNPKG

@scriptables/manifest

Version:

Utilities to generate, parse, and update manifest headers in Scriptable scripts.

71 lines (61 loc) 2.03 kB
import {matchAllBannerManifest} from './matchAllBannerManifest'; import {parse} from './parse'; import {SCRIPTABLE_BANNER_KEYS, ScriptableBannerKey, ScriptableManifest, ScriptableShareSheetInputs} from './types'; interface ScriptableParseResult { manifest: Partial<ScriptableManifest> | null; rawHeader: string; content: string; } export function parseScriptableManifest(script: string, targetKeys: ScriptableBannerKey[] = []): ScriptableParseResult { if (!script) { return { manifest: {}, rawHeader: '', content: '', }; } const { header: parsedManifest, headerContent: rawHeader, content, } = parse(script, headerLines => extractManifestFromHeader(headerLines, targetKeys), {maxHeaderLines: 20}); return { manifest: parsedManifest, rawHeader, content, }; } function extractManifestFromHeader( headerLines: string[], targetKeys: ScriptableBannerKey[], ): Partial<ScriptableManifest> { const manifest: Partial<ScriptableManifest> = {}; const keysToExtract = targetKeys.length ? targetKeys : [...SCRIPTABLE_BANNER_KEYS]; const manifestLine = headerLines.join(' '); const matches = matchAllBannerManifest(manifestLine); for (const match of matches) { const key = match[1]; const value = match[2].trim(); const manifestKey = key as ScriptableBannerKey; if (keysToExtract.includes(manifestKey) && value !== '') { setManifestValue(manifest, manifestKey, value); } } return manifest; } function setManifestValue(manifest: Partial<ScriptableManifest>, key: ScriptableBannerKey, value: string): void { switch (key) { case 'always-run-in-app': manifest.alwaysRunInApp = value === 'true'; break; case 'share-sheet-inputs': manifest.shareSheetInputs = value.split(',').map(v => v.trim()) as ScriptableShareSheetInputs; break; case 'icon-color': manifest.iconColor = value.trim(); break; case 'icon-glyph': manifest.iconGlyph = value.trim(); break; } }