Compare commits

..

89 Commits

Author SHA1 Message Date
ba16c60168 remove database snippet 2020-07-04 16:49:16 +02:00
46be34c4b0 add copyright 2020-06-28 17:02:46 +02:00
3e773b5327 fix 2020-06-28 16:55:44 +02:00
146c9b661f initial menu design, simpler patch serialization 2020-06-28 14:51:37 +02:00
214b113865 complete feature 2020-06-27 19:50:34 +02:00
336edb84b1 fix 2020-06-27 19:42:46 +02:00
d7d30fd417 carry previous date string 2020-06-27 19:36:46 +02:00
6ff99c827d update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.14 ==> 1.1.16 minor
@sapphirecode/standard: 1.1.7 ==> 1.1.8 minor
@types/node: 14.0.13 ==> 14.0.14 minor
eslint: 7.3.0 ==> 7.3.1 minor
2020-06-24 13:01:13 +02:00
e3ddb9a069 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.13 ==> 1.1.14 minor
@sapphirecode/standard: 1.1.6 ==> 1.1.7 minor
eslint: 7.2.0 ==> 7.3.0 minor
2020-06-22 08:31:34 +02:00
1519290c1d update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.12 ==> 1.1.13 minor
2020-06-19 13:19:13 +02:00
e617141a5c update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.11 ==> 1.1.12 minor
@sapphirecode/standard: 1.1.5 ==> 1.1.6 minor
@types/node: 14.0.10 ==> 14.0.13 minor
eslint: 7.1.0 ==> 7.2.0 minor
typescript: 3.9.3 ==> 3.9.5 minor
2020-06-11 20:41:27 +02:00
830c82d69d update-scanner: automatic update
@sapphirecode/standard: 1.1.4 ==> 1.1.5 minor
@types/node: 14.0.9 ==> 14.0.10 minor
fs-extra: 9.0.0 ==> 9.0.1 minor
2020-06-04 11:44:37 +02:00
aba411a17a update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.10 ==> 1.1.11 minor
@sapphirecode/standard: 1.1.3 ==> 1.1.4 minor
@types/node: 14.0.5 ==> 14.0.9 minor
2020-06-02 08:58:26 +02:00
92cb9d5c21 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.9 ==> 1.1.10 minor
2020-05-28 08:57:02 +02:00
32deb35fec fix 2020-05-24 19:43:13 +02:00
cd7041c2e1 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.1.7 ==> 1.1.9 minor
@sapphirecode/standard: 1.0.28 ==> 1.1.3 minor
@types/fs-extra: 9.0.0 ==> 9.0.1 minor
@types/node: 14.0.1 ==> 14.0.5 minor
eslint: 7.0.0 ==> 7.1.0 minor
typescript: 3.9.2 ==> 3.9.3 minor
2020-05-23 18:33:05 +02:00
97d4756eb1 update 2020-05-17 19:55:04 +02:00
b1a53a3ad1 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.0.45 ==> 1.1.7 minor
@sapphirecode/standard: 1.0.18 ==> 1.0.28 minor
@types/fs-extra: 8.1.0 ==> 9.0.0 major
@types/node: 13.13.6 ==> 14.0.1 major
eslint: 6.8.0 ==> 7.0.0 major
2020-05-17 19:49:50 +02:00
c54fba0483 fix 2020-05-17 16:12:00 +02:00
c68be00e16 update jenkins.js 2020-05-15 13:17:34 +02:00
08ec8d9182 fix 2020-05-13 21:12:29 +02:00
190f20c7b9 fix readme 2020-05-13 21:09:03 +02:00
d55b752958 remove link to package quality, as the site seems to be unmaintained 2020-05-13 21:06:20 +02:00
b87c5bf2f1 adapt jenkins.js 2020-05-13 16:08:05 +02:00
9a0a4a4201 add version to readme 2020-05-13 11:39:46 +02:00
8e3a19221d update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.0.44 ==> 1.0.45 minor
@sapphirecode/standard: 1.0.14 ==> 1.0.18 minor
@types/node: 13.13.5 ==> 14.0.1 major
eslint: 6.8.0 ==> 7.0.0 major
typescript: 3.8.3 ==> 3.9.2 minor
2020-05-13 11:15:26 +02:00
a6da0f6836 description without blockquote 2020-05-11 12:21:18 +02:00
21411e8684 fixing badge again 2020-05-11 12:20:46 +02:00
20e66788c2 fix 2020-05-11 12:18:39 +02:00
f4b7366d49 readme 2020-05-11 12:12:28 +02:00
4e76cf3d5c disable wip snippets 2020-05-11 12:01:39 +02:00
f0a67a5d84 fix 2020-05-11 11:34:16 +02:00
be004c5e02 readme template 2020-05-11 11:33:34 +02:00
8880a72560 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.0.43 ==> 1.0.44 minor
@sapphirecode/standard: 1.0.13 ==> 1.0.14 minor
2020-05-08 13:53:34 +02:00
3545ba6a48 fix 2020-05-08 09:58:49 +02:00
6b0b40a292 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.0.41 ==> 1.0.43 minor
2020-05-07 19:35:02 +02:00
c25b352041 fixes 2020-05-07 18:40:35 +02:00
ab66113c89 update-scanner: automatic update
@sapphirecode/eslint-config-ts: 1.0.38 ==> 1.0.41 minor
@sapphirecode/standard: 1.0.12 ==> 1.0.13 minor
2020-05-07 10:43:39 +02:00
3a5cc47424 update-scanner: automatic update
@sapphirecode/standard: 1.0.11 ==> 1.0.12 minor
2020-05-06 10:10:07 +02:00
3bc5d16f8a update 2020-05-06 08:36:48 +02:00
83b5cd054b fix 2020-05-06 07:50:58 +02:00
cb169f9242 fix 2020-05-06 07:45:16 +02:00
5ec439cd1e fix 2020-05-06 07:33:11 +02:00
048dee838a fix publish 2020-05-05 19:50:17 +02:00
1b182c9932 move to @sapphirecode scope 2020-05-05 19:23:52 +02:00
476111c1b6 update-scanner: automatic update
@scode/standard: 1.0.7 ==> 1.0.8 minor
2020-05-04 21:52:22 +02:00
e8b22b84ca update-scanner: automatic update
@scode/eslint-config-ts: 1.0.29 ==> 1.0.31 minor
@scode/standard: 1.0.4 ==> 1.0.7 minor
2020-05-04 21:20:18 +02:00
ebff7dc7f4 update 2020-05-04 12:32:17 +02:00
c9fd021634 fixes, option for no tests 2020-05-04 12:31:38 +02:00
91869b3183 standardization 2020-05-04 12:23:06 +02:00
a7180f9e50 update-scanner: automatic update
@scode/eslint-config-ts: 1.0.27 ==> 1.0.29 minor
2020-05-03 18:35:14 +02:00
bbdfaf1791 update-scanner: automatic update
@scode/eslint-config-ts: 1.0.26 ==> 1.0.27 minor
2020-05-02 17:18:41 +02:00
6e48707ec2 update-scanner: automatic update
@scode/eslint-config-ts: 1.0.23 ==> 1.0.26 minor
2020-04-28 07:43:37 +02:00
0d1b3aac2e fix 2020-04-27 13:54:10 +02:00
9663fc3579 update-scanner: automatic update
@scode/eslint-config-ts: 1.0.22 ==> 1.0.23 minor
@types/node: 13.13.2 ==> 13.13.4 minor
2020-04-27 13:04:23 +02:00
d38cfb041c log error instead of promise rejection 2020-04-27 10:18:12 +02:00
deacaa76a1 ignore d.ts files 2020-04-27 10:12:51 +02:00
650cdf7476 fix 2020-04-27 08:51:53 +02:00
0edf59ba24 fix 2020-04-26 12:07:23 +02:00
cae2b2ad75 fix 2020-04-26 12:04:10 +02:00
b69e6a36c3 license in file + package json 2020-04-26 11:57:42 +02:00
cd7c757daf tsc on test when typescript on 2020-04-26 11:57:32 +02:00
a6e607334c remove unnecessary file 2020-04-26 11:45:22 +02:00
f95226c7f0 remove trailing space 2020-04-24 12:08:30 +02:00
45b64b3aca fix 2020-04-24 10:19:02 +02:00
32410bab93 output declarations by default 2020-04-23 18:09:42 +02:00
17bf48d7cc fix 2020-04-23 17:58:04 +02:00
8bc26b384e fixes 2020-04-23 17:51:19 +02:00
fee3f55300 fix 2020-04-23 17:44:14 +02:00
4dcfde8316 fixes 2020-04-23 17:39:18 +02:00
592b02226d update yarn.lock 2020-04-23 17:38:12 +02:00
f8f7c5d91c Merge branch 'dev'
# Conflicts:
#	yarn.lock
2020-04-23 17:37:05 +02:00
3ea7163e17 add eslintrc for ts 2020-04-23 17:30:12 +02:00
7a563862af don't initialize index files 2020-04-23 17:07:54 +02:00
5a6c874425 add compile script to typescript 2020-04-23 16:38:29 +02:00
3160ccd49c add typescript support to node snippet 2020-04-23 16:19:31 +02:00
d0c3e333a0 update-scanner: automatic update
@scode/eslint-config: 2.0.10 ==> 2.0.11 minor
2020-04-21 11:19:00 +02:00
b7706f9a42 implementing patches 2020-04-19 18:49:07 +02:00
858d778039 database structure 2020-04-18 20:43:02 +02:00
dde41c085e fixes 2020-04-18 19:00:27 +02:00
168fc577d9 fix 2020-04-18 17:45:39 +02:00
c0c2881020 fixes 2020-04-18 17:43:13 +02:00
f383ed0ce4 complete other snippets 2020-04-18 17:24:41 +02:00
3c44614298 fix 2020-04-16 08:05:46 +02:00
fa5c631d23 don't ask for save if loaded from config 2020-04-16 08:04:58 +02:00
1feda9d44f fix 2020-04-16 08:02:35 +02:00
6a525d8120 dialog fix 2020-04-16 08:00:53 +02:00
05d4839dea license config, copyright notices 2020-04-16 07:45:48 +02:00
2094287af8 save settings 2020-04-16 07:42:32 +02:00
43 changed files with 1223 additions and 3170 deletions

