UNPKG

3.04 kBJavaScriptView Raw
1const { BaseTemplate } = require('@electron-forge/template-base');
2const { promisify } = require('util');
3const path = require('path');
4const readFile = promisify(require('fs').readFile);
5const writeFile = promisify(require('fs').writeFile);
6const rimraf = promisify(require('rimraf'));
7const ncp = promisify(require('ncp'));
8const {
9 emberBuildDir,
10 emberTestBuildDir,
11 packageOutDir,
12} = require('../lib/utils/build-paths');
13
14async function updateGitIgnore(dir) {
15 // add our ember build directories to .gitignore
16 let gitIgnorePath = path.join(dir, '.gitignore');
17 let contents = await readFile(gitIgnorePath);
18 await writeFile(
19 gitIgnorePath,
20 [
21 contents.toString(),
22 '# Ember build',
23 `${emberBuildDir}/`,
24 `${emberTestBuildDir}/`,
25 // `electron-packager` will automatically ignore the output directory, but
26 // if someone were to build once without specifying a custom output path,
27 // and then build with a custom output path, during the second build,
28 // `electron-packager` would only ignore the custom output path, and not the
29 // contents of `packageDir`, so it would package up all that previously
30 // built content in the second packaged application.
31 '# package/make output directory',
32 `${packageOutDir}/`,
33 '',
34 ].join('\n')
35 );
36}
37
38async function updatePackageJson(dir) {
39 // add our test and test build directories and the test directory to
40 // electron-packager's ignores
41 let packageJsonPath = path.join(dir, 'package.json');
42 let packageJson = JSON.parse(await readFile(packageJsonPath));
43 packageJson.config.forge.packagerConfig.ignore = [
44 emberTestBuildDir,
45 'tests',
46 ].map((dir) => `/${dir}(/|$)`); // these are regexes, not globs
47
48 // copy some fields from the Ember project's package.json
49 let parentPackageJson = JSON.parse(
50 await readFile(path.join(dir, '../package.json'))
51 );
52 const keysToCopy = ['name', 'version', 'description', 'author', 'license'];
53 for (let key of keysToCopy) {
54 if (Object.keys(parentPackageJson).includes(key)) {
55 packageJson[key] = parentPackageJson[key];
56 }
57 }
58
59 // special-case productName since forge creates it, but a lot of apps don't
60 packageJson.productName = parentPackageJson.productName || packageJson.name;
61 await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
62}
63
64class EmberElectronTemplates extends BaseTemplate {
65 constructor() {
66 super(...arguments);
67 this.templateDir = path.join(__dirname, 'files');
68 }
69
70 get devDependencies() {
71 return ['devtron'];
72 }
73 get dependencies() {
74 return ['electron-devtools-installer', 'electron-is-dev'];
75 }
76
77 async initializeTemplate(dir) {
78 await super.initializeTemplate(...arguments);
79
80 // delete source directory with default files
81 await rimraf(path.join(dir, 'src'));
82
83 // copy our initial content
84 await ncp(this.templateDir, dir);
85
86 await updateGitIgnore(dir);
87 await updatePackageJson(dir);
88 }
89}
90
91module.exports = new EmberElectronTemplates();