diff --git a/snippets/copyright/index.js b/snippets/copyright/index.js new file mode 100644 index 0000000..e6a3767 --- /dev/null +++ b/snippets/copyright/index.js @@ -0,0 +1,153 @@ +/* + * Copyright (C) Sapphirecode - All Rights Reserved + * This file is part of snippeteer which is released under BSD-3-Clause. + * See file 'LICENSE' for full license details. + * Created by Timo Hocker , March 2020 + */ + +/* eslint-disable no-sync */ +/* eslint-disable no-console */ + +'use strict'; + +const fs = require ('fs-extra'); +const path = require ('path'); + +/** + * @param {string} folder folder to scan + * @param {Function} func function to execute on file contents + */ +async function map_all_files (folder, func) { + const files = await fs.readDir (folder); + for (const file of files) { + if ([ 'node_modules' ].includes (file)) + continue; + const abs_path = path.join (folder, file); + if (await fs.stat (abs_path).isDirectory) + map_all_files (abs_path, func); + + const data = await fs.readFile (abs_path); + const res = func (data); + if (res === null) + continue; + await fs.writeFile (abs_path, res); + } +} + +/** + * @param {string} license license name + * @param {string} software software name + * @returns {string} copyright notice + */ +function get_copyright_notice (license = '', software = '') { + let notice = ''; + if (license) { + notice = `${'/*'} + * Copyright (C) Sapphirecode - All Rights Reserved + * This file is part of ${software} which is released under ${license}. + * See file 'LICENSE' for full license details. + * Created by Timo Hocker , ${month} ${year} + */ + +`; + } + else { + notice = `${'/*'} + * Copyright (C) Sapphirecode - All Rights Reserved + * Created by Timo Hocker , ${month} ${year} + */ + +`; + } + return notice; +} + +/** + * @param folder + * @param license + */ +function fix_all_copy (folder, license) { + const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\//g; + map_all_files (folder, (data) => { + if (!regex.test (data)) + return null; + return get_copyright_notice (license) + data.replace (regex, ''); + }); +} + +/** + * copies the full template to a new folder named after arg[0] + * + * @param {string} folder folder to run in + * @param {Array} args function arguments + */ +function run (folder, args) { + const snip_folder_path = [ folder ]; + if (args.length > 0) + snip_folder_path.push (args[0]); + const snip_folder = path.join (...snip_folder_path); + const template = path.join (__dirname, 'template'); + if (!fs.existsSync (snip_folder)) + fs.mkdir (snip_folder); + for (const f of fs.readdirSync (template)) { + fs.copy ( + path.join (template, f), + path.join (snip_folder, f), + { + recursive: true, + filter: (src, dest) => !fs.existsSync (dest) + } + ); + } +} + +/** + * checks if the arguments meet the requirements + * + * @param {string} folder folder to run in + * @param {Array} args function arguments + * @returns {boolean} true if arguments match requirements + */ +function assert (folder, args) { + const tests = [ + { + f: () => (args.length < 2), + reason: 'too many arguments' + }, + { + f: () => (args.length === 0 || typeof args[0] === 'string'), + reason: 'name is not a string' + }, + { + f: () => (args.length === 0 || (/^[a-z]+$/iu).test (args[0])), + reason: 'name can only contain [a-z]' + }, + { + f: () => (typeof folder === 'string'), + reason: 'cwd is not a folder (internal error)' + }, + { + f: () => (fs.existsSync (folder)), + reason: 'cwd does not exist (internal error)' + }, + { + f: () => (args.length === 1 || fs.readdirSync (folder).length === 0), + reason: 'folder is not empty' + }, + { + f: () => (args.length === 0 + || !fs.existsSync (path.join (folder, args[0]))), + reason: 'folder already exists' + } + ]; + for (const test of tests) { + if (!test.f ()) { + console.log (test.reason); + return false; + } + } + + return true; +} + +module.exports = { run, assert }; diff --git a/snippets/db/dot_parser.js b/snippets/db/dot_parser.js index 994d245..83b5de5 100644 --- a/snippets/db/dot_parser.js +++ b/snippets/db/dot_parser.js @@ -1,4 +1,5 @@ /* eslint-disable no-magic-numbers */ +/* eslint-disable no-console */ 'use strict';