├── .editorconfig ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── .jshintrc ├── .travis.yml ├── README.md ├── app ├── index.js └── templates │ ├── Gruntfile.js │ ├── LICENSE │ ├── README.md │ ├── _package.json │ ├── ascii │ ├── umbraco-logo.txt │ └── umbraco-text.txt │ ├── basic │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ ├── config │ ├── _package.nuspec │ ├── _package.xml │ └── readme.txt │ ├── gitignore │ ├── google-maps │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ ├── markdown-editor │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ └── test │ ├── app.conf.js │ ├── karma.conf.js │ └── specs │ └── name.controller.spec.js ├── package.json ├── test ├── test-creation.js └── test-load.js ├── yo-umbraco-grunt-target.gif ├── yo-umbraco-grunt.gif ├── yo-umbraco.gif ├── yo-umbraco.sublime-project └── yo-umbraco.sublime-workspace /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: warrenbuckley # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | temp/ 3 | generator-umbraco-sublime-proj.sublime-project 4 | generator-umbraco-sublime-proj.sublime-workspace 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "esnext": true, 4 | "bitwise": true, 5 | "camelcase": true, 6 | "curly": true, 7 | "eqeqeq": true, 8 | "immed": true, 9 | "indent": 2, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "quotmark": "single", 14 | "regexp": true, 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "white": true 21 | } 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_install: 5 | - currentfolder=${PWD##*/} 6 | - if [ "$currentfolder" != 'generator-umbraco' ]; then cd .. && eval "mv $currentfolder generator-umbraco" && cd generator-umbraco; fi 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # generator-umbraco [![Build Status](https://secure.travis-ci.org/warrenbuckley/generator-umbraco.png?branch=master)](https://travis-ci.org/warrenbuckley/generator-umbraco) [![Stories in Ready](https://badge.waffle.io/warrenbuckley/generator-umbraco.png?label=ready&title=Ready)](https://waffle.io/warrenbuckley/generator-umbraco) 2 | 3 | > An Umbraco [Yeoman](http://yeoman.io) generator 4 | 5 | ## Getting Started 6 | 7 | ### What is Yeoman? 8 | 9 | Trick question. It's not a thing. It's this guy: 10 | 11 | ![](http://i.imgur.com/JHaAlBJ.png) 12 | 13 | Basically, he wears a top hat, lives in your computer, and waits for you to tell him what kind of application you wish to create. 14 | 15 | Not every new computer comes with a Yeoman pre-installed. He lives in the [npm](https://npmjs.org) package repository. You only have to ask for him once, then he packs up and moves into your hard drive. *Make sure you clean up, he likes new and shiny things.* 16 | 17 | ``` 18 | npm install -g yo 19 | ``` 20 | 21 | ### Yeoman Generators 22 | 23 | Yeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension. 24 | 25 | To install generator-umbraco from npm, run: 26 | 27 | ``` 28 | npm install -g generator-umbraco 29 | ``` 30 | 31 | Finally, initiate the generator: 32 | 33 | ``` 34 | yo umbraco 35 | ``` 36 | ![](https://raw.github.com/warrenbuckley/generator-umbraco/master/yo-umbraco.gif) 37 | 38 | 39 | The friendly YeoMan will ask you some questions about creating your Umbraco property editor and then go off and scaffold it all for you to start building your own Umbraco property editor. 40 | 41 | Once you have YeoMan create the Umbraco Property Editor for you you can use the power of GruntJS build tool to help build the property editor. If you have GruntJS already installed then you will not need to run the command below. 42 | 43 | ``` 44 | npm install -g grunt-cli 45 | ``` 46 | 47 | ### Grunt Tasks 48 | There are several grunt tasks you can run from the folder where YeoMan has copied the folder & files for you, make sure you chaneg directory to that folder then you can run the following commands: 49 | 50 | ![](https://raw.github.com/warrenbuckley/generator-umbraco/master/yo-umbraco-grunt.gif) 51 | 52 | 53 | #### General Build 54 | ``` 55 | grunt 56 | ``` 57 | 58 | #### Build NuGet Package 59 | ``` 60 | grunt nuget 61 | ``` 62 | 63 | #### Build Umbraco Package 64 | ``` 65 | grunt package 66 | ``` 67 | 68 | #### Automatically watch & build files 69 | This will monitor the Less, Javascript & HTML files for you and build, concat & copy them as needed every time you save a file. 70 | ``` 71 | grunt watch 72 | ``` 73 | 74 | #### Test with an Umbraco Site 75 | You can easily copy your property editor to an Umbraco site to test it out. This will copy the folder that gets run when calling grunt. You simply need to specify the root of the Umbraco site by specifiying a target switch. 76 | ``` 77 | grunt --target=c:\inetpub\wwwroot\my-umbraco-site\ 78 | ``` 79 | 80 | #### Unit test your controller 81 | Your property editor comes with a basic test setup for unit testing the editors controller. This is done with [Jasmine](http://jasmine.github.io/2.0/introduction.html) and [Karma](http://karma-runner.github.io/0.12/index.html) 82 | 83 | To run your unit tests: 84 | ``` 85 | grunt test 86 | ``` 87 | 88 | **Notice**: To run unit tests you have to copy over all Umbraco's core javascript files. Which you can do by setting -target to point at your /umbraco/ directory, you only have to do this once. 89 | 90 | ``` 91 | grunt test --target=c:\inetpub\wwwroot\my-umbraco-site\umbraco 92 | ``` 93 | 94 | 95 | 96 | 97 | ![](https://raw.github.com/warrenbuckley/generator-umbraco/master/yo-umbraco-grunt-target.gif) 98 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var util = require('util'); 4 | var path = require('path'); 5 | var yeoman = require('yeoman-generator'); 6 | var chalk = require('chalk'); 7 | var changeCase = require('change-case'); 8 | 9 | var UmbracoGenerator = yeoman.generators.Base.extend({ 10 | init: function () { 11 | this.pkg = yeoman.file.readJSON(path.join(__dirname, '../package.json')); 12 | 13 | this.on('end', function () { 14 | if (!this.options['skip-install']) { 15 | console.log(chalk.green('Installing npm dependencies')); 16 | process.chdir(this.names.alias); 17 | this.npmInstall(); 18 | } 19 | }); 20 | }, 21 | 22 | askFor: function () { 23 | var done = this.async(); 24 | 25 | //Umbraco ASCII Art 26 | var ascii = this.readFileAsString(path.join(this.sourceRoot(), '/ascii/umbraco-text.txt')); 27 | console.log(chalk.green(ascii)); 28 | 29 | //Add in some version info 30 | console.log(chalk.green('Version: ' + this.pkg.version )); 31 | console.log(chalk.green('Author: ' + this.pkg.author.name )); 32 | console.log(chalk.green('Contributors: ' + this.pkg.contributors[0].name + ' & ' + this.pkg.contributors[1].name + ' & ' + this.pkg.contributors[2].name)); 33 | 34 | console.log(chalk.yellow("Hello there! Let's create an Umbraco Property Editor.\n")); 35 | 36 | var prompts = [ 37 | { 38 | name: 'name', 39 | message: 'Name', 40 | default: 'Awesome Property Editor' 41 | }, 42 | { 43 | name: 'description', 44 | message: 'Description', 45 | default: 'An Umbraco Property Editor' 46 | }, 47 | { 48 | name: 'author', 49 | message: 'Author', 50 | default: this.user.git.username || 'Warren Buckley' 51 | }, 52 | { 53 | name: 'template', 54 | message: 'Do you wish to use a template to help you?', 55 | type: 'list', 56 | choices: [ 57 | { 58 | name: "No thanks I am fine", 59 | value: "basic" 60 | }, 61 | { 62 | name: "Google Maps", 63 | value: "google-maps" 64 | } 65 | ] 66 | }, 67 | { 68 | name: 'valueType', 69 | message: 'What type of data will you be storing?', 70 | type: 'list', 71 | choices: [ 72 | { 73 | name: "JSON", 74 | value: "JSON" 75 | }, 76 | { 77 | name: "String", 78 | value: "STRING" 79 | }, 80 | { 81 | name: "Text", 82 | value: "TEXT" 83 | }, 84 | { 85 | name: "Date Time", 86 | value: "DATETIME" 87 | }, 88 | { 89 | name: "Integer", 90 | value: "INT" 91 | } 92 | ], 93 | when: function(answers) { 94 | return answers.template === "basic"; 95 | }, 96 | default: 'JSON' 97 | } 98 | ]; 99 | 100 | this.prompt(prompts, function(props) { 101 | 102 | this.names = { 103 | name: props.name, 104 | alias: changeCase.pascalCase(props.name), 105 | ctrl: changeCase.pascalCase(props.name) + 'Controller', 106 | css: changeCase.paramCase(props.name), 107 | file: changeCase.dotCase(props.name), 108 | template: changeCase.paramCase(props.template) 109 | } 110 | 111 | this.author = props.author; 112 | this.description = props.description; 113 | this.valueType = props.valueType; 114 | 115 | //Log template type 116 | console.log(this.names.template); 117 | 118 | 119 | done(); 120 | 121 | }.bind(this)); 122 | }, 123 | 124 | app: function () { 125 | //Read package.manifest JSON (So we can loop over them in the HTML view markup) 126 | this.pkgmanifest = yeoman.file.readJSON(path.join(__dirname,'templates/' , this.names.template ,'/config/package.manifest')); 127 | this.prevalues = this.pkgmanifest.propertyEditors[0].prevalues.fields; 128 | 129 | //Create Directories 130 | this.mkdir(this.names.alias); 131 | this.mkdir(this.names.alias + '/app/scripts/controllers'); 132 | this.mkdir(this.names.alias + '/app/styles'); 133 | this.mkdir(this.names.alias + '/app/views'); 134 | this.mkdir(this.names.alias + '/config'); 135 | this.mkdir(this.names.alias + '/test'); 136 | this.mkdir(this.names.alias + '/test/specs'); 137 | 138 | //Template: Common files 139 | this.template('README.md', this.names.alias + '/README.md'); 140 | this.template('LICENSE', this.names.alias + '/LICENSE'); 141 | this.template('gitignore', this.names.alias + '/.gitignore'); 142 | this.template('_package.json', this.names.alias + '/package.json'); 143 | this.template('Gruntfile.js', this.names.alias + '/Gruntfile.js'); 144 | 145 | //Template: Files specific to template type (/basic/app/views/name.html ...) 146 | this.template(this.names.template + '/app/views/name.html', this.names.alias + '/app/views/' + this.names.file + '.html'); 147 | this.template(this.names.template + '/app/scripts/controllers/name.controller.js', this.names.alias + '/app/scripts/controllers/' + this.names.file + '.controller.js'); 148 | this.template(this.names.template + '/app/styles/name.less', this.names.alias + '/app/styles/' + this.names.file + '.less'); 149 | this.template(this.names.template + '/config/package.manifest', this.names.alias + '/config/package.manifest'); 150 | 151 | 152 | //COPY: Files specific for test setup 153 | this.copy('test/karma.conf.js', this.names.alias + '/test/karma.conf.js'); 154 | this.copy('test/app.conf.js', this.names.alias + '/test/app.conf.js'); 155 | 156 | //TEMPLATE: controller test setup 157 | this.template('test/specs/name.controller.spec.js', this.names.alias + '/test/specs/' + this.names.ctrl + '.spec.js'); 158 | 159 | 160 | //Copy Files: No param's need replacing 161 | this.copy('config/_package.nuspec', this.names.alias + '/config/package.nuspec'); 162 | this.copy('config/_package.xml', this.names.alias + '/config/package.xml'); 163 | this.copy('config/readme.txt', this.names.alias + '/config/readme.txt'); 164 | 165 | } 166 | }); 167 | 168 | module.exports = UmbracoGenerator; 169 | 170 | -------------------------------------------------------------------------------- /app/templates/Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | require('load-grunt-tasks')(grunt); 3 | require('time-grunt')(grunt); 4 | require('grunt-karma')(grunt); 5 | 6 | //cant load this with require 7 | grunt.loadNpmTasks('grunt-contrib-jshint'); 8 | 9 | if (grunt.option('target') && !grunt.file.isDir(grunt.option('target'))) { 10 | grunt.fail.warn('The --target option specified is not a valid directory'); 11 | } 12 | 13 | grunt.initConfig({ 14 | pkg: grunt.file.readJSON('package.json'), 15 | dest: grunt.option('target') || 'dist', 16 | basePath: 'App_Plugins/<%%= pkg.name %>', 17 | 18 | concat: { 19 | dist: { 20 | src: [ 21 | 'app/scripts/controllers/*.controller.js', 22 | 'app/scripts/services/*.service.js', 23 | 'app/scripts/resources/*.resouce.js', 24 | 'app/scripts/directives/*.directive.js', 25 | ], 26 | dest: '<%%= dest %>/<%%= basePath %>/js/<%= names.file %>.js', 27 | nonull: true 28 | } 29 | }, 30 | 31 | less: { 32 | dist: { 33 | options: { 34 | paths: ['app/styles'], 35 | }, 36 | files: { 37 | '<%%= dest %>/<%%= basePath %>/css/<%= names.file %>.css': 'app/styles/<%= names.file %>.less', 38 | } 39 | } 40 | }, 41 | 42 | watch: { 43 | options: { 44 | atBegin: true 45 | }, 46 | 47 | less: { 48 | files: ['app/styles/**/*.less'], 49 | tasks: ['less:dist'] 50 | }, 51 | 52 | js: { 53 | files: ['app/scripts/**/*.js'], 54 | tasks: ['concat:dist'] 55 | }, 56 | 57 | testControllers: { 58 | files: ['app/scripts/**/*.controller.js', 'test/specs/**/*.spec.js'], 59 | tasks: ['jshint', 'test'] 60 | }, 61 | 62 | html: { 63 | files: ['app/views/**/*.html'], 64 | tasks: ['copy:views'] 65 | }, 66 | 67 | config: { 68 | files: ['config/package.manifest'], 69 | tasks: ['copy:config'] 70 | } 71 | }, 72 | 73 | copy: { 74 | config: { 75 | src: 'config/package.manifest', 76 | dest: '<%%= dest %>/<%%= basePath %>/package.manifest', 77 | }, 78 | 79 | views: { 80 | expand: true, 81 | cwd: 'app/views/', 82 | src: '**', 83 | dest: '<%%= dest %>/<%%= basePath %>/views/' 84 | }, 85 | 86 | nuget: { 87 | expand: true, 88 | cwd: '<%%= dest %>', 89 | src: '**', 90 | dest: 'tmp/nuget/content/' 91 | }, 92 | 93 | umbraco: { 94 | expand: true, 95 | cwd: '<%%= dest %>/', 96 | src: '**', 97 | dest: 'tmp/umbraco/' 98 | }, 99 | 100 | testAssets: { 101 | expand: true, 102 | cwd: '<%%= dest %>', 103 | src: ['js/umbraco.*.js', 'lib/**/*.js'], 104 | dest: 'test/assets/' 105 | } 106 | }, 107 | 108 | template: { 109 | nuspec: { 110 | options: { 111 | data: { 112 | name: '<%%= pkg.name %>', 113 | version: '<%%= pkg.version %>', 114 | author: '<%%= pkg.author.name %>', 115 | description: '<%%= pkg.description %>' 116 | } 117 | }, 118 | files: { 119 | 'tmp/nuget/<%%= pkg.name %>.nuspec': 'config/package.nuspec' 120 | } 121 | } 122 | }, 123 | 124 | mkdir: { 125 | pkg: { 126 | options: { 127 | create: ['pkg/nuget', 'pkg/umbraco'] 128 | }, 129 | }, 130 | }, 131 | 132 | nugetpack: { 133 | dist: { 134 | src: 'tmp/nuget/<%%= pkg.name %>.nuspec', 135 | dest: 'pkg/nuget/' 136 | } 137 | }, 138 | 139 | umbracoPackage: { 140 | options: { 141 | name: '<%%= pkg.name %>', 142 | version: '<%%= pkg.version %>', 143 | url: '<%%= pkg.url %>', 144 | license: '<%%= pkg.license %>', 145 | licenseUrl: '<%%= pkg.licenseUrl %>', 146 | author: '<%%= pkg.author %>', 147 | authorUrl: '<%%= pkg.authorUrl %>', 148 | manifest: 'config/package.xml', 149 | readme: 'config/readme.txt', 150 | sourceDir: 'tmp/umbraco', 151 | outputDir: 'pkg/umbraco', 152 | } 153 | }, 154 | 155 | clean: { 156 | dist: '<%= dest %>', 157 | test: 'test/assets' 158 | }, 159 | 160 | karma: { 161 | unit: { 162 | configFile: 'test/karma.conf.js' 163 | } 164 | }, 165 | 166 | jshint: { 167 | dev: { 168 | files: { 169 | src: ['app/scripts/**/*.js'] 170 | }, 171 | options: { 172 | curly: true, 173 | eqeqeq: true, 174 | immed: true, 175 | latedef: true, 176 | newcap: true, 177 | noarg: true, 178 | sub: true, 179 | boss: true, 180 | eqnull: true, 181 | //NOTE: we need to use eval sometimes so ignore it 182 | evil: true, 183 | //NOTE: we need to check for strings such as "javascript:" so don't throw errors regarding those 184 | scripturl: true, 185 | //NOTE: we ignore tabs vs spaces because enforcing that causes lots of errors depending on the text editor being used 186 | smarttabs: true, 187 | globals: {} 188 | } 189 | } 190 | } 191 | }); 192 | 193 | grunt.registerTask('default', ['jshint', 'concat', 'less', 'copy:config', 'copy:views']); 194 | grunt.registerTask('nuget', ['clean', 'default', 'copy:nuget', 'template:nuspec', 'mkdir:pkg', 'nugetpack']); 195 | grunt.registerTask('package', ['clean', 'default', 'copy:umbraco', 'mkdir:pkg', 'umbracoPackage']); 196 | 197 | grunt.registerTask('test', 'Clean, copy test assets, test', function () { 198 | var assetsDir = grunt.config.get('dest'); 199 | //copies over umbraco assets from --target, this must point at the /umbraco/ directory 200 | if (assetsDir !== 'dist') { 201 | grunt.task.run(['clean:test', 'copy:testAssets', 'karma']); 202 | } else if (grunt.file.isDir('test/assets/js/')) { 203 | grunt.log.oklns('Test assets found, running tests'); 204 | grunt.task.run(['karma']); 205 | } else { 206 | grunt.log.errorlns('Tests assets not found, skipping tests'); 207 | } 208 | }); 209 | }; 210 | -------------------------------------------------------------------------------- /app/templates/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) <%= new Date().getFullYear() %> <%= author %> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /app/templates/README.md: -------------------------------------------------------------------------------- 1 | # <%= names.name %> 2 | 3 | <%= description %> 4 | 5 | ## Setup 6 | 7 | ### Install Dependencies 8 | 9 | ```bash 10 | npm install -g grunt-cli 11 | npm install 12 | ``` 13 | 14 | ### Build 15 | 16 | ```bash 17 | grunt 18 | ``` 19 | 20 | ### Watch 21 | 22 | ```bash 23 | grunt watch 24 | ``` 25 | 26 | -------------------------------------------------------------------------------- /app/templates/_package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%= names.alias %>", 3 | "version": "0.0.0", 4 | "description": "<%= description %>", 5 | "license": "MIT", 6 | "author": { 7 | "name": "<%= author %>", 8 | "email": "", 9 | "url": "" 10 | }, 11 | "devDependencies": { 12 | "grunt": "~0.4.2", 13 | "load-grunt-tasks": "~0.3.0", 14 | "grunt-contrib-concat": "~0.3.0", 15 | "grunt-contrib-watch": "~0.5.3", 16 | "grunt-contrib-less": "~0.9.0", 17 | "grunt-contrib-clean": "~0.5.0", 18 | "grunt-contrib-copy": "~0.5.0", 19 | "grunt-contrib-jshint": "^0.10.0", 20 | "grunt-template": "~0.2.2", 21 | "grunt-nuget": "~0.1.1", 22 | "grunt-mkdir": "~0.1.1", 23 | "grunt-umbraco-package": "~0.0.3", 24 | "time-grunt": "~0.2.10", 25 | "grunt-karma": "^0.8.3", 26 | "karma": "^0.12.16", 27 | "karma-jasmine": "^0.1.5", 28 | "karma-phantomjs-launcher": "^0.1.4" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/templates/ascii/umbraco-logo.txt: -------------------------------------------------------------------------------- 1 | ,iii. 2 | iiiiiiiiii: 3 | ,iiiiiiiiiiiii 4 | iiiiiiiiiiiiiiii: 5 | iiiiiiiiiiiiiiiiii. 6 | .iiiiiiiiiiiiiiiiiii 7 | iiiiiiiiiiiiiiiiiiiii 8 | ;iiii iiiiiiiii iiii C, 9 | iiiii iiiiiiiii iiiii Gi 10 | iiiii iiiiiiiii iiiii GL GL GGGG,GGG GLGGG GGG, GGGG GGG GGGi 11 | iiiii iiiiiiiii iiiii GC GL G: CG GG GC GG G , GG GG GG ,G 12 | iiii: iiiiiiiii iiiii GC GL G .G GG Gi GG G .tGG G G G, 13 | iiii; iiiiiiiii iiiii GC GL G .G GG Gi GG G GG;GG ,G G Gi 14 | iiiii iiiiiiiii iiiii GL GL G .G GG Gi GG G tG GG G G G 15 | iiiii iiiiiiii: iiiii GGGGGL G .G GG GGGGG G GGGGG GGGG GGGGG 16 | iiiii :iiii ;C tC C: .Cl C; 17 | iiiii ;iiiii 18 | iiiiiiiiiiiiiiiiiiii 19 | iiiiiiiiiiiiiiiiiii 20 | iiiiiiiiiiiiiiiii 21 | iiiiiiiiiiiiii, 22 | iiiiiiiiiii 23 | .iiiii 24 | 25 | -------------------------------------------------------------------------------- /app/templates/ascii/umbraco-text.txt: -------------------------------------------------------------------------------- 1 | $$\ $$\ $$\ 2 | $$ | $$ | $$ | 3 | $$ | $$ |$$$$$$\$$$$\ $$$$$$$\ $$$$$$\ $$$$$$\ $$$$$$$\ $$$$$$\ 4 | $$ | $$ |$$ _$$ _$$\ $$ __$$\ $$ __$$\ \____$$\ $$ _____|$$ __$$\ 5 | $$ | $$ |$$ / $$ / $$ |$$ | $$ |$$ | \__|$$$$$$$ |$$ / $$ / $$ | 6 | $$ | $$ |$$ | $$ | $$ |$$ | $$ |$$ | $$ __$$ |$$ | $$ | $$ | 7 | \$$$$$$ |$$ | $$ | $$ |$$$$$$$ |$$ | \$$$$$$$ |\$$$$$$$\ \$$$$$$ | 8 | \______/ \__| \__| \__|\_______/ \__| \_______| \_______| \______/ 9 | -------------------------------------------------------------------------------- /app/templates/basic/app/scripts/controllers/name.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('umbraco').controller('<%= names.ctrl %>', function($scope) { 2 | console.log('Hello from <%= names.ctrl %>'); 3 | }); 4 | 5 | -------------------------------------------------------------------------------- /app/templates/basic/app/styles/name.less: -------------------------------------------------------------------------------- 1 | .<%= names.css %> { 2 | // Your styles here 3 | } 4 | 5 | -------------------------------------------------------------------------------- /app/templates/basic/app/views/name.html: -------------------------------------------------------------------------------- 1 |
2 |

