Skip to content

Commit 3758491

Browse files
committed
initial working version
1 parent 0cfa670 commit 3758491

File tree

8 files changed

+233
-0
lines changed

8 files changed

+233
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/

eslint.config.mjs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import globals from "globals";
2+
import pluginJs from "@eslint/js";
3+
4+
5+
export default [
6+
{files: ["**/*.js"], languageOptions: {sourceType: "commonjs"}},
7+
{languageOptions: { globals: globals.node }},
8+
pluginJs.configs.recommended,
9+
];

files-override/app/index.html

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<title>AppTemplate</title>
6+
<meta name="description" content="">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
9+
{{content-for "head"}}
10+
11+
<link integrity="" rel="stylesheet" href="/@embroider/core/vendor.css">
12+
<link integrity="" rel="stylesheet" href="/assets/app-template.css">
13+
14+
{{content-for "head-footer"}}
15+
</head>
16+
<body>
17+
{{content-for "body"}}
18+
19+
<script src="/@embroider/core/vendor.js"></script>
20+
<script src="/@embroider/core/entrypoint" type="module"></script>
21+
22+
{{content-for "body-footer"}}
23+
</body>
24+
</html>

files-override/ember-cli-build.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
4+
const { maybeEmbroider } = require('@embroider/test-setup');
5+
6+
module.exports = function (defaults) {
7+
let app = new EmberApp(defaults, {});
8+
9+
return maybeEmbroider(app, {
10+
skipBabel: [
11+
{
12+
package: 'qunit',
13+
},
14+
],
15+
});
16+
};

files-override/tests/index.html

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>AppTemplate Tests</title>
6+
<meta name="description" content="" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1" />
8+
9+
{{content-for "head"}} {{content-for "test-head"}}
10+
11+
<link rel="stylesheet" href="/@embroider/core/vendor.css" />
12+
<link rel="stylesheet" href="/assets/app-template.css" />
13+
<link rel="stylesheet" href="/@embroider/core/test-support.css" />
14+
15+
{{content-for "head-footer"}} {{content-for "test-head-footer"}}
16+
</head>
17+
<body>
18+
{{content-for "body"}} {{content-for "test-body"}}
19+
20+
<div id="qunit"></div>
21+
<div id="qunit-fixture">
22+
<div id="ember-testing-container">
23+
<div id="ember-testing"></div>
24+
</div>
25+
</div>
26+
27+
<script src="/testem.js" integrity="" data-embroider-ignore></script>
28+
<script src="/@embroider/core/vendor.js"></script>
29+
<script src="/@embroider/core/test-support.js"></script>
30+
<script src="/@embroider/core/entrypoint" type="module"></script>
31+
<script src="/@embroider/core/test-entrypoint" type="module"></script>
32+
33+
{{content-for "body-footer"}} {{content-for "test-body-footer"}}
34+
</body>
35+
</html>

files/babel.config.cjs

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
let config;
2+
3+
// TODO - remove this once we have the better solution for injecting stage1 babel config into a real config file
4+
// this is needed because there are things (like ember-composible-helpers) that are now finding our babel config during
5+
// their stage1 build and historically they will never (99% of the time) have found any babel config.
6+
// we might need to keep something like this so that prebuild will never apply babel configs during stage1 i.e. a util
7+
// function that wraps your whole babel config
8+
if (
9+
process.env.EMBROIDER_PREBUILD ||
10+
process.env.EMBROIDER_TEST_SETUP_FORCE === "classic"
11+
) {
12+
config = {};
13+
} else {
14+
config = require("./node_modules/.embroider/_babel_config_");
15+
}
16+
17+
module.exports = config;

