@atlassian/webresource-vite-plugin
Version:
Auto-generates web-resource definitions from your vite-built code, for usage in an Atlassian product or plugin.
92 lines • 4.29 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const node_path_1 = __importDefault(require("node:path"));
const pretty_data_1 = require("pretty-data");
const generator_1 = require("./association/generator");
const options_1 = require("./helpers/options");
const generator_2 = require("./web-resource/generator");
const defaultResourceParams = new Map().set('svg', [
{
name: 'content-type',
value: 'image/svg+xml',
},
]);
const defaultOptions = {
pluginKey: '${atlassian.plugin.key}',
xmlDescriptors: 'META-INF/plugin-descriptor/wrm-vite-modules.xml',
resourceParamMap: defaultResourceParams,
prettyPrint: false,
};
const ASSOCIATIONS_PATH_IN_BUNDLE = 'META-INF/fe-manifest-associations';
function webresourcePlugin(options = {}) {
const pluginOptions = Object.assign({}, defaultOptions, options);
const { pluginKey, xmlDescriptors } = pluginOptions;
pluginOptions.resourceParamMap = (0, options_1.ensureResourceParamsAreUnique)((0, options_1.toMap)(pluginOptions.resourceParamMap));
const xmlDescriptorFilepath = node_path_1.default.relative('.', xmlDescriptors);
const resolveLocalDep = (dep) => `${pluginKey}:${dep}`;
return {
name: 'webresource',
generateBundle(_, bundle) {
// generate WRM metadata used to link bundles together in XML
const wrmMetadata = {};
for (const [filename, info] of Object.entries(bundle)) {
const key = ('isEntry' in info && info.isEntry ? 'entry_' : 'split_') + info.fileName;
wrmMetadata[filename] = {
key,
};
}
const webResources = [];
const webResourcesAssets = [];
for (const [filename, metadata] of Object.entries(bundle)) {
if (!('imports' in metadata)) {
// CSS, Images, txt, etc...
webResourcesAssets.push({ name: metadata.fileName, location: metadata.fileName });
continue;
}
const dependencies = metadata.imports.map((i) => resolveLocalDep(wrmMetadata[i].key));
const resources = [{ name: metadata.fileName, location: metadata.fileName }];
if (metadata.viteMetadata?.importedAssets) {
metadata.viteMetadata.importedAssets.forEach((asset) => resources.push({ name: asset, location: asset }));
}
if (metadata.viteMetadata?.importedCss) {
metadata.viteMetadata.importedCss.forEach((asset) => resources.push({ name: asset, location: asset }));
}
webResources.push({
key: wrmMetadata[filename].key,
dependencies,
resources,
});
}
if (webResourcesAssets.length) {
webResources.push({
// TODO hash?
key: 'assets',
dependencies: [],
resources: webResourcesAssets,
});
}
this.emitFile({
type: 'asset',
name: 'wrm-module-definitions',
fileName: xmlDescriptorFilepath,
source: pluginOptions.prettyPrint
? pretty_data_1.pd.xml((0, generator_2.generateWebResourcesXml)(pluginOptions, webResources))
: (0, generator_2.generateWebResourcesXml)(pluginOptions, webResources),
});
if (pluginOptions.packageName) {
const associationsFilepath = node_path_1.default.relative('.', ASSOCIATIONS_PATH_IN_BUNDLE);
const fileName = node_path_1.default.join(associationsFilepath, `${pluginKey}-vite.intermediary.json`);
this.emitFile({
type: 'asset',
name: 'wrm-associations-definitions',
fileName,
source: (0, generator_1.generateAssociationsReport)(pluginOptions, webResources),
});
}
},
};
}
module.exports = webresourcePlugin;
//# sourceMappingURL=index.js.map