Compare commits

..

50 Commits

Author SHA1 Message Date
655a8a72ff 3.0.7 2019-09-10 18:23:53 +02:00
80a77d5f06 fix(core): update 2019-09-10 18:23:53 +02:00
6296411b50 3.0.6 2019-09-10 18:18:30 +02:00
e7690d4020 fix(core): update 2019-09-10 18:18:30 +02:00
b85a29cfc1 3.0.5 2019-09-10 18:03:33 +02:00
d559b0f402 fix(core): update 2019-09-10 18:03:33 +02:00
7433c1dba4 3.0.4 2019-09-10 18:00:13 +02:00
c8f6b0296d update 2019-09-10 18:00:03 +02:00
0cffae9eaa update dependencies 2019-09-10 17:59:29 +02:00
d50c8a1260 3.0.3 2019-02-17 17:17:47 +01:00
b3702d56bc fix(core): update 2019-02-17 17:17:47 +01:00
ff0faa719b 3.0.2 2019-01-27 18:55:39 +01:00
400e228ffc fix(core): update 2019-01-27 18:55:38 +01:00
25871fc970 3.0.1 2018-10-04 17:00:33 +02:00
eb990a8ec2 fix(core): update 2018-10-04 17:00:33 +02:00
f5194b76bd Merge branch 'master' into 'master'
update

See merge request pushrocks/smartscaf!1
2018-10-04 14:48:20 +00:00
6b5e9ac617 update 2018-10-04 16:04:42 +02:00
60854250eb 3.0.0 2018-08-30 22:43:22 +02:00
53de92ac1a BREAKING CHANGE(structure): templates now take their path within the constructor 2018-08-30 22:43:22 +02:00
6cb4fff0a5 2.0.2 2018-08-28 23:57:06 +02:00
45710ded00 2.0.1 2018-08-28 00:20:02 +02:00
aa87ed9427 fix(dependencies): resolve dependencies 2018-08-28 00:20:02 +02:00
f3594447ac 2.0.0 2018-08-27 23:55:14 +02:00
a3f18c17ed BREAKING CHANGE(scope): switch to new @pushrocks scope 2018-08-27 23:55:14 +02:00
c5ec7e9c24 1.0.14 2017-08-09 16:57:39 +02:00
98875a2ece fix variable distribution 2017-08-09 16:57:32 +02:00
5b42cf93cb 1.0.13 2017-08-09 15:31:39 +02:00
e0ab34c466 update dependencies 2017-08-09 15:31:35 +02:00
beb3013e2c 1.0.12 2017-07-28 14:47:46 +02:00
5d1c0a6f1e update dependencies 2017-07-28 14:47:43 +02:00
fc450816e6 1.0.11 2017-06-02 01:03:27 +02:00
5fac35c75f prevent empty defaults.yml causing error 2017-06-02 01:03:24 +02:00
dde29629b7 1.0.10 2017-05-28 00:14:25 +02:00
4347f800e6 update dependencies 2017-05-28 00:14:11 +02:00
59161f1eeb 1.0.9 2017-05-27 23:53:06 +02:00
b9a346c5d7 now supports frontmatter for advanced file templating 2017-05-27 23:52:58 +02:00
fa961f86b8 1.0.8 2017-05-27 03:25:50 +02:00
ff679c1787 add docs 2017-05-27 03:25:42 +02:00
35e3c9ae48 1.0.7 2017-05-27 03:22:00 +02:00
bf0007ff3a fix deep add 2017-05-27 03:21:55 +02:00
3ab780e600 1.0.6 2017-05-27 02:57:25 +02:00
d0662f809f update smartfile 2017-05-27 02:57:22 +02:00
e20bf7f610 1.0.5 2017-05-27 01:47:21 +02:00
0a97ec4d07 fix tests 2017-05-27 01:47:16 +02:00
69e09c8b4c 1.0.4 2017-05-27 01:28:42 +02:00
0e92554d0a update smartfile 2017-05-27 01:28:37 +02:00
648afbcf21 1.0.3 2017-05-26 15:32:54 +02:00
7998c99f27 now works as intended 2017-05-26 15:32:50 +02:00
8e3633827c 1.0.2 2017-05-25 18:32:56 +02:00
eac20873e5 now working 2017-05-25 18:32:53 +02:00
32 changed files with 2406 additions and 1286 deletions

