Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
8454c34
Update package.json
invercity Oct 14, 2025
e08a4e4
Update Dockerfile
invercity Oct 14, 2025
569c353
Updates
invercity Nov 18, 2025
6194285
Updates
invercity Feb 5, 2026
e700ba8
Updates
invercity Feb 5, 2026
1aa3ed6
Dockerfile fixes
invercity Feb 5, 2026
c830d2f
Flyio.toml fix
invercity Feb 5, 2026
7d7fb4a
Fly.toml fix
invercity Feb 5, 2026
8bde14a
Fly.toml fix
invercity Feb 5, 2026
c2e023b
Fly.toml fix
invercity Feb 5, 2026
ad4e7d0
App fix
invercity Feb 5, 2026
0de1f7a
Mongo connection config
invercity Feb 5, 2026
d325bbb
Mongo connection config
invercity Feb 5, 2026
95f0b76
Updates
invercity Feb 5, 2026
0f379f0
Updates
invercity Feb 5, 2026
05b2b2d
Updates
invercity Feb 5, 2026
ef64bbc
Updates
invercity Feb 5, 2026
32ca4a3
Updates
invercity Feb 5, 2026
3af6bd9
Updates
invercity Feb 5, 2026
86e26fc
Updates
invercity Feb 5, 2026
6214bfc
Updates
invercity Feb 5, 2026
936227d
Updates
invercity Feb 5, 2026
3af4535
Updates
invercity Feb 5, 2026
78bbbf3
Updates
invercity Feb 5, 2026
fe710ce
Updates
invercity Feb 5, 2026
d5c3c26
Updates
invercity Feb 5, 2026
f9aab11
Grunt debug
invercity Feb 6, 2026
232e627
Dockerfile
invercity Feb 6, 2026
f0d01f8
ignore
invercity Feb 6, 2026
57df0b5
Pug integration
invercity Feb 6, 2026
12c3a27
Pug integration update
invercity Feb 6, 2026
0825e5c
Pug integration update
invercity Feb 6, 2026
5a19c82
Fly.toml update
invercity Feb 6, 2026
46affb2
Fly.toml update
invercity Feb 6, 2026
8f1d65d
Fly.toml update
invercity Feb 6, 2026
f02ffcb
Build app
invercity Feb 6, 2026
3a71bce
Update
invercity Feb 6, 2026
9e4d9c8
Update
invercity Feb 6, 2026
8e8c9e1
Fix auth check
invercity Feb 6, 2026
520c645
Fix list filters
invercity Feb 6, 2026
abb8149
Fix search
invercity Feb 6, 2026
9e6f955
Real count on pagination
invercity Feb 6, 2026
79d0876
Fix link to order
invercity Feb 6, 2026
3142b65
Fix link to order
invercity Feb 6, 2026
d1e4e4e
LICENSE.md
invercity Feb 7, 2026
9f206ab
Node version
invercity Feb 7, 2026
241d52c
Version in footer
invercity Feb 8, 2026
6791a31
Fixed url for order
invercity Feb 8, 2026
4f59bde
Copy url on click
invercity Feb 9, 2026
95a2904
Fixed query
invercity Feb 13, 2026
5386204
Fixed query
invercity Feb 27, 2026
0daeb97
Fixed query
invercity Feb 27, 2026
393ee66
Fixed query
invercity Feb 27, 2026
70a2c4c
Fixed regex
invercity Mar 5, 2026
3655d3e
Release workflow
invercity Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
NODE_ENV=development
MONGO_URI=mongodb://localhost/mean-dev
23 changes: 23 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Release

on:
push:
branches:
- master

permissions:
contents: write
pull-requests: write

jobs:
release:
runs-on: ubuntu-latest

steps:
- name: Run Release Please
uses: google-github-actions/release-please-action@v4
with:
release-type: node
package-name: your-package-name
bump-minor-pre-major: true
bump-patch-for-minor-pre-major: true
14 changes: 0 additions & 14 deletions .github/workflows/tag-latest.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ '16', '18', '20', '22' ]
node: [ '20', '22', '24' ]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,5 @@ local.properties
*.ntvs*
*.njsproj
*.sln
.env.*
.rebooted
11 changes: 7 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
FROM node:20.11.0-alpine
FROM node:22.20.0-alpine

RUN apk add --no-cache git

WORKDIR /home/iris

# Install iris packages
COPY package.json /home/iris/package.json
COPY package-lock.json /home/iris/package-lock.json
RUN npm install

# Manually trigger bower. Why doesnt this work via npm install?
COPY .bowerrc /home/iris/.bowerrc
COPY bower.json /home/iris/bower.json
COPY gruntfile.js /home/iris/gruntfile.js

RUN npm install
RUN npm run bower

# Make everything available for start
COPY . /home/iris
RUN npm run build

