Comparing version 1.2.6 to 1.2.7
@@ -59,2 +59,3 @@ module.exports = function (grunt) { | ||
src: ['test/amdloader/**/*.ts'], | ||
html: ['test/amdloader/**/*.tpl.html'], | ||
reference: 'test/amdloader/ts/reference.ts', | ||
@@ -61,0 +62,0 @@ outDir: 'test/amdloader/js', |
@@ -5,3 +5,3 @@ { | ||
"description": "Compile and manage your TypeScript project", | ||
"version": "1.2.6", | ||
"version": "1.2.7", | ||
"homepage": "https://github.com/basarat/grunt-ts", | ||
@@ -8,0 +8,0 @@ "repository": { |
@@ -16,2 +16,4 @@ grunt-ts | ||
*If you know Grunt. Here is a quickstart full featured [Gruntfile](https://github.com/basarat/grunt-ts/blob/master/sample/Gruntfile.js)* | ||
Following are some key features: | ||
@@ -29,3 +31,5 @@ ====================== | ||
Can also do js *file concatenation* using `--out`. For file ordering look at Javascript Generation below. | ||
Can also do js *file concatenation* using `--out`. Additionally supports an output directory for the generated | ||
javascript using `--outDir` flag. | ||
For file ordering look at Javascript Generation below. | ||
@@ -55,3 +59,2 @@ | ||
// You can even put comments here and they are preserved | ||
var orEvenCode = 123; // That you want to come before or after all your files | ||
@@ -67,2 +70,64 @@ //grunt-start | ||
####Javscript generation Redirect | ||
If you specify `outDir` all output javascript are redirectied to this folder. | ||
This helps keep your source folder clean. | ||
####AMD / RequireJS support | ||
If you specify both `outDir` and `amdloader` option a Javascript requireJS loader file is created using the information | ||
available from `reference.ts`. The file consists of three sections. | ||
* The initial ordered section. | ||
* A middle order independent section loaded asynchronously. | ||
* And a final ordered section. | ||
e.g the following `reference` file | ||
```typescript | ||
/// <reference path="classa.ts" /> | ||
//grunt-start | ||
/// <reference path="deep/classb.ts" /> | ||
/// <reference path="deep/classc.ts" /> | ||
//grunt-end | ||
/// <reference path="deep/deeper/classd.ts" /> | ||
/// <reference path="app.ts" /> | ||
``` | ||
Corresponds to an `amdloader`: | ||
```typescript | ||
define(function (require) { | ||
require(["./classa"],function (){ // initial ordered files | ||
require(["./deep/classb", // grunt-ts start / end unordered async loaded files | ||
"./deep/classc"],function (){ | ||
require(["./deep/deeper/classd"],function (){ // final ordered files | ||
require(["./app"],function (){ // another final ordered file | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); | ||
``` | ||
#####Advantage of using amdloader option | ||
The following combination of circumstances are why you would use it instead of Compiler supported AMD. | ||
* You want to use RequireJS since you prefer to debug "js" files instead of "ts" files. | ||
This is useful in some cases and the most common way is using AMD | ||
* However, File order doesn't matter to you, even when you have inter file depenendency (e.g. AngularJS runtime Dependency injection) | ||
In such a case you can either create a `loader.js` manually or have grunt create it for you. | ||
**Further Explanation** If you use `export class Foo{}` at the root level of your file the only | ||
way to use the type information | ||
of Foo in another file is via an import statement `import foo = require('./potentially/long/path/to/Foo');` | ||
The ordering implied by this isn't necessary when using a runtime Dependency injection framework like AngularJS. | ||
Having a loader gives you the js debugging (+ async) advantages | ||
of RequireJS without the overhead of constantly requesting via `import` to get the TypeScript type inference and | ||
worrying about file paths when they are not relevant. | ||
PS: your individual file SourceMaps will continue to work. So now you can debug individual "JS" or "TS" files :) | ||
###Html 2 TypeScript support | ||
@@ -134,3 +199,3 @@ Can reencode html files into typescript and makes them available as a variable. e.g. | ||
out: 'test/out.js', // If specified, generate an out.js file which is the merged js file | ||
outDir: 'test/outputdirectory', // If specified, the generate javascript files are placed here. Only works if out is not specified | ||
outDir: 'test/outputdirectory', // If specified, the generate javascript files are placed here. Only works if out is not specified | ||
watch: 'test', // If specified, watches this directory for changes, and re-runs the current target | ||
@@ -137,0 +202,0 @@ options: { // use to override the default options, http://gruntjs.com/configuring-tasks#options |
@@ -113,2 +113,3 @@ /// <reference path="../defs/node/node.d.ts"/> | ||
var ourSignatureEnd = '//grunt-end'; | ||
var generatedSignature = "// generated"; | ||
@@ -157,9 +158,9 @@ var origFileLines = []; | ||
// the generated files: | ||
// Put in the generated files | ||
generatedFiles = _.map(generatedFiles, function (file) { | ||
return referenceIntro + makeReferencePath(referencePath, file) + referenceEnd; | ||
return referenceIntro + makeReferencePath(referencePath, file) + referenceEnd + generatedSignature; | ||
}); | ||
var contents = insertArrayAt([ourSignatureStart], 1, generatedFiles); | ||
// the new / observed missing files: | ||
var contents = insertArrayAt([ourSignatureStart], 1, generatedFiles); | ||
// Put in the new / observed missing files: | ||
files.forEach(function (filename) { | ||
@@ -192,2 +193,3 @@ // The file we are about to add | ||
before: [], | ||
generated: [], | ||
unordered: [], | ||
@@ -208,2 +210,5 @@ after: [] | ||
// The generated files. These must go on top | ||
var generatedSignature = "// generated"; | ||
var lines = fs.readFileSync(referenceFile).toString().split('\n'); | ||
@@ -233,3 +238,7 @@ | ||
case referenceFileLoopState.unordered: | ||
toreturn.unordered.push(filename); | ||
if (endsWith(line, generatedSignature)) { | ||
toreturn.generated.push(filename); | ||
} else { | ||
toreturn.unordered.push(filename); | ||
} | ||
break; | ||
@@ -247,2 +256,5 @@ case referenceFileLoopState.after: | ||
}); | ||
toreturn.generated = _.map(toreturn.generated, function (relativepath) { | ||
return path.resolve(referencePath, relativepath); | ||
}); | ||
toreturn.unordered = _.map(toreturn.unordered, function (relativepath) { | ||
@@ -283,9 +295,18 @@ return path.resolve(referencePath, relativepath); | ||
// Filter.d.ts, | ||
files.before = _.filter(files.before, function (file) { | ||
return !endsWith(file, '.d.ts'); | ||
}); | ||
files.generated = _.filter(files.generated, function (file) { | ||
return !endsWith(file, '.d.ts'); | ||
}); | ||
files.unordered = _.filter(files.unordered, function (file) { | ||
return !endsWith(file, '.d.ts'); | ||
}); | ||
files.after = _.filter(files.after, function (file) { | ||
return !endsWith(file, '.d.ts'); | ||
}); | ||
if (outDir) { | ||
// Find common path | ||
var commonPath = findCommonPath(files.before.concat(files.unordered.concat(files.after))); | ||
var commonPath = findCommonPath(files.before.concat(files.generated.concat(files.unordered.concat(files.after)))); | ||
@@ -314,2 +335,3 @@ // Make sure outDir is absolute: | ||
files.before = makeRelativeToOutDir(files.before); | ||
files.generated = makeRelativeToOutDir(files.generated); | ||
files.unordered = makeRelativeToOutDir(files.unordered); | ||
@@ -329,2 +351,5 @@ files.after = makeRelativeToOutDir(files.after); | ||
// | ||
// Notice that we build inside out in the below sections: | ||
// | ||
// Generate fileTemplate from inside out | ||
@@ -343,2 +368,7 @@ // Start with after | ||
// Next the generated files | ||
// For these we will use just one require call | ||
var generatedFileNames = files.generated.join('",' + eol + '\t\t "'); | ||
subitem = singleRequireTemplate({ filename: '"' + generatedFileNames + '"', subitem: subitem }); | ||
// Build the subitem for ordered before items | ||
@@ -345,0 +375,0 @@ files.before = files.before.reverse(); |
@@ -142,2 +142,3 @@ /// <reference path="../defs/node/node.d.ts"/> | ||
var ourSignatureEnd = '//grunt-end'; | ||
var generatedSignature = "// generated"; | ||
@@ -189,7 +190,7 @@ var origFileLines = []; // The lines we do not modify and send out as is. Lines will we reach grunt-ts generated | ||
// the generated files: | ||
generatedFiles = _.map(generatedFiles, (file) => referenceIntro + makeReferencePath(referencePath, file) + referenceEnd); | ||
// Put in the generated files | ||
generatedFiles = _.map(generatedFiles, (file) => referenceIntro + makeReferencePath(referencePath, file) + referenceEnd + generatedSignature); | ||
var contents = insertArrayAt([ourSignatureStart], 1, generatedFiles); | ||
// the new / observed missing files: | ||
var contents = insertArrayAt([ourSignatureStart], 1, generatedFiles); | ||
// Put in the new / observed missing files: | ||
files.forEach((filename: string) => { | ||
@@ -222,5 +223,6 @@ // The file we are about to add | ||
function getReferencesInOrder(referenceFile: string, referencePath: string): { before: string[]; unordered: string[]; after: string[]; } { | ||
function getReferencesInOrder(referenceFile: string, referencePath: string): { before: string[]; generated: string[]; unordered: string[]; after: string[]; } { | ||
var toreturn = { | ||
before: [], | ||
generated: [], | ||
unordered: [], | ||
@@ -241,2 +243,5 @@ after: [] | ||
// The generated files. These must go on top | ||
var generatedSignature = "// generated"; | ||
var lines = fs.readFileSync(referenceFile).toString().split('\n'); | ||
@@ -269,3 +274,8 @@ | ||
case referenceFileLoopState.unordered: | ||
toreturn.unordered.push(filename); | ||
if(endsWith(line, generatedSignature)) { | ||
toreturn.generated.push(filename); | ||
} | ||
else { | ||
toreturn.unordered.push(filename); | ||
} | ||
break; | ||
@@ -281,2 +291,3 @@ case referenceFileLoopState.after: | ||
toreturn.before = _.map(toreturn.before, (relativepath) => { return path.resolve(referencePath, relativepath); }); | ||
toreturn.generated = _.map(toreturn.generated, (relativepath) => { return path.resolve(referencePath, relativepath); }); | ||
toreturn.unordered = _.map(toreturn.unordered, (relativepath) => { return path.resolve(referencePath, relativepath); }); | ||
@@ -316,3 +327,6 @@ toreturn.after = _.map(toreturn.after, (relativepath) => { return path.resolve(referencePath, relativepath); }); | ||
// Filter.d.ts, | ||
files.before = _.filter(files.before, (file) => { return !endsWith(file, '.d.ts'); }); | ||
files.generated = _.filter(files.generated, (file) => { return !endsWith(file, '.d.ts'); }); | ||
files.unordered = _.filter(files.unordered, (file) => { return !endsWith(file, '.d.ts'); }); | ||
files.after = _.filter(files.after, (file) => { return !endsWith(file, '.d.ts'); }); | ||
@@ -326,3 +340,3 @@ // If target has outDir we need to make adjust the path | ||
// Find common path | ||
var commonPath = findCommonPath(files.before.concat(files.unordered.concat(files.after))); | ||
var commonPath = findCommonPath(files.before.concat(files.generated.concat(files.unordered.concat(files.after)))); | ||
@@ -351,14 +365,14 @@ // Make sure outDir is absolute: | ||
files.before = makeRelativeToOutDir(files.before); | ||
files.generated = makeRelativeToOutDir(files.generated); | ||
files.unordered = makeRelativeToOutDir(files.unordered); | ||
files.after = makeRelativeToOutDir(files.after); | ||
var mainTemplate = _.template('define(function (require) { ' | ||
+ eol + '<%= body %>' | ||
+ eol + '});'); | ||
// The order in the before and after files is important | ||
var singleRequireTemplate = _.template('\t require([<%= filename %>],function (){' | ||
+ eol + '<%= subitem %>' | ||
+ eol + '\t });'); | ||
+ eol + '\t });'); | ||
@@ -368,6 +382,10 @@ | ||
var body = ''; | ||
// initial sub item | ||
var subitem = ''; | ||
var subitem = ''; | ||
// | ||
// Notice that we build inside out in the below sections: | ||
// | ||
// Generate fileTemplate from inside out | ||
@@ -378,3 +396,3 @@ // Start with after | ||
_.forEach(files.after, (file) => { | ||
subitem = singleRequireTemplate({ filename: '"'+file+'"', subitem: subitem}); | ||
subitem = singleRequireTemplate({ filename: '"' + file + '"', subitem: subitem }); | ||
}); | ||
@@ -384,4 +402,9 @@ | ||
// For these we will use just one require call | ||
var unorderFileNames = files.unordered.join('",'+eol+'\t\t "'); | ||
subitem = singleRequireTemplate({filename:'"'+unorderFileNames+'"',subitem:subitem}); | ||
var unorderFileNames = files.unordered.join('",' + eol + '\t\t "'); | ||
subitem = singleRequireTemplate({ filename: '"' + unorderFileNames + '"', subitem: subitem }); | ||
// Next the generated files | ||
// For these we will use just one require call | ||
var generatedFileNames = files.generated.join('",' + eol + '\t\t "'); | ||
subitem = singleRequireTemplate({ filename: '"' + generatedFileNames + '"', subitem: subitem }); | ||
@@ -548,3 +571,3 @@ // Build the subitem for ordered before items | ||
// Create the loader if specified & compiliation succeeded | ||
if (!!amdloaderPath && result.code==0) { | ||
if (!!amdloaderPath && result.code == 0) { | ||
updateAmdLoader(referenceFile, referencePath, amdloaderFile, amdloaderPath, target.outDir); | ||
@@ -551,0 +574,0 @@ } |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
160349
2617
237