21
.gitignore vendored
View File

@ -1,3 +1,22 @@
node_modules/ .nogit/
# artifacts
coverage/ coverage/
public/ public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_web/
dist_serve/
dist_ts_web/
# custom

View File

@ -1,71 +1,119 @@
# gitzone standard # gitzone ci_default
image: hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache: cache:
paths: paths:
- .yarn/ - .npmci_cache/
key: "$CI_BUILD_STAGE" key: "$CI_BUILD_STAGE"
stages: stages:
- security
- test - test
- release - release
- trigger - metadata
- pages
testLEGACY: # ====================
stage: test # security stage
# ====================
mirror:
stage: security
script: script:
- npmci test legacy - npmci git mirror
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
allow_failure: true - notpriv
testLTS: snyk:
stage: security
script:
- npmci npm prepare
- npmci command npm install -g snyk
- npmci command npm install --ignore-scripts
- npmci command snyk test
tags:
- docker
- notpriv
# ====================
# test stage
# ====================
testStable:
stage: test stage: test
script: script:
- npmci test lts - npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- priv
testSTABLE:
testBuild:
stage: test stage: test
script: script:
- npmci test stable - npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- notpriv
release: release:
stage: release stage: release
script: script:
- npmci publish - npmci node install stable
- npmci npm publish
only: only:
- tags - tags
tags: tags:
- docker - docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
allow_failure: true
script:
- npmci command npm install -g tslint typescript
- npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags:
- docker
- priv
trigger: trigger:
stage: trigger stage: metadata
script: script:
- npmci trigger - npmci trigger
only: only:
- tags - tags
tags: tags:
- docker - docker
- notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-dbase:npmci
stage: pages services:
- docker:stable-dind
stage: metadata
script: script:
- npmci command yarn global add npmpage - npmci command npm install -g @gitzone/tsdoc
- npmci command npmpage - npmci npm prepare
- npmci npm install
- npmci command tsdoc
tags: tags:
- docker - docker
- notpriv
only: only:
- tags - tags
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:
- public - public
allow_failure: true

23
.snyk Normal file
View File

@ -0,0 +1,23 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.13.5
# ignores vulnerabilities until expiry date; change duration by modifying expiry date
ignore:
SNYK-JS-JSYAML-173999:
- '@pushrocks/smartfm > gray-matter > js-yaml':
reason: None given
expires: '2019-10-10T16:23:38.993Z'
- '@pushrocks/smartyaml > js-yaml':
reason: None given
expires: '2019-10-10T16:23:38.993Z'
SNYK-JS-JSYAML-174129:
- '@pushrocks/smartfm > gray-matter > js-yaml':
reason: None given
expires: '2019-10-10T16:23:38.993Z'
- '@pushrocks/smartyaml > js-yaml':
reason: None given
expires: '2019-10-10T16:23:38.993Z'
SNYK-JS-LODASH-450202:
- '@pushrocks/smartinteract > inquirer > lodash':
reason: None given
expires: '2019-10-10T16:23:38.993Z'
patch: {}

1
dist/index.d.ts vendored
View File

@ -1 +0,0 @@
export * from './smartscaf.classes.smartscaf';

7
dist/index.js vendored
View File

@ -1,7 +0,0 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./smartscaf.classes.smartscaf"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1EQUE2QyJ9

View File

@ -1,35 +0,0 @@
import { Smartfile } from 'smartfile';
export interface ScafTemplateContructorOptions {
name?: string;
description?: string;
sourceDir?: string;
}
export declare class ScafTemplate {
name: string;
description: string;
templateSmartfileArray: Smartfile[];
requiredVariables: string[];
suppliedVariables: any;
missingVariables: string[];
/**
* read a template from a directory
*/
readTemplateFromDir(dirPathArg: string): Promise<void>;
/**
* supply the variables to render the teplate with
* @param variablesArg
*/
supplyVariables(variablesArg: any): Promise<void>;
/**
* Will ask for the missing variables by cli interaction
*/
askCliForMissingVariables(): Promise<void>;
/**
* finds all variables in a Template
*/
private _findVariablesInTemplate();
/**
* checks if supplied Variables satisfy the template
*/
private _checkSuppliedVariables();
}

