// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /** * **Note**: If you already have a `build.dart` in your application, we * recommend to use the `package:polymer/builder.dart` library instead. * Temporary deploy command used to create a version of the app that can be * compiled with dart2js and deployed. Following pub layout conventions, this * script will treat any HTML file under a package 'web/' and 'test/' * directories as entry points. * * From an application package you can run deploy by creating a small program * as follows: * * import "package:polymer/deploy.dart" as deploy; * main() => deploy.main(); * * This library should go away once `pub deploy` can be configured to run * barback transformers. */ library polymer.deploy; import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; import 'package:path/path.dart' as path; import 'src/build/common.dart' show TransformOptions; import 'src/build/runner.dart'; import 'transformer.dart'; main(List arguments) { var args = _parseArgs(arguments); if (args == null) exit(1); var test = args['test']; var outDir = args['out']; var options; if (test == null) { var transformOps = new TransformOptions( directlyIncludeJS: args['js'], contentSecurityPolicy: args['csp'], releaseMode: !args['debug']); options = new BarbackOptions(createDeployPhases(transformOps), outDir); } else { options = _createTestOptions( test, outDir, args['js'], args['csp'], !args['debug']); } if (options == null) exit(1); print('polymer/deploy.dart: creating a deploy target for ' '"${options.currentPackage}"'); runBarback(options) .then((_) => print('Done! All files written to "$outDir"')) .catchError(_reportErrorAndExit); } createDeployPhases(options) => new PolymerTransformerGroup(options).phases; BarbackOptions _createTestOptions(String testFile, String outDir, bool directlyIncludeJS, bool contentSecurityPolicy, bool releaseMode) { var testDir = path.normalize(path.dirname(testFile)); // A test must be allowed to import things in the package. // So we must find its package root, given the entry point. We can do this // by walking up to find pubspec.yaml. var pubspecDir = _findDirWithFile(path.absolute(testDir), 'pubspec.yaml'); if (pubspecDir == null) { print('error: pubspec.yaml file not found, please run this script from ' 'your package root directory or a subdirectory.'); return null; } var packageName = readCurrentPackageFromPubspec(pubspecDir); var phases = createDeployPhases(new TransformOptions( entryPoints: [path.relative(testFile, from: pubspecDir)], directlyIncludeJS: directlyIncludeJS, contentSecurityPolicy: contentSecurityPolicy, releaseMode: releaseMode)); return new BarbackOptions(phases, outDir, currentPackage: packageName, packageDirs: {packageName : pubspecDir}, transformTests: true); } String _findDirWithFile(String dir, String filename) { while (!new File(path.join(dir, filename)).existsSync()) { var parentDir = path.dirname(dir); // If we reached root and failed to find it, bail. if (parentDir == dir) return null; dir = parentDir; } return dir; } void _reportErrorAndExit(e, trace) { print('Uncaught error: $e'); if (trace != null) print(trace); exit(1); } ArgResults _parseArgs(arguments) { var parser = new ArgParser() ..addFlag('help', abbr: 'h', help: 'Displays this help message.', defaultsTo: false, negatable: false) ..addOption('out', abbr: 'o', help: 'Directory to generate files into.', defaultsTo: 'out') ..addOption('test', help: 'Deploy the test at the given path.\n' 'Note: currently this will deploy all tests in its directory,\n' 'but it will eventually deploy only the specified test.') ..addFlag('js', help: 'deploy replaces *.dart scripts with *.dart.js. This flag \n' 'leaves "packages/browser/dart.js" to do the replacement at runtime.', defaultsTo: true) ..addFlag('debug', help: 'run in debug mode. For example, use the debug versions of the \n' 'polyfills (shadow_dom.debug.js and custom-elements.debug.js) \n' 'instead of the minified versions.', defaultsTo: false) ..addFlag('csp', help: 'replaces *.dart with *.dart.precompiled.js to comply with \n' 'Content Security Policy restrictions.'); try { var results = parser.parse(arguments); if (results['help']) { _showUsage(parser); return null; } return results; } on FormatException catch (e) { print(e.message); _showUsage(parser); return null; } } _showUsage(parser) { print('Usage: dart --package-root=packages/ ' 'package:polymer/deploy.dart [options]'); print(parser.getUsage()); }