diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e20a968 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..1025ddc --- /dev/null +++ b/.eslintrc @@ -0,0 +1,200 @@ +{ + "env": { + "browser": 2, + "node": 2, + "mocha": 2, + "es6": 2 + }, + "ecmaFeatures": { + "modules": true + }, + "globals": { + "_": 2, + "$": 2, + "angular": 2, + "jQuery": 2 + }, + "rules": { + // Possible Errors + "comma-dangle": 2, + // no-comma-dangle - (deprecated) + "no-cond-assign": [2, "always"], + "no-console": 2, + "no-constant-condition": 2, + "no-control-regex": 2, + "no-debugger": 2, + "no-dupe-keys": 2, + "no-dupe-args": 2, + "no-duplicate-case": 2, + "no-empty-character-class": 2, + // no-empty-class - (deprecated) + "no-empty": 2, + "no-ex-assign": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": 2, + "no-extra-semi": 2, + "no-func-assign": 2, + "no-inner-declarations": 2, + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-negated-in-lhs": 2, + "no-obj-calls": 2, + "no-regex-spaces": 2, + "no-sparse-arrays": 2, + "no-unreachable": 2, + "use-isnan": 2, + "valid-jsdoc": 2, + "valid-typeof": 2, + "no-unexpected-multiline": 2, + + // Best Practices + // not sure + "accessor-pairs": [2, {"getWithoutSet": false, "setWithoutGet": true}], + "block-scoped-var": 2, + "complexity": [2, 6], + "consistent-return": 2, + "curly": 2, + "default-case": 2, + "dot-notation": 2, + // not good for chain calls, but not for properties + "dot-location": [2, "property"], + "eqeqeq": 2, + "guard-for-in": 2, + "no-alert": 2, + "no-caller": 2, + "no-div-regex": 2, + "no-else-return": 2, + "no-empty-label": 2, + "no-eq-null": 2, + "no-eval": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-implied-eval": 2, + "no-iterator": 2, + "no-labels": 2, + "no-lone-blocks": 2, + "no-loop-func": 2, + "no-multi-spaces": 2, + "no-multi-str": 2, + "no-native-reassign": 2, + "no-new": 2, + "no-new-func": 2, + "no-new-wrappers": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-param-reassign": 2, + "no-process-env": 2, + "no-proto": 2, + "no-redeclare": 2, + "no-return-assign": 2, + "no-script-url": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-throw-literal": 2, + "no-unused-expressions": 2, + "no-void": 2, + "no-warning-comments": [1, { "terms": ["todo", "fixme"], "location": "anywhere" }], + "no-with": 2, + "radix": 2, + "vars-on-top": 0, + "wrap-iife": [2, "inside"], + "yoda": [2, "never"], + + // Strict Mode + "strict": [2, "global"], + + // Variables + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-label-var": 2, + "no-shadow": 2, + "no-shadow-restricted-names": 2, + "no-undef": 2, + "no-undef-init": 2, + "no-undefined": 2, + "no-unused-vars": 2, + "no-use-before-define": [2, "nofunc"], + + // Node.js + "handle-callback-err": [2, "^.*(e|E)rr" ], + "no-mixed-requires": [2, true], + "no-new-require": 2, + "no-path-concat": 2, + "no-process-exit": 2, + "no-sync": 2, + + // Stylistic Issues + "array-bracket-spacing": [2, "never"], + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + "camelcase": 2, + "comma-spacing": [2, {"before": false, "after": true}], + "comma-style": [2, "last"], + "computed-property-spacing": [2, "never"], + "consistent-this": [2, "self"], + // not sure + "eol-last": 0, + "func-names": 0, + "func-style": [2, "declaration"], + "indent": [2, 2], + "key-spacing": [2, { "beforeColon": false, "afterColon": true}], + "max-nested-callbacks": [2, 3], + "new-cap": [2, {"newIsCap": true, "capIsNew": true, "capIsNewExceptions":[ + "ObjectId", + "Object", + "Function", + "Number", + "String", + "Boolean", + "Date", + "Array", + "Symbol", + "RegExp" + ]}], + "new-parens": 2, + "newline-after-var": 0, + "no-array-constructor": 2, + "no-inline-comments": 2, + "no-lonely-if": 2, + "no-mixed-spaces-and-tabs": 2, + "no-multiple-empty-lines": [2, {"max": 1}], + "no-nested-ternary": 2, + "no-new-object": 2, + "no-spaced-func": 2, + "no-ternary": 0, + "no-trailing-spaces": 2, + "no-underscore-dangle": 2, + "no-unneeded-ternary": 2, + "object-curly-spacing": [2, "never"], + "one-var": [2, { + "var": "never", // Exactly one var declaration per function + "let": "never", // Exactly one let declaration per block + "const": "never" // Exactly one declarator per const declaration per block + }], + "operator-assignment": [1, "always"], + "operator-linebreak": [2, "after"], + "padded-blocks": [2, "never"], + "quote-props": [2, "as-needed"], + "quotes": [2, "single", "avoid-escape"], + "semi": [2, "always"], + "semi-spacing": 2, + // "sort-vars": [1, { "ignoreCase": true }], + "space-after-keywords": [2, "always" ], + "space-before-blocks": [2, "always"], + "space-in-parens": [2, "never"], + "space-infix-ops": 2, + "space-return-throw-case": 2, + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "spaced-comment": 0, + "wrap-regexp": 0, + + // Legacy + "max-len": [1, 120, 4], + // todo: apply max-params + "max-params": [0, 3], + // todo: apply max-statements + "max-statements": [2, 30], + "no-bitwise": 2 + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5dc8a45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +/node_modules +npm-debug.log + +# type script artifacts +/typings + +# WebStorm +.idea + +# ignore build and dist for now +/build +/dist + +/demo/**/*.js +/demo/**/*.js.map +/components/**/*.js +/components/**/*.js.map + +/logs diff --git a/components/file-upload/file-select.ts b/components/file-upload/file-select.ts new file mode 100644 index 0000000..d90d5fc --- /dev/null +++ b/components/file-upload/file-select.ts @@ -0,0 +1,22 @@ +/// + +import { + Component, View, + Directive, LifecycleEvent, + EventEmitter, ElementRef, Renderer, + CORE_DIRECTIVES, FORM_DIRECTIVES, NgClass +} from 'angular2/angular2'; + +@Directive({ + selector: '[ng2-file-select]', + properties: ['config: ng2FileSelect'] +}) +export class FileSelect { + public config:any = {}; + + constructor(private element:ElementRef, private renderer:Renderer) { + console.log('it works!'); + } +} + +export const fileUpload:Array = [FileSelect]; diff --git a/components/file-upload/readme.md b/components/file-upload/readme.md new file mode 100644 index 0000000..7ed3a5c --- /dev/null +++ b/components/file-upload/readme.md @@ -0,0 +1,4 @@ +### Usage +```typescript +import {fileUpload} from 'ng2-file-upload'; +``` diff --git a/components/index.ts b/components/index.ts new file mode 100644 index 0000000..226e78a --- /dev/null +++ b/components/index.ts @@ -0,0 +1,3 @@ +/// + +export * from './file-upload/file-select'; diff --git a/components/module.ts b/components/module.ts new file mode 100644 index 0000000..a799f35 --- /dev/null +++ b/components/module.ts @@ -0,0 +1,3 @@ +declare module 'ng2-file-upload' { + export * from 'index'; +} diff --git a/demo/assets/css/glyphicons.css b/demo/assets/css/glyphicons.css new file mode 100644 index 0000000..6e518b9 --- /dev/null +++ b/demo/assets/css/glyphicons.css @@ -0,0 +1,805 @@ +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} diff --git a/demo/assets/css/prism-okaidia.css b/demo/assets/css/prism-okaidia.css new file mode 100644 index 0000000..0fac682 --- /dev/null +++ b/demo/assets/css/prism-okaidia.css @@ -0,0 +1,119 @@ +/** + * okaidia theme for JavaScript, CSS and HTML + * Loosely based on Monokai textmate theme by http://www.monokai.nl/ + * @author ocodia + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #f8f8f2; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #272822; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #f8f8f2; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #f92672; +} + +.token.boolean, +.token.number { + color: #ae81ff; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #a6e22e; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} + +.token.atrule, +.token.attr-value, +.token.function { + color: #e6db74; +} + +.token.keyword { + color: #66d9ef; +} + +.token.regex, +.token.important { + color: #fd971f; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/demo/assets/css/style.css b/demo/assets/css/style.css new file mode 100644 index 0000000..5549277 --- /dev/null +++ b/demo/assets/css/style.css @@ -0,0 +1,248 @@ +/*! + * Bootstrap Docs (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under the Creative Commons Attribution 3.0 Unported License. For + * details, see http://creativecommons.org/licenses/by/3.0/. + */ + +.h1, .h2, .h3, h1, h2, h3 { + margin-top: 20px; + margin-bottom: 10px; +} + +.h1, h1 { + font-size: 36px; +} + +.btn-group-lg > .btn, .btn-lg { + font-size: 18px; +} + +section { + padding-top: 30px; +} + +.bd-pageheader { + margin-top: 51px; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} + +.navbar-default .navbar-nav > li > a { + color: #777; +} + +.navbar { + padding: 0; +} + +.navbar-nav .nav-item { + margin-left: 0 !important; +} + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} + +.nav .navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; + margin-right: 0 !important; +} + +.navbar-brand { + color: #777; + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} + +.navbar-toggler { + margin-top: 8px; + margin-right: 15px; +} + +.navbar-default .navbar-nav > li > a:focus, .navbar-default .navbar-nav > li > a:hover { + color: #333; + background-color: transparent; +} + +.bd-pageheader, .bs-docs-masthead { + position: relative; + padding: 30px 0; + color: #cdbfe3; + text-align: center; + text-shadow: 0 1px 0 rgba(0, 0, 0, .1); + background-color: #6f5499; + background-image: -webkit-gradient(linear, left top, left bottom, from(#563d7c), to(#6f5499)); + background-image: -webkit-linear-gradient(top, #563d7c 0, #6f5499 100%); + background-image: -o-linear-gradient(top, #563d7c 0, #6f5499 100%); + background-image: linear-gradient(to bottom, #563d7c 0, #6f5499 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#563d7c', endColorstr='#6F5499', GradientType=0); + background-repeat: repeat-x; +} + +.bd-pageheader { + margin-bottom: 40px; + font-size: 20px; +} + +.bd-pageheader h1 { + margin-top: 0; + color: #fff; +} + +.bd-pageheader p { + margin-bottom: 0; + font-weight: 300; + line-height: 1.4; +} + +.bd-pageheader .btn { + margin: 10px 0; +} + +.scrollable-menu .nav-link { + color: #337ab7; + font-size: 14px; +} + +.scrollable-menu .nav-link:hover { + color: #23527c; + background-color: #eee; +} + +@media (min-width: 992px) { + .bd-pageheader h1, .bd-pageheader p { + margin-right: 380px; + } +} + +@media (min-width: 768px) { + .bd-pageheader { + padding-top: 60px; + padding-bottom: 60px; + font-size: 24px; + text-align: left; + } + + .bd-pageheader h1 { + font-size: 60px; + line-height: 1; + } + + .navbar-nav > li > a.nav-link { + padding-top: 15px; + padding-bottom: 15px; + font-size: 14px; + } + + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + + .navbar .container { + width: 100%; + max-width: 100%; + } + .navbar .container, + .navbar .container .navbar-header { + padding: 0; + margin: 0; + } +} + +@media (max-width: 400px) { + code, kbd { + font-size: 60%; + } +} + +/** + * VH and VW units can cause issues on iOS devices: http://caniuse.com/#feat=viewport-units + * + * To overcome this, create media queries that target the width, height, and orientation of iOS devices. + * It isn't optimal, but there is really no other way to solve the problem. In this example, I am fixing + * the height of element '.scrollable-menu' —which is a full width and height cover image. + * + * iOS Resolution Quick Reference: http://www.iosres.com/ + */ + +.scrollable-menu { + height: 90vh !important; + width: 100vw; + overflow-x: hidden; + padding: 0 0 20px; +} + +/** + * iPad with portrait orientation. + */ +@media all and (device-width: 768px) and (device-height: 1024px) and (orientation: portrait) { + .scrollable-menu { + height: 1024px !important; + } +} + +/** + * iPad with landscape orientation. + */ +@media all and (device-width: 768px) and (device-height: 1024px) and (orientation: landscape) { + .scrollable-menu { + height: 768px !important; + } +} + +/** + * iPhone 5 + * You can also target devices with aspect ratio. + */ +@media screen and (device-aspect-ratio: 40/71) { + .scrollable-menu { + height: 500px !important; + } +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} + +.navbar-toggle:focus { + outline: 0 +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px +} + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px +} + +pre { + white-space: pre-wrap; /* CSS 3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} diff --git a/demo/assets/fonts/glyphicons-halflings-regular.eot b/demo/assets/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/demo/assets/fonts/glyphicons-halflings-regular.eot differ diff --git a/demo/assets/fonts/glyphicons-halflings-regular.svg b/demo/assets/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/demo/assets/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/assets/fonts/glyphicons-halflings-regular.ttf b/demo/assets/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/demo/assets/fonts/glyphicons-halflings-regular.ttf differ diff --git a/demo/assets/fonts/glyphicons-halflings-regular.woff b/demo/assets/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/demo/assets/fonts/glyphicons-halflings-regular.woff differ diff --git a/demo/assets/fonts/glyphicons-halflings-regular.woff2 b/demo/assets/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/demo/assets/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/demo/components/file-upload-section.ts b/demo/components/file-upload-section.ts new file mode 100644 index 0000000..7b6acac --- /dev/null +++ b/demo/components/file-upload-section.ts @@ -0,0 +1,78 @@ +/// + +import {Component, View, CORE_DIRECTIVES, NgNonBindable} from 'angular2/angular2'; + +import {tabs} from 'ng2-bootstrap'; +import {SimpleDemo} from './file-upload/simple-demo'; + +let name = 'File Upload'; +let doc = require('../../components/file-upload/readme.md'); + +let tabDesc:Array = [ + { + heading: 'Simple', + ts: require('!!prismjs?lang=typescript!./file-upload/simple-demo.ts'), + html: require('!!prismjs?lang=markup!./file-upload/simple-demo.html') + } +]; + +let tabsContent:string = ``; +tabDesc.forEach(desc => { + tabsContent += ` + +
+ + <${desc.heading.toLowerCase()}-demo *ng-if="currentHeading === '${desc.heading}'"> + +
+ +
+ + +
+
${desc.html}
+
+
+ +
+
${desc.ts}
+
+
+
+
+
+
+ `; +}); + +@Component({ + selector: 'file-upload-section' +}) +@View({ + template: ` +
+
+ + + ${tabsContent} + + +
+ +
+

API

+
${doc}
+
+
+ `, + directives: [SimpleDemo, tabs, CORE_DIRECTIVES, NgNonBindable] +}) +export class FileUploadSection { + private currentHeading:string = 'Simple'; + + private select(e) { + if (e.heading) { + this.currentHeading = e.heading; + } + } +} diff --git a/demo/components/file-upload/simple-demo.html b/demo/components/file-upload/simple-demo.html new file mode 100644 index 0000000..f9f6117 --- /dev/null +++ b/demo/components/file-upload/simple-demo.html @@ -0,0 +1,3 @@ +

+ +

diff --git a/demo/components/file-upload/simple-demo.ts b/demo/components/file-upload/simple-demo.ts new file mode 100644 index 0000000..e48dc87 --- /dev/null +++ b/demo/components/file-upload/simple-demo.ts @@ -0,0 +1,21 @@ +/// + +import { + Component, View, EventEmitter, + CORE_DIRECTIVES, FORM_DIRECTIVES, NgClass +} from 'angular2/angular2'; + +import {fileUpload} from '../../../components/index'; + +// webpack html imports +let template = require('./simple-demo.html'); + +@Component({ + selector: 'simple-demo' +}) +@View({ + template: template, + directives: [fileUpload, NgClass, CORE_DIRECTIVES, FORM_DIRECTIVES] +}) +export class SimpleDemo { +} diff --git a/demo/getting-started.md b/demo/getting-started.md new file mode 100644 index 0000000..5803f9b --- /dev/null +++ b/demo/getting-started.md @@ -0,0 +1,10 @@ +# Getting started + +## First of all, Welcome! + +### Install + +Install the components +``` +npm install ng2-file-upload --save +``` diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..17540fc --- /dev/null +++ b/demo/index.html @@ -0,0 +1,44 @@ + + + + Angular2 File Upload + + + + + + + + + + + + + + + + + + + Loading... + + + + + + + + + + diff --git a/demo/index.ts b/demo/index.ts new file mode 100644 index 0000000..33dc25d --- /dev/null +++ b/demo/index.ts @@ -0,0 +1,45 @@ +/// +import {Component, View, bootstrap, NgClass} from 'angular2/angular2'; + +import {FileUploadSection} from './components/file-upload-section'; + +let gettingStarted = require('./getting-started.md'); + +@Component({ + selector: 'app' +}) +@View({ + template: ` +
+
+

ng2-file-upload

+

The Angular2 File Upload directives

+ +
+
+ +
+
${gettingStarted}
+ + +
+ + + `, + directives: [ + NgClass, + FileUploadSection + ] +}) +export class Demo { +} + +bootstrap(Demo); diff --git a/gulp-tasks/lint.js b/gulp-tasks/lint.js new file mode 100644 index 0000000..1371ed5 --- /dev/null +++ b/gulp-tasks/lint.js @@ -0,0 +1,23 @@ +var gulp = require('gulp'); +var esLint = require('gulp-eslint'); +var tslint = require('gulp-tslint'); + +var paths = gulp.paths; + +gulp.task('eslint', function() { + return gulp.src(paths.jssrc) + .pipe(esLint({useEslintrc: true})) + .pipe(esLint.format()) + .pipe(esLint.failOnError()); +}); + +gulp.task('tslint', function() { + return gulp.src(paths.tssrc) + .pipe(tslint()) + .pipe(tslint.report('verbose', { + emitError: true, + reportLimit: 0 + })); +}); + +gulp.task('lint', ['tslint', 'eslint']); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..6078516 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,57 @@ +var gulp = require('gulp'); + +gulp.paths = { + tssrc: [ + '**/*.ts', + '!node_modules/**/*', + '!dist/**/*', + '!typings/**/*', + '!**/*.{ts,coffee}.js'], + jssrc: [ + '*.js', + '!angular2-file-upload.js', + 'gulp-tasks/*.js', + '!node_modules', + '!**/*.{ts,coffee}.js'] +}; + +require('require-dir')('./gulp-tasks'); + +var typescript = require('gulp-tsc'); +var options = require('./tsconfig.json').compilerOptions; +options.emitError = false; + +var o = { + target: 'es5', + module: 'commonjs', + outDir: 'dist', + sourceRoot: 'dist', + mapRoot: 'dist', + keepTree: true, + declaration: true, + noEmitOnError: true, + emitError: false, + sourceMap: true, + removeComments: true, + noResolve: false, + suppressImplicitAnyIndexErrors: true, + safe: false, + emitDecoratorMetadata: true, + experimentalDecorators: true +}; + +var clean = require('gulp-clean'); +gulp.task('clean', function () { + return gulp.src('dist', {read: false}) + .pipe(clean()); +}); + +gulp.task('compile', ['clean'], function () { + gulp.src(['components/**/*.ts']) + .pipe(typescript(o)) + .pipe(gulp.dest(options.outDir)); +}); + +gulp.task('default', function () { + gulp.start('lint'); +}); diff --git a/package.json b/package.json index fc45d93..70a8f56 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,78 @@ { "name": "ng2-file-upload", - "version": "0.0.0", - "description": "Easy to use Angular2 components for files upload", - "main": "index.js", + "version": "0.0.1", + "description": "angular2 file upload directives", "scripts": { - "test": "npm test" + "deploy": "NODE_ENV=production webpack -p --progress --color --optimize-minimize --optimize-dedupe --optimize-occurence-order", + "prepublish": "gulp compile", + "prestart": "npm install", + "server": "webpack-dev-server --hot --inline --colors --display-error-details --display-cached", + "start": "npm run server", + "test": "gulp lint" }, - "repository": { - "type": "git", - "url": "git+https://github.com/valor-software/ng2-file-upload.git" + "main": "dist/index.js", + "typescript": { + "definition": [ + "dist/module.d.ts", + "typings/es6-object.d.ts" + ] }, + "files": [ + "dist", + "components", + "typings", + "tsd.d.ts" + ], "keywords": [ "angular2", - "ng2", - "file-upload", - "angular2-file-upload", - "ng2-file-upload" + "bootstrap", + "angularjs", + "twitter-bootstrap" ], - "author": "Dmitriy Shekhovtsov ", + "author": "Vyacheslav Chub ", "license": "MIT", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/valor-software/ng2-file-upload.git" + }, "bugs": { "url": "https://github.com/valor-software/ng2-file-upload/issues" }, - "homepage": "https://github.com/valor-software/ng2-file-upload#readme" + "homepage": "https://github.com/valor-software/ng2-file-upload#readme", + "dependencies": { + "angular2": "2.0.0-alpha.37", + "es6-promise": "3.0.2", + "moment": "^2.10.6", + "ng2-bootstrap": "^0.37.0", + "reflect-metadata": "0.1.1", + "rtts_assert": "2.0.0-alpha.37", + "traceur-runtime": "0.0.59", + "zone.js": "0.5.4" + }, + "devDependencies": { + "bootstrap": "^3.3.5", + "clean-webpack-plugin": "^0.1.3", + "compression-webpack-plugin": "^0.2.0", + "eslint": "^1.1.0", + "exports-loader": "^0.6.2", + "file-loader": "^0.8.4", + "gulp": "^3.9.0", + "gulp-clean": "^0.3.1", + "gulp-eslint": "^1.0.0", + "gulp-size": "^2.0.0", + "gulp-tsc": "^1.1.1", + "gulp-tslint": "^3.1.2", + "html-loader": "^0.3.0", + "markdown-loader": "^0.1.7", + "marked": "^0.3.5", + "pre-commit": "^1.1.1", + "prismjs": "valorkin/prism", + "prismjs-loader": "0.0.2", + "raw-loader": "^0.5.1", + "require-dir": "^0.3.0", + "typescript": "^1.5.3", + "typescript-simple-loader": "^0.3.4", + "webpack": "^1.11.0", + "webpack-dev-server": "^1.10.1" + } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..27d6949 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,31 @@ +{ + "version": "1.5.3", + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "outDir": "dist", + "sourceMap": true, + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "listFiles": false, + "noLib": false, + "noEmitOnError": false, + "noImplicitAny": false + }, + "filesGlob": [ + "./**/*.ts", + "!./node_modules/**/*.ts" + ], + "files": [ + "./components/file-upload/file-select.ts", + "./components/index.ts", + "./components/module.ts", + "./demo/components/file-upload-section.ts", + "./demo/components/file-upload/simple-demo.ts", + "./demo/index.ts", + "./tsd.d.ts", + "./typings/tsd.d.ts" + ] +} diff --git a/tsd.d.ts b/tsd.d.ts new file mode 100644 index 0000000..8754f73 --- /dev/null +++ b/tsd.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..a412061 --- /dev/null +++ b/tslint.json @@ -0,0 +1,56 @@ +{ + "rules": { + "class-name": true, + "comment-format": [true, "check-space"], + "curly": true, + "eofline": true, + "forin": true, + "indent": [true, "spaces"], + "label-position": true, + "label-undefined": true, + "max-line-length": [false, 140], + "no-arg": true, + "no-bitwise": true, + "no-console": [true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-eval": true, + "no-shadowed-variable": true, + "no-string-literal": true, + "no-switch-case-fall-through": true, + "no-trailing-comma": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-unused-variable": false, + "no-unreachable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "one-line": [true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "quotemark": [true, "single"], + "radix": true, + "semicolon": true, + "sort-object-literal-keys": false, + "triple-equals": [true, "allow-null-check"], + "variable-name": false, + "whitespace": [true, + "check-branch", + "check-decl", + "check-operator", + "check-separator" + ] + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..1bb9abe --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,161 @@ +var path = require('path'); +var marked = require('marked'); +var webpack = require('webpack'); + +var Clean = require('clean-webpack-plugin'); +var CompressionPlugin = require('compression-webpack-plugin'); + +// marked renderer hack +marked.Renderer.prototype.code = function (code, lang) { + var out = this.options.highlight(code, lang); + + if (!lang) { + return '
' + out + '\n
'; + } + + var classMap = this.options.langPrefix + lang; + return '
' + out + '\n
\n'; +}; + +/*eslint no-process-env:0, camelcase:0*/ +var isProduction = (process.env.NODE_ENV || 'development') === 'production'; + +var src = 'demo'; +//var absSrc = path.join(__dirname, src); +var dest = '/build'; +var absDest = path.join(__dirname, dest); + +var config = { + // isProduction ? 'source-map' : 'evale', + devtool: 'source-map', + + debug: true, + cache: false, + context: __dirname, + + resolve: { + root: __dirname, + extensions: ['', '.ts', '.js', '.json'], + alias: {} + }, + + entry: { + angular2: [ + // Angular 2 Deps + 'traceur-runtime', + 'zone.js', + 'reflect-metadata', + 'rtts_assert/rtts_assert', + 'angular2/angular2' + ], + 'angular2-file-upload': ['components'], + 'angular2-file-upload-demo': 'demo' + }, + + output: { + path: absDest, + filename: '[name].js', + sourceMapFilename: '[name].js.map', + chunkFilename: '[id].chunk.js' + }, + + // our Development Server configs + devServer: { + inline: true, + colors: true, + historyApiFallback: true, + contentBase: src, + publicPath: dest + }, + markdownLoader: { + langPrefix: 'language-', + highlight: function (code, lang) { + var language = !lang || lang === 'html' ? 'markup' : lang; + if (!global.Prism) { + global.Prism = require('prismjs'); + } + var Prism = global.Prism; + if (!Prism.languages[language]) { + require('prismjs/components/prism-' + language + '.js'); + } + return Prism.highlight(code, Prism.languages[language]); + } + }, + module: { + loaders: [ + // support markdown + {test: /\.md$/, loader: 'html!markdown'}, + + // Support for *.json files. + {test: /\.json$/, loader: 'json'}, + + // Support for CSS as raw text + {test: /\.css$/, loader: 'raw'}, + + // support for .html as raw text + {test: /\.html$/, loader: 'raw'}, + + // Support for .ts files. + { + test: /\.ts$/, + loader: 'typescript-simple', + exclude: [ + /\.spec\.ts$/, + /\.e2e\.ts$/, + /web_modules/, + /test/, + /node_modules/ + ] + } + ], + noParse: [ + /rtts_assert\/src\/rtts_assert/ + ] + }, + + plugins: [ + new Clean(['build']), + new webpack.optimize.CommonsChunkPlugin({ + name: 'angular2', + minChunks: Infinity, + filename: 'angular2.js' + }), + new webpack.optimize.DedupePlugin({ + __isProduction: isProduction + }), + new webpack.optimize.OccurenceOrderPlugin(), + new webpack.optimize.DedupePlugin() + ], + pushPlugins: function () { + if (!isProduction) { + return; + } + + this.plugins.push.apply(this.plugins, [ + //production only + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false, + drop_debugger: false + }, + output: { + comments: false + }, + beautify: false + }), + new CompressionPlugin({ + asset: '{file}.gz', + algorithm: 'gzip', + regExp: /\.js$|\.html|\.css|.map$/, + threshold: 10240, + minRatio: 0.8 + }) + ]); + }, + + stats: {colors: true, reasons: true} +}; + +config.pushPlugins(); + +module.exports = config;