Skip to content

Commit

Permalink
improve DSL
Browse files Browse the repository at this point in the history
  • Loading branch information
lifeart committed Dec 9, 2023
1 parent be8821b commit 7561b64
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 40 deletions.
32 changes: 19 additions & 13 deletions plugins/ember-vendor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ const modeModulesPath = path.resolve(
export function internalPackages(mode: string) {
return [
Addon('ember & ember-source & @ember/*', mode)
.addAlias(/^ember$/, 'ember-source/dist/packages/ember')
.addAlias(/^ember\/version$/, 'ember-source/dist/packages/ember/version')
.addAlias(/^ember$/, nodePath('ember-source/dist/packages/ember'))
.addAlias(
/^ember\/version$/,
nodePath('ember-source/dist/packages/ember/version')
)
.addAliases(
emberPackages().map((pkg) => ({
find: `@ember/${pkg}`,
Expand All @@ -23,10 +26,10 @@ export function internalPackages(mode: string) {
),

Addon('@glimmer/*', mode)
.addAlias(
'@glimmer/validator',
nodePath('@glimmer/validator/dist/modules/es2017')
)
// .addAlias(
// '@glimmer/validator',
// nodePath('@glimmer/validator/dist/modules/es2017')
// )
.addAlias(
'@glimmer/tracking/primitives/cache',
nodePath(
Expand All @@ -39,7 +42,7 @@ export function internalPackages(mode: string) {
)
.addAlias(
'@glimmer/component',
'@glimmer/component/addon/-private/component'
nodePath('@glimmer/component/addon/-private/component')
)
.addAlias('@glimmer/env', compatPath('glimmer-env'))
.addAliases(
Expand All @@ -57,15 +60,15 @@ export function internalPackages(mode: string) {
),

Addon('ember-component-manager', mode).addSelfAlias(
'@glimmer/component/addon/-private/ember-component-manager'
nodePath('@glimmer/component/addon/-private/ember-component-manager')
),

Addon('@ember/test-helpers', mode).addSelfAlias(
'@ember/test-helpers/addon-test-support/@ember/test-helpers'
nodePath('@ember/test-helpers/addon-test-support/@ember/test-helpers')
),

Addon('@ember/test-waiters', mode).addSelfAlias(
'@ember/test-waiters/addon/@ember/test-waiters'
nodePath('@ember/test-waiters/addon/@ember/test-waiters')
),

Addon('ember-compatibility-helpers', mode).addSelfAlias(
Expand All @@ -87,13 +90,16 @@ export function internalPackages(mode: string) {
),
Addon('require', mode).addSelfAlias(compatPath('require/index.ts')),
Addon('ember-template-compiler', mode).addSelfAlias(
'node_modules/ember-source/dist/ember-template-compiler.js'
nodePath('ember-source/dist/ember-template-compiler.js')
),
Addon('ember-testing', mode)
.addAlias(/^ember-testing$/, 'ember-source/dist/packages/ember-testing')
.addAlias(
/^ember-testing$/,
nodePath('ember-source/dist/packages/ember-testing')
)
.addAlias(
/^ember-testing\//,
'ember-source/dist/packages/ember-testing/'
nodePath('ember-source/dist/packages/ember-testing/')
),
Addon('@embroider/macros', mode).addSelfAlias(
compatPath('embroider-macros/index.ts')
Expand Down
75 changes: 71 additions & 4 deletions plugins/ember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@ export function App(mode: string) {
const isDev = addon.isDev;
const enableSourceMaps = isDev;

addon.resolveExtensions([
'.mjs',
'.js',
'.ts',
'.jsx',
'.tsx',
'.json',
'.hbs',
]);

addon.babelPlugins = [
hbsResolver(isProd),
gtsResolver(isProd),
Expand Down Expand Up @@ -79,6 +89,7 @@ export function emberAppConfig(
addons: EmberAddon[]
) {
addons.forEach((el) => el.attachToConfig(definedConfig));
// console.table(definedConfig.resolve.alias);
return definedConfig;
}

Expand All @@ -94,9 +105,11 @@ function addonBabelConfig(

class EmberAddon {
name!: string;
aliases: unknown[] = [];
aliases: { find: unknown; replacement: unknown }[] = [];
babelPlugins: unknown[] = [];
mode: string;
defineConfig: Record<string, unknown> = {};
extensions: string[] = [];
constructor(name: string, mode: string) {
this.name = name;
this.mode = mode;
Expand All @@ -120,6 +133,14 @@ class EmberAddon {
});
return this;
}
resolveExtensions(extensions: string[]) {
this.extensions = Array.from(new Set([...this.extensions, ...extensions]));
return this;
}
extendDefineConfig(config: Record<string, unknown>) {
this.defineConfig = { ...this.defineConfig, ...config };
return this;
}
needBabel(
{
removeLegacyLayout,
Expand Down Expand Up @@ -172,12 +193,58 @@ class EmberAddon {
});
return this;
}
attachToConfig(config: UserConfig) {
fixConfig(config: UserConfig) {
const resolveExtensions = config?.resolve?.extensions ?? [];
const resolveAlias = config?.resolve?.alias ?? [];
const plugins = config?.plugins ?? [];
const define = config?.define ?? {};
if (!config.resolve) {
config.resolve = {
extensions: [],
alias: [],
};
}
config.resolve.extensions = resolveExtensions;
config.resolve.alias = resolveAlias;
config.plugins = plugins;
config.define = define;

return config as UserConfig & {
resolve: {
extensions: string[];
alias: { find: unknown; replacement: unknown }[];
};
plugins: unknown[];
define: Record<string, unknown>;
};
}
attachToConfig(rawConfig: UserConfig) {
const config = this.fixConfig(rawConfig);
this.extensions.forEach((el) => {
if (!config.resolve.extensions.includes(el)) {
config.resolve.extensions.push(el);
}
});
this.aliases.forEach((el) => {
config?.resolve?.alias.push(el);
const existingAlias = config.resolve.alias.find((alias) => alias.find === el.find);
if (!existingAlias) {
config.resolve.alias.push(el);
} else {
throw new Error(
`Alias ${el.find} already exists, but imported by [${this.name}] addon. Please check your config.
Existing alias: ${existingAlias.replacement}
New alias: ${el.replacement}
`
);
}
});
this.babelPlugins.forEach((el) => {
config?.plugins?.push(el);
config.plugins.push(el);
});
Object.keys(this.defineConfig).forEach((el) => {
if (config.define) {
config.define[el] = this.defineConfig[el];
}
});
return this;
}
Expand Down
39 changes: 16 additions & 23 deletions vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defineConfig } from 'vite';
import { fileURLToPath, URL } from 'node:url';
import { resolve } from 'node:path';
import { generateDefineConfig } from './compat/ember-data-private-build-infra/index.ts';
import { generateDefineConfig } from './compat/ember-data-private-build-infra/index';
import {
Addon as AddonConstructor,
compatPath,
Expand Down Expand Up @@ -44,33 +44,26 @@ export default defineConfig(({ mode }) => {
preview: {
port: 4200,
},
define: {
ENV_DEBUG: isProd ? false : true,
ENV_CI: false,
...generateDefineConfig(isProd),
},
resolve: {
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.hbs'],
alias: [
{
find: `@/tests/`,
replacement: fileURLToPath(new URL(`./tests/`, projectRoot)),
},
...localScopes().map((scope) => ({
find: `@/${scope}`,
replacement: fileURLToPath(new URL(`./src/${scope}`, projectRoot)),
})),
],
},
plugins: [],
},
[
App(),
App()
.extendDefineConfig({
ENV_DEBUG: isProd ? false : true,
ENV_CI: false,
})
.addAlias(`@/tests/`, fileURLToPath(new URL(`./tests/`, projectRoot)))
.addAliases(
localScopes().map((scope) => ({
find: `@/${scope}`,
replacement: fileURLToPath(new URL(`./src/${scope}`, projectRoot)),
}))
),

...internalPackages(mode),

Addon('@ember-data')
.needBabel()
.extendDefineConfig(generateDefineConfig(isProd))
.addAliases(
eDataPackages().map((pkg) => ({
find: `@ember-data/${pkg}`,
Expand Down Expand Up @@ -108,11 +101,11 @@ export default defineConfig(({ mode }) => {
Addon('ember-simple-auth')
.addNestedAlias(
'use-session-setup-method',
'./compat/ember-simple-auth/use-session-setup-method.ts'
compatPath('ember-simple-auth/use-session-setup-method.ts')
)
.addAlias(
/ember-simple-auth\/(?!(app|addon)\/)(.+)/,
'ember-simple-auth/addon/$2'
nodePath('ember-simple-auth/addon/$2')
),
]
);
Expand Down

0 comments on commit 7561b64

Please sign in to comment.