The DSpace User Interface built on Angular, written in TypeScript and using Angular Universal.
DSpace open source software is a turnkey repository application used by more than 2,000 organizations and institutions worldwide to provide durable access to digital resources. For more information, visit http://www.dspace.org/
DSpace consists of both a Java-based backend and an Angular-based frontend.
- Backend (https://github.com/DSpace/DSpace/) provides a REST API, along with other machine-based interfaces (e.g. OAI-PMH, SWORD, etc)
- The REST Contract is at https://github.com/DSpace/RestContract
- Frontend (this codebase) is the User Interface built on the REST API
- Backend (REST API): https://github.com/DSpace/DSpace/releases
- Frontend (User Interface): https://github.com/DSpace/dspace-angular/releases
Documentation for each release may be viewed online or downloaded via our Documentation Wiki.
The latest DSpace Installation instructions are available at: https://wiki.lyrasis.org/display/DSDOC7x/Installing+DSpace
Ensure you're running Node v12.x
or v14.x
, npm >= v5.x
and yarn >= v1.x
# clone the repo
git clone https://github.com/DSpace/dspace-angular.git
# change directory to our repo
cd dspace-angular
# install the local dependencies
yarn install
# start the server
yarn start
Then go to http://localhost:4000 in your browser
Not sure where to start? watch the training videos linked in the Introduction to the technology section below.
- Introduction to the technology
- Requirements
- Installing
- Running the app
- Cleaning
- Testing
- Documentation
- Other commands
- Recommended Editors/IDEs
- Collaborating
- File Structure
- Managing Dependencies (via yarn)
- Frequently asked questions
- License
You can find more information on the technologies used in this project (Angular.io, Angular CLI, Typescript, Angular Universal, RxJS, etc) on the LYRASIS wiki
If you have nvm
or nvm-windows
installed, which is highly recommended, you can run nvm install --lts && nvm use
to install and start using the latest Node LTS.
yarn run global
to install the required global dependenciesyarn install
to install the local dependencies
Default configuration file is located in src/environments/
folder.
To change the default configuration values, create local files that override the parameters you need to change. You can use environment.template.ts
as a starting point.
- Create a new
environment.dev.ts
file insrc/environments/
for adevelopment
environment; - Create a new
environment.prod.ts
file insrc/environments/
for aproduction
environment;
The server settings can also be overwritten using an environment file.
This file should be called .env
and be placed in the project root.
The following settings can be overwritten in this file:
DSPACE_HOST # The host name of the angular application
DSPACE_PORT # The port number of the angular application
DSPACE_NAMESPACE # The namespace of the angular application
DSPACE_SSL # Whether the angular application uses SSL [true/false]
DSPACE_REST_HOST # The host name of the REST application
DSPACE_REST_PORT # The port number of the REST application
DSPACE_REST_NAMESPACE # The namespace of the REST application
DSPACE_REST_SSL # Whether the angular REST uses SSL [true/false]
The same settings can also be overwritten by setting system environment variables instead, E.g.:
export DSPACE_HOST=api7.dspace.org
The priority works as follows: environment variable overrides variable in .env
file overrides environment.(prod, dev or test).ts
overrides environment.common.ts
These configuration sources are collected at build time, and written to src/environments/environment.ts
. At runtime the configuration is fixed, and neither .env
nor the process' environment will be consulted.
To use environment variables in a UI component, use:
import { environment } from '../environment.ts';
This file is generated by the script located in scripts/set-env.ts
. This script will run automatically before every build, or can be manually triggered using the appropriate config
script in package.json
After you have installed all dependencies you can now run the app. Run yarn run start:dev
to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at http://localhost:4000
.
When building for production we're using Ahead of Time (AoT) compilation. With AoT, the browser downloads a pre-compiled version of the application, so it can render the application immediately, without waiting to compile the app first. The compiler is roughly half the size of Angular itself, so omitting it dramatically reduces the application payload.
To build the app for production and start the server run:
yarn start
This will run the application in an instance of the Express server, which is included.
If you only want to build for production, without starting, run:
yarn run build:prod
This will build the application and put the result in the dist
folder. You can copy this folder to wherever you need it for your application server. If you will be using the built-in Express server, you'll also need a copy of the node_modules
folder tucked inside your copy of dist
.
NOTE: At this time, we do not have production-ready Docker images for DSpace. That said, we do have quick-start Docker Compose scripts for development or testing purposes.
# clean everything, including node_modules. You'll need to run yarn install again afterwards.
yarn run clean
# clean files generated by the production build (.ngfactory files, css files, etc)
yarn run clean:prod
# cleans the distribution directory
yarn run clean:dist
If you would like to contribute by testing a Pull Request (PR), here's how to do so. Keep in mind, you do not need to have a DSpace backend / REST API installed locally to test a PR. By default, the dspace-angular project points at our demo REST API
- Pull down the branch that the Pull Request was built from. Easy instructions for doing so can be found on the Pull Request itself.
- Next to the "Merge" button, you'll see a link that says "command line instructions".
- Click it, and follow "Step 1" of those instructions to checkout the pull down the PR branch.
yarn run clean
(This resets your local dependencies to ensure you are up-to-date with this PR)yarn install
(Updates your local dependencies to those in the PR)yarn start
(Rebuilds the project, and deploys to localhost:4000, by default)- At this point, the code from the PR will be deployed to http://localhost:4000. Test it out, and ensure that it does what is described in the PR (or fixes the bug described in the ticket linked to the PR).
Once you have tested the Pull Request, please add a comment and/or approval to the PR to let us know whether you found it to be successful (or not). Thanks!
Unit tests use Karma. You can find the configuration file at the same level of this README file:./karma.conf.js
If you are going to use a remote test environment you need to edit the ./karma.conf.js
. Follow the instructions you will find inside it. To executing tests whenever any file changes you can modify the 'autoWatch' option to 'true' and 'singleRun' option to 'false'. A coverage report is also available at: http://localhost:9876/ after you run: yarn run coverage
.
The default browser is Google Chrome.
Place your tests in the same location of the application source code files that they test.
and run: yarn run test
E2E tests use Protractor + Selenium server + browsers. You can find the configuration file at the same level of this README file:./protractor.conf.js
Protractor is installed as 'local' as a dev dependency.
If you are going to use a remote test enviroment you need to edit the './e2e//protractor.conf.js'. Follow the instructions you will find inside it.
The default browser is Google Chrome.
Place your tests at the following path: ./e2e
and run: ng e2e
To run all the tests (e.g.: to run tests with Continuous Integration software) you can execute:yarn run ci
Keep in mind that this command prerequisites are the sum of unit test and E2E tests.
See ./docs
for further documentation.
To build the code documentation we use TYPEDOC. TYPEDOC is a documentation generator for TypeScript projects. It extracts information from properly formatted comments that can be written within the code files. Follow the instructions here to know how to make those comments.
Run:yarn run docs
to produce the documentation that will be available in the 'doc' folder.
There are many more commands in the scripts
section of package.json
. Most of these are executed by one of the commands mentioned above.
A command with a name that starts with pre
or post
will be executed automatically before or after the script with the matching name. e.g. if you type yarn run start
the prestart
script will run first, then the start
script will trigger.
To get the most out of TypeScript, you'll need a TypeScript-aware editor. We've had good experiences using these editors:
- Free
- Paid
dspace-angular
├── README.md * This document
├── app.yaml * Application manifest file
├── config * Folder for configuration files
│ ├── environment.default.js * Default configuration files
│ └── environment.test.js * Test configuration files
├── docs * Folder for documentation
├── e2e * Folder for e2e test files
│ ├── app.e2e-spec.ts *
│ ├── app.po.ts *
│ ├── pagenotfound *
│ │ ├── pagenotfound.e2e-spec.ts *
│ │ └── pagenotfound.po.ts *
│ └── tsconfig.json * TypeScript configuration file for e2e tests
├── karma.conf.js * Karma configuration file for Unit Test
├── nodemon.json * Nodemon (https://nodemon.io/) configuration
├── package.json * This file describes the npm package for this project, its dependencies, scripts, etc.
├── postcss.config.js * PostCSS (http://postcss.org/) configuration file
├── protractor.conf.js *
├── resources * Folder for static resources
│ ├── data * Folder for static data
│ │ └── en * Folder for i18n English data
│ ├── i18n * Folder for i18n translations
│ │ └── en.json * i18n translations for English
│ └── images * Folder for images
│ ├── dspace-logo-old.png *
│ ├── dspace-logo.png *
│ └── favicon.ico *
├── rollup.config.js * Rollup (http://rollupjs.org/) configuration
├── spec-bundle.js *
├── src * The source of the application
│ ├── app *
│ │ ├── app-routing.module.ts *
│ │ ├── app.component.html *
│ │ ├── app.component.scss *
│ │ ├── app.component.spec.ts *
│ │ ├── app.component.ts *
│ │ ├── app.effects.ts *
│ │ ├── app.module.ts *
│ │ ├── app.reducer.ts *
│ │ ├── browser-app.module.ts * The root module for the client
│ │ ├── +collection-page * Lazily loaded route for collection module
│ │ ├── +community-page * Lazily loaded route for community module
│ │ ├── core *
│ │ ├── header *
│ │ ├── +home * Lazily loaded route for home module
│ │ ├── +item-page * Lazily loaded route for item module
│ │ ├── object-list *
│ │ ├── pagenotfound *
│ │ ├── server-app.module.ts * The root module for the server
│ │ ├── shared *
│ │ ├── store.actions.ts *
│ │ ├── store.effects.ts *
│ │ ├── thumbnail *
│ │ └── typings.d.ts * File that allows you to add custom typings for libraries without TypeScript support
│ ├── backend * Folder containing a mock of the REST API, hosted by the express server
│ │ ├── api.ts *
│ │ ├── cache.ts *
│ │ ├── data *
│ │ └── db.ts *
│ ├── config *
│ │ ├── cache-config.interface.ts *
│ │ ├── config.interface.ts *
│ │ ├── global-config.interface.ts *
│ │ ├── server-config.interface.ts *
│ │ └── universal-config.interface.ts *
│ ├── config.ts * File that loads environmental and shareable settings and makes them available to app components
│ ├── index.csr.html * The index file for client side rendering fallback
│ ├── index.html * The index file
│ ├── main.browser.ts * The bootstrap file for the client
│ ├── main.server.ts * The express (http://expressjs.com/) config and bootstrap file for the server
│ ├── modules *
│ │ ├── cookies *
│ │ ├── data-loader *
│ │ ├── transfer-http *
│ │ ├── transfer-state *
│ │ ├── transfer-store *
│ │ └── translate-universal-loader.ts *
│ ├── routes.ts * The routes file for the server
│ ├── styles * Folder containing global styles
│ │ ├── _mixins.scss *
│ │ └── variables.scss * Global sass variables file
│ ├── tsconfig.browser.json * TypeScript config for the client build
│ ├── tsconfig.server.json * TypeScript config for the server build
│ └── tsconfig.test.json * TypeScript config for the test build
├── tsconfig.json * TypeScript config
├── tslint.json * TSLint (https://palantir.github.io/tslint/) configuration
├── typedoc.json * TYPEDOC configuration
├── webpack * Webpack (https://webpack.github.io/) config directory
│ ├── webpack.aot.js * Webpack (https://webpack.github.io/) config for AoT build
│ ├── webpack.client.js * Webpack (https://webpack.github.io/) config for client build
│ ├── webpack.common.js *
│ ├── webpack.prod.js * Webpack (https://webpack.github.io/) config for production build
│ ├── webpack.server.js * Webpack (https://webpack.github.io/) config for server build
│ └── webpack.test.js * Webpack (https://webpack.github.io/) config for test build
├── webpack.config.ts *
└── yarn.lock * Yarn lockfile (https://yarnpkg.com/en/docs/yarn-lock)
This project makes use of yarn
to ensure that the exact same dependency versions are used every time you install it.
yarn
creates ayarn.lock
to track those versions. That file is updated automatically by whenever dependencies are added/updated/removed via yarn.- Adding new dependencies: To install/add a new dependency (third party library), use
yarn add
. For example:yarn add some-lib
.- If you are adding a new build tool dependency (to
devDependencies
), useyarn add some-lib --dev
- If you are adding a new build tool dependency (to
- Upgrading existing dependencies: To upgrade existing dependencies, you can use
yarn upgrade
. For example:yarn upgrade some-lib
oryarn upgrade some-lib@version
- Removing dependencies: If a dependency is no longer needed, or replaced, use
yarn remove
to remove it.
As you can see above, using yarn
commandline tools means that you should never need to modify the package.json
manually. We recommend always using yarn
to keep dependencies updated / in sync.
If the library does not include typings, you can install them using yarn:
yarn add d3
yarn add @types/d3 --dev
If the library doesn't have typings available at @types/
, you can still use it by manually adding typings for it:
-
In
src/typings.d.ts
, add the following code:declare module 'typeless-package';
-
Then, in the component or file that uses the library, add the following code:
import * as typelessPackage from 'typeless-package'; typelessPackage.method();
Done. Note: you might need or find useful to define more typings for the library that you're trying to use.
If you're importing a module that uses CommonJS you need to import as
import * as _ from 'lodash';
- Why is my service, aka provider, is not injecting a parameter correctly?
- Please use
@Injectable()
for your service for typescript to correctly attach the metadata
- Please use
- Where do I write my tests?
- You can write your tests next to your component files. e.g. for
src/app/home/home.component.ts
call itsrc/app/home/home.component.spec.ts
- You can write your tests next to your component files. e.g. for
- How do I start the app when I get
EACCES
andEADDRINUSE
errors?- The
EADDRINUSE
error means the port4000
is currently being used andEACCES
is lack of permission to build files to./dist/
- The
- What are the naming conventions for Angular?
- Why is the size of my app larger in development?
- The production build uses a whole host of techniques (ahead-of-time compilation, rollup to remove unreachable code, minification, etc.) to reduce the size, that aren't used during development in the intrest of build speed.
- node-pre-gyp ERR in yarn install (Windows)
- install Python x86 version between 2.5 and 3.0 on windows. See this issue
- How do I handle merge conflicts in yarn.lock?
- first check out the yarn.lock file from the branch you're merging in to yours: e.g.
git checkout --theirs yarn.lock
- now run
yarn install
again. Yarn will create a new lockfile that contains both sets of changes. - then run
git add yarn.lock
to stage the lockfile for commit - and
git commit
to conclude the merge
- first check out the yarn.lock file from the branch you're merging in to yours: e.g.
DSpace provides public mailing lists where you can post questions or raise topics for discussion. We welcome everyone to participate in these lists:
- dspace-community@googlegroups.com : General discussion about DSpace platform, announcements, sharing of best practices
- dspace-tech@googlegroups.com : Technical support mailing list. See also our guide for How to troubleshoot an error.
- dspace-devel@googlegroups.com : Developers / Development mailing list
Great Q&A is also available under the DSpace tag on Stackoverflow
Additional support options are at https://wiki.lyrasis.org/display/DSPACE/Support
DSpace also has an active service provider network. If you'd rather hire a service provider to install, upgrade, customize or host DSpace, then we recommend getting in touch with one of our Registered Service Providers.
DSpace uses GitHub to track issues:
- Backend (REST API) issues: https://github.com/DSpace/DSpace/issues
- Frontend (User Interface) issues: https://github.com/DSpace/dspace-angular/issues
This project's source code is made available under the DSpace BSD License: http://www.dspace.org/license