Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add gui server #439

Draft
wants to merge 8 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
31 changes: 27 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.

# compiled output
/dist
/share/dist
/share/manifest.json
/dist-electron
/release-builds
/tmp
Expand Down Expand Up @@ -58,8 +59,30 @@ src/assets/faqs/gui-faq-*.html
tests_output/
.e2e-chrome-profile/

# Emacs backup files
*~

# Generated by e2e
/test-results

/Makefile
Makefile.old
Build
Build.bat
META.*
MYMETA.*
.build/
_build/
cover_db/
blib/
.lwpcookies
.last_cover_stats
nytprof.out
pod2htm*.tmp
pm_to_blib
Zonemaster-*
Zonemaster-*.tar.gz
MANIFEST
inc

# Ignore Emacs and other backup files
*.bak
*~
.*.swp
87 changes: 87 additions & 0 deletions MANIFEST.SKIP
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
^.angular/
^.github/
^.tmp/
^additional/
^dist/
^docs/
^e2e/
^lib/auto/
^inc/
^node_modules/
^src/
^scripts/[^/]*\.js$
^share/dist/[a-z]{2}/assets/app\.config(\.sample)?\.json$
^test-results/

^\.browserslistrc$
^\.editorconfig$
^\.gitignore$
^angular\.json$
^package\.json$
^package-lock\.json$
^playwright\.config\.ts$
^proxy\.conf\.json$
^proxy\.disabled\.conf\.json$
^tsconfig\.json$
^zonemaster-gui\.toml$
.log$
^Zonemaster-.+\.tar\.gz$


#!start included /usr/share/perl/5.20/ExtUtils/MANIFEST.SKIP
# Avoid version control files.
\bRCS\b
\bCVS\b
\bSCCS\b
,v$
\B\.svn\b
\B\.git\b
\B\.gitignore\b
\b_darcs\b
\B\.cvsignore$

# Avoid VMS specific MakeMaker generated files
\bDescrip.MMS$
\bDESCRIP.MMS$
\bdescrip.mms$

# Avoid Makemaker generated and utility files.
\bMANIFEST\.bak
^Makefile$
\bblib/
\bMakeMaker-\d
\bpm_to_blib\.ts$
\bpm_to_blib$
\bblibdirs\.ts$ # 6.18 through 6.25 generated this

# Avoid Module::Build generated and utility files.
\bBuild$
\b_build/
\bBuild.bat$
\bBuild.COM$
\bBUILD.COM$
\bbuild.com$

# Avoid temp and backup files.
~$
\.old$
\#$
\b\.#
\.bak$
\.tmp$
\.#
\.rej$

# Avoid OS-specific files/dirs
# Mac OSX metadata
\B\.DS_Store
# Mac OSX SMB mount metadata files
\B\._

# Avoid Devel::Cover and Devel::CoverX::Covered files.
\bcover_db\b
\bcovered\b

# Avoid MYMETA files
^MYMETA\.
#!end included /usr/share/perl/5.20/ExtUtils/MANIFEST.SKIP
21 changes: 21 additions & 0 deletions Makefile.PL
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use inc::Module::Install;
use Module::Install::Share;

name 'Zonemaster-GUI';
all_from 'lib/Zonemaster/GUI.pm';
repository 'https://github.com/zonemaster/zonemaster-gui';
bugtracker 'https://github.com/zonemaster/zonemaster-gui/issues';

requires
'Dancer2' => 0,
'I18N::AcceptLanguage' => 0,
'TOML::Tiny' => 0,
'File::ShareDir' => 0,
'File::Slurp' => 0,
;

install_script 'scripts/zonemaster-gui';

install_share;

