gulp-vash-static
Version:
Gulp plugin for converting Vash razor templates to static html
186 lines (141 loc) • 8.11 kB
Markdown
# gulp-vash-static
Gulp plugin for converting Vash razor templates to static html
*Keep in mind that this is just a thin wrapper around Vash Static and your issue is most likely with that.*
## Install
```
$ npm install --save-dev gulp-vash-static
```
## Usage
There are a few different functions you can call:
- 'precompile': Precompiles a vash templates and generates a json file with the template's name and contents in it.
- 'renderPage': Renders a 'page' vash template by name, which should be stored in the cacheDest, with optional helpers.
- 'watchModelsAndTemplates': Convenience function for watching models and templates.
This is my recommended setup, where all you need to call is 'gulp watch' to get started.
```js
var gulp = require('gulp');
var vashStatic = require('gulp-vash-static');
// The default is "pg" anyway, but this is just to show you that you can change it to another directory name if you wish
vashStatic.setPageDirType("pg");
var dirTypes = ["pg", "wg", "glb"]; // vashStatic module types
var APP = "dev/app/";
var PRECOMP_VASH = "precompiled-vash.json" // aka vash cache
gulp.task("precompile-vash", function() {
return gulp.src([
APP + "pg/**/*.vash"
, APP + "wg/**/*.vash"
, APP + "glb/**/*.vash"
, "!" + APP + "glb/vash-helpers/*.vash" // leave out any vash helpers you have
])
.pipe(vashStatic.precompile({
debugMode: true,
dirTypes: dirTypes,
modelsPath: "bld/js/models.js",
cacheFileName: PRECOMP_VASH
}))
.pipe(gulp.dest("bld/"))
})
gulp.task("pg-render-static", function() {
return gulp.src(APP + "pg/**/*.vash")
.pipe(vashStatic.renderPage({
cacheDest: "bld/" + PRECOMP_VASH
, helpers: [ APP "glb/vash-helpers/RenderWidget.vash" ] // optionally, you can add or override (same name) with custom helpers
, omitSubDir: "tmpl" //omit a subdirectory that you might have that you don't want to be part of the template name
}))
.pipe(gulp.dest("bld/"))
})
// Combines models so they can be injected into templates when rendering.
// This is suggested if you need a separate model per page.
// Recommend using TypeScript because of it's similar syntax to C# models, which makes integration of Razor front end and back end easier.
gulp.task("combine-models", function () {
var src = [
APP + "pg/**/mdl/*.ts"
, APP + "wg/**/mdl/*.ts"
];
return gulp.src(src)
.pipe(ts({
noImplicitAny: true,
out: 'models.js'
}))
.pipe(gulp.dest("bld/js/"));
});
/*
Watches for any changes in vash templates or models, updates the precompiled template cache (on the file system), then renders the page marked by a flag (eg --home) by calling the 'pg-render-static' task.
Note that 'vashStatic.watchModelsAndTemplates' is not a gulp plugin, just a convenience function that abstracts away some complex logic.
Returns a stream from gulp plugin 'gulp-watch'.
*/
gulp.task("watch", function() {
var vashSrc = [ // vash templates
APP+"pg/**/*.vash"
, APP+"wg/**/*.vash"
]
, modelSrc = [ // template models
APP + "pg/**/mdl/*.ts"
, APP + "wg/**/mdl/*.ts"
]
return vashStatic.watchModelsAndTemplates({
gulp: gulp // pass in the instance of gulp you are using
, vashSrc: vashSrc
, modelSrc: modelSrc
, modelsDest: "bld/js/models.js" // your combined models to inject when rendering templates
, cacheDest: "bld/" + PRECOMP_VASH // cached templates JSON file, generated by 'precompile-vash' task
, debugMode: true // should be false for production to keep file size down
, dirTypes: dirTypes // module types, eg ['pg', 'wg', 'glb']
, pageTemplatePath: APP + "<%= type %>/<%= moduleName %>/tmpl/<%= fileName %>" // pattern to the vash template, using moduleName from the '--home' flag
// existing gulp tasks to call when files are changed
, combineModelsTask: 'combine-models'
, precompileTask: 'precompile-vash'
, pageRenderTask: 'pg-render-static'
})
})
```
## API
### setPageDirType
Vash Static uses modules to organise your templates. By default it assumes you have at least a page module, which is abbreviated to 'pg' and is expected in the directory structure. With 'setPageDirType' you can change this, if you need to.
### getAllArgs
Gets the argument from the command-line that starts with '--', omitting the '--' and finishing at the next space.
The watch on models cannot detect the exact page that needs to be rendered, so assumes 'Index.vash'. You can specify a different page though by adding a '/MyPageName' (omit the file extension).
#### parameters
- {string[]} - Optionally pass in custom args, say from a child process when testing.
- returns {string} Argument value without the '--' prefix.
### overrideGetAllArgs
Allows you to optionally override the functionality of 'getAllArgs', so you can manipulate arguments. First param should be the function and it should return a manipulated string containing the page name.
### restoreGetAllArgs
Restores 'getAllArgs' after using 'overrideGetAllArgs'.
### suppressWarnings
This can be useful if you don't want to output lots of warnings in things like unit tests (which can be annoying).
#### parameters
- {boolean} - True to suppress console warnings. False to switch them back on again.
### precompileTemplateCache
Precompiles a vash templates and generates a json file with the template's name and contents in it.
#### options
- {boolean} debugMode (optional) - Production usage should pass false to keep file size down. Development should use true, for useful debugging info. Defaults to false.
- {string[]} dirTypes (optional) - List of types. This type will be searched for in the filePath and is expected to be a full directory name. If not given, only page type will be used.
- {string} modelsPath (optional) - File path to the combined models js file, which can prepend your templates to provide model data. If not given, no models will be added.
- {string} cacheFileName (optional) - Name of the json file output. Defaults to 'precompiled-vash.json'.
### renderPage
Precompiles a vash templates and generates a json file with the template's name and contents in it.
#### options
- {string} cacheDest - Path to the JSON file containing the vash template cache.
- {string} omitSubDir (optional) - If given, will remove the first occurance of a sub-directory with this name when generating the template name.
- {string[]} helpers (optional) - Array of paths to use as Vash helpers. Defaults will be used, unless overridden by name. Otherwise both lists will be used.
### watchModelsAndTemplates
Convenience function for watching models and templates
#### options
- {object} gulp - instance of gulp
- {string} vashSrc - vash templates to watch (accepts globbing)
- {string} modelSrc - models to watch (accepts globbing)
- {string} modelsDest - path to the models JS destination (once they are combined)
- {string} cacheDest - path to the template cache destination
- {boolean} debugMode - If this is for production, should be false
- {string[]} dirTypes - Module types (eg "pg", "wg", glb), which correspond to parent directory name of template modules.
- {string} pageTemplatePath - String for determining the path of the page-level template, where only the page name is known (eg "<%= type %>/<%= moduleName %>/tmpl/<%= fileName %>").
- {string} combineModelsTask - Gulp task name for combining your models
- {string} precompileTask - Gulp task name for pre-compiling your vash templates
- {string} pageRenderTask - Gulp task name for rendering a page
## Release notes:
- Version 2.0.0 introduced some breaking API changes:
1. `getFirstArg` was replaced by `getAllArgs`
2. `overrideGetFirstArg` was replaced by `overrideGetAllArgs`
3. `restoreGetFirstArg` was replaced by `restoreGetAllArgs`
## License
MIT © [Jim Doyle](http://jimdoyle.com.au)