View File

@ -1 +1,2 @@
**/*.d.ts
/dist/

View File

@ -1,24 +1,22 @@
/*
* Copyright (C) Sapphirecode - All Rights Reserved
* 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 <timo@scode.ovh>, March 2020
* Created by Timo Hocker <timo@scode.ovh>, May 2020
*/
'use strict';
module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@scode'
],
extends: [ '@sapphirecode' ],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}
parserOptions: { ecmaVersion: 2018 }
};

1
.gitignore vendored
View File

@ -3,3 +3,4 @@
# stryker temp files
.stryker-tmp
*.log

8
.liconfig.json Normal file
View File

@ -0,0 +1,8 @@
{
"has_license": true,
"license": "BSD-3-Clause",
"author": "Timo Hocker",
"company": "SapphireCode",
"email": "timo@scode.ovh",
"software": "Snippeteer"
}

1
.npmrc
View File

@ -1 +0,0 @@
@scode:registry=https://npm.scode.ovh

21
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,21 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\index.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
"console": "externalTerminal"
}
]
}

18
CHANGELOG.md Normal file
View File

@ -0,0 +1,18 @@
# Changelog
## 1.3.0
Copyright function: carry previous creation date to prevent unnecessary modifications
## 1.2.0
- Fully interactive snippets
- db migration generator removed (new snipped in development)
## 1.1.0
Knex database migration generator
## 1.0.0
initial version

