1
0
mirror of https://github.com/flarum/core.git synced 2025-08-06 08:27:42 +02:00

feat: export registry (#3842)

* feat: registry first iteration

Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>

* feat: improve webpack auto export loader

Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>

* chore: remove `compat` API

Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>

* chore: cleanup

Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>

---------

Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
This commit is contained in:
Sami Mazouz
2023-06-29 18:57:53 +01:00
committed by GitHub
parent cf70865aa6
commit 016503d8c3
74 changed files with 2206 additions and 1076 deletions

View File

@@ -0,0 +1,54 @@
/**
* @jest-environment node
*/
import compiler from './compiler.js';
import 'regenerator-runtime/runtime';
const compile = async (path, useFinalOutput = false) => {
const stats = await compiler(path);
return useFinalOutput
? stats.finalOutput
: stats.toJson({
source: true,
}).modules[0].source;
};
test('A directory with index.js that exports multiple modules adds the directory as a module', async () => {
let output = await compile('src/common/bars/index.js', true);
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/bars', bars)");
output = await compile('src/common/bars/Acme.js');
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/bars/Acme', Acme)");
output = await compile('src/common/bars/Foo.js');
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/bars/Foo', Foo)");
});
test('Simple default exports are added', async () => {
const output = await compile('src/common/Test.js');
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/Test', Test)");
});
test('Named exports are added', async () => {
const output = await compile('src/common/foos/namedExports.js');
expect(output).toContain(
"flarum.reg.add('flarum-framework', 'common/foos/namedExports', { baz: baz,foo: foo,Bar: Bar,sasha: sasha,flarum: flarum,david: david, })"
);
});
test('Export as default from another module is added', async () => {
const output = await compile('src/common/foos/exportDefaultFrom.js', true);
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/foos/exportDefaultFrom', potato");
});
test('Export from other modules is added', async () => {
const output = await compile('src/common/foos/exportFrom.js', true);
expect(output).toContain("flarum.reg.add('flarum-framework', 'common/foos/exportFrom', { potato: potato,franz: franz, }");
});
test('Export from with other named exports works', async () => {
const output = await compile('src/common/foos/exportFromWithNamedExports.js', true);
expect(output).toContain(
"flarum.reg.add('flarum-framework', 'common/foos/exportFromWithNamedExports', { potato: potato,franz: franz,baz: baz,foo: foo,Bar: Bar,sasha: sasha,forum: forum,david: david, }"
);
});

View File

@@ -0,0 +1,48 @@
import path from 'path';
import webpack from 'webpack';
import { createFsFromVolume, Volume } from 'memfs';
import * as fs from 'fs';
export default (fixture, options = {}) => {
const compiler = webpack({
context: __dirname,
entry: `./${fixture}`,
output: {
path: path.resolve(__dirname),
filename: 'bundle.js',
},
module: {
rules: [
{
test: /\.js$/,
use: {
loader: path.resolve(__dirname, '../src/autoExportLoader.cjs'),
options: {
...options,
composerPath: '../../composer.json',
},
},
},
],
},
optimization: {
minimize: false,
minimizer: [],
},
});
compiler.outputFileSystem = createFsFromVolume(new Volume());
compiler.outputFileSystem.join = path.join.bind(path);
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err) reject(err);
if (stats.hasErrors()) reject(stats.toJson().errors);
const outputFilepath = path.join(compiler.options.output.path, compiler.options.output.filename);
stats.finalOutput = compiler.outputFileSystem.readFileSync(outputFilepath, 'utf-8');
resolve(stats);
});
});
};

View File

@@ -0,0 +1 @@
export default class Test {}

View File

@@ -0,0 +1 @@
export default class Acme {}

View File

@@ -0,0 +1 @@
export default class Foo {}

View File

@@ -0,0 +1,9 @@
import Acme from './Acme.js';
import Foo from './Foo.js';
const bars = {
Acme,
Foo,
};
export default bars;

View File

@@ -0,0 +1 @@
export { potato as default } from '../support/potato.js';

View File

@@ -0,0 +1 @@
export { potato, franz } from '../support/potato.js';

View File

@@ -0,0 +1,16 @@
export { potato, franz } from '../support/potato.js';
export function baz() {}
export function foo() {}
export class Bar {}
const sasha = 'camel';
export { sasha };
const forum = 'Flarum';
const david = 'david';
export { forum, david };

View File

@@ -0,0 +1,14 @@
export function baz() {}
export function foo() {}
export class Bar {}
const sasha = 'camel';
export { sasha };
const flarum = 'Flarum';
const david = 'david';
export { flarum, david };

View File

@@ -0,0 +1,4 @@
const potato = 'potato';
const franz = 'franz';
export { potato, franz };