files/vite.config.mjs

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { defineConfig } from "vite";
2+
import {
3+
resolver,
4+
hbs,
5+
scripts,
6+
templateTag,
7+
optimizeDeps,
8+
compatPrebuild,
9+
assets,
10+
contentFor,
11+
} from "@embroider/vite";
12+
import { resolve } from "path";
13+
import { babel } from "@rollup/plugin-babel";
14+
15+
const root = "node_modules/.embroider/rewritten-app";
16+
17+
export default defineConfig(({ mode }) => {
18+
return {
19+
root,
20+
// esbuild in vite does not support decorators
21+
esbuild: false,
22+
cacheDir: resolve("node_modules", ".vite"),
23+
plugins: [
24+
hbs(),
25+
templateTag(),
26+
scripts(),
27+
resolver(),
28+
compatPrebuild(),
29+
assets(),
30+
contentFor(),
31+
32+
babel({
33+
babelHelpers: "runtime",
34+
35+
// this needs .hbs because our hbs() plugin above converts them to
36+
// javascript but the javascript still also needs babel, but we don't want
37+
// to rename them because vite isn't great about knowing how to hot-reload
38+
// them if we resolve them to made-up names.
39+
extensions: [".gjs", ".js", ".hbs", ".ts", ".gts"],
40+
}),
41+
],
42+
optimizeDeps: optimizeDeps(),
43+
publicDir: resolve(process.cwd(), "public"),
44+
server: {
45+
port: 4200,
46+
watch: {
47+
ignored: ["!**/node_modules/.embroider/rewritten-app/**"],
48+
},
49+
},
50+
build: {
51+
outDir: resolve(process.cwd(), "dist"),
52+
rollupOptions: {
53+
input: {
54+
main: resolve(root, "index.html"),
55+
...(shouldBuildTests(mode)
56+
? { tests: resolve(root, "tests/index.html") }
57+
: undefined),
58+
},
59+
},
60+
},
61+
};
62+
});
63+
64+
function shouldBuildTests(mode) {
65+
return mode !== "production" || process.env.FORCE_BUILD_TESTS;
66+
}

index.js

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
const Blueprint = require('ember-cli/lib/models/blueprint');
2+
const fs = require('fs-extra');
3+
const { join } = require('path');
4+
5+
const appBlueprint = Blueprint.lookup('app');
6+
7+
module.exports = {
8+
locals(options) {
9+
return appBlueprint.locals(options);
10+
},
11+
beforeInstall(options) {
12+
if (!appBlueprint) {
13+
throw new Error('Cannot find app blueprint for generating test-app!');
14+
}
15+
16+
return appBlueprint.install({
17+
...options,
18+
skipGit: true,
19+
});
20+
},
21+
22+
async afterInstall(options) {
23+
// there doesn't seem to be a way to tell ember-cli to not prompt to override files that were added in the beforeInstall
24+
// so I'm just copying a few over at this stage
25+
await fs.copy(join(__dirname, 'files-override'), options.target, {
26+
overwrite: true,
27+
});
28+
29+
// this.addPackagesToProject doesn't respect the packageManager that the blueprint specified 🙈 so we're skipping a level here
30+
let installTask = this.taskFor('npm-install');
31+
await installTask.run({
32+
'save-dev': true,
33+
verbose: false,
34+
packages: [
35+
'@embroider/core@unstable',
36+
'@embroider/vite@unstable',
37+
'@embroider/compat@unstable',
38+
'@embroider/test-setup@unstable',
39+
'vite',
40+
'@rollup/plugin-babel'
41+
],
42+
packageManager: options.packageManager,
43+
});
44+
45+
let uninstallTask = this.taskFor('npm-uninstall');
46+
await uninstallTask.run({
47+
'save-dev': true,
48+
verbose: false,
49+
packages: ['ember-fetch'],
50+
packageManager: options.packageManager,
51+
});
52+
53+
let packageJson = join(options.target, 'package.json');
54+
let json = await fs.readJSON(packageJson);
55+
56+
json.scripts = {
57+
...json.scripts,
58+
"build": "vite build",
59+
"start": "vite",
60+
"test:ember": "vite build --mode test && ember test --path dist"
61+
};
62+
63+
await fs.writeFile(packageJson, JSON.stringify(json, null, 2));
64+
},
65+
}

0 commit comments

Comments
 (0)