2
Jenkinsfile vendored
View File

@ -5,7 +5,7 @@ pipeline {
VERSION = VersionNumber([
versionNumberString:
'${BUILDS_ALL_TIME}',
versionPrefix: '1.2.',
versionPrefix: '1.3.',
worstResultForIncrement: 'SUCCESS'
])
}

30
LICENSE
View File

@ -1,29 +1,11 @@
Copyright (c) 2020, Timo Hocker
Copyright (c) <year> <author>. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
All rights reserved.
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of snippeteer nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,60 +1,57 @@
# Snippeteer
# @sapphirecode/snippeteer
version: 1.3.x
macros for setting up projects or project parts
## Installation
to work with the @scode scope you have to add the following line to your npmrc.
for this particular one you'll have to add it to the global npmrc stored in your home folder (~/.npmrc)
> npm i -g @sapphirecode/snippeteer
```npmrc
@scode:registry=https://npm.scode.ovh
```
## Requirements
then install the module using the following command
installed on the system:
```sh
npm i -g @scode/snippeteer
```
- yarn
- git
## Usage
```sh
snippeteer [snippet] [..args]
```
run `snippeteer` in console and choose a snippet, all necessary parameters will
be asked interactively
All snippets will be executed relative to your current working directory!
### Snippets
## Snippets
#### copyright
### Snippet
add copyright notice to .js, .ts and .mjs files, as well was generating a
license file and adding fields like author and license to the package.json
Creates a new snippet template
#### jenkins
```sh
snippeteer snippet [name]
```
create a generic jenkinsfile
### Node
for node projects: automatically generates a jenkinsfile and jenkins.js for easy
use in jenkins.
Creates a new nodejs project
necessary scripts in the package.json:
```sh
snippeteer node [name]
```
- ci: `yarn --frozen-lockfile && node jenkins.js`
- compile: `tsc` or
`tsc --allowJs --declaration --emitDeclarationOnly index.js`, ...
### Jenkins
compile should be the general compile task, for typescript: tsc, for commonjs:
creating type definitions, ...
Adds files necessary for jenkins
#### node
optionally with a js script for npm modules by adding 'node' as argument
initializes a node project with the standard structure used by sapphirecode
modules
```sh
snippeteer jenkins [node]
```
#### readme
### Vue
create a template readme file
Adds files, dependencies and scripts for vue to a nodejs project
## License
```sh
snippeteer vue
```
BSD-3-Clause © Timo Hocker <timo@scode.ovh>

View File

@ -1,5 +1,12 @@
#!/usr/bin/env node
/*
* 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 <timo@scode.ovh>, May 2020
*/
'use strict';
// @ts-ignore

View File

@ -1,33 +1,29 @@
/*
* Copyright (C) Sapphirecode - All Rights Reserved
* 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 <timo@scode.ovh>, March 2020
* Created by Timo Hocker <timo@scode.ovh>, June 2020
*/
/* eslint-disable no-process-exit */
/* eslint-disable no-console */
/* eslint-disable no-sync */
'use strict';
const https = require ('https');
const fs = require ('fs');
const child_process = require ('child_process');
const { execSync: exec_sync } = require ('child_process');
const pkg = JSON.parse (fs.readFileSync ('package.json', 'utf-8'));
[
,, pkg.version
const run_file = fs.createWriteStream ('.jenkins.run.js');
const [
,, ...args
] = process.argv;
fs.writeFileSync ('package.json', JSON.stringify (pkg, null, 2));
child_process.execSync ('yarn lint', { stdio: 'inherit' });
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.test === 'string')
child_process.execSync ('yarn test', { stdio: 'inherit' });
child_process.exec ('git log -1 | grep \'\\[no publish\\]\'')
.addListener ('exit', (code) => {
if (code === 0) {
console.log ('build not marked for deployment');
process.exit (1);
}
else { child_process.execSync ('yarn publish'); }
run_file.on ('close', () => {
exec_sync (`node .jenkins.run.js ${args.join (' ')}`, { stdio: 'inherit' });
});
https.get (
'https://git.scode.ovh/Timo/standard/raw/branch/master/jenkins.run.js',
(msg) => {
msg.pipe (run_file);
}
);

View File

@ -1,24 +1,24 @@
/*
* Copyright (C) Sapphirecode - All Rights Reserved
* 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 <timo@scode.ovh>, March 2020
* Created by Timo Hocker <timo@scode.ovh>, May 2020
*/
/* eslint-disable */
'use strict';
module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@scode/eslint-config-ts'
],
extends: [ '@sapphirecode/eslint-config-ts' ],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}
parserOptions: { ecmaVersion: 2018 }
};

66
lib/Helper.ts Normal file
View File

@ -0,0 +1,66 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
import path from 'path';
import child_process from 'child_process';
import fs from 'fs-extra';
/**
* write a template to a file
*
* @param contents - file contents
* @param destination - file destination
*/
async function apply_template (
contents: string,
destination: string
): Promise<void> {
const dst = path.join (process.cwd (), destination);
if (!await fs.pathExists (dst)) {
await fs.mkdirp (path.dirname (dst));
await fs.writeFile (dst, contents);
}
}
type JSONMutator = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(json: any): any;
}
/**
* modify a json file
*
* @param func - function that modifies the object
* @param json_path - path of json file
*/
async function modify_json (
func: JSONMutator,
json_path = 'package.json'
): Promise<void> {
const file_path = path.join (process.cwd (), json_path);
const content = JSON.parse (await fs.readFile (file_path, 'utf-8'));
const new_obj = await func (content);
if (typeof new_obj === 'undefined' || new_obj === null)
return;
await fs.writeFile (file_path, JSON.stringify (new_obj, null, 2));
}
/**
* run a command
*
* @param command - command to run
* @param folder - folder to run in
*/
function run_command (command: string, folder = ''): void {
// eslint-disable-next-line no-sync
child_process.execSync (
command,
{ cwd: path.join (process.cwd (), folder), stdio: 'inherit' }
);
}
export { modify_json, apply_template, run_command };