View File

@ -1,79 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartscaf.plugins");
class ScafTemplate {
constructor() {
this.missingVariables = [];
}
/**
* read a template from a directory
*/
readTemplateFromDir(dirPathArg) {
return __awaiter(this, void 0, void 0, function* () {
let dirPath = plugins.path.resolve(dirPathArg);
this.templateSmartfileArray = yield plugins.smartfile.fs.fileTreeToObject(dirPath, '**/*');
this._findVariablesInTemplate();
});
}
/**
* supply the variables to render the teplate with
* @param variablesArg
*/
supplyVariables(variablesArg) {
return __awaiter(this, void 0, void 0, function* () {
this.suppliedVariables = variablesArg;
this.missingVariables = yield this._checkSuppliedVariables();
});
}
/**
* Will ask for the missing variables by cli interaction
*/
askCliForMissingVariables() {
return __awaiter(this, void 0, void 0, function* () {
this.missingVariables = yield this._checkSuppliedVariables();
let localSmartInteract = new plugins.smartinteract.SmartInteract();
for (let missingVariable of this.missingVariables) {
localSmartInteract.addQuestions([{
name: missingVariable,
type: 'input',
default: `undefined ${missingVariable}`,
message: `What is the value of ${missingVariable}?`
}]);
}
let answers = yield localSmartInteract.runQueue();
});
}
/**
* finds all variables in a Template
*/
_findVariablesInTemplate() {
return __awaiter(this, void 0, void 0, function* () {
for (let localSmartfile of this.templateSmartfileArray) {
}
});
}
/**
* checks if supplied Variables satisfy the template
*/
_checkSuppliedVariables() {
return __awaiter(this, void 0, void 0, function* () {
let missingVars = [];
for (let templateSmartFile of this.templateSmartfileArray) {
let localMissingVars = yield plugins.smarthbs.checkVarsSatisfaction(templateSmartFile.contents.toString(), this.suppliedVariables);
missingVars = plugins.lodash.concat(missingVars, localMissingVars);
missingVars = plugins.lodash.uniq(missingVars);
}
return missingVars;
});
}
}
exports.ScafTemplate = ScafTemplate;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzY2FmLmNsYXNzZXMuc21hcnRzY2FmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzY2FmLmNsYXNzZXMuc21hcnRzY2FmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwrQ0FBOEM7QUFXOUM7SUFBQTtRQU1FLHFCQUFnQixHQUFhLEVBQUUsQ0FBQTtJQTZEakMsQ0FBQztJQTNEQzs7T0FFRztJQUNHLG1CQUFtQixDQUFFLFVBQWtCOztZQUMzQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM5QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDMUYsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFDakMsQ0FBQztLQUFBO0lBRUQ7OztPQUdHO0lBQ0csZUFBZSxDQUFFLFlBQVk7O1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUE7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDOUQsQ0FBQztLQUFBO0lBRUQ7O09BRUc7SUFDRyx5QkFBeUI7O1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1lBQzVELElBQUksa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFBO1lBQ2xFLEdBQUcsQ0FBQyxDQUFDLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUMvQixJQUFJLEVBQUUsZUFBZTt3QkFDckIsSUFBSSxFQUFFLE9BQU87d0JBQ2IsT0FBTyxFQUFFLGFBQWEsZUFBZSxFQUFFO3dCQUN2QyxPQUFPLEVBQUUsd0JBQXdCLGVBQWUsR0FBRztxQkFDcEQsQ0FBQyxDQUFDLENBQUE7WUFDTCxDQUFDO1lBQ0QsSUFBSSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUNuRCxDQUFDO0tBQUE7SUFFRDs7T0FFRztJQUNXLHdCQUF3Qjs7WUFDcEMsR0FBRyxDQUFDLENBQUMsSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztZQUV6RCxDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRUQ7O09BRUc7SUFDVyx1QkFBdUI7O1lBQ25DLElBQUksV0FBVyxHQUFhLEVBQUUsQ0FBQTtZQUM5QixHQUFHLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUNqRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkIsQ0FBQTtnQkFDRCxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUE7Z0JBQ2xFLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNoRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQTtRQUNwQixDQUFDO0tBQUE7Q0FDRjtBQW5FRCxvQ0FtRUMifQ==

