You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This issue is addressed to ts-skeleton users as much as to @b091 who created this future proof TypeScript stack skeleton.
The problem, we currently noticed is that we have very similar tech stack in our four projects written in TypeScript, but we have to maintain it in every project separately.
Now each of us need to correct configuration of their project. What a waste of time! Every time when the tslint, typedoc, jspm, sytemjs or whatever else configuration API changes, we need to make changes in all our projects.
Do our projects really need as much individual configurations? What are main differences between them, that force specific configuration?
Solution: convention
The problem is present also in other technologies. We bumped into the problem in JS world very late. For a long time, the fact that there is no built-in module manager in JavaScript, was not a problem. Now we build more and more complex front-end applications and the tools like webpack and systemjs appeared. Maybe it's time to move a bit forward and create a tool which will handle not only building (systemjs), dependency management (jspm) but also:
documentation
reporting
releases
and distribution?
Sounds familiar? It's what Maven does for Java projects.
... Maven is about the application of patterns in order to achieve an infrastructure which displays the characteristics of visibility, reusability, maintainability, and comprehensibility.
(Philosophy of Maven)
Maven follows "convention over configuration" principle, which allow it's users to get a new project or module started in seconds.
Convention: project structure
One of the major things which make our gulp tasks different between our projects is directory structure. To not invent the wheel again, I suggest to follow the maven project structure while it make sense for us:
project root
|- package.json // containing project-specific options for our tool
|- node_modules
|- src
| |- main
| | |- typescript
| | | |- Main.ts
| | | `- tslint.json
| | |- images
| | `- less // or sass or simply css
| `- test
| |- typescript
| `- resources
|- target // or dist, maybe?
|- vendor
| |- jspm_packages
| `- typings
|- index.html // root file for app projects
`-README.md
However it's only proposal (to be discussed). Project structure is one of the things that must be thoroughly discussed, as it's really hard to change in the future. We should find an appropriate place for generated docs, reports, distribution files, e2e tests (or maybe e2e tests should be placed in a separate project? – to be discussed).
Convention: shared tools
Of course the idea of the tool is not to implement building, dependencies management etc. itself. To avoid tons of configuration for each project, we need to select one tool for each task. So, here are my proposals (already used in ts-skeleton):
Building (package management)
tool: Systemjs
Configuration of systemjs is a part of JSPM configuration (see below)
We should provide two types of projects:
library, which build contains index.js and index.js.map
application, which build contains index.html and directories with images and other resources
Dependency management
tool: JSPM
List of dependencies as well as configuration of non-standard registries, may be provided in custom section of package.json. From options provided in this section we could generate jspm config and dependencies list (invisible in root package.json file). Location of jspm_packages as well as most options jspm.conf.js could be forced by the convention (to be discussed).
tool: Karma
Other tests frameworks (and karma plugins) could be specified by the user. Maybe main part of the karma.conf.js should also be forced by the convention (to be discussed)?
Reports
test coverage tool: Istanbul until we get better tool for test coverage calculation
Maven artifactory (maybe as a plugin – to be discussed)
Assumtions:
most of the projects no longer need to have karma, gulp and other tools in dependencies - we guarantee that all tools have latest versions and work together
project setup is simple and follows best practices
we are able to easily work with multiple projects at the same time
The text was updated successfully, but these errors were encountered:
This issue is addressed to ts-skeleton users as much as to @b091 who created this future proof TypeScript stack skeleton.
The problem, we currently noticed is that we have very similar tech stack in our four projects written in TypeScript, but we have to maintain it in every project separately.
Problem: maintaining the tech-stack
Let's look into problems with ts-skeleton itself:
Now each of us need to correct configuration of their project. What a waste of time! Every time when the tslint, typedoc, jspm, sytemjs or whatever else configuration API changes, we need to make changes in all our projects.
Do our projects really need as much individual configurations? What are main differences between them, that force specific configuration?
Solution: convention
The problem is present also in other technologies. We bumped into the problem in JS world very late. For a long time, the fact that there is no built-in module manager in JavaScript, was not a problem. Now we build more and more complex front-end applications and the tools like webpack and systemjs appeared. Maybe it's time to move a bit forward and create a tool which will handle not only building (systemjs), dependency management (jspm) but also:
Sounds familiar? It's what Maven does for Java projects.
(Philosophy of Maven)
Maven follows "convention over configuration" principle, which allow it's users to get a new project or module started in seconds.
Convention: project structure
One of the major things which make our gulp tasks different between our projects is directory structure. To not invent the wheel again, I suggest to follow the maven project structure while it make sense for us:
However it's only proposal (to be discussed). Project structure is one of the things that must be thoroughly discussed, as it's really hard to change in the future. We should find an appropriate place for generated docs, reports, distribution files, e2e tests (or maybe e2e tests should be placed in a separate project? – to be discussed).
Convention: shared tools
Of course the idea of the tool is not to implement building, dependencies management etc. itself. To avoid tons of configuration for each project, we need to select one tool for each task. So, here are my proposals (already used in ts-skeleton):
Building (package management)
tool: Systemjs
Configuration of systemjs is a part of JSPM configuration (see below)
We should provide two types of projects:
index.js
andindex.js.map
index.html
and directories with images and other resourcesDependency management
tool: JSPM
List of dependencies as well as configuration of non-standard registries, may be provided in custom section of
package.json
. From options provided in this section we could generate jspm config and dependencies list (invisible in rootpackage.json
file). Location ofjspm_packages
as well as most optionsjspm.conf.js
could be forced by the convention (to be discussed).Documentation
tool: Typedoc
Tests
tool: Karma
Other tests frameworks (and karma plugins) could be specified by the user. Maybe main part of the
karma.conf.js
should also be forced by the convention (to be discussed)?Reports
Develoment server
tool: browser-sync
Distribution
tool: ?
We should support distribution via:
Assumtions:
The text was updated successfully, but these errors were encountered: