@scriptables/manifest
Version:
Utilities to generate, parse, and update manifest headers in Scriptable scripts.
71 lines (61 loc) • 2.03 kB
text/typescript
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;
}
}