<%= names.name %>

3 |
4 | 5 | -------------------------------------------------------------------------------- /app/templates/basic/config/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | "propertyEditors": [ 3 | { 4 | "name": "<%= names.name %>", 5 | "alias": "<%= names.alias %>", 6 | "editor": { 7 | "valueType": "<%= valueType %>", 8 | "view": "~/App_Plugins/<%= names.alias %>/views/<%= names.file %>.html" 9 | }, 10 | "prevalues": { 11 | "fields": [ 12 | { 13 | "description": "This is an example prevalue", 14 | "key": "examplePreValue", 15 | "label": "Example PreValue", 16 | "view": "textstring" 17 | } 18 | ] 19 | } 20 | } 21 | ], 22 | "css": [ 23 | "~/App_Plugins/<%= names.alias %>/css/<%= names.file %>.css" 24 | ], 25 | "javascript": [ 26 | "~/App_Plugins/<%= names.alias %>/js/<%= names.file %>.js" 27 | ] 28 | } 29 | 30 | -------------------------------------------------------------------------------- /app/templates/config/_package.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= name %> 5 | <%= version %> 6 | <%= author %> 7 | <%= author %> 8 | <%= description %> 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/templates/config/_package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= name %> 6 | <%= version %> 7 | <%= license %> 8 | <%= url %> 9 | 10 | 0 11 | 0 12 | 0 13 | 14 | 15 | 16 | <%= author %> 17 | <%= authorUrl %> 18 | 19 | ]]> 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | <% files.forEach(function(file) { %> 32 | 33 | <%= file.guid %>.<%= file.ext %> 34 | <%= file.dir %> 35 | <%= file.name %> 36 | 37 | <% }); %> 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/templates/config/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/warrenbuckley/generator-umbraco/29157ad9d70a4246df9bbd58ea7c388d682eefdf/app/templates/config/readme.txt -------------------------------------------------------------------------------- /app/templates/gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | tmp 4 | pkg 5 | -------------------------------------------------------------------------------- /app/templates/google-maps/app/scripts/controllers/name.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('umbraco').controller('<%= names.ctrl %>', function($scope, assetsService) { 2 | 3 | //Property Editor has loaded... 4 | console.log('Hello from <%= names.ctrl %>'); 5 | 6 | //Load the General Google JS API Loader 7 | assetsService.loadJs('http://www.google.com/jsapi').then(function () { 8 | 9 | //Once this file has loaded, let's go & load the Google Maps API 10 | google.load("maps", "3", { 11 | callback: mapInit, 12 | other_params: "sensor=false" 13 | }); 14 | }); 15 | 16 | //Map init 17 | function mapInit() { 18 | 19 | console.log('map init'); 20 | 21 | //Get default config options 22 | //Try get them from saved value first if not fallback to cdefault config 23 | var zoomLevel = parseInt($scope.model.value.zoom) || parseInt($scope.model.config.zoom); 24 | var lat = $scope.model.value.lat || $scope.model.config.lat; 25 | var lng = $scope.model.value.lng || $scope.model.config.lng; 26 | var mapType = $scope.model.value.maptype || $scope.model.config.maptype; 27 | 28 | //Get the latLng as the Google Maps LatLng object 29 | var latLng = new google.maps.LatLng(lat, lng); 30 | 31 | //Get the DIV in the HTML markup we apply the map to 32 | var mapDiv = document.getElementById($scope.model.alias + '-google-map'); 33 | 34 | //This is used to allow us geocode address etc... 35 | var geoCoder = new google.maps.Geocoder(); 36 | 37 | //Initial options for the map load 38 | var mapOptions = { 39 | zoom: zoomLevel, 40 | center: latLng, 41 | mapTypeId: google.maps.MapTypeId[mapType] 42 | }; 43 | 44 | //Create the map (pass in DIV & the options we want) 45 | var map = new google.maps.Map(mapDiv, mapOptions); 46 | 47 | //Add a marker to the map that is the map center 48 | var marker = new google.maps.Marker({ 49 | map: map, 50 | position: latLng, 51 | draggable: true 52 | }); 53 | 54 | //if no value saved yet 55 | if (!$scope.model.value) { 56 | console.log('No value saved yet, use initial config'); 57 | 58 | updateValues(map, marker); 59 | } 60 | 61 | 62 | //So when an Umbraco tab is shown/changed to another 63 | $('a[data-toggle="tab"]').on('shown', function (e) { 64 | //This allows us to re-draw the map 65 | google.maps.event.trigger(map, 'resize'); 66 | }); 67 | 68 | //Add an event listened when the google map marker has stopped being dragged... 69 | google.maps.event.addListener(marker, "dragend", function (e) { 70 | console.log('Drag End', marker); 71 | 72 | //Update Values 73 | updateValues(map, marker); 74 | }); 75 | 76 | //Map type change event 77 | google.maps.event.addListener(map, 'maptypeid_changed', function (e) { 78 | console.log('Map Type Changed', map); 79 | 80 | //Update Values 81 | updateValues(map, marker); 82 | }); 83 | 84 | //Change Zoom level event 85 | google.maps.event.addListener(map, 'zoom_changed', function (e) { 86 | console.log('Zoom Changed', map); 87 | 88 | //Update Values 89 | updateValues(map, marker); 90 | }); 91 | }; 92 | 93 | //Update values for our JSON 94 | function updateValues(map, marker) { 95 | 96 | // MapType's are: 97 | // HYBRID, ROADMAP, SATELLITE, TERRAIN 98 | 99 | //Update our scope which is a JSON object 100 | $scope.model.value = { 101 | "lat": marker.getPosition().lat(), 102 | "lng": marker.getPosition().lng(), 103 | "zoom": map.getZoom(), 104 | "maptype": map.getMapTypeId() 105 | }; 106 | }; 107 | 108 | }); -------------------------------------------------------------------------------- /app/templates/google-maps/app/styles/name.less: -------------------------------------------------------------------------------- 1 | .<%= names.css %> { 2 | // Your styles here 3 | .value { 4 | margin: 0 0 5px 0; 5 | 6 | label { 7 | display:inline-block; 8 | width:55px; 9 | } 10 | 11 | input { 12 | display: inline-block; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /app/templates/google-maps/app/views/name.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 | 7 |
8 | 9 | 10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 |
18 | 19 | 20 |
21 | 22 |
23 | 24 | 25 |
26 | 27 |
28 | -------------------------------------------------------------------------------- /app/templates/google-maps/config/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | "propertyEditors": [ 3 | { 4 | "name": "<%= names.name %>", 5 | "alias": "<%= names.alias %>", 6 | "editor": { 7 | "valueType": "JSON", 8 | "view": "~/App_Plugins/<%= names.alias %>/views/<%= names.file %>.html" 9 | }, 10 | "prevalues": { 11 | "fields": [ 12 | { 13 | "description": "This is initial Lat", 14 | "key": "lat", 15 | "label": "Lat", 16 | "view": "textstring" 17 | }, 18 | { 19 | "description": "This is initial Lng", 20 | "key": "lng", 21 | "label": "Lng", 22 | "view": "textstring" 23 | }, 24 | { 25 | "description": "This is initial Zoom", 26 | "key": "zoom", 27 | "label": "Zoom", 28 | "view": "number" 29 | }, 30 | { 31 | "description": "This is initial Map Type (HYBRID, ROADMAP, SATELLITE, TERRAIN)", 32 | "key": "maptype", 33 | "label": "Map Type", 34 | "view": "textstring" 35 | } 36 | ] 37 | } 38 | } 39 | ], 40 | "css": [ 41 | "~/App_Plugins/<%= names.alias %>/css/<%= names.file %>.css" 42 | ], 43 | "javascript": [ 44 | "~/App_Plugins/<%= names.alias %>/js/<%= names.file %>.js" 45 | ] 46 | } 47 | 48 | -------------------------------------------------------------------------------- /app/templates/markdown-editor/app/scripts/controllers/name.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('umbraco').controller('<%= names.ctrl %>', function($scope) { 2 | console.log('Hello from <%= names.ctrl %>'); 3 | console.log('I am a Markdown Editor Controller'); 4 | }); 5 | 6 | -------------------------------------------------------------------------------- /app/templates/markdown-editor/app/styles/name.less: -------------------------------------------------------------------------------- 1 | .<%= names.css %> { 2 | // Your styles here 3 | } 4 | 5 | -------------------------------------------------------------------------------- /app/templates/markdown-editor/app/views/name.html: -------------------------------------------------------------------------------- 1 |
2 |

<%= names.name %>

3 |

Markdown Editor

4 |
5 | 6 | -------------------------------------------------------------------------------- /app/templates/markdown-editor/config/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | "propertyEditors": [ 3 | { 4 | "name": "<%= names.name %>", 5 | "alias": "<%= names.alias %>", 6 | "editor": { 7 | "valueType": "<%= valueType %>", 8 | "view": "~/App_Plugins/<%= names.alias %>/views/<%= names.file %>.html" 9 | }, 10 | "prevalues": { 11 | "fields": [ 12 | { 13 | "description": "This is an example prevalue", 14 | "key": "examplePreValue", 15 | "label": "Example PreValue", 16 | "view": "textstring" 17 | } 18 | ] 19 | } 20 | } 21 | ], 22 | "css": [ 23 | "~/App_Plugins/<%= names.alias %>/css/<%= names.file %>.css" 24 | ], 25 | "javascript": [ 26 | "~/App_Plugins/<%= names.alias %>/js/<%= names.file %>.js" 27 | ] 28 | } 29 | 30 | -------------------------------------------------------------------------------- /app/templates/test/app.conf.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('umbraco', [ 2 | 'umbraco.filters', 3 | 'umbraco.directives', 4 | 'umbraco.resources', 5 | 'umbraco.services', 6 | 'umbraco.mocks', 7 | 'umbraco.security', 8 | 'ngCookies' 9 | ]); -------------------------------------------------------------------------------- /app/templates/test/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // Generated on Tue Jun 03 2014 08:15:43 GMT+0200 (CEST) 3 | 4 | module.exports = function(config) { 5 | 6 | config.set({ 7 | 8 | // base path that will be used to resolve all patterns (eg. files, exclude) 9 | basePath: '..', 10 | 11 | 12 | // frameworks to use 13 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 14 | frameworks: ['jasmine'], 15 | 16 | 17 | // list of files / patterns to load in the browser 18 | files: [ 19 | 'test/assets/lib/jquery/jquery-2.0.3.min.js', 20 | 'test/assets/lib/angular/1.1.5/angular.js', 21 | 'test/assets/lib/angular/1.1.5/angular-cookies.min.js', 22 | 'test/assets/lib/angular/1.1.5/angular-mocks.js', 23 | 'test/assets/lib/angular/angular-ui-sortable.js', 24 | 25 | 'test/assets/lib/underscore/underscore.js', 26 | 'test/assets/lib/umbraco/Extensions.js', 27 | 'test/assets/lib/lazyload/lazyload.min.js', 28 | 29 | 'test/app.conf.js', 30 | 'test/assets/js/umbraco.*.js', 31 | 32 | 'app/scripts/controllers/*.js', 33 | 'test/**/*.spec.js' 34 | ], 35 | 36 | 37 | // list of files to exclude 38 | exclude: [ 39 | 'test/assets/js/umbraco.httpbackend.js' 40 | ], 41 | 42 | 43 | // preprocess matching files before serving them to the browser 44 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 45 | preprocessors: { 46 | 47 | }, 48 | 49 | 50 | // test results reporter to use 51 | // possible values: 'dots', 'progress' 52 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 53 | reporters: ['progress'], 54 | 55 | 56 | // web server port 57 | port: 9876, 58 | 59 | 60 | // enable / disable colors in the output (reporters and logs) 61 | colors: true, 62 | 63 | 64 | // level of logging 65 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 66 | logLevel: config.LOG_INFO, 67 | 68 | 69 | // enable / disable watching file and executing tests whenever any file changes 70 | autoWatch: false, 71 | 72 | 73 | // start these browsers 74 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 75 | browsers: ['PhantomJS'], 76 | 77 | 78 | // Continuous Integration mode 79 | // if true, Karma captures browsers, runs the tests and exits 80 | singleRun: true 81 | }); 82 | }; 83 | -------------------------------------------------------------------------------- /app/templates/test/specs/name.controller.spec.js: -------------------------------------------------------------------------------- 1 | describe('<%= names.name %> tests', function() { 2 | var $scope, $location, $rootScope, createController; 3 | 4 | beforeEach(module('umbraco')); 5 | 6 | beforeEach(inject(function ($rootScope, $controller, angularHelper, entityMocks, mocksUtils) { 7 | 8 | //mock the scope model 9 | $scope = $rootScope.$new(); 10 | $scope.model = { 11 | alias: "property", 12 | label: "<%= names.name %> property", 13 | description: "desc", 14 | config: {} 15 | }; 16 | 17 | //setup the controller for the test by setting its scope to 18 | //our mocked model 19 | createController = function() { 20 | return $controller('<%= names.ctrl %>', { 21 | '$scope': $scope 22 | }); 23 | }; 24 | })); 25 | 26 | it('model.value should be equal to meh', function() { 27 | var controller = createController(); 28 | 29 | //initially our model.value is not set 30 | expect($scope.model.value).toBe(undefined); 31 | 32 | //we then set it to meh 33 | $scope.model.value = "meh"; 34 | 35 | //and the test should pass 36 | expect($scope.model.value).toBe("meh"); 37 | }); 38 | 39 | it('config should be set', function() { 40 | var controller = createController(); 41 | 42 | //Our config should not be null 43 | expect($scope.model.config).not.toBeNull(); 44 | 45 | }); 46 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "generator-umbraco", 3 | "version": "0.0.5", 4 | "description": "An Umbraco Property Editor Yeoman generator", 5 | "homepage": "https://github.com/warrenbuckley/generator-umbraco", 6 | "license": "MIT", 7 | "main": "app/index.js", 8 | "repository": "warrenbuckley/generator-umbraco", 9 | "author": { 10 | "name": "Warren Buckley", 11 | "email": "warren@creativewebspecialist.co.uk", 12 | "url": "https://github.com/warrenbuckley" 13 | }, 14 | "contributors": [ 15 | { 16 | "name": "Taylor Smith", 17 | "email": "" 18 | }, 19 | { 20 | "name": "Tom Fulton", 21 | "email": "" 22 | }, 23 | { 24 | "name": "Per Ploug", 25 | "email": "" 26 | } 27 | ], 28 | "engines": { 29 | "node": ">=0.10.0" 30 | }, 31 | "scripts": { 32 | "test": "mocha" 33 | }, 34 | "files": [ 35 | "app" 36 | ], 37 | "keywords": [ 38 | "yeoman-generator", 39 | "umbraco", 40 | "umbraco-property-editor", 41 | "property-editor", 42 | "yeoman-umbraco" 43 | ], 44 | "dependencies": { 45 | "yeoman-generator": "~0.16.0", 46 | "chalk": "~0.4.0", 47 | "change-case": "~1.0.6" 48 | }, 49 | "devDependencies": { 50 | "mocha": "*" 51 | }, 52 | "peerDependencies": { 53 | "yo": ">=1.0.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /test/test-creation.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it */ 2 | 'use strict'; 3 | var path = require('path'); 4 | var helpers = require('yeoman-generator').test; 5 | 6 | describe('umbraco generator', function () { 7 | beforeEach(function (done) { 8 | helpers.testDirectory(path.join(__dirname, 'temp'), function (err) { 9 | if (err) { 10 | return done(err); 11 | } 12 | 13 | this.app = helpers.createGenerator('umbraco:app', [ 14 | '../../app' 15 | ]); 16 | done(); 17 | }.bind(this)); 18 | }); 19 | 20 | it('creates expected files', function (done) { 21 | var expected = [ 22 | 'Archetype/.gitignore', 23 | 'Archetype/package.json', 24 | 'Archetype/Gruntfile.js', 25 | 'Archetype/app/views/archetype.html', 26 | 'Archetype/app/scripts/controllers/archetype.controller.js', 27 | 'Archetype/app/styles/archetype.less', 28 | 'Archetype/config/package.manifest', 29 | 'Archetype/config/package.nuspec', 30 | 'Archetype/config/package.xml', 31 | 'Archetype/config/readme.txt', 32 | 'Archetype/test/app.conf.js', 33 | 'Archetype/test/karma.conf.js', 34 | 'Archetype/test/specs/ArchetypeController.spec.js' 35 | ]; 36 | 37 | helpers.mockPrompt(this.app, { 38 | 'name': 'Archetype', 39 | 'template': 'basic' 40 | }); 41 | 42 | this.app.options['skip-install'] = true; 43 | this.app.run({}, function () { 44 | helpers.assertFile(expected); 45 | done(); 46 | }); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /test/test-load.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | var assert = require('assert'); 4 | 5 | describe('umbraco generator', function () { 6 | it('can be imported without blowing up', function () { 7 | var app = require('../app'); 8 | assert(app !== undefined); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /yo-umbraco-grunt-target.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/warrenbuckley/generator-umbraco/29157ad9d70a4246df9bbd58ea7c388d682eefdf/yo-umbraco-grunt-target.gif -------------------------------------------------------------------------------- /yo-umbraco-grunt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/warrenbuckley/generator-umbraco/29157ad9d70a4246df9bbd58ea7c388d682eefdf/yo-umbraco-grunt.gif -------------------------------------------------------------------------------- /yo-umbraco.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/warrenbuckley/generator-umbraco/29157ad9d70a4246df9bbd58ea7c388d682eefdf/yo-umbraco.gif -------------------------------------------------------------------------------- /yo-umbraco.sublime-project: -------------------------------------------------------------------------------- 1 | { 2 | "folders": 3 | [ 4 | { 5 | "path": "/Users/warrenbuckley/GitHub/generator-umbraco" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /yo-umbraco.sublime-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "auto_complete": 3 | { 4 | "selected_items": 5 | [ 6 | [ 7 | "des", 8 | "destTarget" 9 | ], 10 | [ 11 | "pa", 12 | "paramCase" 13 | ], 14 | [ 15 | "prima", 16 | "primary_rgb_val" 17 | ] 18 | ] 19 | }, 20 | "buffers": 21 | [ 22 | { 23 | "file": "app/templates/Gruntfile.js", 24 | "settings": 25 | { 26 | "buffer_size": 4826, 27 | "line_ending": "Unix" 28 | } 29 | }, 30 | { 31 | "file": "app/index.js", 32 | "settings": 33 | { 34 | "buffer_size": 4536, 35 | "line_ending": "Unix" 36 | } 37 | } 38 | ], 39 | "build_system": "", 40 | "command_palette": 41 | { 42 | "height": 47.0, 43 | "selected_items": 44 | [ 45 | [ 46 | "Package Control: install", 47 | "Package Control: Install Package" 48 | ], 49 | [ 50 | "gru", 51 | "Grunt" 52 | ], 53 | [ 54 | "", 55 | "Grunt" 56 | ], 57 | [ 58 | "Package Control: inst", 59 | "Package Control: Install Package" 60 | ], 61 | [ 62 | "Package Control: ", 63 | "Package Control: Install Package" 64 | ] 65 | ], 66 | "width": 449.0 67 | }, 68 | "console": 69 | { 70 | "height": 125.0 71 | }, 72 | "distraction_free": 73 | { 74 | "menu_visible": true, 75 | "show_minimap": false, 76 | "show_open_files": false, 77 | "show_tabs": false, 78 | "side_bar_visible": false, 79 | "status_bar_visible": false 80 | }, 81 | "file_history": 82 | [ 83 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/Gruntfile-temp.js", 84 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/Gruntfile.js", 85 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/index.js", 86 | "/Users/warrenbuckley/GitHub/generator-umbraco/test/test-creation.js", 87 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/google-maps/app/scripts/controllers/name.controller.js", 88 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/google-maps/app/views/name.html", 89 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/markdown-editor/app/scripts/controllers/name.controller.js", 90 | "/Users/warrenbuckley/GitHub/generator-umbraco/app/templates/markdown-editor/app/views/name.html", 91 | "/Users/warrenbuckley/GitHub/warrenbuckley/talks/AngularJS-London-Umbraco/src/styles/main.styl", 92 | "/Users/warrenbuckley/GitHub/warrenbuckley/talks/AngularJS-London-Umbraco/bower.json", 93 | "/Users/warrenbuckley/GitHub/warrenbuckley/talks/AngularJS-London-Umbraco/Gruntfile.js", 94 | "/Users/warrenbuckley/GitHub/warrenbuckley/talks/AngularJS-London-Umbraco/public/styles/main.css", 95 | "/Users/warrenbuckley/GitHub/warrenbuckley/talks/AngularJS-London-Umbraco/src/styles/main-old.styl" 96 | ], 97 | "find": 98 | { 99 | "height": 35.0 100 | }, 101 | "find_in_files": 102 | { 103 | "height": 0.0, 104 | "where_history": 105 | [ 106 | ] 107 | }, 108 | "find_state": 109 | { 110 | "case_sensitive": false, 111 | "find_history": 112 | [ 113 | "destTarget", 114 | "primary", 115 | "png" 116 | ], 117 | "highlight": true, 118 | "in_selection": false, 119 | "preserve_case": false, 120 | "regex": false, 121 | "replace_history": 122 | [ 123 | ], 124 | "reverse": false, 125 | "show_context": true, 126 | "use_buffer2": true, 127 | "whole_word": false, 128 | "wrap": true 129 | }, 130 | "groups": 131 | [ 132 | { 133 | "selected": 1, 134 | "sheets": 135 | [ 136 | { 137 | "buffer": 0, 138 | "file": "app/templates/Gruntfile.js", 139 | "settings": 140 | { 141 | "buffer_size": 4826, 142 | "regions": 143 | { 144 | }, 145 | "selection": 146 | [ 147 | [ 148 | 4536, 149 | 4536 150 | ] 151 | ], 152 | "settings": 153 | { 154 | "syntax": "Packages/JavaScript/JavaScript.tmLanguage", 155 | "tab_size": 2, 156 | "translate_tabs_to_spaces": true 157 | }, 158 | "translation.x": 0.0, 159 | "translation.y": 2267.0, 160 | "zoom_level": 1.0 161 | }, 162 | "type": "text" 163 | }, 164 | { 165 | "buffer": 1, 166 | "file": "app/index.js", 167 | "settings": 168 | { 169 | "buffer_size": 4536, 170 | "regions": 171 | { 172 | }, 173 | "selection": 174 | [ 175 | [ 176 | 2697, 177 | 2697 178 | ] 179 | ], 180 | "settings": 181 | { 182 | "syntax": "Packages/JavaScript/JavaScript.tmLanguage", 183 | "tab_size": 2, 184 | "translate_tabs_to_spaces": true 185 | }, 186 | "translation.x": 0.0, 187 | "translation.y": 1323.0, 188 | "zoom_level": 1.0 189 | }, 190 | "type": "text" 191 | } 192 | ] 193 | } 194 | ], 195 | "incremental_find": 196 | { 197 | "height": 0.0 198 | }, 199 | "input": 200 | { 201 | "height": 31.0 202 | }, 203 | "layout": 204 | { 205 | "cells": 206 | [ 207 | [ 208 | 0, 209 | 0, 210 | 1, 211 | 1 212 | ] 213 | ], 214 | "cols": 215 | [ 216 | 0.0, 217 | 1.0 218 | ], 219 | "rows": 220 | [ 221 | 0.0, 222 | 1.0 223 | ] 224 | }, 225 | "menu_visible": true, 226 | "replace": 227 | { 228 | "height": 0.0 229 | }, 230 | "save_all_on_build": true, 231 | "select_file": 232 | { 233 | "height": 0.0, 234 | "selected_items": 235 | [ 236 | ], 237 | "width": 0.0 238 | }, 239 | "select_project": 240 | { 241 | "height": 0.0, 242 | "selected_items": 243 | [ 244 | ], 245 | "width": 0.0 246 | }, 247 | "show_minimap": true, 248 | "show_open_files": false, 249 | "show_tabs": true, 250 | "side_bar_visible": true, 251 | "side_bar_width": 241.0, 252 | "status_bar_visible": true 253 | } 254 | --------------------------------------------------------------------------------