diff --git a/BUILD.gn b/BUILD.gn index b113353a888c..39f27aed2d0a 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -76,15 +76,7 @@ npm_action("atom_browserify_sandbox") { ":build_electron_definitions", ] - inputs = [ - # FIXME(zcbenz): The dependencies of these files are not listed here, so - # the generated file will be out-dated when dependencies are modified. - # Use a script to generate all dependencies and put them here. - "lib/sandboxed_renderer/init.js", - "lib/sandboxed_renderer/api/exports/electron.js", - "tsconfig.electron.json", - "tsconfig.json", - ] + inputs = auto_filenames.sandbox_browserify_deps outputs = [ "$target_gen_dir/js2c/preload_bundle.js", @@ -113,11 +105,7 @@ npm_action("atom_browserify_isolated") { ":build_electron_definitions", ] - inputs = [ - "lib/isolated_renderer/init.js", - "tsconfig.electron.json", - "tsconfig.json", - ] + inputs = auto_filenames.isolated_browserify_deps outputs = [ "$target_gen_dir/js2c/isolated_bundle.js", @@ -144,11 +132,7 @@ npm_action("atom_browserify_content_script") { ":build_electron_definitions", ] - inputs = [ - "lib/content_script/init.js", - "tsconfig.electron.json", - "tsconfig.json", - ] + inputs = auto_filenames.context_script_browserify_deps outputs = [ "$target_gen_dir/js2c/content_script_bundle.js", diff --git a/filenames.auto.gni b/filenames.auto.gni index 5191cda90fb6..0d729e8945d7 100644 --- a/filenames.auto.gni +++ b/filenames.auto.gni @@ -109,4 +109,73 @@ auto_filenames = { "docs/api/structures/upload-raw-data.md", "docs/api/structures/web-source.md", ] + + sandbox_browserify_deps = [ + "lib/browser/api/module-list.js", + "lib/common/api/deprecate.ts", + "lib/common/api/is-promise.js", + "lib/common/api/module-list.js", + "lib/common/api/native-image.js", + "lib/common/atom-binding-setup.ts", + "lib/common/buffer-utils.js", + "lib/common/crash-reporter.js", + "lib/common/error-utils.js", + "lib/common/web-view-methods.js", + "lib/renderer/api/crash-reporter.js", + "lib/renderer/api/desktop-capturer.js", + "lib/renderer/api/ipc-renderer.js", + "lib/renderer/api/remote.js", + "lib/renderer/api/web-frame.ts", + "lib/renderer/callbacks-registry.js", + "lib/renderer/chrome-api.ts", + "lib/renderer/content-scripts-injector.ts", + "lib/renderer/extensions/event.js", + "lib/renderer/extensions/i18n.js", + "lib/renderer/extensions/storage.js", + "lib/renderer/extensions/web-navigation.js", + "lib/renderer/inspector.ts", + "lib/renderer/ipc-renderer-internal-utils.ts", + "lib/renderer/ipc-renderer-internal.ts", + "lib/renderer/security-warnings.ts", + "lib/renderer/web-frame-init.ts", + "lib/renderer/web-view/guest-view-internal.ts", + "lib/renderer/web-view/web-view-attributes.ts", + "lib/renderer/web-view/web-view-element.ts", + "lib/renderer/web-view/web-view-impl.ts", + "lib/renderer/web-view/web-view-init.ts", + "lib/sandboxed_renderer/api/exports/electron.js", + "lib/sandboxed_renderer/api/module-list.js", + "lib/sandboxed_renderer/init.js", + "tsconfig.json", + "tsconfig.electron.json", + "package.json", + ] + + isolated_browserify_deps = [ + "lib/common/atom-binding-setup.ts", + "lib/isolated_renderer/init.js", + "lib/renderer/ipc-renderer-internal.ts", + "lib/renderer/web-view/web-view-element.ts", + "lib/renderer/window-setup.ts", + "tsconfig.json", + "tsconfig.electron.json", + "package.json", + ] + + context_script_browserify_deps = [ + "lib/common/atom-binding-setup.ts", + "lib/common/error-utils.js", + "lib/content_script/init.js", + "lib/renderer/chrome-api.ts", + "lib/renderer/extensions/event.js", + "lib/renderer/extensions/i18n.js", + "lib/renderer/extensions/storage.js", + "lib/renderer/extensions/web-navigation.js", + "lib/renderer/ipc-renderer-internal-utils.ts", + "lib/renderer/ipc-renderer-internal.ts", + "lib/renderer/window-setup.ts", + "tsconfig.json", + "tsconfig.electron.json", + "package.json", + ] } diff --git a/package.json b/package.json index c2d047f6e824..acc86d7d14a1 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,10 @@ "node script/lint.js --js --fix --only --", "git add" ], + "*.{js,ts,d.ts}": [ + "node script/gen-filenames.js", + "git add" + ], "*.{cc,mm,c,h}": [ "python script/run-clang-format.py -r -c --fix", "git add" diff --git a/script/gen-filenames.js b/script/gen-filenames.js index 4ae77b80a27f..33e789409a57 100644 --- a/script/gen-filenames.js +++ b/script/gen-filenames.js @@ -1,6 +1,9 @@ -const fs = require('fs') +const cp = require('child_process') +const fs = require('fs-extra') +const os = require('os') const path = require('path') +const rootPath = path.resolve(__dirname, '..') const gniPath = path.resolve(__dirname, '../filenames.auto.gni') const allDocs = fs.readdirSync(path.resolve(__dirname, '../docs/api')) @@ -10,13 +13,92 @@ const allDocs = fs.readdirSync(path.resolve(__dirname, '../docs/api')) .map(doc => `docs/api/structures/${doc}`) ) -fs.writeFileSync( - gniPath, - `# THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT BY HAND +const main = async () => { + const browserifyTargets = [ + { + name: 'sandbox_browserify_deps', + entry: 'lib/sandboxed_renderer/init.js' + }, + { + name: 'isolated_browserify_deps', + entry: 'lib/isolated_renderer/init.js' + }, + { + name: 'context_script_browserify_deps', + entry: 'lib/content_script/init.js' + } + ] + + await Promise.all(browserifyTargets.map(async browserifyTarget => { + const tmpDir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-filenames-')) + const child = cp.spawn('node', [ + 'node_modules/browserify/bin/cmd.js', + browserifyTarget.entry, + ...(browserifyTarget.name === 'sandbox_browserify_deps' ? [ + '-r', + './lib/sandboxed_renderer/api/exports/electron.js:electron' + ] : []), + '-t', + 'aliasify', + '-p', + '[', + 'tsify', + '-p', + 'tsconfig.electron.json', + ']', + '-o', + path.resolve(tmpDir, 'out.js'), + '--list' + ], { + cwd: path.resolve(__dirname, '..') + }) + let output = '' + child.stdout.on('data', chunk => { + output += chunk.toString() + }) + await new Promise((resolve, reject) => child.on('exit', (code) => { + if (code !== 0) return reject(new Error(`Failed to list browserify dependencies for entry: ${browserifyTarget.name}`)) + + resolve() + })) + + browserifyTarget.dependencies = output + .split('\n') + // Remove whitespace + .map(line => line.trim()) + // Ignore empty lines + .filter(line => line) + // Get the relative path + .map(line => path.relative(rootPath, line)) + // Only care about files in //electron + .filter(line => !line.startsWith('..')) + // Only care about our own files + .filter(line => !line.startsWith('node_modules')) + // Make the generated list easier to read + .sort() + // All browserify commands depend on the tsconfig and package json files + .concat(['tsconfig.json', 'tsconfig.electron.json', 'package.json']) + await fs.remove(tmpDir) + })) + + fs.writeFileSync( + gniPath, + `# THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT BY HAND auto_filenames = { api_docs = [ ${allDocs.map(doc => ` "${doc}",`).join('\n')} ] + +${browserifyTargets.map(target => ` ${target.name} = [ +${target.dependencies.map(dep => ` "${dep}",`).join('\n')} + ]`).join('\n\n')} +} +`) +} + +if (process.mainModule === module) { + main().catch((err) => { + console.error(err) + process.exit(1) + }) } -` -)