View File

View File

@ -1,3 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzY2FmLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHNjYWYuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=

View File

@ -1,8 +0,0 @@
import 'typings-global';
import * as lodash from 'lodash';
import * as path from 'path';
import * as smartfile from 'smartfile';
import * as smarthbs from 'smarthbs';
import * as smartinteract from 'smartinteract';
import * as smartq from 'smartq';
export { lodash, path, smartfile, smarthbs, smartinteract, smartq };

View File

@ -1,16 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("typings-global");
const lodash = require("lodash");
exports.lodash = lodash;
const path = require("path");
exports.path = path;
const smartfile = require("smartfile");
exports.smartfile = smartfile;
const smarthbs = require("smarthbs");
exports.smarthbs = smarthbs;
const smartinteract = require("smartinteract");
exports.smartinteract = smartinteract;
const smartq = require("smartq");
exports.smartq = smartq;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzY2FmLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHNjYWYucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUN2QixpQ0FBZ0M7QUFROUIsd0JBQU07QUFQUiw2QkFBNEI7QUFRMUIsb0JBQUk7QUFQTix1Q0FBc0M7QUFRcEMsOEJBQVM7QUFQWCxxQ0FBb0M7QUFRbEMsNEJBQVE7QUFQViwrQ0FBOEM7QUFRNUMsc0NBQWE7QUFQZixpQ0FBZ0M7QUFROUIsd0JBQU0ifQ==

View File

@ -3,8 +3,17 @@
"coverageTreshold": 30 "coverageTreshold": 30
}, },
"npmci": { "npmci": {
"globalNpmTools": [ "npmGlobalTools": [],
"npmts" "npmAccessLevel": "public"
] },
"gitzone": {
"module": {
"githost": "gitlab.com",
"gitscope": "pushrocks",
"gitrepo": "smartscaf",
"shortDescription": "scaffold projects quickly",
"npmPackagename": "@pushrocks/smartscaf",
"license": "MIT"
}
} }
} }

1920
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,13 @@
{ {
"name": "smartscaf", "name": "@pushrocks/smartscaf",
"version": "1.0.1", "version": "3.0.7",
"private": false,
"description": "scaffold projects quickly", "description": "scaffold projects quickly",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"scripts": { "scripts": {
"test": "(npmts)" "test": "(tstest test/)",
"build": "(tsbuild)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -23,15 +25,30 @@
"npm" "npm"
], ],
"devDependencies": { "devDependencies": {
"tapbundle": "^1.0.10" "@gitzone/tsbuild": "^2.1.17",
"@gitzone/tsrun": "^1.2.8",
"@gitzone/tstest": "^1.0.24",
"@pushrocks/tapbundle": "^3.0.13",
"@types/node": "^12.7.4"
}, },
"dependencies": { "dependencies": {
"@types/lodash": "^4.14.63", "@pushrocks/lik": "^3.0.11",
"lodash": "^4.17.4", "@pushrocks/smartfile": "^7.0.4",
"smartfile": "^4.2.9", "@pushrocks/smartfm": "^2.0.4",
"smarthbs": "^1.0.12", "@pushrocks/smarthbs": "^2.0.8",
"smartinteract": "^1.0.4", "@pushrocks/smartinteract": "^2.0.4",
"smartq": "^1.1.1", "@pushrocks/smartpromise": "^3.0.2",
"typings-global": "^1.0.16" "@pushrocks/smartyaml": "^2.0.3"
} },
"files": [
"ts/*",
"ts_web/*",
"dist/*",
"dist_web/*",
"dist_ts_web/*",
"assets/*",
"cli.js",
"npmextra.json",
"readme.md"
]
} }