View File

@ -1,3 +1,11 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
export interface Snippet {
is_active(): boolean;
start(cwd: string): Promise<void>;
}

4
lib/asset.d.ts vendored
View File

@ -1,4 +0,0 @@
declare module '*.asset' {
const content: any;
export default content;
}

13
lib/dialog.ts Normal file
View File

@ -0,0 +1,13 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
export class DialogHandler {
public static catch (): void {
// eslint-disable-next-line no-process-exit
process.exit ();
}
}

7
lib/enquirer.d.ts vendored
View File

@ -1 +1,8 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
declare module 'enquirer';

View File

@ -1,3 +1,10 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
import path from 'path';
import fs from 'fs-extra';
import { AutoComplete } from 'enquirer';
@ -5,15 +12,22 @@ import { Snippet } from './Snippet';
(async (): Promise<void> => {
const snippets = await fs.readdir (path.join (__dirname, 'snippets'));
const snippet = await new AutoComplete (
{
const runners: Record<string, Snippet> = {};
await Promise.all (
snippets.map (async (s) => {
const runner = (new (
await import (`./snippets/${s}/index.js`)
).default) as Snippet;
runners[s] = runner;
})
);
const snippet = await new AutoComplete ({
name: 'snippet',
message: 'choose a snippet',
choices: snippets
}
)
choices: snippets.filter ((s) => runners[s].is_active ())
})
.run ();
const runner
= new (await import (`./snippets/${snippet}/index.js`)).default as Snippet;
runner.start (process.cwd ());
}) ();
runners[snippet].start (process.cwd ());
}) ()
// eslint-disable-next-line no-console
.catch ((e) => console.log (e));

View File

