/*
 * 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);
}
