Skip to content

Commit 5bc63e2

Browse files
authored
Convert ember-debug to ESM and simplify wrapper (#2672)
2 parents 4b5ac6d + 4c14b4f commit 5bc63e2

28 files changed

+545
-575
lines changed

.npmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
public-hoist-pattern[]=@babel/*
22
resolution-mode=highest
3-
use-node-version=18.20.4
3+
use-node-version=22.17.1

ember-cli-build.js

Lines changed: 28 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ const writeFile = require('broccoli-file-creator');
99
const replace = require('broccoli-string-replace');
1010
const Funnel = require('broccoli-funnel');
1111
const packageJson = require('./package.json');
12-
const { map, mv } = stew;
12+
const { mv } = stew;
13+
14+
const {
15+
EMBER_VERSIONS_SUPPORTED,
16+
PREVIOUS_EMBER_VERSIONS_SUPPORTED,
17+
} = require('ember-debug/versions');
1318

1419
const options = {
1520
autoImport: {
@@ -84,95 +89,30 @@ module.exports = function (defaults) {
8489
app.import('node_modules/compare-versions/index.js');
8590
app.import('node_modules/normalize.css/normalize.css');
8691

87-
let emberDebug = 'ember_debug/dist';
88-
89-
emberDebug = new Funnel(emberDebug, {
90-
destDir: 'ember-debug',
91-
include: ['**/*.js'],
92-
});
93-
94-
const previousEmberVersionsSupportedString = `[${packageJson.previousEmberVersionsSupported
95-
.map(function (item) {
96-
return `'${item}'`;
97-
})
98-
.join(',')}]`;
99-
const emberVersionsSupportedString = `[${packageJson.emberVersionsSupported
100-
.map(function (item) {
101-
return `'${item}'`;
102-
})
103-
.join(',')}]`;
104-
105-
let startupWrapper = new Funnel('ember_debug', {
106-
srcDir: 'vendor',
107-
files: ['startup-wrapper.js'],
108-
});
109-
110-
startupWrapper = replace(startupWrapper, {
111-
files: ['startup-wrapper.js'],
112-
patterns: [
113-
{
114-
match: /{{EMBER_VERSIONS_SUPPORTED}}/,
115-
replacement: emberVersionsSupportedString,
116-
},
117-
],
118-
});
119-
120-
const loader = new Funnel('ember_debug', {
121-
srcDir: 'vendor',
122-
files: ['loader.js'],
123-
});
124-
125-
emberDebug = mergeTrees([startupWrapper, emberDebug, loader]);
126-
127-
emberDebug = concatFiles(emberDebug, {
128-
headerFiles: ['loader.js'],
129-
inputFiles: ['**/*.js'],
130-
outputFile: '/ember_debug.js',
131-
sourceMapConfig: { enabled: false },
132-
});
133-
134-
function wrapWithLoader(content) {
135-
return `(function loadEmberDebugInWebpage() {
136-
const waitForEmberLoad = new Promise((resolve) => {
137-
if (window.requireModule) {
138-
const has =
139-
window.requireModule.has ||
140-
function has(id) {
141-
return !!(
142-
window.requireModule.entries[id] ||
143-
window.requireModule.entries[id + '/index']
144-
);
145-
};
146-
if (has('ember')) {
147-
return resolve();
148-
}
149-
}
150-
151-
/**
152-
* NOTE: if the above (for some reason) fails and the consuming app has
153-
* deprecation-workflow's throwOnUnhandled: true
154-
* or set \`ember-global\`'s handler to 'throw'
155-
* and is using at least \`[email protected]\`
156-
*
157-
* this will throw an exception in the consuming project
158-
*/
159-
if (window.Ember) return resolve();
160-
161-
window.addEventListener('Ember', resolve, { once: true });
162-
});
163-
waitForEmberLoad.then(() => ${content});
164-
})()
165-
`;
166-
}
92+
const previousEmberVersionsSupportedString = JSON.stringify(
93+
PREVIOUS_EMBER_VERSIONS_SUPPORTED,
94+
);
95+
const emberVersionsSupportedString = JSON.stringify(EMBER_VERSIONS_SUPPORTED);
16796