WriteAll
19 changes: 13 additions & 6 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,18 @@
"allowedCommonJsDependencies": [
"file-saver"
],
"outputPath": "dist",
"outputPath": "share/dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"assets": [
"src/assets",
"src/.htaccess"
"src/assets/favicon",
"src/assets/images"
],
"styles": [
"node_modules/fork-awesome/css/fork-awesome.min.css",
"src/styles.scss"
"src/styles.scss",
"node_modules/fork-awesome/css/fork-awesome.min.css"
],
"scripts": [],
"aot": true,
Expand All @@ -72,7 +72,14 @@
},
"production": {
"localize": true,
"optimization": true,
"optimization": {
"scripts": true,
"styles": {
"minify": true,
"inlineCritical": false
},
"fonts": true
},
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
Expand Down
17 changes: 0 additions & 17 deletions compress.js

This file was deleted.

5 changes: 5 additions & 0 deletions e2e/zonemaster-gui.test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[general]
default_language = "en"
enabled_languages = ["da", "en", "es", "fi", "fr", "nb", "sv"]

# All client config are hardcoded in environment.tests.js
164 changes: 164 additions & 0 deletions lib/Zonemaster/GUI.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package Zonemaster::GUI;

use strict;
use warnings;

use Dancer2;
use Carp;
use I18N::AcceptLanguage;
use TOML::Tiny qw(from_toml);
use File::Slurp qw( read_file );
use File::ShareDir qw( dist_dir );


our $VERSION = '0.0.0';

# Generate configuration
get '/:lang/app.config.json' => sub {
send_as JSON => config->{client_config}
};

# Serve additional assets
get '/:lang/additional/**' => sub {
my ( $path ) = splat;

if ( grep /^\.{2,}$/, @{$path} ) {
marc-vanderwal marked this conversation as resolved.
Show resolved Hide resolved
pass;
} else {
if ( defined config->{additional_assets_directory} ) {
send_file( path( config->{additional_assets_directory}, @{$path} ), system_path => 1 );
}
}
};

# Serve localized GUI assets, serve index.html for all other requests under /:lang
get '/:lang/?**?' => sub {
my $lang = route_parameters->get('lang');
my ( $path ) = splat;
my $filename = path( 'dist', $lang, @{$path} );

if ( ! grep { $_ eq $lang } @{config->{enabled_languages}} ) {
pass;
} else {
if (-f path( config->{public_dir}, $filename )) {
send_file $filename;
} else {
template 'index.html', {
styles => config->{static_resources}->{styles},
scripts => config->{static_resources}->{scripts},
baseurl => join('/', config->{base_url}, $lang, ""),
lang => $lang,
};
}
}
};

# For all other request, redirect based on the browser prefered language
get '/**?' => sub {
my ( $path ) = splat;
my $accept_language = request_header 'Accept-Language';
my $acceptor = I18N::AcceptLanguage->new( defaultLanguage => config->{default_language});
my $lang = $acceptor->accepts($accept_language, config->{enabled_languages});

redirect uri_for( join('/', config->{base_url}, $lang, @{$path}) );
};

sub build_app {
my $config_file_name = $ENV{ZONEMASTER_GUI_CONFIG_FILE} // "zonemaster-gui.toml";
my $config_file = read_file $config_file_name;
my $config = from_toml($config_file);
my $install_directory = $config->{general}->{install_directory} // dist_dir('Zonemaster-GUI');

if (! exists $config->{general}->{default_language}) {
croak "Please set `default_language` in configuration file.";
}

if (! exists $config->{general}->{enabled_languages}) {
croak "Please set `enabled_languages` in configuration file.";
}

my $base_url = $config->{general}->{base_url} // '';

set (
public_dir => $install_directory,
static_handler => false,
template => 'template_toolkit',
views => path($install_directory, 'templates'),
base_url => $base_url,
default_language => $config->{general}->{default_language},
enabled_languages => [ @{$config->{general}->{enabled_languages}} ],
);

my %client_config;
while( my ($key, $value) = each %{$config->{client}} ) {
$key =~ s/_([[:alpha:]])/\U$1/g;
$client_config{$key} = $value;
}

$client_config{defaultLanguage} = $config->{general}->{default_language};
$client_config{enabledLanguages} = $config->{general}->{enabled_languages};

if (exists $config->{client}->{api_endpoint}) {
$client_config{apiEndpoint} = $config->{client}->{api_endpoint};
}

if (exists $config->{client}->{polling_interval}) {
$client_config{pollingInterval} = $config->{client}->{polling_interval};
}

if (exists $config->{customization}->{msg_banner}) {
$client_config{msgBanner} = $config->{customization}->{msg_banner};
}

if (exists $config->{customization}->{contact_address}) {
$client_config{contactAddress} = $config->{customization}->{contact_address};
}

if (exists $config->{customization}->{logo_url}) {
$client_config{logoUrl} = $config->{customization}->{logo_url};
}

if (exists $config->{customization}->{footer_logo}) {
$client_config{footerLogo} = $config->{customization}->{footer_logo};
}

if (exists $config->{customization}->{footer_logo_alt}) {
$client_config{footerLogo} = $config->{customization}->{footer_logo_alt};
}


set client_config => \%client_config;

my $manifest_file = read_file path($install_directory, "manifest.json");
my $static_resources = decode_json($manifest_file);
my %final_static_resources;

my @additional_styles = map { join('/', 'additional', $_) } @{$config->{customization}->{additional_styles}};
my @additional_scripts = map { join('/', 'additional', $_) } @{$config->{customization}->{additional_scripts}};

my $override_default_style = $config->{customization}->{override_default_style} // 0;

$final_static_resources{styles} =
$override_default_style ?
\@additional_styles :
[ @{$static_resources->{styles}}, @additional_styles ];

$final_static_resources{scripts} = [ @{$static_resources->{scripts}}, @additional_scripts ];

set (
static_resources => \%final_static_resources,
additional_assets_directory => $config->{customization}->{additional_assets_directory},
);

if ( exists $config->{customization}->{template_override_directory} ) {
set engines => {
template => {
template_toolkit => {
include_path => $config->{customization}->{template_override_directory}
}
}
}
}

return to_app;
}
1 change: 1 addition & 0 deletions lib/auto/share/dist/Zonemaster-GUI
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "node scripts/faq.js && ng build --configuration production",
"build": "node scripts/faq.js && ng build --configuration production && node scripts/create_manifest.js ",
"release": "npm run build && node scripts/create_release.js",
"lint": "ng lint",
"e2e": "playwright test",
Expand Down
Loading
Loading