Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Mario L Gutierrez committed Mar 23, 2013
0 parents commit 9582b54
Show file tree
Hide file tree
Showing 13 changed files with 681 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.idea
src/js/app_js/app.*
dist/
47 changes: 47 additions & 0 deletions Projfile.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
exports.project = (pm) ->
f = pm.filters()
$ = pm.shell()

# Change asset filename roots to "dist"
distDir = _filename: { replace: [/^src/, "dist"] }

addJsHeader = f.addHeader filename: "res/copyright.js"

"app.js":
description: "Creates app.js CommonJS module from src/app_js"
files:
include: ["src/js/app_js/**/*.coffee", "src/js/app_js/**/*.js"]
# hack for WebStorm, app.js has to be built in same directory for source
# maps to work
exclude: ["src/js/app_js/app.js"]

development: [
# source map is default in development environment
f.coffee(bare: true)

f.commonJsify(baseDir: "src/js/app_js", packageName: "app", filename: "src/js/app_js/app.js")

# Write assets to "dist" directory
f.writeFile
]

production: [
f.coffee(bare: true)
# file isn't written at this step, the writeFile filter replaces "src" with "dist"
f.commonJsify(baseDir: "src/js/app_js", packageName: "app", filename: "src/js/app_js/app.js")
f.uglify
addJsHeader
f.writeFile(distDir)
]

clean:
development: ->
$.rm_rf "dist"
$.rm "-f", "src/js/app_js/app.*"

staticFiles:
development: ->
$.cp_f "src/index.html", "dist"

dist:
pre: ["clean", "app.js", "staticFiles"]
43 changes: 43 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# coffee-backbone-sourcemap

Projmate CoffeeScript and Backbone example with support for source maps.
Debug your CoffeeScript templates and source! What's inside?

* CommonJS simplicity
* Debuggable CoffeeScript everywhere


More documentation is forthcoming for Projmate, which is a GUI project editor
based on my likes/dislikes about Jake, Grunt and deploying production sites.
The project is early but the CLI is already useful.

* Builds are based on environments (development, test, production)
* Simple filters and pipelines for asset processing


## Instructions

* Install Projmate build tool

npm install projmate@0.1.0-dev

* Clone the project

git clone git://github.com/projmate/coffee-backbone-sourcemap.git

* Serve and watch files in development mode.

cd coffee-backbone-sourcemap
pm run app.js --serve src --watch

* To build production files

pm run dist -e production


## Debugging

Chrome's source map support seems hit-and-miss. Debugging works great in
WebStorm. Set breakpoints then debug `src/index.html` by right clicking it.


65 changes: 65 additions & 0 deletions sourcemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env coffee

Fs = require('fs')
Path = require('path')

{SourceMapGenerator, SourceMapConsumer, SourceNode:Node} = require("source-map")

`
String.prototype.regexIndexOf = function(regex, startpos) {
var indexOf = this.substring(startpos || 0).search(regex);
return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}
`

SourceMap =

createGenerator: (file, sourceRoot) ->
new SourceMapGenerator({file, sourceRoot})

loadFile: (file) ->
content = Fs.readFileSync(file, "utf8")
new SourceMapConsumer(content)

rebase: (generator, map, offsetLine) ->
consumer = new SourceMapConsumer(map)
consumer.eachMapping (item) ->
generator.addMapping
source: item.source
generated: {line: item.generatedLine + offsetLine, column: item.generatedColumn}
original: {line: item.originalLine, column: item.originalColumn}
name: item.name

dump: (map, max=Number.MAX_VALUE) ->
cons = new SourceMapConsumer(map)
i = 0
cons.eachMapping (item) ->
console.log(item) if i++ < max

# Interlace sourceFile statements with generated statemetns
interlace: (sourceFile, mapFile) ->
map = SourceMap.loadFile(mapFile)
generatedFile = Path.resolve(Path.join(Path.dirname(mapFile), map.file))
mapLines = Fs.readFileSync(generatedFile, "utf8").split("\n")

lines = Fs.readFileSync(sourceFile, "utf8").split("\n")

if map.sourceRoot
basename = sourceFile
else
basename = Path.basename(sourceFile)
#console.log "basename", basename

for line, l in lines
col = line.regexIndexOf(/\S/)
console.log line
if col > -1
generated = map.generatedPositionFor(source: basename, line: l + 1, column: col + 1)
#console.log "generated", generated
#console.log "//[#{l+1}, #{col+1}] "+mapLines[generated.line - 1]
console.log "#=> "+mapLines[generated.line - 1].trim()

SourceMap.interlace "src/account.coffee", "src/app.map"


# vim set filetype=coffee :
20 changes: 20 additions & 0 deletions src/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<html>
<head>
</head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
<script src="js/app_js/app.js" type="text/javascript"></script>
<div id="app-wrapper">
<!-- backbone app -->
</div>
<script>
$(function() {
var app = require('app');

app.run();
});
</script>
</body>
</html>
7 changes: 7 additions & 0 deletions src/js/app_js/index.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Account = require("./models/account")
AppView = require("./views/app")

exports.run = ->
account = new Account
view = new AppView(model: account)
view.renderTo $("#app-wrapper")
Loading

0 comments on commit 9582b54

Please sign in to comment.