@ -1,14 +1,26 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
import { CopyrightOptions } from './copyright_options';
export class CopyrightGenerator {
public static get_copyright_notice (
opt: CopyrightOptions
opt: CopyrightOptions,
date_str?: string
): string {
let notice = '';
let date_string = date_str;
if (typeof date_str === 'undefined') {
const date = (new Date);
const dtf = new Intl.DateTimeFormat ('en', { month: 'long' });
const year = date.getFullYear ();
const month = dtf.format (date);
date_string = `${month} ${year}`;
}
if (opt.has_license) {
notice = `${'/*'}
@ -16,7 +28,7 @@ export class CopyrightGenerator {
* This file is part of ${opt.software} which is released under ${
opt.license}.
* See file 'LICENSE' for full license details.
* Created by ${opt.author} <${opt.email}>, ${month} ${year}
* Created by ${opt.author} <${opt.email}>, ${date_string}
*/
`;
@ -24,7 +36,7 @@ export class CopyrightGenerator {
else {
notice = `${'/*'}
* Copyright (C) ${opt.company || opt.author} - All Rights Reserved
* Created by ${opt.author} <${opt.email}>, ${month} ${year}
* Created by ${opt.author} <${opt.email}>, ${date_string}
*/
`;

View File

@ -1,3 +1,10 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
export class CopyrightOptions {
public has_license = false;
public license = '';

View File

@ -1,3 +1,10 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
/* eslint-disable no-await-in-loop */
import path from 'path';
import fs from 'fs-extra';
@ -5,7 +12,7 @@ import fs from 'fs-extra';
export class FileMapper {
public static async map_all_files (
folder: string,
mutator: Function,
mutator: (data: string, file: string, args: Array<unknown>) => string|null,
args: Array<unknown> = []
): Promise<void> {
const files = await fs.readdir (folder);

View File

@ -1,87 +1,155 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
/* eslint-disable no-await-in-loop */
import path from 'path';
import fs from 'fs-extra';
import { Confirm, Input, AutoComplete } from 'enquirer';
// eslint-disable-next-line id-match
import { findLicense } from 'license';
import { findLicense, getLicense } from 'license';
import { Snippet } from '../../Snippet';
import { DialogHandler } from '../../dialog';
import { modify_json } from '../../Helper';
import { CopyrightGenerator } from './copyright_generator';
import { FileMapper } from './file_mapper';
import { CopyrightOptions } from './copyright_options';
export default class Copyright implements Snippet {
public is_active (): boolean {
return true;
}
private _options: CopyrightOptions | null = null;
private _cwd = '';
private _loaded_from_config = false;
async start (cwd: string): Promise<void> {
const options = (await this.load_options_file (cwd))
|| (await this.gather_options ());
this._cwd = cwd;
await this.load_options_file ();
if (!this._options)
await this.gather_options ();
const options = this._options as CopyrightOptions;
await FileMapper.map_all_files (
cwd,
Copyright.fix_file_license,
[ options ]
this._cwd,
this.fix_file_license.bind (this)
);
await modify_json ((json) => {
json.author = `${options.author} <${options.email}>`;
json.license = options.has_license ? options.license : 'UNLICENSED';
return json;
});
if (options.has_license) {
await fs.writeFile (
path.join (cwd, 'LICENSE'),
getLicense (options.license, {
name: options.author,
email: options.email,
project: options.software
})
);
}
private async gather_options (): Promise<CopyrightOptions> {
const options = (new CopyrightOptions);
options.author = await new Input ({ message: 'author' })
.run ();
options.email = await new Input ({ message: 'email' })
.run ();
options.company = await new Input ({ message: 'company' })
.run ();
options.software = await new Input ({ message: 'software name' })
.run ();
options.has_license = await new Confirm ({
message:
'would you like to specify a license?'
})
.run ();
if (options.has_license) {
options.license = await new AutoComplete ({
if (
!this._loaded_from_config
&& (await new Confirm (
{ message: 'should those settings be saved for the next run?' }
)
.run ()
.catch (DialogHandler.catch))
)
this.save_options_file ();
}
private async gather_options (): Promise<void> {
this._options = (new CopyrightOptions);
this._options.author = await new Input ({ message: 'author' })
.run ()
.catch (DialogHandler.catch);
this._options.email = await new Input ({ message: 'email' })
.run ()
.catch (DialogHandler.catch);
this._options.company = await new Input ({ message: 'company' })
.run ()
.catch (DialogHandler.catch);
this._options.software = await new Input ({ message: 'software name' })
.run ()
.catch (DialogHandler.catch);
this._options.has_license = await new Confirm (
{ message: 'would you like to specify a license?' }
)
.run ()
.catch (DialogHandler.catch);
if (this._options.has_license) {
this._options.license = await new AutoComplete ({
name: 'license',
message: 'choose a license',
limit: 10,
choices: findLicense ('')
})
.run ();
.run ()
.catch (DialogHandler.catch);
}
}
return options;
}
private async load_options_file
(folder: string): Promise<CopyrightOptions|null> {
const file_path = path.join (folder, '.liconfig.json');
private async load_options_file (): Promise<void> {
const file_path = path.join (this._cwd, '.liconfig.json');
this._options = null;
if (await fs.pathExists (file_path)) {
return JSON.parse (
await fs.readFile (file_path, 'utf-8')
const options = JSON.parse (await fs.readFile (file_path, 'utf-8'));
// eslint-disable-next-line no-console
console.log (`author: ${options.author}
email: ${options.email}
company: ${options.company}
software name: ${options.software}
license: ${options.license}`);
const should_load = await new Confirm (
{ message: 'should those options be used?' }
)
.run ()
.catch (DialogHandler.catch);
if (should_load) {
this._options = options;
this._loaded_from_config = true;
}
}
}
private async save_options_file (): Promise<void> {
const file_path = path.join (this._cwd, '.liconfig.json');
await fs.writeFile (
file_path,
JSON.stringify (this._options, null, 2),
'utf-8'
);
}
return null;
}
private async save_options_file
(folder: string, options: CopyrightOptions): Promise<void> {
const file_path = path.join (folder, '.liconfig.json');
await fs.writeFile (file_path, JSON.stringify (options, null, 2), 'utf-8');
}
private static fix_file_license (
data: string,
filename: string,
[ options ]: [CopyrightOptions]
): string | null {
const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\/\n{0,2}/gu;
private fix_file_license (data: string, filename: string): string | null {
// eslint-disable-next-line max-len
const regex = /\/\*\s+\*\sCopyright[\s\S]*?(?:Created by.*?, (?<date>[a-z]+ [0-9]+)[\s\S]*?|\s)\*\/\n{0,2}/gui;
const shebang = /^#!.*?\n\n/gu;
const shebang_line = shebang.exec (data);
if (!(/\.(?:js|ts|mjs)$/u).test (filename) && !regex.test (data))
return null;
return (shebang_line ? shebang_line[0] : '')
+ CopyrightGenerator.get_copyright_notice (options)
const res = regex.exec (data);
return (
(shebang_line ? shebang_line[0] : '')
+ CopyrightGenerator.get_copyright_notice (
this._options as CopyrightOptions,
res?.groups?.date
)
+ data.replace (regex, '')
.replace (shebang, '');
.replace (shebang, '')
);
}
}

View File

@ -1,228 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
/* eslint-disable no-magic-numbers */
/* eslint-disable no-console */
'use strict';
const fs = require ('fs-extra');
/**
* convert short type notation to knex notation
*
* @param {string} short short type
* @returns {string} type
*/
function get_type (short) {
switch (short) {
case '\'\'':
return 'string';
case '#':
return 'integer';
case '#.#':
return 'double';
case '✓':
return 'boolean';
case '🖹':
return 'text';
case '🕓':
return 'timestamp';
default:
return '';
}
}
/**
* returns columns and attributes for a table
*
* @param {string} str table definition
* @returns {object} table info
*/
function get_table_info (str) {
const lines = str.split (/\n/ug);
lines.splice (0, 2);
lines.splice (lines.length - 2, 2);
const name_line = lines.shift ();
const { name } = (/<b>(?<name>\S+)<\/b>/u).exec (name_line).groups;
const columns = [];
while (lines.length > 0) {
const col = {};
const l = lines.shift ();
const regex = /<tr><td.*?>(?<props>.*?)<\/td><\/tr>/u;
const data = regex.exec (l).groups.props.split (/\s+/gu);
if (data.length === 3 || data[0] === '🔑') {
const opt = data.shift ();
if (opt === '★')
col.unique = true;
if (opt === '🔑')
col.type = 'increments';
}
col.name = data.shift ();
if (data.length > 0)
col.type = get_type (data.shift ());
if (typeof col.type === 'undefined')
console.error (`column type is undefined: ${col.name} table: ${name}`);
columns.push (col);
}
return { name, columns, foreign_keys: [] };
}
/**
* get all tables from a structure file
*
* @param {string} file path to the structure file
* @returns {Promise<object>} tables and foreign keys
*/
async function get_tables (file) {
const lines = (await fs.readFile (file, 'utf-8')).split (/\n/gu);
const curr = [];
const tables = [];
const foreign = [];
for (const l of lines) {
if (curr.length > 0 || (/\S+ \[label=</u).test (l))
curr.push (l);
if ((/>.*?\]/u).test (l)) {
const val = curr.join ('\n');
if (val)
tables.push (get_table_info (val));
curr.splice (0, curr.length);
}
get_foreign_key (l, foreign);
}
for (const fk of foreign) {
for (let i = 0; i < tables.length; i++) {
if (tables[i].name === fk.table) {
tables[i].foreign_keys.push (fk);
break;
}
}
}
return tables;
}
/**
* gets foreign keys from a line
*
* @param {string} line line to check
* @param {Array<object>} foreign_keys array to add to
*/
function get_foreign_key (line, foreign_keys) {
const fk = (/(?<col>\S+) -> (?<ref>\S+)/u).exec (line);
if (fk) {
const col = fk.groups.col.split (':');
const ref = fk.groups.ref.split (':');
const foreign_key = {
table: col[0],
column: col[1],
ref_table: ref[0],
ref_column: ref[1]
};
foreign_keys.push (foreign_key);
}
}
/**
* creates a function for creating a table
*
* @param {object} table table to create a function for
* @returns {string} function
*/
function create_table_function (table) {
let func = `/**
* create table ${table.name}
*
* @param {any} knex database connection
* @returns {Promise} result
*/
function create_${table.name} (knex) {
return knex.schema.createTable ('${table.name}', (table) => {
${table.columns
.map ((col) => `table.${col.type} ('${col.name}');`)
.join ('\n ')}
`;
const unique = table.columns.filter ((val) => val.unique);
if (unique.length > 0) {
func += `\n table.unique (${unique
.map ((val) => `'${val.name}'`)
.join (', ')});\n`;
}
if (table.foreign_keys.length > 0) {
func += '\n';
for (const fk of table.foreign_keys) {
func += ` table.foreign ('${fk.column}')
.references ('${fk.ref_column}')
.inTable ('${fk.ref_table}');\n`;
}
}
func += ` });
}`;
return func;
}
/**
* creates the migration function
*
* @param {Array<object>} tables table array
* @returns {string} function
*/
function create_up_function (tables) {
const func = `async function up (knex) {
${tables.map ((val) => ` await create_${val.name} (knex);`)
.join ('\n')}
}`;
return func;
}
/**
* creates the complete migration file for a graph
*
* @param {string} file_path file to scan
* @returns {Promise<string>} file
*/
async function create_migration (file_path) {
const tables = await get_tables (file_path);
const functions = tables.map ((tab) => create_table_function (tab));
const file = `'use strict';
${functions.join ('\n\n')}
/**
* run migration
*
* @param {any} knex db connection
*/
${create_up_function (tables)}
/**
* revert migration
*/
function down () {
// noop
}
module.exports = { up, down };
`;
return file;
}
module.exports = { get_tables, create_table_function, create_migration };

View File

@ -1,66 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
/* eslint-disable no-magic-numbers */
/* eslint-disable no-sync */
/* eslint-disable no-console */
'use strict';
const fs = require ('fs-extra');
const path = require ('path');
const dot_parser = require ('./dot_parser');
/**
* copies the full template to a new folder named after arg[0]
*
* @param {string} folder folder to run in
* @param {Array} args function arguments
*/
async function run (folder, args) {
const graph = path.join (folder, args[0]);
const migration = path.join (folder, args[1]);
const db_migration = await dot_parser.create_migration (graph);
await fs.writeFile (migration, db_migration, 'utf-8');
}
/**
* 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
&& typeof args[0] === 'string'
&& typeof args[1] === 'string'),
reason: 'db [graph] [migration]'
},
{
f: () => (typeof folder === 'string'),
reason: 'cwd is not a folder (internal error)'
},
{
f: () => (fs.existsSync (folder)),
reason: 'cwd does not exist (internal error)'
}
];
for (const test of tests) {
if (!test.f ()) {
console.log (test.reason);
return false;
}
}
return true;
}
module.exports = { run, assert };

View File

@ -0,0 +1,56 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
/* eslint-disable max-len */
import { files } from '@sapphirecode/standard';
const general = { jenkinsfile: '' };
const node = { jenkinsfile: files.jenkinsfile, js: files.jenkins };
general.jenkinsfile = `pipeline {
agent any
environment {
VERSION = VersionNumber([
versionNumberString:
'\${BUILDS_ALL_TIME}',
versionPrefix: '1.0.',
worstResultForIncrement: 'SUCCESS'
])
publish = 0
}
stages {
stage('Setup') {
steps {
script {
currentBuild.displayName = env.VERSION
}
echo 'Setting up test environment'
sh 'echo setup'
}
}
}
post {
success {
script {
publish = sh script: "git log -1 | grep '\\\\[no publish\\\\]'", returnStatus: true
if (publish != 0) {
echo 'Deploying'
sh 'echo deploy'
} else {
echo 'Build successful, Commit not marked for deploying'
currentBuild.result = "UNSTABLE"
}
}
}
}
}
`;
export { general, node };

View File

@ -1,78 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
/* eslint-disable no-sync */
/* eslint-disable no-console */
'use strict';
const fs = require ('fs-extra');
const path = require ('path');
/**
* 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 is_node = args.length === 1 && (/^node$/ui).test (args[0]);
const template = path.join (
__dirname,
'template',
is_node
? 'node'
: 'general'
);
for (const f of fs.readdirSync (template)) {
fs.copy (
path.join (template, f),
path.join (folder, f),
{ filter: (src, dest) => !fs.existsSync (dest) }
);
}
if (is_node) {
const pkg = path.join (folder, 'package.json');
if (fs.existsSync (pkg)) {
const json = JSON.parse (fs.readFileSync (pkg, 'utf-8'));
json.scripts.ci = 'yarn && node jenkins.js';
fs.writeFileSync (pkg, JSON.stringify (json, null, 2), 'utf-8');
}
}
}
/**
* checks if the arguments meet the requirements
*
* @param {string} folder folder to run in
* @returns {boolean} true if arguments match requirements
*/
function assert (folder) {
const tests = [
{
f: () => (typeof folder === 'string'),
reason: 'cwd is not a folder (internal error)'
},
{
f: () => (fs.existsSync (folder)),
reason: 'cwd does not exist (internal error)'
}
];
for (const test of tests) {
if (!test.f ()) {
console.log (test.reason);
return false;
}
}
return true;
}
module.exports = { run, assert };

View File

@ -0,0 +1,39 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
import { Confirm } from 'enquirer';
import { Snippet } from '../../Snippet';
import { apply_template, modify_json } from '../../Helper';
import { general, node } from './Assets';
export default class Jenkins implements Snippet {
public is_active (): boolean {
return true;
}
public async start (): Promise<void> {
const is_node = await new Confirm ({
message: 'is the current project using nodejs?',
initial: true
})
.run ();
if (is_node) {
await apply_template (node.js, 'jenkins.js');
await apply_template (node.jenkinsfile, 'Jenkinsfile');
// eslint-disable-next-line @typescript-eslint/no-explicit-any
await modify_json ((obj: any): any => {
obj.scripts.ci = 'yarn && node jenkins.js';
return obj;
});
}
else {
await apply_template (general.jenkinsfile, 'Jenkinsfile');
}
}
}

View File

@ -1,39 +0,0 @@
pipeline {
agent any
environment {
VERSION = VersionNumber([
versionNumberString:
'${BUILDS_ALL_TIME}',
versionPrefix: '1.0.',
worstResultForIncrement: 'SUCCESS'
])
publish = 0
}
stages {
stage('Setup') {
steps {
script {
currentBuild.displayName = env.VERSION
}
echo 'Setting up test environment'
sh 'echo setup'
}
}
}
post {
success {
script {
publish = sh script: "git log -1 | grep '\\[no publish\\]'", returnStatus: true
if (publish != 0) {
echo 'Deploying'
sh 'echo deploy'
} else {
echo 'Build successful, Commit not marked for deploying'
currentBuild.result = "UNSTABLE"
}
}
}
}
}

View File

@ -1,23 +0,0 @@
pipeline {
agent any
environment {
VERSION = VersionNumber([
versionNumberString:
'${BUILDS_ALL_TIME}',
versionPrefix: '1.0.',
worstResultForIncrement: 'SUCCESS'
])
}
stages {
stage('Building') {
steps {
script {
currentBuild.displayName = env.VERSION
}
sh 'yarn ci ${VERSION}'
}
}
}
}

View File

@ -1,33 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
/* eslint-disable no-process-exit */
/* eslint-disable no-console */
/* eslint-disable no-sync */
'use strict';
const fs = require ('fs');
const child_process = require ('child_process');
const pkg = JSON.parse (fs.readFileSync ('package.json', 'utf-8'));
[
,, pkg.version
] = process.argv;
fs.writeFileSync ('package.json', JSON.stringify (pkg, null, 2));
child_process.execSync ('yarn lint', { stdio: 'inherit' });
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.test === 'string')
child_process.execSync ('yarn test', { stdio: 'inherit' });
child_process.exec ('git log -1 | grep \'\\[no publish\\]\'')
.addListener ('exit', (code) => {
if (code === 0) {
console.log ('build not marked for deployment');
process.exit (1);
}
else { child_process.execSync ('yarn publish'); }
});

View File

@ -0,0 +1,70 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
const eslintrc = `module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@sapphirecode'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}
`;
const eslintrc_ts = `module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@sapphirecode/eslint-config-ts'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}
`;
const gitignore = `/node_modules/
/dist/
/.nyc_output/
/coverage/
`;
const tsconfig = `{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./lib",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"declaration": true
}
}
`;
const eslintignore = `/dist/
*.d.ts
`;
export { eslintrc, gitignore, tsconfig, eslintrc_ts, eslintignore };

View File

@ -1,127 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
/* eslint-disable no-sync */
/* eslint-disable no-console */
'use strict';
const fs = require ('fs-extra');
const path = require ('path');
const child_process = require ('child_process');
/**
* copies the full template to a new folder named after arg[0]
*
* @param {string} folder folder to run in
* @param {Array} args function arguments
*/
async 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)
}
);
}
child_process.execSync (
'git init',
{ cwd: snip_folder, stdio: 'inherit' }
);
child_process.execSync (
'yarn init -y',
{ cwd: snip_folder, stdio: 'inherit' }
);
child_process.execSync (
'yarn add --dev @scode/eslint-config eslint nyc ava',
{ cwd: snip_folder, stdio: 'inherit' }
);
const package_json = JSON.parse (
await fs.readFile (path.join (snip_folder, 'package.json'), 'utf-8')
);
package_json.scripts = {
lint: 'eslint . --ext .js,.jsx,.ts,.tsx,.vue,.mjs',
test: 'nyc ava'
};
await fs.writeFile (
path.join (snip_folder, 'package.json'),
JSON.stringify (package_json, null, 2)
);
await fs.writeFile (
path.join (snip_folder, '.gitignore'),
`/node_modules/
/dist/
/.nyc_output/
/coverage/`
);
}
/**
* 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 };

105
lib/snippets/node/index.ts Normal file
View File

@ -0,0 +1,105 @@
/*
* 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 <timo@scode.ovh>, May 2020
*/
import path from 'path';
import { Input, Confirm } from 'enquirer';
import { scripts as standard_scripts } from '@sapphirecode/standard';
import { Snippet } from '../../Snippet';
import { apply_template, modify_json, run_command } from '../../Helper';
import {
eslintrc, gitignore,
tsconfig, eslintrc_ts, eslintignore
} from './Assets';
/**
* initialize the package.json
*
* @param folder - folder
* @param use_ts - use typescript
* @param use_tests - use tests
*/
async function init_package (
folder: string,
use_ts: boolean,
use_tests: boolean
): Promise<void> {
await modify_json ((obj: Record<string, unknown>) => {
const scripts
= {
lint: standard_scripts.lint,
test: standard_scripts.test.common,
compile: standard_scripts.compile.common
};
const files = [ 'LICENSE' ];
if (use_ts) {
scripts.compile = standard_scripts.compile.ts;
scripts.test = standard_scripts.test.ts;
files.push ('/dist/');
}
else {
files.push ('*.js', '*.d.ts');
}
if (!use_tests)
scripts.test = standard_scripts.test.no;
obj.scripts = scripts;
obj.files = files;
return obj;
}, path.join (folder, 'package.json'));
}
export default class Node implements Snippet {
public is_active (): boolean {
return true;
}
public async start (): Promise<void> {
const folder = await new Input (
{ message: 'project name (leave empty for current folder):' }
)
.run ();
const use_ts = await new Confirm ({
message: 'use typescript?',
initial: false
})
.run ();
const use_tests = await new Confirm ({
message: 'use tests?',
initial: true
})
.run ();
await apply_template (eslintrc, path.join (folder, '.eslintrc.js'));
await apply_template (gitignore, path.join (folder, '.gitignore'));
await apply_template (
eslintignore,
path.join (folder, '.eslintignore')
);
if (use_ts) {
await apply_template (tsconfig, path.join (folder, 'tsconfig.json'));
await apply_template (
eslintrc_ts,
path.join (folder, 'lib', '.eslintrc.js')
);
}
run_command ('git init', folder);
run_command ('yarn init -y', folder);
run_command (
`yarn add --dev @sapphirecode/eslint-config${use_ts
? '-ts typescript @ava/typescript'
: ''} eslint nyc ava`,
folder
);
await init_package (folder, use_ts, use_tests);
}
}

View File

@ -1,24 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/
module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@scode'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}

View File

@ -1 +0,0 @@
@scode:registry=https://npm.scode.ovh

View File

@ -1,7 +0,0 @@
/*
* 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 <timo@scode.ovh>, March 2020
*/

View File

@ -0,0 +1,40 @@
/*
* 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 <timo@scode.ovh>, June 2020
*/
/* eslint-disable max-len */
export function get_readme (
software: string,
description: string,
dev: boolean,
license: string,
author: string
): string {
return `# ${software}
version: 0.0.0
${description}
## Installation
npm:
> npm i --save${dev ? '-dev' : ''} ${software}
yarn:
> yarn add ${dev ? '--dev ' : ''}${software}
## Usage
TODO: Add usage
## License
${license} © ${author}
`;
}

View File

@ -0,0 +1,45 @@
/*
* 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 <timo@scode.ovh>, June 2020
*/
import { Confirm } from 'enquirer';
import { Snippet } from '../../Snippet';
import { modify_json, apply_template } from '../../Helper';
import { get_readme } from './Assets';
export default class Readme implements Snippet {
public is_active (): boolean {
return true;
}
public async start (): Promise<void> {
const dev = await new Confirm ({
message: 'is the package used as dev dependency?',
default: false
})
.run ();
const package_data = {
software: '',
description: '',
license: '',
author: ''
};
await modify_json ((json) => {
package_data.software = json.name;
package_data.description = json.description;
package_data.license = json.license;
package_data.author = json.author;
});
const readme = get_readme (
package_data.software,
package_data.description,
dev,
package_data.license,
package_data.author
);
await apply_template (readme, 'README.md');
}
}

View File

@ -1,5 +1,5 @@
{
"name": "@scode/snippeteer",
"name": "@sapphirecode/snippeteer",
"version": "1.0.0",
"description": "macros for setting up projects or project parts",
"main": "index.js",
@ -9,26 +9,31 @@
"scripts": {
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.vue,.mjs",
"ci": "yarn --frozen-lockfile && node jenkins.js",
"test": "echo \"no test\""
"test": "echo \"no test\"",
"compile": "tsc"
},
"repository": {
"type": "git",
"url": "git@git.scode.ovh:timo/snippeteer"
},
"files": [
"/snippets/",
"/dist/",
"/lib/",
"LICENSE"
],
"author": "Timo Hocker",
"author": "Timo Hocker <timo@scode.ovh>",
"license": "BSD-3-Clause",
"devDependencies": {
"@scode/eslint-config-ts": "^1.0.19",
"@types/fs-extra": "^8.1.0",
"@types/node": "^13.11.1",
"eslint": "^6.8.0",
"@sapphirecode/eslint-config-ts": "^1.0.22",
"@types/fs-extra": "^9.0.0",
"@types/node": "^14.0.1",
"eslint": "^7.0.0",
"typescript": "^3.8.3"
},
"dependencies": {
"@sapphirecode/console-app": "^2.0.6",
"@sapphirecode/modelling": "^1.1.6",
"@sapphirecode/standard": "^1.0.1",
"enquirer": "^2.3.5",
"fs-extra": "^9.0.0",
"license": "^1.0.3"

View File

@ -8,9 +8,9 @@
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
"declaration": true, /* Generates corresponding '.d.ts' file. */
"declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
"sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
"rootDir": "./lib", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */

File diff suppressed because it is too large Load Diff

844
yarn.lock

File diff suppressed because it is too large Load Diff