# Set development environment as default
ENV NODE_ENV development
Expand Down
2 changes: 1 addition & 1 deletion LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2017-2025 Andrii Yermolenko
Copyright (c) 2017-2026 Andrii Yermolenko

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
Expand Down
8 changes: 5 additions & 3 deletions bower.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"name": "iris",
"dependencies": {
"bootstrap": "~3",
"angular": "~1.3",
"angular-resource": "~1.3",
"angular-animate": "~1.3",
Expand All @@ -11,8 +10,11 @@
"angular-ui-router": "~0.2",
"angular-file-upload": "1.1.5",
"angular-messages": "~1.3.17",
"owasp-password-strength-test": "~1.3.0",
"lodash": "^4.17.4"
"bootstrap": "~3",
"dom-to-image": "^2.6.0",
"file-saver": "^2.0.2",
"lodash": "^4.17.4",
"owasp-password-strength-test": "~1.3.0"
},
"resolutions": {
"angular": "~1.3"
Expand Down
2 changes: 2 additions & 0 deletions config/assets/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ module.exports = {
'public/lib/angular-file-upload/angular-file-upload.min.js',
'public/lib/owasp-password-strength-test/owasp-password-strength-test.js',
'public/lib/lodash/dist/lodash.min.js',
'public/lib/dom-to-image/dist/dom-to-image.min.js',
'public/lib/file-saver/dist/FileSaver.min.js'
],
tests: ['public/lib/angular-mocks/angular-mocks.js']
},
Expand Down
11 changes: 8 additions & 3 deletions config/env/default.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
module.exports = {
app: {
title: 'IRIS',
description: 'Full-Stack JavaScript with MongoDB, Express, AngularJS, and Node.js',
title: 'Homio',
description: 'Grocery store',
keywords: 'mongodb, express, angularjs, node.js, mongoose, passport',
googleAnalyticsTrackingID: process.env.GOOGLE_ANALYTICS_TRACKING_ID || 'GOOGLE_ANALYTICS_TRACKING_ID'
},
db: {
uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_1_PORT_27017_TCP_ADDR || 'localhost') + '/mean',
options: {
maxPoolSize: 5,
minPoolSize: 1,
maxIdleTimeMS: 30000,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
// user: '',
// pass: '',
},
// Enable mongoose debug mode
debug: process.env.MONGODB_DEBUG || false
},
port: process.env.PORT || 3000,
templateEngine: 'swig',
templateEngine: 'pug',
// Session Cookie settings
sessionCookie: {
// session expiration is set by default to 24 hours
Expand Down
2 changes: 1 addition & 1 deletion config/lib/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module.exports.loadModels = mongoose.loadModels;
module.exports.start = async function start() {
const db = await mongoose.connect();
const app = await express.init(db);
app.listen(config.port, () => {
app.listen(config.port, '0.0.0.0', () => {
// Logging initialization
console.log('--');
console.log(chalk.green(config.app.title));
Expand Down
9 changes: 5 additions & 4 deletions config/lib/express.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ const compress = require('compression');
const methodOverride = require('method-override');
const cookieParser = require('cookie-parser');
const helmet = require('helmet');
const consolidate = require('@ladjs/consolidate');

const config = require('../config');
const logger = require('./logger');
const configureSocketIO = require('./socket.io');
const { version } = require('../../package');

/**
* Initialize local variables
Expand All @@ -34,6 +34,7 @@ module.exports.initLocalVariables = (app) => {
app.locals.livereload = config.livereload;
app.locals.logo = config.logo;
app.locals.favicon = config.favicon;
app.locals.version = version;

// Passing the request url to environment locals
app.use((req, res, next) => {
Expand Down Expand Up @@ -91,11 +92,11 @@ module.exports.initMiddleware = (app) => {
* Configure view engine
*/
module.exports.initViewEngine = (app) => {
// Set swig as the template engine
app.engine('server.view.html', consolidate[config.templateEngine]);
// Set Pug as the template engine
app.engine('pug', require('pug').__express);

// Set views path and view engine
app.set('view engine', 'server.view.html');
app.set('view engine', 'pug');
app.set('views', './');
};

Expand Down
28 changes: 28 additions & 0 deletions fly.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
app = "homio"
primary_region = "fra"

kill_signal = "SIGINT"
kill_timeout = 5

[build]
dockerfile = "Dockerfile"

[env]
NODE_ENV = "production"
PORT = "3000"

[[services]]
internal_port = 3000

[[services.ports]]
port = 80
handlers = ["http"]

[[services.ports]]
port = 443
handlers = ["tls", "http"]

[[services.tcp_checks]]
interval = "10s"
timeout = "2s"
grace_period = "10s"
44 changes: 39 additions & 5 deletions gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ module.exports = (grunt) => {
}
},
concurrent: {
debug: ['node-inspect', 'watch'],
debug: ['nodemon', 'watch'],
options: {
logConcurrentOutput: true
}
Expand Down Expand Up @@ -138,14 +138,48 @@ module.exports = (grunt) => {
}
}
},
nodemon: {
dev: {
script: 'server.js',
options: {
nodeArgs: ['--inspect', '--env-file=.env.local'],
env: {
PORT: '3000'
},
// omit this property if you aren't serving HTML files and
// don't want to open a browser tab on start
callback: function (nodemon) {
nodemon.on('log', function (event) {
console.log(event.colour);
});

// opens browser on initial server start
nodemon.on('config:update', function () {
// Delay before server listens on port
setTimeout(function() {
require('open')('http://localhost:3000');
}, 1000);
});

// refreshes browser when server reboots
nodemon.on('restart', function () {
// Delay before server listens on port
setTimeout(function() {
require('fs').writeFileSync('.rebooted', 'rebooted');
}, 1000);
});
}
}
}
},
});

// Load NPM tasks
require('load-grunt-tasks')(grunt);
// grunt.loadNpmTasks('grunt-protractor-coverage');

// Make sure upload directory exists
grunt.task.registerTask('mkdir:upload', 'Task that makes sure upload directory exists.', () => {
grunt.task.registerTask('mkdir:upload', 'Task that makes sure upload directory exists.', function() {
// Get the callback
const done = this.async();
grunt.file.mkdir(path.normalize(__dirname + '/modules/users/client/img/profile/uploads'));
Expand Down Expand Up @@ -192,11 +226,11 @@ module.exports = (grunt) => {
// Lint CSS and JavaScript files.
grunt.registerTask('lint', ['sass', 'jshint', 'eslint', 'csslint']);
// Lint project files and minify them into two production files.
grunt.registerTask('build', ['env:dev', 'lint', 'uglify', 'cssmin']);
grunt.registerTask('build', ['env:dev', 'uglify', 'cssmin']);
// Run the project in development mode
grunt.registerTask('default', ['env:dev', 'lint', 'mkdir:upload', 'copy:localConfig', 'server']);
grunt.registerTask('default', ['env:dev', 'mkdir:upload', 'copy:localConfig', 'server']);
// Run the project in debug mode
grunt.registerTask('debug', ['env:dev', 'lint', 'mkdir:upload', 'copy:localConfig', 'concurrent:debug']);
grunt.registerTask('debug', ['env:dev', 'mkdir:upload', 'copy:localConfig', 'concurrent:debug']);
// Run the project in production mode
grunt.registerTask('prod', ['build', 'env:prod', 'mkdir:upload', 'copy:localConfig', 'server']);
};
5 changes: 2 additions & 3 deletions modules/core/client/app/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,20 @@ angular.module(ApplicationConfiguration.applicationModuleName).config(['$locatio
]);

angular.module(ApplicationConfiguration.applicationModuleName).run(function ($rootScope, $state, Authentication) {

// Check authentication before changing state
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
if (toState.data && toState.data.roles && toState.data.roles.length > 0) {
var allowed = false;
toState.data.roles.forEach(function (role) {
if (Authentication.user.roles !== undefined && Authentication.user.roles.indexOf(role) !== -1) {
if (Authentication.user && Authentication.user.roles !== undefined && Authentication.user.roles.indexOf(role) !== -1) {
allowed = true;
return true;
}
});

if (!allowed) {
event.preventDefault();
if (Authentication.user !== undefined && typeof Authentication.user === 'object') {
if (Authentication.user && typeof Authentication.user === 'object') {
$state.go('forbidden');
} else {
$state.go('authentication.signin').then(function () {
Expand Down
56 changes: 56 additions & 0 deletions modules/core/client/css/core.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
.content {
margin-top: 50px;
}

.content-footer {
min-height: calc(100vh - 67px);
}

.undecorated-link:hover {
text-decoration: none;
}
Expand Down Expand Up @@ -69,3 +74,54 @@ a:hover .header-profile-image {
.hero-widget var { display: block; height: 64px; font-size: 64px; line-height: 64px; font-style: normal; }
.hero-widget label { font-size: 17px; }
.hero-widget .options { margin-top: 10px; }

.footer {
height: 17px;
text-align: center;
}

.footer a {
color: #333;
font-weight: bold;
font-size: 12px;
font-family: Calibri, serif;
}

.footer-version {
color: #333;
font-weight: bold;
font-size: 12px;
font-family: Calibri, serif;
}

.alert {
position: fixed;
top: 80px;
left: 50%;
transform: translateX(-50%) translateY(0);

z-index: 9999;

padding: 10px 16px;
min-width: 220px;

background: #ffffff;
border: 1px solid #38b2ac;
color: #065f5b;

border-radius: 6px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);

text-align: center;
font-size: 14px;
font-weight: 500;

opacity: 1;
transition: opacity 0.25s ease, transform 0.25s ease;
}

.alert.ng-hide {
opacity: 0;
transform: translateX(-50%) translateY(-10px);
pointer-events: none;
}
Binary file modified modules/core/client/img/brand/favicon.ico
Binary file not shown.
Binary file modified modules/core/client/img/brand/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion modules/core/client/views/confirm.client.view.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div class="modal-header">
<h3 class="modal-title">{{confirmTitle}}</h3>
<h4 class="modal-title">{{confirmTitle}}</h4>
</div>
<div class="modal-body">
<h3>{{confirmText}}</h3>
Expand Down
Loading