mirror of
https://github.com/discourse/discourse.git
synced 2026-08-05 21:16:17 +08:00
1. Remove 'federated exports' system, which was named entrypoint exports
for every module inside the plugin. Replace it with a single import of
the target plugin's 'compatModules', and then update call sites to do a
'just in time' lookup of the module and export. This is implemented in a
new `babel-resolve-plugin-imports` plugin
2. Update theme & plugin build systems to produce a list of external
plugins which are imported. For plugins, it's stored in the manifest.
For themes, it's stored in a new column of the javascript_caches table.
3. Refactor theme extra_js loading to use a more structured data model,
and move the HTML generation to the erb template
4. Update core importmap to identify any missing plugin dependencies and
add a fake placeholder module for them. This allows optional imports to
exist without causing a boot error. The imported values will resolve to
'null'.
5. Update core plugins to remove use of `optionalRequire`, and replace
it with regular imports, and a `with { discourseImport: "optional" }`
suffix. This is functionally equivalent to optionalRequire, but without
leaning on the legacy `loader.js` system of core
6. Add support for `with { discourseImport: "optional" }` for
plugins/themes importing core modules. This is useful when a
theme/plugin needs to target multiple versions of Discourse core.
Co-authored-by: Jarek Radosz <jarek@cvx.dev>
14 lines
589 B
JavaScript
Vendored
14 lines
589 B
JavaScript
Vendored
// Reads and validates the `with { discourseImport: ... }` attribute on an
|
|
// import declaration, returning "optional", "required", or undefined.
|
|
export function readDiscourseImportMode(path) {
|
|
const attribute = (path.node.attributes ?? []).find(
|
|
(a) => (a.key.name ?? a.key.value) === "discourseImport"
|
|
);
|
|
const mode = attribute?.value.value;
|
|
if (![undefined, "optional", "required"].includes(mode)) {
|
|
throw path.buildCodeFrameError(
|
|
`Invalid \`discourseImport\` import attribute "${mode}". Allowed values are "optional" and "required".`
|
|
);
|
|
}
|
|
return mode;
|
|
}
|