Skip to content

Commit

Permalink
Merge pull request #20582 from emberjs/internal-coordination
Browse files Browse the repository at this point in the history
Reducing internal usage of AMD loader
  • Loading branch information
ef4 committed Dec 1, 2023
2 parents 74aa87f + f679f03 commit c737bbc
Show file tree
Hide file tree
Showing 17 changed files with 449 additions and 437 deletions.
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ module.exports = {
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-this-alias': 'off',
'@typescript-eslint/no-var-requires': 'warn',
'@typescript-eslint/no-var-requires': 'error',
'@typescript-eslint/consistent-type-imports': 'error',

// TODO: Enable and fix these rules
Expand Down
36 changes: 34 additions & 2 deletions ember-cli-build.js
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,40 @@ function templateCompilerBundle(emberPackages, transpileTree) {

return concatBundle(new MergeTrees([templateCompilerFiles, emberHeaderFiles()]), {
outputFile: 'ember-template-compiler.js',
footer:
'(function (m) { if (typeof module === "object" && module.exports) { module.exports = m } }(require("ember-template-compiler")));',
footer: `
try {
// in the browser, the ember-template-compiler.js and ember.js bundles find each other via globalThis.require.
require('@ember/template-compilation');
} catch (err) {
// in node, that coordination is a no-op
define('@ember/template-compilation', ['exports'], function (e) {
e.__registerTemplateCompiler = function () {};
});
define('ember', [
'exports',
'@ember/-internals/environment',
'@ember/canary-features',
'ember/version',
], function (e, env, fea, ver) {
e.default = {
ENV: env.ENV,
FEATURES: fea.FEATURES,
VERSION: ver.default,
};
});
define('@ember/-internals/glimmer', ['exports'], function(e) {
e.template = undefined;
});
define('@ember/application', ['exports'], function(e) {});
}
(function (m) {
if (typeof module === 'object' && module.exports) {
module.exports = m;
}
})(require('ember-template-compiler'));
`,
});
}

Expand Down
9 changes: 8 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,14 @@ module.exports = {
return new MergeTrees([
concatBundle(emberFiles, {
outputFile: 'ember.js',
footer: `require('@ember/-internals/bootstrap')`,
footer: `
(function bootstrap() {
// Bootstrap Node module
if (typeof module === 'object' && typeof module.require === 'function') {
module.exports = require('ember').default;
}
})();
`,
}),

concatBundle(emberTestingFiles, {
Expand Down
8 changes: 0 additions & 8 deletions packages/@ember/-internals/bootstrap/index.ts

This file was deleted.

17 changes: 15 additions & 2 deletions packages/@ember/template-compilation/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { DEBUG } from '@glimmer/env';
import type { TemplateFactory } from '@glimmer/interfaces';

export { compile as compileTemplate } from 'ember-template-compiler';
import type * as ETC from 'ember-template-compiler';

interface CommonOptions {
moduleName?: string;
Expand All @@ -27,6 +26,16 @@ interface PrecompileTemplate {
(templateString: string, options: StrictModeOptions): TemplateFactory;
}

export let __emberTemplateCompiler: undefined | typeof ETC;
export const compileTemplate: typeof ETC.compile = (...args: Parameters<typeof ETC.compile>) => {
if (!__emberTemplateCompiler) {
throw new Error(
'Attempted to call `compileTemplate` without first loading the runtime template compiler.'
);
}
return __emberTemplateCompiler.compile(...args);
};

export let precompileTemplate: PrecompileTemplate;

if (DEBUG) {
Expand All @@ -36,3 +45,7 @@ if (DEBUG) {
);
};
}

export function __registerTemplateCompiler(c: typeof ETC) {
__emberTemplateCompiler = c;
}
42 changes: 19 additions & 23 deletions packages/@ember/test/index.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
import require, { has } from 'require';
import { type Test as TestNS } from 'ember-testing';
import type * as EmberTesting from 'ember-testing';

export let registerAsyncHelper: (typeof TestNS)['registerAsyncHelper'];
export let registerHelper: (typeof TestNS)['registerHelper'];
export let registerWaiter: (typeof TestNS)['registerWaiter'];
export let unregisterHelper: (typeof TestNS)['unregisterHelper'];
export let unregisterWaiter: (typeof TestNS)['unregisterWaiter'];
export let registerAsyncHelper: (typeof EmberTesting.Test)['registerAsyncHelper'];
export let registerHelper: (typeof EmberTesting.Test)['registerHelper'];
export let registerWaiter: (typeof EmberTesting.Test)['registerWaiter'];
export let unregisterHelper: (typeof EmberTesting.Test)['unregisterHelper'];
export let unregisterWaiter: (typeof EmberTesting.Test)['unregisterWaiter'];
export let _impl: typeof EmberTesting | undefined;

if (has('ember-testing')) {
// SAFETY: since `require` is opaque to TS, we need to inform it that this is
// the actual type of what we import. This `require` needs to stay in sync
// with the `import type` statement above. (This cast *increases* safety,
// because the result of `require` is `any`.)
let Test = require('ember-testing').Test as typeof TestNS;
let testingNotAvailableMessage = () => {
throw new Error('Attempted to use test utilities, but `ember-testing` was not included');
};

registerAsyncHelper = testingNotAvailableMessage;
registerHelper = testingNotAvailableMessage;
registerWaiter = testingNotAvailableMessage;
unregisterHelper = testingNotAvailableMessage;
unregisterWaiter = testingNotAvailableMessage;

export function registerTestImplementaiton(impl: typeof EmberTesting) {
let { Test } = impl;
registerAsyncHelper = Test.registerAsyncHelper;
registerHelper = Test.registerHelper;
registerWaiter = Test.registerWaiter;
unregisterHelper = Test.unregisterHelper;
unregisterWaiter = Test.unregisterWaiter;
} else {
let testingNotAvailableMessage = () => {
throw new Error('Attempted to use test utilities, but `ember-testing` was not included');
};

registerAsyncHelper = testingNotAvailableMessage;
registerHelper = testingNotAvailableMessage;
registerWaiter = testingNotAvailableMessage;
unregisterHelper = testingNotAvailableMessage;
unregisterWaiter = testingNotAvailableMessage;
_impl = impl;
}
36 changes: 4 additions & 32 deletions packages/ember-template-compiler/index.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,8 @@
import { ENV } from '@ember/-internals/environment';
import { FEATURES } from '@ember/canary-features';
import * as _GlimmerSyntax from '@glimmer/syntax';
import VERSION from 'ember/version';
import require from 'require';

export let _Ember: unknown;

try {
_Ember = require('ember');
} catch (e) {
_Ember = {
ENV,
FEATURES,
VERSION,
};
}

export { default as precompile } from './lib/system/precompile';
export { default as compile } from './lib/system/compile';
export {
default as compileOptions,
buildCompileOptions as _buildCompileOptions,
transformsFor as _transformsFor,
} from './lib/system/compile-options';
export { RESOLUTION_MODE_TRANSFORMS, STRICT_MODE_TRANSFORMS } from './lib/plugins';
export { EmberPrecompileOptions } from './lib/types';

export { preprocess as _preprocess, print as _print } from '@glimmer/syntax';
export { precompile as _precompile } from '@glimmer/compiler';

export { _GlimmerSyntax, VERSION };
export * from './lib/public-api';
import * as ETC from './lib/public-api';
import { __registerTemplateCompiler } from '@ember/template-compilation';

__registerTemplateCompiler(ETC);
// used to bootstrap templates
import './lib/system/bootstrap';

Expand Down
19 changes: 19 additions & 0 deletions packages/ember-template-compiler/lib/public-api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export { default as _Ember } from 'ember';

import VERSION from 'ember/version';
import * as _GlimmerSyntax from '@glimmer/syntax';

export { default as precompile } from './system/precompile';
export { default as compile } from './system/compile';
export {
default as compileOptions,
buildCompileOptions as _buildCompileOptions,
transformsFor as _transformsFor,
} from './system/compile-options';
export { RESOLUTION_MODE_TRANSFORMS, STRICT_MODE_TRANSFORMS } from './plugins';
export { EmberPrecompileOptions } from './types';

export { preprocess as _preprocess, print as _print } from '@glimmer/syntax';
export { precompile as _precompile } from '@glimmer/compiler';

export { _GlimmerSyntax, VERSION };
9 changes: 1 addition & 8 deletions packages/ember-template-compiler/lib/system/compile.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
/**
@module ember
*/
import require, { has } from 'require';
import type { EmberPrecompileOptions } from '../types';
import precompile from './precompile';
import type { SerializedTemplateWithLazyBlock, TemplateFactory } from '@glimmer/interfaces';
import type { templateFactory } from '@glimmer/opcode-compiler';

let template: typeof templateFactory;
import { template } from '@ember/-internals/glimmer';

/**
Uses HTMLBars `compile` function to process a string into a compiled template.
Expand All @@ -21,10 +18,6 @@ export default function compile(
templateString: string,
options: Partial<EmberPrecompileOptions> = {}
): TemplateFactory {
if (!template && has('@ember/-internals/glimmer')) {
template = require('@ember/-internals/glimmer').template;
}

if (!template) {
throw new Error(
'Cannot call `compile` with only the template compiler loaded. Please load `ember.debug.js` or `ember.prod.js` prior to calling `compile`.'
Expand Down
13 changes: 4 additions & 9 deletions packages/ember-template-compiler/lib/system/initializer.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import require, { has } from 'require';
import bootstrap from './bootstrap';
import * as emberEnv from '@ember/-internals/browser-environment';
import * as emberGlimmer from '@ember/-internals/glimmer';
import * as emberApp from '@ember/application';

// Globals mode template compiler
if (
has('@ember/application') &&
has('@ember/-internals/browser-environment') &&
has('@ember/-internals/glimmer')
) {
let emberEnv = require('@ember/-internals/browser-environment');
let emberGlimmer = require('@ember/-internals/glimmer');
let emberApp = require('@ember/application');
if (emberApp.default) {
let Application = emberApp.default;
let { hasTemplate, setTemplate } = emberGlimmer;
let { hasDOM } = emberEnv;
Expand Down
12 changes: 4 additions & 8 deletions packages/ember-testing/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
export { default as Test } from './lib/test';
export { default as Adapter } from './lib/adapters/adapter';
export { default as setupForTesting } from './lib/setup_for_testing';
export { default as QUnitAdapter } from './lib/adapters/qunit';
export * from './lib/public-api';
import * as EmberTesting from './lib/public-api';
import { registerTestImplementaiton } from '@ember/test';

import './lib/ext/application';
import './lib/ext/rsvp'; // setup RSVP + run loop integration
import './lib/helpers'; // adds helpers to helpers object in Test
import './lib/initializers'; // to setup initializer
registerTestImplementaiton(EmberTesting);
9 changes: 9 additions & 0 deletions packages/ember-testing/lib/public-api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export { default as Test } from './test';
export { default as Adapter } from './adapters/adapter';
export { default as setupForTesting } from './setup_for_testing';
export { default as QUnitAdapter } from './adapters/qunit';

import './ext/application';
import './ext/rsvp'; // setup RSVP + run loop integration
import './helpers'; // adds helpers to helpers object in Test
import './initializers'; // to setup initializer
3 changes: 2 additions & 1 deletion packages/ember-testing/tests/reexports_test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Ember from 'ember';
import { confirmExport } from 'internal-test-helpers';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
import * as emberTesting from 'ember-testing';

class ReexportsTestCase extends AbstractTestCase {}

Expand All @@ -19,7 +20,7 @@ class ReexportsTestCase extends AbstractTestCase {}
}

ReexportsTestCase.prototype[`@test Ember.${path} exports correctly`] = function (assert) {
confirmExport(Ember, assert, path, moduleId, exportName);
confirmExport(Ember, assert, path, moduleId, exportName, emberTesting);
};
});

Expand Down
Loading

0 comments on commit c737bbc

Please sign in to comment.