Merge pull request #2609 from NoelDeMartin/MOBILE-3320
MOBILE-3320: Refactor folder structure and extract modulesmain
commit
4c7545fb46
|
@ -93,7 +93,8 @@
|
||||||
"options": {
|
"options": {
|
||||||
"lintFilePatterns": [
|
"lintFilePatterns": [
|
||||||
"src/**/*.ts",
|
"src/**/*.ts",
|
||||||
"src/app/**/*.html"
|
"src/core/**/*.html",
|
||||||
|
"src/addons/**/*.html"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,15 +18,14 @@ const { resolve } = require('path');
|
||||||
|
|
||||||
module.exports = config => {
|
module.exports = config => {
|
||||||
config.resolve.alias['@'] = resolve('src');
|
config.resolve.alias['@'] = resolve('src');
|
||||||
config.resolve.alias['@addon'] = resolve('src/app/addon');
|
config.resolve.alias['@classes'] = resolve('src/core/classes');
|
||||||
config.resolve.alias['@app'] = resolve('src/app');
|
config.resolve.alias['@components'] = resolve('src/core/components');
|
||||||
config.resolve.alias['@classes'] = resolve('src/app/classes');
|
config.resolve.alias['@directives'] = resolve('src/core/directives');
|
||||||
config.resolve.alias['@components'] = resolve('src/app/components');
|
config.resolve.alias['@features'] = resolve('src/core/features');
|
||||||
config.resolve.alias['@core'] = resolve('src/app/core');
|
config.resolve.alias['@guards'] = resolve('src/core/guards');
|
||||||
config.resolve.alias['@directives'] = resolve('src/app/directives');
|
config.resolve.alias['@pipes'] = resolve('src/core/pipes');
|
||||||
config.resolve.alias['@pipes'] = resolve('src/app/pipes');
|
config.resolve.alias['@services'] = resolve('src/core/services');
|
||||||
config.resolve.alias['@services'] = resolve('src/app/services');
|
config.resolve.alias['@singletons'] = resolve('src/core/singletons');
|
||||||
config.resolve.alias['@singletons'] = resolve('src/app/singletons');
|
|
||||||
|
|
||||||
config.plugins.push(
|
config.plugins.push(
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
|
|
|
@ -136,48 +136,36 @@ class BuildLangTask {
|
||||||
treatMergedData(data) {
|
treatMergedData(data) {
|
||||||
const merged = {};
|
const merged = {};
|
||||||
const mergedOrdered = {};
|
const mergedOrdered = {};
|
||||||
|
const getPrefix = (path) => {
|
||||||
|
const folders = path.split(/[\/\\]/);
|
||||||
|
|
||||||
|
switch (folders[0]) {
|
||||||
|
case 'core':
|
||||||
|
switch (folders[1]) {
|
||||||
|
case 'lang':
|
||||||
|
return 'core.';
|
||||||
|
case 'features':
|
||||||
|
return `core.${folders[2]}.`;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'addons':
|
||||||
|
return `addon.${folders.slice(1, -2).join('_')}.`;
|
||||||
|
case 'assets':
|
||||||
|
return `assets.${folders[1]}.`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
for (let filepath in data) {
|
for (let filepath in data) {
|
||||||
|
const prefix = getPrefix(filepath);
|
||||||
const pathSplit = filepath.split(/[\/\\]/);
|
|
||||||
let prefix;
|
|
||||||
|
|
||||||
pathSplit.pop();
|
|
||||||
|
|
||||||
switch (pathSplit[0]) {
|
|
||||||
case 'lang':
|
|
||||||
prefix = 'core';
|
|
||||||
break;
|
|
||||||
case 'core':
|
|
||||||
if (pathSplit[1] == 'lang') {
|
|
||||||
// Not used right now.
|
|
||||||
prefix = 'core';
|
|
||||||
} else {
|
|
||||||
prefix = 'core.' + pathSplit[1];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'addon':
|
|
||||||
// Remove final item 'lang'.
|
|
||||||
pathSplit.pop();
|
|
||||||
// Remove first item 'addon'.
|
|
||||||
pathSplit.shift();
|
|
||||||
|
|
||||||
// For subplugins. We'll use plugin_subfolder_subfolder2_...
|
|
||||||
// E.g. 'mod_assign_feedback_comments'.
|
|
||||||
prefix = 'addon.' + pathSplit.join('_');
|
|
||||||
break;
|
|
||||||
case 'assets':
|
|
||||||
prefix = 'assets.' + pathSplit[1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
this.addProperties(merged, data[filepath], prefix + '.');
|
this.addProperties(merged, data[filepath], prefix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Force ordering by string key.
|
// Force ordering by string key.
|
||||||
Object.keys(merged).sort().forEach((key) => {
|
Object.keys(merged).sort().forEach((key) => {
|
||||||
mergedOrdered[key] = merged[key];
|
mergedOrdered[key] = merged[key];
|
||||||
|
|
11
gulpfile.js
11
gulpfile.js
|
@ -19,13 +19,12 @@ const gulp = require('gulp');
|
||||||
|
|
||||||
const paths = {
|
const paths = {
|
||||||
lang: [
|
lang: [
|
||||||
'./src/app/lang/',
|
'./src/addons/**/lang/',
|
||||||
'./src/app/core/**/lang/',
|
|
||||||
'./src/app/addon/**/lang/',
|
|
||||||
'./src/app/**/**/lang/',
|
|
||||||
'./src/assets/countries/',
|
'./src/assets/countries/',
|
||||||
'./src/assets/mimetypes/'
|
'./src/assets/mimetypes/',
|
||||||
]
|
'./src/core/features/**/lang/',
|
||||||
|
'./src/core/lang/',
|
||||||
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const args = Utils.getCommandLineArguments();
|
const args = Utils.getCommandLineArguments();
|
||||||
|
|
|
@ -3,11 +3,11 @@ const { compilerOptions } = require('./tsconfig');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
preset: 'jest-preset-angular',
|
preset: 'jest-preset-angular',
|
||||||
setupFilesAfterEnv: ['<rootDir>/src/tests/setup.ts'],
|
setupFilesAfterEnv: ['<rootDir>/src/testing/setup.ts'],
|
||||||
testMatch: ['**/?(*.)test.ts'],
|
testMatch: ['**/?(*.)test.ts'],
|
||||||
collectCoverageFrom: [
|
collectCoverageFrom: [
|
||||||
'src/**/*.{ts,html}',
|
'src/**/*.{ts,html}',
|
||||||
'!src/tests/**/*',
|
'!src/testing/**/*',
|
||||||
],
|
],
|
||||||
transform: {
|
transform: {
|
||||||
'^.+\\.(ts|html)$': 'ts-jest',
|
'^.+\\.(ts|html)$': 'ts-jest',
|
||||||
|
|
|
@ -12,10 +12,13 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/**
|
import { NgModule } from '@angular/core';
|
||||||
* Prevents Angular change detection from
|
|
||||||
* running with certain Web Component callbacks
|
|
||||||
*/
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-underscore-dangle
|
import { AddonPrivateFilesInitModule } from './privatefiles/privatefiles-init.module';
|
||||||
window.__Zone_disable_customElements = true;
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
AddonPrivateFilesInitModule,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class AddonsModule {}
|
|
@ -29,9 +29,9 @@ import {
|
||||||
AddonPrivateFilesFile,
|
AddonPrivateFilesFile,
|
||||||
AddonPrivateFilesGetUserInfoWSResult,
|
AddonPrivateFilesGetUserInfoWSResult,
|
||||||
AddonPrivateFilesGetFilesWSParams,
|
AddonPrivateFilesGetFilesWSParams,
|
||||||
} from '@addon/privatefiles/services/privatefiles';
|
} from '@/addons/privatefiles/services/privatefiles';
|
||||||
import { AddonPrivateFilesHelper } from '@addon/privatefiles/services/privatefiles.helper';
|
import { AddonPrivateFilesHelper } from '@/addons/privatefiles/services/privatefiles.helper';
|
||||||
import { CoreUtils } from '@/app/services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page that displays the list of files.
|
* Page that displays the list of files.
|
|
@ -15,14 +15,14 @@
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { Routes } from '@angular/router';
|
import { Routes } from '@angular/router';
|
||||||
|
|
||||||
import { CoreMainMenuDelegate } from '@core/mainmenu/services/mainmenu.delegate';
|
import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu.delegate';
|
||||||
import { CoreMainMenuRoutingModule } from '@core/mainmenu/mainmenu-routing.module';
|
import { CoreMainMenuRoutingModule } from '@features/mainmenu/mainmenu-routing.module';
|
||||||
import { AddonPrivateFilesMainMenuHandler } from './services/handlers/mainmenu';
|
import { AddonPrivateFilesMainMenuHandler } from './services/handlers/mainmenu';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path: 'addon-privatefiles',
|
path: 'addon-privatefiles',
|
||||||
loadChildren: () => import('@addon/privatefiles/privatefiles.module').then(m => m.AddonPrivateFilesModule),
|
loadChildren: () => import('@/addons/privatefiles/privatefiles.module').then(m => m.AddonPrivateFilesModule),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@core/mainmenu/services/mainmenu.delegate';
|
import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu.delegate';
|
||||||
import { AddonPrivateFiles } from '@addon/privatefiles/services/privatefiles';
|
import { AddonPrivateFiles } from '@/addons/privatefiles/services/privatefiles';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler to inject an option into main menu.
|
* Handler to inject an option into main menu.
|
|
@ -16,7 +16,7 @@ import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreFileUploaderHelper } from '@core/fileuploader/services/fileuploader.helper';
|
import { CoreFileUploaderHelper } from '@features/fileuploader/services/fileuploader.helper';
|
||||||
import { AddonPrivateFiles, AddonPrivateFilesGetUserInfoWSResult } from './privatefiles';
|
import { AddonPrivateFiles, AddonPrivateFilesGetUserInfoWSResult } from './privatefiles';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { makeSingleton, Translate } from '@singletons/core.singletons';
|
import { makeSingleton, Translate } from '@singletons/core.singletons';
|
|
@ -20,15 +20,15 @@ import { AuthGuard } from '@guards/auth.guard';
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path: 'login',
|
path: 'login',
|
||||||
loadChildren: () => import('./core/login/login.module').then( m => m.CoreLoginModule),
|
loadChildren: () => import('@features/login/login.module').then( m => m.CoreLoginModule),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'settings',
|
path: 'settings',
|
||||||
loadChildren: () => import('./core/settings/settings.module').then( m => m.CoreSettingsModule),
|
loadChildren: () => import('@features/settings/settings.module').then( m => m.CoreSettingsModule),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
loadChildren: () => import('./core/mainmenu/mainmenu.module').then( m => m.CoreMainMenuModule),
|
loadChildren: () => import('@features/mainmenu/mainmenu.module').then( m => m.CoreMainMenuModule),
|
||||||
canActivate: [AuthGuard],
|
canActivate: [AuthGuard],
|
||||||
canLoad: [AuthGuard],
|
canLoad: [AuthGuard],
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,13 +12,15 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
import { NavController } from '@ionic/angular';
|
import { NavController } from '@ionic/angular';
|
||||||
|
|
||||||
import { AppComponent } from '@app/app.component';
|
import { AppComponent } from '@/app/app.component';
|
||||||
import { CoreEvents } from '@singletons/events';
|
import { CoreEvents } from '@singletons/events';
|
||||||
import { CoreLangProvider } from '@services/lang';
|
import { CoreLangProvider } from '@services/lang';
|
||||||
|
import { Network, Platform, NgZone } from '@singletons/core.singletons';
|
||||||
|
|
||||||
import { mock, renderComponent, RenderConfig } from '@/tests/utils';
|
import { mock, mockSingleton, renderComponent, RenderConfig } from '@/testing/utils';
|
||||||
|
|
||||||
describe('AppComponent', () => {
|
describe('AppComponent', () => {
|
||||||
|
|
||||||
|
@ -27,6 +29,10 @@ describe('AppComponent', () => {
|
||||||
let config: Partial<RenderConfig>;
|
let config: Partial<RenderConfig>;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
mockSingleton(Network, { onChange: () => new Observable() });
|
||||||
|
mockSingleton(Platform, { ready: () => Promise.resolve() });
|
||||||
|
mockSingleton(NgZone, { run: jest.fn() });
|
||||||
|
|
||||||
langProvider = mock<CoreLangProvider>(['clearCustomStrings']);
|
langProvider = mock<CoreLangProvider>(['clearCustomStrings']);
|
||||||
navController = mock<NavController>(['navigateRoot']);
|
navController = mock<NavController>(['navigateRoot']);
|
||||||
config = {
|
config = {
|
||||||
|
|
|
@ -16,7 +16,7 @@ import { Component, OnInit } from '@angular/core';
|
||||||
import { NavController } from '@ionic/angular';
|
import { NavController } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreLangProvider } from '@services/lang';
|
import { CoreLangProvider } from '@services/lang';
|
||||||
import { CoreLoginHelperProvider } from '@core/login/services/login.helper';
|
import { CoreLoginHelperProvider } from '@features/login/services/login.helper';
|
||||||
import { CoreEvents, CoreEventSessionExpiredData } from '@singletons/events';
|
import { CoreEvents, CoreEventSessionExpiredData } from '@singletons/events';
|
||||||
import { Network, NgZone, Platform } from '@singletons/core.singletons';
|
import { Network, NgZone, Platform } from '@singletons/core.singletons';
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
|
|
|
@ -12,65 +12,22 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { NgModule, Injector } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { RouteReuseStrategy } from '@angular/router';
|
import { RouteReuseStrategy } from '@angular/router';
|
||||||
import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
|
import { HttpClient, HttpClientModule } from '@angular/common/http';
|
||||||
|
|
||||||
import { IonicModule, IonicRouteStrategy, Platform } from '@ionic/angular';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
import { AppRoutingModule } from './app-routing.module';
|
|
||||||
import { CoreInterceptor } from '@classes/interceptor';
|
|
||||||
|
|
||||||
// Import core services.
|
|
||||||
import { CoreAppProvider } from '@services/app';
|
|
||||||
import { CoreConfigProvider } from '@services/config';
|
|
||||||
import { CoreCronDelegate } from '@services/cron';
|
|
||||||
import { CoreDbProvider } from '@services/db';
|
|
||||||
import { CoreFileHelperProvider } from '@services/file-helper';
|
|
||||||
import { CoreFileSessionProvider } from '@services/file-session';
|
|
||||||
import { CoreFileProvider, CoreFile } from '@services/file';
|
|
||||||
import { CoreFilepoolProvider } from '@services/filepool';
|
|
||||||
import { CoreGeolocationProvider } from '@services/geolocation';
|
|
||||||
import { CoreGroupsProvider } from '@services/groups';
|
|
||||||
import { CoreInitDelegate, CoreInit } from '@services/init';
|
|
||||||
import { CoreLangProvider } from '@services/lang';
|
|
||||||
import { CoreLocalNotificationsProvider } from '@services/local-notifications';
|
|
||||||
import { CorePluginFileDelegate } from '@services/plugin-file.delegate';
|
|
||||||
import { CoreSitesProvider, CoreSites } from '@services/sites';
|
|
||||||
import { CoreSyncProvider } from '@services/sync';
|
|
||||||
import { CoreUpdateManagerProvider, CoreUpdateManager } from '@services/update-manager';
|
|
||||||
import { CoreWSProvider } from '@services/ws';
|
|
||||||
import { CoreDomUtilsProvider } from '@services/utils/dom';
|
|
||||||
import { CoreIframeUtilsProvider } from '@services/utils/iframe';
|
|
||||||
import { CoreMimetypeUtilsProvider } from '@services/utils/mimetype';
|
|
||||||
import { CoreTextUtilsProvider } from '@services/utils/text';
|
|
||||||
import { CoreTimeUtilsProvider } from '@services/utils/time';
|
|
||||||
import { CoreUrlUtilsProvider } from '@services/utils/url';
|
|
||||||
import { CoreUtilsProvider } from '@services/utils/utils';
|
|
||||||
|
|
||||||
// Import init DB functions of core services.
|
|
||||||
import { initCoreFilepoolDB } from '@services/filepool.db';
|
|
||||||
import { initCoreSitesDB } from '@services/sites.db';
|
|
||||||
import { initCoreSyncDB } from '@services/sync.db';
|
|
||||||
import { initCoreSearchHistoryDB } from '@core/search/services/search.history.db';
|
|
||||||
|
|
||||||
// Import core modules.
|
|
||||||
import { CoreEmulatorModule } from '@core/emulator/emulator.module';
|
|
||||||
import { CoreLoginModule } from '@core/login/login.module';
|
|
||||||
import { CoreCoursesModule } from '@core/courses/courses.module';
|
|
||||||
import { CoreSettingsInitModule } from '@core/settings/settings-init.module';
|
|
||||||
import { CoreFileUploaderInitModule } from '@core/fileuploader/fileuploader-init.module';
|
|
||||||
|
|
||||||
// Import addons init modules.
|
|
||||||
import { AddonPrivateFilesInitModule } from '@addon/privatefiles/privatefiles-init.module';
|
|
||||||
|
|
||||||
import { setSingletonsInjector } from '@singletons/core.singletons';
|
|
||||||
|
|
||||||
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
||||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||||
|
|
||||||
|
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
|
||||||
|
|
||||||
|
import { CoreModule } from '@/core/core.module';
|
||||||
|
import { AddonsModule } from '@/addons/addons.module';
|
||||||
|
|
||||||
|
import { AppComponent } from './app.component';
|
||||||
|
import { AppRoutingModule } from './app-routing.module';
|
||||||
|
|
||||||
// For translate loader. AoT requires an exported function for factories.
|
// For translate loader. AoT requires an exported function for factories.
|
||||||
export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
|
export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
|
||||||
return new TranslateHttpLoader(http, './assets/lang/', '.json');
|
return new TranslateHttpLoader(http, './assets/lang/', '.json');
|
||||||
|
@ -91,93 +48,12 @@ export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
AppRoutingModule,
|
AppRoutingModule,
|
||||||
CoreEmulatorModule,
|
CoreModule,
|
||||||
CoreLoginModule,
|
AddonsModule,
|
||||||
CoreCoursesModule,
|
|
||||||
CoreSettingsInitModule,
|
|
||||||
CoreFileUploaderInitModule,
|
|
||||||
AddonPrivateFilesInitModule,
|
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
|
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: CoreInterceptor, multi: true },
|
|
||||||
CoreAppProvider,
|
|
||||||
CoreConfigProvider,
|
|
||||||
CoreCronDelegate,
|
|
||||||
CoreDbProvider,
|
|
||||||
CoreFileHelperProvider,
|
|
||||||
CoreFileSessionProvider,
|
|
||||||
CoreFileProvider,
|
|
||||||
CoreFilepoolProvider,
|
|
||||||
CoreGeolocationProvider,
|
|
||||||
CoreGroupsProvider,
|
|
||||||
CoreInitDelegate,
|
|
||||||
CoreLangProvider,
|
|
||||||
CoreLocalNotificationsProvider,
|
|
||||||
CorePluginFileDelegate,
|
|
||||||
CoreSitesProvider,
|
|
||||||
CoreSyncProvider,
|
|
||||||
CoreUpdateManagerProvider,
|
|
||||||
CoreWSProvider,
|
|
||||||
CoreDomUtilsProvider,
|
|
||||||
CoreIframeUtilsProvider,
|
|
||||||
CoreMimetypeUtilsProvider,
|
|
||||||
CoreTextUtilsProvider,
|
|
||||||
CoreTimeUtilsProvider,
|
|
||||||
CoreUrlUtilsProvider,
|
|
||||||
CoreUtilsProvider,
|
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent],
|
bootstrap: [AppComponent],
|
||||||
})
|
})
|
||||||
export class AppModule {
|
export class AppModule {}
|
||||||
|
|
||||||
constructor(injector: Injector, platform: Platform) {
|
|
||||||
// Set the injector.
|
|
||||||
setSingletonsInjector(injector);
|
|
||||||
|
|
||||||
this.initCoreServicesDB();
|
|
||||||
|
|
||||||
// Register a handler for platform ready.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CorePlatformReady',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 400,
|
|
||||||
blocking: true,
|
|
||||||
load: async () => {
|
|
||||||
await platform.ready();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Register the update manager as an init process.
|
|
||||||
CoreInit.instance.registerProcess(CoreUpdateManager.instance);
|
|
||||||
|
|
||||||
// Restore the user's session during the init process.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CoreRestoreSession',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 200,
|
|
||||||
blocking: false,
|
|
||||||
load: CoreSites.instance.restoreSession.bind(CoreSites.instance),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Register clear app tmp folder.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CoreClearTmpFolder',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 150,
|
|
||||||
blocking: false,
|
|
||||||
load: CoreFile.instance.clearTmpFolder.bind(CoreFile.instance),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Execute the init processes.
|
|
||||||
CoreInit.instance.executeInitProcesses();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Init the DB of core services.
|
|
||||||
*/
|
|
||||||
protected initCoreServicesDB(): void {
|
|
||||||
initCoreFilepoolDB();
|
|
||||||
initCoreSitesDB();
|
|
||||||
initCoreSyncDB();
|
|
||||||
initCoreSearchHistoryDB();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { BehaviorSubject, Subject } from 'rxjs';
|
import { BehaviorSubject, Subject } from 'rxjs';
|
||||||
import { CoreEvents } from '../singletons/events';
|
import { CoreEvents } from '@singletons/events';
|
||||||
import { CoreDelegate, CoreDelegateDisplayHandler, CoreDelegateToDisplay } from './delegate';
|
import { CoreDelegate, CoreDelegateDisplayHandler, CoreDelegateToDisplay } from './delegate';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -101,4 +101,3 @@ export class CoreSortedDelegate<
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ describe('CoreError', () => {
|
||||||
expect(error!.name).toEqual('CoreError');
|
expect(error!.name).toEqual('CoreError');
|
||||||
expect(error!.message).toEqual(message);
|
expect(error!.message).toEqual(message);
|
||||||
expect(error!.stack).not.toBeNull();
|
expect(error!.stack).not.toBeNull();
|
||||||
expect(error!.stack).toContain('src/app/classes/error.test.ts');
|
expect(error!.stack).toContain('src/core/classes/error.test.ts');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can be subclassed', () => {
|
it('can be subclassed', () => {
|
||||||
|
@ -70,7 +70,7 @@ describe('CoreError', () => {
|
||||||
expect(error!.name).toEqual('CustomCoreError');
|
expect(error!.name).toEqual('CustomCoreError');
|
||||||
expect(error!.message).toEqual(`Custom message: ${message}`);
|
expect(error!.message).toEqual(`Custom message: ${message}`);
|
||||||
expect(error!.stack).not.toBeNull();
|
expect(error!.stack).not.toBeNull();
|
||||||
expect(error!.stack).toContain('src/app/classes/error.test.ts');
|
expect(error!.stack).toContain('src/core/classes/error.test.ts');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
|
@ -32,7 +32,7 @@ import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreTimeUtils } from '@services/utils/time';
|
import { CoreTimeUtils } from '@services/utils/time';
|
||||||
import { CoreUrlUtils, CoreUrlParams } from '@services/utils/url';
|
import { CoreUrlUtils, CoreUrlParams } from '@services/utils/url';
|
||||||
import { CoreUtils, PromiseDefer } from '@services/utils/utils';
|
import { CoreUtils, PromiseDefer } from '@services/utils/utils';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { SQLiteDB } from '@classes/sqlitedb';
|
import { SQLiteDB } from '@classes/sqlitedb';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreWSError } from '@classes/errors/wserror';
|
import { CoreWSError } from '@classes/errors/wserror';
|
|
@ -31,8 +31,8 @@ import { CoreShowPasswordComponent } from './show-password/show-password';
|
||||||
import { CoreEmptyBoxComponent } from './empty-box/empty-box';
|
import { CoreEmptyBoxComponent } from './empty-box/empty-box';
|
||||||
import { CoreTabsComponent } from './tabs/tabs';
|
import { CoreTabsComponent } from './tabs/tabs';
|
||||||
|
|
||||||
import { CoreDirectivesModule } from '@app/directives/directives.module';
|
import { CoreDirectivesModule } from '@directives/directives.module';
|
||||||
import { CorePipesModule } from '@app/pipes/pipes.module';
|
import { CorePipesModule } from '@pipes/pipes.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to show a download button with refresh option, the spinner and the status of it.
|
* Component to show a download button with refresh option, the spinner and the status of it.
|
|
@ -23,9 +23,9 @@ import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreTextUtils } from '@services/utils/text';
|
import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { CoreWSExternalFile } from '@/app/services/ws';
|
import { CoreWSExternalFile } from '@services/ws';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to handle a remote file. Shows the file name, icon (depending on mimetype) and a button
|
* Component to handle a remote file. Shows the file name, icon (depending on mimetype) and a button
|
|
@ -29,8 +29,8 @@ import { TranslateService } from '@ngx-translate/core';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { CoreConfig } from '@services/config';
|
import { CoreConfig } from '@services/config';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { CoreUtils } from '@/app/services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { NavigationOptions } from '@ionic/angular/providers/nav-controller';
|
import { NavigationOptions } from '@ionic/angular/providers/nav-controller';
|
||||||
import { Params } from '@angular/router';
|
import { Params } from '@angular/router';
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { CoreIconComponent } from '@components/icon/icon';
|
import { CoreIconComponent } from '@components/icon/icon';
|
||||||
|
|
||||||
import { renderWrapperComponent } from '@/tests/utils';
|
import { renderWrapperComponent } from '@/testing/utils';
|
||||||
|
|
||||||
describe('CoreIconComponent', () => {
|
describe('CoreIconComponent', () => {
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||||
|
import { Injector, NgModule } from '@angular/core';
|
||||||
|
|
||||||
|
import { Platform } from '@ionic/angular';
|
||||||
|
|
||||||
|
import { CoreFeaturesModule } from './features/features.module';
|
||||||
|
import { CoreFile } from './services/file';
|
||||||
|
import { CoreInit, CoreInitDelegate } from './services/init';
|
||||||
|
import { CoreInterceptor } from './classes/interceptor';
|
||||||
|
import { CoreSites, CORE_SITE_SCHEMAS } from './services/sites';
|
||||||
|
import { CoreUpdateManager } from './services/update-manager';
|
||||||
|
import { setSingletonsInjector } from './singletons/core.singletons';
|
||||||
|
import { SITE_SCHEMA as FILEPOOL_SITE_SCHEMA } from './services/filepool-db';
|
||||||
|
import { SITE_SCHEMA as SITES_SITE_SCHEMA } from './services/sites-db';
|
||||||
|
import { SITE_SCHEMA as SYNC_SITE_SCHEMA } from './services/sync-db';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
CoreFeaturesModule,
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{ provide: HTTP_INTERCEPTORS, useClass: CoreInterceptor, multi: true },
|
||||||
|
{
|
||||||
|
provide: CORE_SITE_SCHEMAS,
|
||||||
|
useValue: [
|
||||||
|
FILEPOOL_SITE_SCHEMA,
|
||||||
|
SITES_SITE_SCHEMA,
|
||||||
|
SYNC_SITE_SCHEMA,
|
||||||
|
],
|
||||||
|
multi: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class CoreModule {
|
||||||
|
|
||||||
|
constructor(platform: Platform, injector: Injector) {
|
||||||
|
// Set the injector.
|
||||||
|
setSingletonsInjector(injector);
|
||||||
|
|
||||||
|
// Register a handler for platform ready.
|
||||||
|
CoreInit.instance.registerProcess({
|
||||||
|
name: 'CorePlatformReady',
|
||||||
|
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 400,
|
||||||
|
blocking: true,
|
||||||
|
load: async () => {
|
||||||
|
await platform.ready();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register the update manager as an init process.
|
||||||
|
CoreInit.instance.registerProcess(CoreUpdateManager.instance);
|
||||||
|
|
||||||
|
// Restore the user's session during the init process.
|
||||||
|
CoreInit.instance.registerProcess({
|
||||||
|
name: 'CoreRestoreSession',
|
||||||
|
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 200,
|
||||||
|
blocking: false,
|
||||||
|
load: CoreSites.instance.restoreSession.bind(CoreSites.instance),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register clear app tmp folder.
|
||||||
|
CoreInit.instance.registerProcess({
|
||||||
|
name: 'CoreClearTmpFolder',
|
||||||
|
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 150,
|
||||||
|
blocking: false,
|
||||||
|
load: CoreFile.instance.clearTmpFolder.bind(CoreFile.instance),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Execute the init processes.
|
||||||
|
CoreInit.instance.executeInitProcesses();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -15,7 +15,7 @@
|
||||||
import { Directive, ElementRef, Input, OnChanges, SimpleChange } from '@angular/core';
|
import { Directive, ElementRef, Input, OnChanges, SimpleChange } from '@angular/core';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import { Http } from '@singletons/core.singletons';
|
import { Http } from '@singletons/core.singletons';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directive to enable font-awesome 5 as ionicons.
|
* Directive to enable font-awesome 5 as ionicons.
|
|
@ -21,7 +21,7 @@ import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreTextUtils } from '@services/utils/text';
|
import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreConstants } from '@core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directive to open a link in external browser or in the app.
|
* Directive to open a link in external browser or in the app.
|
|
@ -27,7 +27,7 @@ import { CoreUrlUtils, CoreUrlUtilsProvider } from '@services/utils/url';
|
||||||
import { CoreUtils, CoreUtilsProvider } from '@services/utils/utils';
|
import { CoreUtils, CoreUtilsProvider } from '@services/utils/utils';
|
||||||
import { Platform } from '@singletons/core.singletons';
|
import { Platform } from '@singletons/core.singletons';
|
||||||
|
|
||||||
import { mock, mockSingleton, RenderConfig, renderWrapperComponent } from '@/tests/utils';
|
import { mock, mockSingleton, RenderConfig, renderWrapperComponent } from '@/testing/utils';
|
||||||
|
|
||||||
describe('CoreFormatTextDirective', () => {
|
describe('CoreFormatTextDirective', () => {
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { CoreLinkDirective } from '@directives/link';
|
import { CoreLinkDirective } from '@directives/link';
|
||||||
|
|
||||||
import { renderTemplate } from '@/tests/utils';
|
import { renderTemplate } from '@/testing/utils';
|
||||||
|
|
||||||
describe('CoreLinkDirective', () => {
|
describe('CoreLinkDirective', () => {
|
||||||
|
|
|
@ -16,7 +16,7 @@ import { CoreContentLinksAction } from '../services/contentlinks.delegate';
|
||||||
import { CoreContentLinksHandlerBase } from './base-handler';
|
import { CoreContentLinksHandlerBase } from './base-handler';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
// import { CoreCourseHelperProvider } from '@core/course/providers/helper';
|
// import { CoreCourseHelperProvider } from '@features/course/providers/helper';
|
||||||
import { Params } from '@angular/router';
|
import { Params } from '@angular/router';
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { CoreContentLinksHelper } from '../services/contentlinks.helper';
|
import { CoreContentLinksHelper } from '../services/contentlinks.helper';
|
||||||
import { CoreContentLinksHandlerBase } from './base-handler';
|
import { CoreContentLinksHandlerBase } from './base-handler';
|
||||||
import { Translate } from '@/app/singletons/core.singletons';
|
import { Translate } from '@singletons/core.singletons';
|
||||||
import { Params } from '@angular/router';
|
import { Params } from '@angular/router';
|
||||||
import { CoreContentLinksAction } from '../services/contentlinks.delegate';
|
import { CoreContentLinksAction } from '../services/contentlinks.delegate';
|
||||||
|
|
|
@ -17,7 +17,7 @@ import { NavController } from '@ionic/angular';
|
||||||
import { CoreSiteBasicInfo, CoreSites } from '@services/sites';
|
import { CoreSiteBasicInfo, CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { Translate } from '@singletons/core.singletons';
|
import { Translate } from '@singletons/core.singletons';
|
||||||
import { CoreLoginHelper } from '@core/login/services/login.helper';
|
import { CoreLoginHelper } from '@features/login/services/login.helper';
|
||||||
import { CoreContentLinksAction } from '../../services/contentlinks.delegate';
|
import { CoreContentLinksAction } from '../../services/contentlinks.delegate';
|
||||||
import { CoreContentLinksHelper } from '../../services/contentlinks.helper';
|
import { CoreContentLinksHelper } from '../../services/contentlinks.helper';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
|
@ -17,10 +17,10 @@ import { NavController } from '@ionic/angular';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreLoginHelper } from '@core/login/services/login.helper';
|
import { CoreLoginHelper } from '@features/login/services/login.helper';
|
||||||
import { CoreContentLinksDelegate, CoreContentLinksAction } from './contentlinks.delegate';
|
import { CoreContentLinksDelegate, CoreContentLinksAction } from './contentlinks.delegate';
|
||||||
import { CoreSite } from '@classes/site';
|
import { CoreSite } from '@classes/site';
|
||||||
import { CoreMainMenu } from '@core/mainmenu/services/mainmenu';
|
import { CoreMainMenu } from '@features/mainmenu/services/mainmenu';
|
||||||
import { makeSingleton, NgZone, Translate } from '@singletons/core.singletons';
|
import { makeSingleton, NgZone, Translate } from '@singletons/core.singletons';
|
||||||
import { Params } from '@angular/router';
|
import { Params } from '@angular/router';
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue