@create-figma-plugin/build
Version:
Build a Figma/FigJam plugin/widget
121 lines • 4.39 kB
JavaScript
import { resolve } from 'node:path';
import { constants, writeFileAsync } from '@create-figma-plugin/common';
import { globby } from 'globby';
import { importFresh } from './import-fresh.js';
export async function buildManifestAsync(options) {
const { config, minify, outputDirectory } = options;
const { api, widgetApi, editorType, containsWidget, commandId, id, name, main, ui, menu, parameters, parameterOnly, relaunchButtons, rest } = config;
const command = { commandId, name, main, ui, menu, parameters, parameterOnly };
if (hasBundle(command, 'main') === false) {
throw new Error('Need a `main` entry point');
}
const hasUi = hasBundle(command, 'ui') === true ||
(relaunchButtons !== null &&
relaunchButtons.filter(function (relaunchButton) {
return relaunchButton.ui !== null;
}).length > 0);
const manifest = {
api,
widgetApi: containsWidget === true ? widgetApi : undefined,
editorType,
containsWidget: containsWidget === true ? containsWidget : undefined,
id,
name,
main: constants.build.pluginCodeFilePath,
ui: hasUi === true ? constants.build.pluginUiFilePath : undefined,
menu: command.menu !== null ? createManifestMenu(command.menu) : undefined,
parameters: command.parameters !== null
? createManifestParameters(command.parameters)
: undefined,
parameterOnly: command.parameterOnly === false ? false : undefined,
relaunchButtons: relaunchButtons !== null
? createManifestRelaunchButtons(relaunchButtons)
: undefined,
...(rest !== null ? rest : {})
};
const result = await overrideManifestAsync(manifest);
const string = (minify === true
? JSON.stringify(result)
: JSON.stringify(result, null, 2)) + '\n';
const outputFilePath = resolve(outputDirectory, constants.build.manifestFilePath);
await writeFileAsync(outputFilePath, string);
}
function hasBundle(command, key) {
if (command[key] !== null) {
return true;
}
if (command.menu !== null) {
const result = command.menu.filter(function (command) {
if ('separator' in command) {
return false;
}
return hasBundle(command, key);
});
return result.length > 0;
}
return false;
}
function createManifestParameters(parameters) {
return parameters.map(function (parameter) {
const result = {
key: parameter.key,
name: parameter.name
};
if (parameter.description !== null) {
result.description = parameter.description;
}
if (parameter.allowFreeform === true) {
result.allowFreeform = true;
}
if (parameter.optional === true) {
result.optional = true;
}
return result;
});
}
function createManifestMenu(menu) {
return menu.map(function (item) {
if ('separator' in item) {
return { separator: true };
}
const result = {
name: item.name
};
if (item.commandId !== null) {
result.command = item.commandId;
}
if (item.parameters !== null) {
result.parameters = createManifestParameters(item.parameters);
}
if (item.parameterOnly === false) {
result.parameterOnly = false;
}
if (item.menu !== null) {
result.menu = createManifestMenu(item.menu);
}
return result;
});
}
function createManifestRelaunchButtons(relaunchButtons) {
return relaunchButtons.map(function (relaunchButton) {
const result = {
name: relaunchButton.name,
command: relaunchButton.commandId
};
if (relaunchButton.multipleSelection === true) {
result.multipleSelection = true;
}
return result;
});
}
async function overrideManifestAsync(manifest) {
const filePaths = await globby(constants.build.manifestConfigGlobPattern, {
absolute: true
});
if (filePaths.length === 0) {
return manifest;
}
const { default: overrideManifest } = await importFresh(filePaths[0]);
return overrideManifest(manifest);
}
//# sourceMappingURL=build-manifest-async.js.map