View File

@ -1,29 +1,35 @@
# smartscaf # @pushrocks/smartscaf
scaffold projects quickly scaffold projects quickly
## Availabililty ## Availabililty and Links
[![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartscaf) * [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartscaf)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/smartscaf) * [gitlab.com (source)](https://gitlab.com/pushrocks/smartscaf)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartscaf) * [github.com (source mirror)](https://github.com/pushrocks/smartscaf)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartscaf/) * [docs (typedoc)](https://pushrocks.gitlab.io/smartscaf/)
## Status for master ## Status for master
[![build status](https://GitLab.com/pushrocks/smartscaf/badges/master/build.svg)](https://GitLab.com/pushrocks/smartscaf/commits/master) [![build status](https://gitlab.com/pushrocks/smartscaf/badges/master/build.svg)](https://gitlab.com/pushrocks/smartscaf/commits/master)
[![coverage report](https://GitLab.com/pushrocks/smartscaf/badges/master/coverage.svg)](https://GitLab.com/pushrocks/smartscaf/commits/master) [![coverage report](https://gitlab.com/pushrocks/smartscaf/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartscaf/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/smartscaf.svg)](https://www.npmjs.com/package/smartscaf) [![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/smartscaf.svg)](https://www.npmjs.com/package/@pushrocks/smartscaf)
[![Dependency Status](https://david-dm.org/pushrocks/smartscaf.svg)](https://david-dm.org/pushrocks/smartscaf) [![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/smartscaf/badge.svg)](https://snyk.io/test/npm/@pushrocks/smartscaf)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartscaf/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartscaf/master/dependencies/npm) [![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartscaf/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartscaf) [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/) [![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage ## Usage
Use TypeScript for best in class instellisense. Use TypeScript for best in class instellisense.
For further information read the linked docs at the top of this README. For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh) > MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) > | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://) [![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -1,26 +1,37 @@
import { expect, tap } from 'tapbundle' import { expect, tap } from '@pushrocks/tapbundle';
import * as path from 'path';
import * as smartscaf from '../dist/index' import * as smartscaf from '../ts/index';
let testScafTemplate: smartscaf.ScafTemplate process.env.CI = 'true';
let testScafTemplate: smartscaf.ScafTemplate;
tap.test('should create new Smartscaf instance', async () => { tap.test('should create new Smartscaf instance', async () => {
testScafTemplate = new smartscaf.ScafTemplate() testScafTemplate = new smartscaf.ScafTemplate('./test/test_template');
expect(testScafTemplate).to.be.instanceof(smartscaf.ScafTemplate) expect(testScafTemplate).to.be.instanceof(smartscaf.ScafTemplate);
}) });
tap.test('Smartscaf instance -> should read a template directory', async () => { tap.test('Smartscaf instance -> should read a template directory', async () => {
await testScafTemplate.readTemplateFromDir('./test/test_template') await testScafTemplate.readTemplateFromDir();
expect(testScafTemplate.templateSmartfileArray.length).to.equal(3) expect(testScafTemplate.templateSmartfileArray.length).to.equal(6);
}) });
tap.test('smartfile -> should accept variables', async () => { tap.test('smartfile -> should accept variables', async () => {
await testScafTemplate.supplyVariables({}) await testScafTemplate.supplyVariables({});
console.log(testScafTemplate.missingVariables) console.log(testScafTemplate.missingVariables);
}) });
tap.test('ask cli', async () => { tap.test('ask cli', async () => {
await testScafTemplate.askCliForMissingVariables() await testScafTemplate.askCliForMissingVariables();
}) });
tap.start() tap.test('should have valid supplied variables', async () => {
console.log(testScafTemplate.suppliedVariables);
});
tap.test('should output ready rendered template', async () => {
await testScafTemplate.writeToDisk(path.resolve('./test/test_output'));
});
tap.start();

View File

@ -0,0 +1 @@
# some undefined variable

View File

@ -0,0 +1 @@
# param1 10

View File

@ -0,0 +1 @@
awesome!

View File

@ -0,0 +1,3 @@
# this is a wow
# this is a here
# this is a undefined variable

View File

@ -0,0 +1,3 @@
# this is a from default yaml
# this is a this is another value from yml
# this is a undefined variable

View File

@ -0,0 +1,10 @@
defaults:
templateVar1: from default yaml
templateVar2: this is another value from yml
templateObject.value1: wow
templateObject.value2: here
node_version: '10'
dependencies:
merge:
- ../test_template_2

View File

@ -0,0 +1 @@
awesome!

View File

@ -1,3 +1,3 @@
# this is a {{templateVar1}} # this is a {{templateObject.value1}}
# this is a {{templateVar2}} # this is a {{templateObject.value2}}
# this is a {{templateVar3}} # this is a {{templateVar3}}

View File

@ -1 +1,4 @@
---
fileName: changedname.md
---
# some {{wow}} # some {{wow}}

View File

@ -0,0 +1 @@
# param1 {{node_version}}

View File

@ -1 +1 @@
export * from './smartscaf.classes.smartscaf' export * from './smartscaf.classes.smartscaf';

View File

@ -1,79 +1,234 @@
import * as plugins from './smartscaf.plugins' import * as plugins from './smartscaf.plugins';
import * as helpers from './smartscaf.helpers';
// interfaces // interfaces
import { Smartfile } from 'smartfile' import { Smartfile } from '@pushrocks/smartfile';
export interface ScafTemplateContructorOptions { export interface ScafTemplateContructorOptions {
name?: string, name?: string;
description?: string description?: string;
sourceDir?: string sourceDir?: string;
} }
export class ScafTemplate { export class ScafTemplate {
name: string static async createTemplateFromDir() {}
description: string
templateSmartfileArray: Smartfile[] /**
requiredVariables: string[] * the name of the template
suppliedVariables: any */
missingVariables: string[] = [] name: string;
/**
* the descriptions of the template
*/
description: string;
/**
* the location on disk of the template
*/
dirPath: string;
/**
* the files of the template as array of Smartfiles
*/
templateSmartfileArray: Smartfile[];
requiredVariables: string[];
defaultVariables: any;
suppliedVariables: any = {};
missingVariables: string[] = [];
constructor(dirPathArg: string) {
this.dirPath = plugins.path.resolve(dirPathArg);
}
/** /**
* read a template from a directory * read a template from a directory
*/ */
async readTemplateFromDir (dirPathArg: string) { async readTemplateFromDir() {
let dirPath = plugins.path.resolve(dirPathArg) this.templateSmartfileArray = await plugins.smartfile.fs.fileTreeToObject(this.dirPath, '**/*');
this.templateSmartfileArray = await plugins.smartfile.fs.fileTreeToObject(dirPath, '**/*') await this._resolveTemplateDependencies();
this._findVariablesInTemplate() await this._findVariablesInTemplate();
await this._checkSuppliedVariables();
await this._checkDefaultVariables();
} }
/** /**
* supply the variables to render the teplate with * supply the variables to render the teplate with
* @param variablesArg * @param variablesArg gets merged with this.suppliedVariables
*/ */
async supplyVariables (variablesArg) { async supplyVariables(variablesArg) {
this.suppliedVariables = variablesArg this.suppliedVariables = {
this.missingVariables = await this._checkSuppliedVariables() ...this.suppliedVariables,
...variablesArg
};
this.missingVariables = await this._checkSuppliedVariables();
} }
/** /**
* Will ask for the missing variables by cli interaction * Will ask for the missing variables by cli interaction
*/ */
async askCliForMissingVariables () { async askCliForMissingVariables() {
this.missingVariables = await this._checkSuppliedVariables() this.missingVariables = await this._checkSuppliedVariables();
let localSmartInteract = new plugins.smartinteract.SmartInteract() let localSmartInteract = new plugins.smartinteract.SmartInteract();
for (let missingVariable of this.missingVariables) { for (let missingVariable of this.missingVariables) {
localSmartInteract.addQuestions([{ localSmartInteract.addQuestions([
name: missingVariable, {
type: 'input', name: missingVariable,
default: `undefined ${missingVariable}`, type: 'input',
message: `What is the value of ${missingVariable}?` default: (() => {
}]) if (this.defaultVariables && this.defaultVariables[missingVariable]) {
return this.defaultVariables[missingVariable];
} else {
return 'undefined variable';
}
})(),
message: `What is the value of ${missingVariable}?`
}
]);
} }
let answers = await localSmartInteract.runQueue() let answerBucket = await localSmartInteract.runQueue();
await answerBucket.answerMap.forEach(async answer => {
await helpers.deepAddToObject(this.suppliedVariables, answer.name, answer.value);
});
} }
/** /**
* finds all variables in a Template * writes a file to disk
* @param destinationDirArg
*/
async writeToDisk(destinationDirArg) {
const smartfileArrayToWrite: Smartfile[] = [];
for (let smartfile of this.templateSmartfileArray) {
// lets filter out template files
if (smartfile.path === '.smartscaf.yml') {
continue;
}
// render the template
let template = await plugins.smarthbs.getTemplateForString(smartfile.contents.toString());
let renderedTemplateString = template(this.suppliedVariables);
// handle frontmatter
const smartfmInstance = new plugins.smartfm.Smartfm({
fmType: 'yaml'
});
let parsedTemplate = smartfmInstance.parse(renderedTemplateString) as any;
if (parsedTemplate.data.fileName) {
smartfile.updateFileName(parsedTemplate.data.fileName);
}
smartfile.contents = Buffer.from(parsedTemplate.content);
smartfileArrayToWrite.push(smartfile);
}
await plugins.smartfile.memory.smartfileArrayToFs(smartfileArrayToWrite, destinationDirArg);
}
/**
* finds all variables in a Template in as string
* e.g. myobject.someKey and myobject.someOtherKey
*/ */
private async _findVariablesInTemplate() { private async _findVariablesInTemplate() {
for (let localSmartfile of this.templateSmartfileArray) { let templateVariables: string[] = [];
for (let templateSmartfile of this.templateSmartfileArray) {
let localTemplateVariables = await plugins.smarthbs.findVarsInHbsString(
templateSmartfile.contents.toString()
);
templateVariables = [...templateVariables, ...localTemplateVariables];
} }
templateVariables = templateVariables.filter((value, index, self) => {
return self.indexOf(value) === index;
});
} }
/** /**
* checks if supplied Variables satisfy the template * checks if supplied Variables satisfy the template
*/ */
private async _checkSuppliedVariables() { private async _checkSuppliedVariables() {
let missingVars: string[] = [] let missingVars: string[] = [];
for (let templateSmartFile of this.templateSmartfileArray) { for (let templateSmartfile of this.templateSmartfileArray) {
let localMissingVars = await plugins.smarthbs.checkVarsSatisfaction( let localMissingVars = await plugins.smarthbs.checkVarsSatisfaction(
templateSmartFile.contents.toString(), templateSmartfile.contents.toString(),
this.suppliedVariables this.suppliedVariables
) );
missingVars = plugins.lodash.concat(missingVars, localMissingVars)
missingVars = plugins.lodash.uniq(missingVars) // combine with other missingVars
missingVars = [...missingVars, ...localMissingVars];
}
// dedupe
missingVars = missingVars.filter((value, index, self) => {
return self.indexOf(value) === index;
});
return missingVars;
}
/**
* checks the smartscaf.yml default values at the root of a template
* allows 2 ways of notation in YAML:
* >> myObject.myKey.someDeeperKey: someValue
* >> myObject.yourKey.yourDeeperKey: yourValue
* or
* >> myObject:
* >> - someKey:
* >> - someDeeperKey: someValue
* >> - yourKey:
* >> - yourDeeperKey: yourValue
*/
private async _checkDefaultVariables() {
let smartscafSmartfile = this.templateSmartfileArray.find(smartfileArg => {
return smartfileArg.parsedPath.base === '.smartscaf.yml';
});
if (smartscafSmartfile) {
const smartscafObject = await plugins.smartyaml.yamlStringToObject(
smartscafSmartfile.contents.toString()
);
const defaultObject = smartscafObject.defaults;
this.defaultVariables = defaultObject;
}
// safeguard against non existent defaults
if (!this.defaultVariables) {
console.log('this template does not specify defaults');
this.defaultVariables = {};
}
}
/**
* resolve template dependencies
*/
private async _resolveTemplateDependencies() {
const smartscafSmartfile = this.templateSmartfileArray.find(smartfileArg => {
return smartfileArg.parsedPath.base === '.smartscaf.yml';
});
if (!smartscafSmartfile) {
console.log('No further template dependencies defined!');
return;
}
console.log('Found template dependencies! Resolving them now!');
console.log('looking at templates to merge!');
const smartscafYamlObject = await plugins.smartyaml.yamlStringToObject(
smartscafSmartfile.contentBuffer.toString()
);
if (!smartscafYamlObject) {
console.log('Something seems strange about the supplied dependencies.yml file.');
return;
}
for (const dependency of smartscafYamlObject.dependencies.merge) {
console.log(`Now resolving ${dependency}`);
const templatePathToMerge = plugins.path.join(this.dirPath, dependency);
if (!plugins.smartfile.fs.isDirectory(templatePathToMerge)) {
console.log(
`dependency ${dependency} resolves to ${templatePathToMerge} which ist NOT a directory`
);
continue;
}
const templateSmartfileArray = await plugins.smartfile.fs.fileTreeToObject(
templatePathToMerge,
'**/*'
);
this.templateSmartfileArray = this.templateSmartfileArray.concat(templateSmartfileArray);
} }
return missingVars
} }
} }

View File

@ -1,2 +1,33 @@
import * as plugins from './smartscaf.plugins' import * as plugins from './smartscaf.plugins';
/**
* adds a variable in string dot notation to an already more or less expanded object
*/
export let deepAddToObject = async (objectArg, varStringArg: string, valueArg: string) => {
let varNamesArray = varStringArg.split('.');
let referencePointer = objectArg;
for (let i = 0; i !== varNamesArray.length; i++) {
let varName = varNamesArray[i];
// is there a next variable ?
let varNameNext: string = (() => {
if (varNamesArray[i + 1]) {
return varNamesArray[i + 1];
}
return null;
})();
// build the tree in suppliedVariables
if (!referencePointer[varName] && !varNameNext) {
referencePointer[varName] = valueArg;
referencePointer = null;
} else if (!referencePointer[varName] && varNameNext) {
referencePointer[varName] = {};
referencePointer = referencePointer[varName];
} else if (referencePointer[varName] && varNameNext) {
referencePointer = referencePointer[varName];
} else {
throw new Error('Something is strange!');
}
}
};

View File

@ -1,16 +1,10 @@
import 'typings-global' import * as path from 'path';
import * as lodash from 'lodash' import * as lik from '@pushrocks/lik';
import * as path from 'path' import * as smartfile from '@pushrocks/smartfile';
import * as smartfile from 'smartfile' import * as smartfm from '@pushrocks/smartfm';
import * as smarthbs from 'smarthbs' import * as smarthbs from '@pushrocks/smarthbs';
import * as smartinteract from 'smartinteract' import * as smartinteract from '@pushrocks/smartinteract';
import * as smartq from 'smartq' import * as smartq from '@pushrocks/smartpromise';
import * as smartyaml from '@pushrocks/smartyaml';
export { export { path, lik, smartfile, smartfm, smarthbs, smartinteract, smartq, smartyaml };
lodash,
path,
smartfile,
smarthbs,
smartinteract,
smartq
}

View File

@ -1,3 +1,17 @@
{ {
"extends": "tslint-config-standard" "extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
} }

1002
yarn.lock

File diff suppressed because it is too large Load Diff