/*
 * Licensed to the Apache Software Foundation (ASF
 * or more contributor license agreements.  See th
 * distributed with this work for additional infor
 * regarding copyright ownership.  The ASF license
 * to you under the Apache License, Version 2.0 (t
 * "License"); you may not use this file except in
 * with the License.  You may obtain a copy of the
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to
 * software distributed under the License is distr
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 * KIND, either express or implied.  See the Licen
 * specific language governing permissions and lim
 * under the License.
 */

var fs = require('fs');
var writeContents = require('./write-contents');
var stripHeader = require('./strip-header');

module.exports = function writeScript (oFile, fileName, debug) {
    var contents = fs.readFileSync(fileName, 'utf8');
    contents = stripHeader(contents, fileName);
    writeContents(oFile, fileName, contents, debug);
};