16897
const emberDebugs = [];
98+
16999
['basic', 'chrome', 'firefox', 'bookmarklet', 'websocket'].forEach(
170100
function (dist) {
171-
emberDebugs[dist] = map(emberDebug, '**/*.js', function (content) {
172-
return wrapWithLoader(
173-
`(function(adapter) {\n${content}\n}('${dist}'))`,
174-
);
175-
});
101+
let emberDebug = 'ember_debug/dist';
102+
103+
let entryPoint = concatFiles(
104+
new Funnel(emberDebug, {
105+
destDir: 'ember-debug',
106+
include: [`${dist}-debug.js`],
107+
}),
108+
{
109+
inputFiles: ['**/*.js'],
110+
outputFile: '/ember_debug.js',
111+
sourceMapConfig: { enabled: false },
112+
},
113+
);
114+
115+
emberDebugs[dist] = mergeTrees([emberDebug, entryPoint]);
176116
},
177117
);
178118

@@ -190,10 +130,7 @@ module.exports = function (defaults) {
190130
patterns: emberInspectorVersionPattern,
191131
});
192132

193-
const minimumVersion = packageJson.emberVersionsSupported[0].replace(
194-
/\./g,
195-
'-',
196-
);
133+
const minimumVersion = EMBER_VERSIONS_SUPPORTED[0].replace(/\./g, '-');
197134
const webExtensionRoot = `panes-${minimumVersion}`;
198135

199136
let tabLabel;
@@ -264,7 +201,7 @@ module.exports = function (defaults) {
264201
skeletonBookmarklet,
265202
]);
266203

267-
packageJson.previousEmberVersionsSupported.forEach(function (version) {
204+
PREVIOUS_EMBER_VERSIONS_SUPPORTED.forEach(function (version) {
268205
version = version.replace(/\./g, '-');
269206
if (env === 'production') {
270207
const prevDist = `dist_prev/${env}`;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage';
2+
import { onEmberReady, startInspector } from '../lib/start-inspector';
3+
4+
import adapter from '../adapters/basic';
5+
6+
loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter)));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage';
2+
import { onEmberReady, startInspector } from '../lib/start-inspector';
3+
4+
import adapter from '../adapters/bookmarklet';
5+
6+
loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter)));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage';
2+
import { onEmberReady, startInspector } from '../lib/start-inspector';
3+
4+
import adapter from '../adapters/chrome';
5+
6+
loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter)));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage';
2+
import { onEmberReady, startInspector } from '../lib/start-inspector';
3+
4+
import adapter from '../adapters/firefox';
5+
6+
loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter)));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage';
2+
import { onEmberReady, startInspector } from '../lib/start-inspector';
3+
4+
import adapter from '../adapters/websocket';
5+
6+
loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter)));
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export default function bootEmberInspector(appInstance) {
2+
appInstance.application.__inspector__booted = true;
3+
appInstance.__inspector__booted = true;
4+
5+
// Boot the inspector (or re-boot if already booted, for example in tests)
6+
window.EmberInspector._application = appInstance.application;
7+
window.EmberInspector.owner = appInstance;
8+
window.EmberInspector.start(true);
9+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* eslint-disable ember/new-module-imports */
2+
/**
3+
* Get all the Ember.Application instances from Ember.Namespace.NAMESPACES
4+
* and add our own applicationId and applicationName to them
5+
* @return {*}
6+
*/
7+
export default function getApplications(Ember) {
8+
var namespaces = Ember.A(Ember.Namespace.NAMESPACES);
9+
10+
var apps = namespaces.filter(function (namespace) {
11+
return namespace instanceof Ember.Application;
12+
});
13+
14+
return apps.map(function (app) {
15+
// Add applicationId and applicationName to the app
16+
var applicationId = Ember.guidFor(app);
17+
var applicationName =
18+
app.name || app.modulePrefix || `(unknown app - ${applicationId})`;
19+
20+
Object.assign(app, {
21+
applicationId,
22+
applicationName,
23+
});
24+
25+
return app;
26+
});
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export default function loadEmberDebugInWebpage(callback) {
2+
const waitForEmberLoad = new Promise((resolve) => {
3+
if (window.requireModule) {
4+
const has =
5+
window.requireModule.has ||
6+
function has(id) {
7+
return !!(
8+
window.requireModule.entries[id] ||
9+
window.requireModule.entries[id + '/index']
10+
);
11+
};
12+
if (has('ember')) {
13+
return resolve();
14+
}
15+
}
16+
17+
/**
18+
* NOTE: if the above (for some reason) fails and the consuming app has
19+
* deprecation-workflow's throwOnUnhandled: true
20+
* or set \`ember-global\`'s handler to 'throw'
21+
* and is using at least \`[email protected]\`
22+
*
23+
* this will throw an exception in the consuming project
24+
*/
25+
if (window.Ember) return resolve();
26+
27+
window.addEventListener('Ember', resolve, { once: true });
28+
});
29+
waitForEmberLoad.then(callback);
30+
}

0 commit comments

Comments
 (0)