Compare commits

..
Author SHA1 Message Date
Rainer Killinger 991fab373c refactor: update elasticsearch to 8.19 2026-10-20 16:13:03 +02:00
Jovan Krunić 3547ad19f6 fix: news settings filter 2026-10-20 15:43:40 +02:00
Jovan Krunić d5fbd8654c feat: app now requests backend version 4.1.0 2026-10-20 15:24:11 +02:00
Jovan Krunić c9ada93f87 fix: remove expired label from the id cards 2026-10-19 17:33:15 +02:00
Jovan Krunić 6d782ecb10 fix: don't use token param for assessments in prod 2026-10-19 16:18:28 +02:00
Jovan Krunić 1cc3ffedf8 fix: remove assessments cache immediately on user change
Closes #256
2026-10-19 15:59:09 +02:00
Rainer Killinger 05a0525320 refactor: update app licenses mentions 2026-10-19 15:40:11 +02:00
Rainer Killinger 3c08704345 ci: fix publish docs job 2026-10-19 12:54:54 +02:00
Jovan Krunić 6b17416d61 docs: update changelogs for release
ci: publish release
2026-10-19 10:43:27 +02:00
Jovan Krunić 019f80134d refactor: update changesets 2026-10-19 10:40:26 +02:00
Jovan Krunić ba728d551b feat: use only one identity provider
Additionally remove ionic-appauth dependency,
refactor the relevant code and fix some issues.

Closes #245
2026-10-18 16:10:13 +02:00
Jovan Krunić c6dfbd6add fix: use same width as other about pages 2026-10-13 16:12:25 +02:00
Jovan Krunić 27877c6607 fix: flickering in chrome when switching views
Related to #253
2026-10-13 11:57:46 +02:00
Jovan Krunić f552586b50 fix: show calendar label using a proper soft hyphen
Closes #254
2026-10-12 10:36:03 +02:00
Rainer Killinger 4c3f3ef14c fix: app resources:ios script 2026-10-09 16:16:53 +02:00
Rainer Killinger 4c5d529589 docs: update changelogs for release
ci: publish release
2026-10-09 14:13:12 +02:00
Rainer Killinger 09ad903a30 refactor: update changesets 2026-10-09 13:48:01 +02:00
Rainer Killinger a482f0bf0b refactor: update capactior and native sdk projects 2026-10-09 13:48:01 +02:00
Jovan KrunićandRainer Killinger da81e06bc2 fix: flickering in chrome when switching views
Closes #253
2026-10-09 13:48:00 +02:00
Rainer Killinger 3efd5d4b31 fix: bump critical peer dependencies 2026-10-09 13:48:00 +02:00
Jovan KrunićandRainer Killinger 3ee036c85e fix: blurred news image background detail in firefox 2026-10-09 13:48:00 +02:00
Jovan KrunićandRainer Killinger 8cec8bacbe fix: properly show places on the map in detail view
Closes #252
2026-10-09 13:48:00 +02:00
Jovan KrunićandRainer Killinger 790b10e57b fix: show 3d buildings only when the map is tilted 2026-10-09 13:48:00 +02:00
Rainer Killinger 2a5c8724b1 ci: update app-builder image 2026-10-09 13:47:59 +02:00
Jovan KrunićandRainer Killinger 4b145f3b2f fix: make gelocation work reliably
Closes #249
2026-10-09 13:47:59 +02:00
Jovan KrunićandRainer Killinger 2438873fd0 fix: translate service injection
Closes #250
2026-10-09 13:47:59 +02:00
Jovan KrunićandRainer Killinger fbb42042bf fix: replace deprecated sass import with use rules 2026-10-09 13:47:59 +02:00
Rainer Killinger 209469c6a7 refactor: fix map controlls 2026-10-09 13:47:59 +02:00
Rainer Killinger 736950e064 refactor: id-cards related test 2026-10-09 13:47:59 +02:00
Rainer Killinger 090ec17ccb refactor: upgrade typescript-eslint and start the stylistic migration 2026-10-09 13:47:58 +02:00
Rainer Killinger 66ae7a39a1 refactor: upgrade project to Typescript 5.9 2026-10-09 13:47:58 +02:00
Rainer Killinger 58b4822265 refactor: apply Angular 20 inject rules 2026-10-09 13:47:58 +02:00
Rainer Killinger 9026c88fac refactor: angular 20 upgrade 2026-10-09 13:47:58 +02:00
Rainer Killinger 1f7b010dc9 refactor: maplibre update 2026-10-09 13:47:57 +02:00
Rainer Killinger 01c9b63eb9 refactor: fix new Angular warnings 2026-10-09 13:47:57 +02:00
Rainer Killinger b109100257 refactor: migrate sass/scss deprecations 2026-10-09 13:47:57 +02:00
Rainer Killinger 5f48bca962 fix: update @ionic/angular* and patch dependencies 2026-10-09 13:47:56 +02:00
Rainer Killinger d1709c3353 refactor: update to Angular 19.2 2026-10-09 13:47:56 +02:00
Rainer Killinger 65facc131a refactor: update to typescript 5.5.4 2026-10-09 13:47:56 +02:00
Jovan KrunićandRainer Killinger a1de793993 refactor: open external links without javascript in browser
Close #246
2026-10-09 13:47:56 +02:00
Jovan KrunićandRainer Killinger 592e655990 refactor: remove library features
Closes #244
2026-10-09 13:47:55 +02:00
Rainer Killinger 5d0d2dd136 fix: update critical production dependencies 2026-10-09 13:47:55 +02:00
Rainer Killinger f5582e91fe docs: update changelogs for release
ci: publish release
2026-06-03 16:33:57 +02:00
Rainer Killinger 2c7bed0b8b ci: enable failed audit jobs for main 2026-06-03 16:14:42 +02:00
Rainer Killinger 87d0af5a39 ci: remove edge browser from cypress 2026-06-03 16:14:35 +02:00
Rainer Killinger 8ccbfac0b1 refactor: bump proxy version to rebuild image from latest source 2026-06-03 12:38:50 +02:00
Rainer Killinger 8550bf976b refactor: capacitor 8 upgrade 2026-03-13 13:10:50 +01:00
Rainer Killinger 86004881b0 fix: update node-glob dependency 2026-01-05 10:44:02 +01:00
Rainer Killinger 3d19fc87e3 fix: hot fix for android 35 edge to edge window rendering 2025-08-28 13:05:52 +02:00
Rainer Killinger 80bcdad851 refactor: update app licenses file 2025-08-27 13:49:57 +02:00
Rainer Killinger afd1c8d87e docs: update changelogs for release
ci: publish release
2025-08-27 13:00:27 +02:00
Rainer Killinger 6941f83b8f refactor: complete changeset 2025-08-27 12:02:10 +02:00
Rainer Killinger 3a274a3a7f refactor: upgrade to Capacitor 7 & Angular 18 2025-08-27 11:27:11 +02:00
Rainer Killinger 5a48342a8d docs: update changelogs for release
ci: publish release
2025-07-30 14:15:24 +02:00
Rainer Killinger 6b06de4019 refactor: update audit relevant nodemailer dependency 2025-07-30 13:58:25 +02:00
512 changed files with 14938 additions and 13225 deletions
+2 -2
View File
@@ -120,6 +120,6 @@ audit:
script: script:
- pnpm audit --prod --audit-level critical - pnpm audit --prod --audit-level critical
rules: rules:
- if: $CI_COMMIT_BRANCH == 'main'
allow_failure: false
- !reference [.limit_pipelines, rules] - !reference [.limit_pipelines, rules]
# - if: $CI_COMMIT_BRANCH == 'main'
# allow_failure: false
+7
View File
@@ -4,6 +4,13 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{
"name": "Launch Chrome",
"request": "launch",
"type": "chrome",
"url": "http://localhost:8100",
"webRoot": "${workspaceFolder}/frontend/app/www"
},
{ {
"type":"node", "type":"node",
"request": "launch", "request": "launch",
+34
View File
@@ -1,5 +1,39 @@
# @openstapps/backend # @openstapps/backend
## 4.0.6
### Patch Changes
- 019f8013: Enable ID cards and assessments using Shibboleth as identity provider
## 4.0.5
### Patch Changes
- Updated dependencies [86004881]
- Updated dependencies [09ad903a]
- @openstapps/core-tools@4.0.5
- @openstapps/core@4.0.5
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/logger@4.0.2
## 4.0.2
### Patch Changes
- 6b06de40: Updated nodemailer dependency
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes
+1 -28
View File
@@ -29,19 +29,6 @@ const menus = [
}, },
}, },
}, },
{
icon: 'local_library',
route: '/hebis-search',
title: 'library catalog',
translations: {
de: {
title: 'Bibliothekskatalog',
},
en: {
title: 'library catalog',
},
},
},
{ {
icon: 'inventory_2', icon: 'inventory_2',
route: '/catalog', route: '/catalog',
@@ -112,7 +99,7 @@ const menus = [
icon: 'school', icon: 'school',
items: [ items: [
{ {
icon: 'grade', icon: 'star',
route: '/favorites', route: '/favorites',
title: 'favorites', title: 'favorites',
translations: { translations: {
@@ -137,20 +124,6 @@ const menus = [
}, },
}, },
}, },
{
authProvider: 'paia',
icon: 'badge',
route: '/library-account',
title: 'library account',
translations: {
de: {
title: 'Bibliothekskonto',
},
en: {
title: 'library account',
},
},
},
{ {
icon: 'settings', icon: 'settings',
route: '/settings', route: '/settings',
@@ -5,8 +5,8 @@ const userGroupSetting = {
categories: ['profile'], categories: ['profile'],
defaultValue: 'students', defaultValue: 'students',
description: description:
'The user group the app is going to be used.' + 'The user group the app is going to use primarily.' +
'This settings for example is getting used for the predefined price category of mensa meals.', ' This settings for example is getting used for the predefined price category of mensa meals.',
inputType: SCSettingInputType.SingleChoice, inputType: SCSettingInputType.SingleChoice,
name: 'group', name: 'group',
order: 1, order: 1,
@@ -25,7 +25,7 @@ const userGroupSetting = {
}, },
en: { en: {
description: description:
'The user group the app is going to be used.' + 'The user group the app is going to use primarily.' +
' This settings for example is getting used for the predefined price category of mensa meals.', ' This settings for example is getting used for the predefined price category of mensa meals.',
name: 'Group', name: 'Group',
values: ['students', 'employees', 'guests'], values: ['students', 'employees', 'guests'],
+17 -45
View File
@@ -13,42 +13,24 @@ const config = {
default: { default: {
client: { client: {
clientId: '1cac3f99-33fa-4234-8438-979f07e0cdab', clientId: '1cac3f99-33fa-4234-8438-979f07e0cdab',
scopes: '', scopes: 'openid profile email offline_access',
url: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0', url: 'https://idp.ub.uni-frankfurt.de/idp/profile/oidc',
}, },
endpoints: { endpoints: {
authorization: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0/authorize', authorization: 'https://idp.ub.uni-frankfurt.de/idp/profile/oidc/authorize',
endSession: 'https://cas.rz.uni-frankfurt.de/cas/logout', endSession: 'https://idp.ub.uni-frankfurt.de/idp/profile/oidc/end-session',
mapping: { mapping: {
id: '$.id', id: '$.preferred_username',
email: '$.attributes.mailPrimaryAddress', email: '$.mailPrimaryAddress',
familyName: '$.attributes.sn', familyName: '$.family_name',
givenName: '$.attributes.givenName', givenName: '$.given_name',
name: '$.attributes.givenName',
role: '$.attributes.eduPersonPrimaryAffiliation',
studentId: '$.attributes.employeeNumber',
},
token: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0/accessToken',
userinfo: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile',
},
},
paia: {
client: {
clientId: '',
scopes: '',
url: 'https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php',
},
endpoints: {
authorization:
'https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php',
endSession: 'https://ubffm.hds.hebis.de/Shibboleth.sso/Logout',
mapping: {
id: '$.email',
name: '$.name', name: '$.name',
role: '$.type', role: '$.eduPersonPrimaryAffiliation',
studentId: '$.employeeNumber',
}, },
token: 'https://hds.hebis.de/paia/auth/login', token: 'https://idp.ub.uni-frankfurt.de/idp/profile/oidc/token',
userinfo: 'https://hds.hebis.de/paia/core', userinfo: 'https://idp.ub.uni-frankfurt.de/idp/profile/oidc/userinfo',
revoke: 'https://idp.ub.uni-frankfurt.de/idp/profile/oauth2/revocation',
}, },
}, },
}, },
@@ -58,22 +40,12 @@ const config = {
extern: { extern: {
hisometry: { hisometry: {
authProvider: 'default', authProvider: 'default',
url: 'https://his-self-service.rz.uni-frankfurt.de', url: 'https://his-self-service.rz.uni-frankfurt.de/v2',
}, },
daia: { idCards: {
url: 'https://daia.hebis.de/DAIA2/UB_Frankfurt',
},
hebisProxy: {
url: 'https://proxy.ub.uni-frankfurt.de/login?qurl=',
},
paia: {
authProvider: 'paia',
url: 'https://hds.hebis.de/paia/core',
},
/** TODO: idCards: {
authProvider: 'default', authProvider: 'default',
url: 'TODO', url: 'https://id-cards.rz.uni-frankfurt.de/v2/id-cards',
} */ },
}, },
}, },
versionHistory, versionHistory,
+5 -5
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/backend", "name": "@openstapps/backend",
"description": "A reference implementation for a StApps backend", "description": "A reference implementation for a StApps backend",
"version": "4.0.1", "version": "4.0.6",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
@@ -43,7 +43,7 @@
"test:unit": "cross-env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true STAPPS_LOG_LEVEL=0 mocha --exit" "test:unit": "cross-env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true STAPPS_LOG_LEVEL=0 mocha --exit"
}, },
"dependencies": { "dependencies": {
"@elastic/elasticsearch": "8.14.1", "@elastic/elasticsearch": "8.19.2",
"@openstapps/core": "workspace:*", "@openstapps/core": "workspace:*",
"@openstapps/core-tools": "workspace:*", "@openstapps/core-tools": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
@@ -53,7 +53,7 @@
"@types/geojson": "1.0.6", "@types/geojson": "1.0.6",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"@types/node-cron": "3.0.7", "@types/node-cron": "3.0.7",
"@types/nodemailer": "6.4.7", "@types/nodemailer": "8.0.2",
"@types/promise-queue": "2.2.0", "@types/promise-queue": "2.2.0",
"@types/uuid": "8.3.4", "@types/uuid": "8.3.4",
"body-parser": "1.20.3", "body-parser": "1.20.3",
@@ -69,7 +69,7 @@
"nock": "13.3.1", "nock": "13.3.1",
"node-cache": "5.1.2", "node-cache": "5.1.2",
"node-cron": "3.0.2", "node-cron": "3.0.2",
"nodemailer": "6.9.1", "nodemailer": "8.0.11",
"prom-client": "14.1.1", "prom-client": "14.1.1",
"promise-queue": "2.2.5", "promise-queue": "2.2.5",
"uuid": "8.3.2" "uuid": "8.3.2"
@@ -100,7 +100,7 @@
"supertest": "6.3.3", "supertest": "6.3.3",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
@@ -15,7 +15,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Logger, SMTP} from '@openstapps/logger'; import {Logger, SMTP} from '@openstapps/logger';
import {MailOptions} from 'nodemailer/lib/sendmail-transport'; import {SendMailOptions} from 'nodemailer';
import Queue from 'promise-queue'; import Queue from 'promise-queue';
/** /**
* A queue that can send mails in serial * A queue that can send mails in serial
@@ -36,7 +36,7 @@ export class MailQueue {
* the transport gets ready this mails are getting pushed in to * the transport gets ready this mails are getting pushed in to
* the normal queue. * the normal queue.
*/ */
dryQueue: MailOptions[]; dryQueue: SendMailOptions[];
/** /**
* A queue that saves mails, that are being sent in series * A queue that saves mails, that are being sent in series
@@ -68,7 +68,7 @@ export class MailQueue {
* Adds a mail into the queue so it gets send when the queue is ready * Adds a mail into the queue so it gets send when the queue is ready
* @param mail Information required for sending a mail * @param mail Information required for sending a mail
*/ */
private async addToQueue(mail: MailOptions) { private async addToQueue(mail: SendMailOptions) {
return this.queue.add<string>(() => this.transport.sendMail(mail)); return this.queue.add<string>(() => this.transport.sendMail(mail));
} }
@@ -99,7 +99,7 @@ export class MailQueue {
* Push a mail into the queue so it gets send when the queue is ready * Push a mail into the queue so it gets send when the queue is ready
* @param mail Information required for sending a mail * @param mail Information required for sending a mail
*/ */
public async push(mail: MailOptions) { public async push(mail: SendMailOptions) {
if (this.transport.isVerified()) { if (this.transport.isVerified()) {
await this.addToQueue(mail); await this.addToQueue(mail);
} else { } else {
@@ -13,12 +13,7 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { import {estypes} from '@elastic/elasticsearch';
AggregateName,
AggregationsAggregate,
AggregationsFiltersAggregate,
AggregationsMultiTermsBucket,
} from '@elastic/elasticsearch/lib/api/types.js';
import {SCFacet, SCThingType} from '@openstapps/core'; import {SCFacet, SCThingType} from '@openstapps/core';
/** /**
@@ -26,16 +21,16 @@ import {SCFacet, SCThingType} from '@openstapps/core';
* @param aggregationResponse - aggregations response from elasticsearch * @param aggregationResponse - aggregations response from elasticsearch
*/ */
export function parseAggregations( export function parseAggregations(
aggregationResponse: Record<AggregateName, AggregationsAggregate>, aggregationResponse: Record<estypes.AggregateName, estypes.AggregationsAggregate>,
): SCFacet[] { ): SCFacet[] {
const facets: SCFacet[] = []; const facets: SCFacet[] = [];
for (const aggregateName in aggregationResponse) { for (const aggregateName in aggregationResponse) {
const aggregation = aggregationResponse[aggregateName] as AggregationsMultiTermsBucket; const aggregation = aggregationResponse[aggregateName] as estypes.AggregationsMultiTermsBucket;
const type = aggregateName === '@all' ? {} : {onlyOnType: aggregateName as SCThingType}; const type = aggregateName === '@all' ? {} : {onlyOnType: aggregateName as SCThingType};
for (const field in aggregation) { for (const field in aggregation) {
const fieldAggregate = aggregation[field] as AggregationsFiltersAggregate; const fieldAggregate = aggregation[field] as estypes.AggregationsFiltersAggregate;
if (typeof fieldAggregate !== 'object') continue; if (typeof fieldAggregate !== 'object') continue;
const buckets = Object.values(fieldAggregate.buckets).map(bucket => { const buckets = Object.values(fieldAggregate.buckets).map(bucket => {
@@ -14,13 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Client, events} from '@elastic/elasticsearch'; import {Client, events} from '@elastic/elasticsearch';
import { import {estypes} from '@elastic/elasticsearch';
AggregateName,
AggregationsMultiTermsBucket,
IndicesGetAliasResponse,
SearchHit,
SearchResponse,
} from '@elastic/elasticsearch/lib/api/types.js';
import {SCConfigFile, SCSearchQuery, SCSearchResponse, SCThings, SCUuid} from '@openstapps/core'; import {SCConfigFile, SCSearchQuery, SCSearchResponse, SCThings, SCUuid} from '@openstapps/core';
import {Logger} from '@openstapps/logger'; import {Logger} from '@openstapps/logger';
import moment from 'moment'; import moment from 'moment';
@@ -113,7 +107,9 @@ export class Elasticsearch implements Database {
/** /**
* Gets a map which contains each alias and all indices that are associated with each alias * Gets a map which contains each alias and all indices that are associated with each alias
*/ */
private async cleanupDeadIndices(retryOptions: Partial<RetryOptions<IndicesGetAliasResponse>> = {}) { private async cleanupDeadIndices(
retryOptions: Partial<RetryOptions<estypes.IndicesGetAliasResponse>> = {},
) {
const aliasResponse = await retryCatch({ const aliasResponse = await retryCatch({
maxRetries: 10, maxRetries: 10,
retryInterval: 2000, retryInterval: 2000,
@@ -147,7 +143,7 @@ export class Elasticsearch implements Database {
* @param uid an UID to use for the search * @param uid an UID to use for the search
* @returns an elasticsearch object containing the thing * @returns an elasticsearch object containing the thing
*/ */
private async getObject(uid: SCUuid): Promise<SearchHit<SCThings> | undefined> { private async getObject(uid: SCUuid): Promise<estypes.SearchHit<SCThings> | undefined> {
const searchResponse = await this.client.search<SCThings>({ const searchResponse = await this.client.search<SCThings>({
body: { body: {
query: { query: {
@@ -273,7 +269,9 @@ export class Elasticsearch implements Database {
/** /**
* Initialize the elasticsearch database (call all needed methods) * Initialize the elasticsearch database (call all needed methods)
*/ */
public async init(retryOptions: Partial<RetryOptions<IndicesGetAliasResponse>> = {}): Promise<void> { public async init(
retryOptions: Partial<RetryOptions<estypes.IndicesGetAliasResponse>> = {},
): Promise<void> {
const monitoringConfiguration = this.config.internal.monitoring; const monitoringConfiguration = this.config.internal.monitoring;
if (monitoringConfiguration !== undefined) { if (monitoringConfiguration !== undefined) {
@@ -373,7 +371,7 @@ export class Elasticsearch implements Database {
| undefined, | undefined,
}; };
const response: SearchResponse<SCThings> = await this.client.search({ const response: estypes.SearchResponse<SCThings> = await this.client.search({
aggs: aggregations, aggs: aggregations,
query: buildQuery(parameters, this.config, esConfig), query: buildQuery(parameters, this.config, esConfig),
from: parameters.from, from: parameters.from,
@@ -394,7 +392,9 @@ export class Elasticsearch implements Database {
facets: facets:
response.aggregations === undefined response.aggregations === undefined
? [] ? []
: parseAggregations(response.aggregations as Record<AggregateName, AggregationsMultiTermsBucket>), : parseAggregations(
response.aggregations as Record<estypes.AggregateName, estypes.AggregationsMultiTermsBucket>,
),
pagination: { pagination: {
count: response.hits.hits.length, count: response.hits.hits.length,
offset: typeof parameters.from === 'number' ? parameters.from : 0, offset: typeof parameters.from === 'number' ? parameters.from : 0,
@@ -14,7 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Client} from '@elastic/elasticsearch'; import {Client} from '@elastic/elasticsearch';
import {SearchRequest} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import { import {
SCMonitoringConfiguration, SCMonitoringConfiguration,
SCMonitoringLogAction, SCMonitoringLogAction,
@@ -128,7 +128,7 @@ export async function setUp(
cron.schedule(trigger.executionTime, async () => { cron.schedule(trigger.executionTime, async () => {
// execute watch (search->condition->action) // execute watch (search->condition->action)
const result = await esClient.search<SCThings>(watcher.query as SearchRequest); const result = await esClient.search<SCThings>(watcher.query as estypes.SearchRequest);
// check conditions // check conditions
const total = const total =
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslFunctionScoreContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCBackendConfigurationSearchBoostingType} from '@openstapps/core'; import {SCBackendConfigurationSearchBoostingType} from '@openstapps/core';
import {QueryDslSpecificQueryContainer} from '../../types/util.js'; import {QueryDslSpecificQueryContainer} from '../../types/util.js';
@@ -22,8 +22,8 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
*/ */
export function buildFunctionsForBoostingTypes( export function buildFunctionsForBoostingTypes(
boostingTypes: SCBackendConfigurationSearchBoostingType[], boostingTypes: SCBackendConfigurationSearchBoostingType[],
): QueryDslFunctionScoreContainer[] { ): estypes.QueryDslFunctionScoreContainer[] {
const functions: QueryDslFunctionScoreContainer[] = []; const functions: estypes.QueryDslFunctionScoreContainer[] = [];
for (const boostingForOneSCType of boostingTypes) { for (const boostingForOneSCType of boostingTypes) {
const typeFilter: QueryDslSpecificQueryContainer<'term'> = { const typeFilter: QueryDslSpecificQueryContainer<'term'> = {
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslFunctionScoreContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCBackendConfigurationSearchBoostingContext, SCSearchContext} from '@openstapps/core'; import {SCBackendConfigurationSearchBoostingContext, SCSearchContext} from '@openstapps/core';
import {buildFunctionsForBoostingTypes} from './boost-functions.js'; import {buildFunctionsForBoostingTypes} from './boost-functions.js';
@@ -24,7 +24,7 @@ import {buildFunctionsForBoostingTypes} from './boost-functions.js';
export function buildScoringFunctions( export function buildScoringFunctions(
boostings: SCBackendConfigurationSearchBoostingContext, boostings: SCBackendConfigurationSearchBoostingContext,
context: SCSearchContext | undefined, context: SCSearchContext | undefined,
): QueryDslFunctionScoreContainer[] { ): estypes.QueryDslFunctionScoreContainer[] {
// default context // default context
let functions = buildFunctionsForBoostingTypes(boostings['default' as SCSearchContext]); let functions = buildFunctionsForBoostingTypes(boostings['default' as SCSearchContext]);
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslQueryContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchFilter} from '@openstapps/core'; import {SCSearchFilter} from '@openstapps/core';
import {buildBooleanFilter} from './filters/boolean.js'; import {buildBooleanFilter} from './filters/boolean.js';
import {buildAvailabilityFilter} from './filters/availability.js'; import {buildAvailabilityFilter} from './filters/availability.js';
@@ -26,7 +26,7 @@ import {buildValueFilter} from './filters/value.js';
* Converts Array of Filters to elasticsearch query-syntax * Converts Array of Filters to elasticsearch query-syntax
* @param filter A search filter for the retrieval of the data * @param filter A search filter for the retrieval of the data
*/ */
export function buildFilter(filter: SCSearchFilter): QueryDslQueryContainer { export function buildFilter(filter: SCSearchFilter): estypes.QueryDslQueryContainer {
switch (filter.type) { switch (filter.type) {
case 'value': { case 'value': {
return buildValueFilter(filter); return buildValueFilter(filter);
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslBoolQuery} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchBooleanFilter} from '@openstapps/core'; import {SCSearchBooleanFilter} from '@openstapps/core';
import {QueryDslSpecificQueryContainer} from '../../types/util.js'; import {QueryDslSpecificQueryContainer} from '../../types/util.js';
import {buildFilter} from '../filter.js'; import {buildFilter} from '../filter.js';
@@ -22,7 +22,7 @@ import {buildFilter} from '../filter.js';
* @param filter A search filter for the retrieval of the data * @param filter A search filter for the retrieval of the data
*/ */
export function buildBooleanFilter(filter: SCSearchBooleanFilter): QueryDslSpecificQueryContainer<'bool'> { export function buildBooleanFilter(filter: SCSearchBooleanFilter): QueryDslSpecificQueryContainer<'bool'> {
const result: QueryDslBoolQuery = { const result: estypes.QueryDslBoolQuery = {
minimum_should_match: 0, minimum_should_match: 0,
must: [], must: [],
must_not: [], must_not: [],
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslDateRangeQuery} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchDateRangeFilter} from '@openstapps/core'; import {SCSearchDateRangeFilter} from '@openstapps/core';
import {QueryDslSpecificQueryContainer} from '../../types/util.js'; import {QueryDslSpecificQueryContainer} from '../../types/util.js';
@@ -23,7 +23,7 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
export function buildDateRangeFilter( export function buildDateRangeFilter(
filter: SCSearchDateRangeFilter, filter: SCSearchDateRangeFilter,
): QueryDslSpecificQueryContainer<'range'> { ): QueryDslSpecificQueryContainer<'range'> {
const dateRangeObject: QueryDslDateRangeQuery = { const dateRangeObject: estypes.QueryDslDateRangeQuery = {
format: filter.arguments.format, format: filter.arguments.format,
time_zone: filter.arguments.timeZone, time_zone: filter.arguments.timeZone,
relation: filter.arguments.relation, relation: filter.arguments.relation,
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslGeoDistanceQuery} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchDistanceFilter} from '@openstapps/core'; import {SCSearchDistanceFilter} from '@openstapps/core';
import {QueryDslSpecificQueryContainer} from '../../types/util.js'; import {QueryDslSpecificQueryContainer} from '../../types/util.js';
@@ -23,7 +23,7 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
export function buildDistanceFilter( export function buildDistanceFilter(
filter: SCSearchDistanceFilter, filter: SCSearchDistanceFilter,
): QueryDslSpecificQueryContainer<'geo_distance'> { ): QueryDslSpecificQueryContainer<'geo_distance'> {
const geoObject: QueryDslGeoDistanceQuery = { const geoObject: estypes.QueryDslGeoDistanceQuery = {
distance: `${filter.arguments.distance}m`, distance: `${filter.arguments.distance}m`,
[`${filter.arguments.field}.point`]: { [`${filter.arguments.field}.point`]: {
lat: filter.arguments.position[1], lat: filter.arguments.position[1],
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslNumberRangeQuery} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchNumericRangeFilter} from '@openstapps/core'; import {SCSearchNumericRangeFilter} from '@openstapps/core';
import {QueryDslSpecificQueryContainer} from '../../types/util.js'; import {QueryDslSpecificQueryContainer} from '../../types/util.js';
@@ -23,7 +23,7 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
export function buildNumericRangeFilter( export function buildNumericRangeFilter(
filter: SCSearchNumericRangeFilter, filter: SCSearchNumericRangeFilter,
): QueryDslSpecificQueryContainer<'range'> { ): QueryDslSpecificQueryContainer<'range'> {
const numericRangeObject: QueryDslNumberRangeQuery = { const numericRangeObject: estypes.QueryDslNumberRangeQuery = {
relation: filter.arguments.relation, relation: filter.arguments.relation,
}; };
if (filter.arguments.bounds.lowerBound?.mode === 'exclusive') { if (filter.arguments.bounds.lowerBound?.mode === 'exclusive') {
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslQueryContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCConfigFile, SCSearchQuery} from '@openstapps/core'; import {SCConfigFile, SCSearchQuery} from '@openstapps/core';
import {ElasticsearchConfig} from '../types/elasticsearch-config.js'; import {ElasticsearchConfig} from '../types/elasticsearch-config.js';
import {buildFilter} from './filter.js'; import {buildFilter} from './filter.js';
@@ -29,7 +29,7 @@ export const buildQuery = function buildQuery(
parameters: SCSearchQuery, parameters: SCSearchQuery,
defaultConfig: SCConfigFile, defaultConfig: SCConfigFile,
elasticsearchConfig: ElasticsearchConfig, elasticsearchConfig: ElasticsearchConfig,
): QueryDslQueryContainer { ): estypes.QueryDslQueryContainer {
// if config provides a minMatch parameter, we use query_string instead of a match query // if config provides a minMatch parameter, we use query_string instead of a match query
let query; let query;
if (elasticsearchConfig.query === undefined) { if (elasticsearchConfig.query === undefined) {
@@ -83,7 +83,7 @@ export const buildQuery = function buildQuery(
); );
} }
const functionScoreQuery: QueryDslQueryContainer = { const functionScoreQuery: estypes.QueryDslQueryContainer = {
function_score: { function_score: {
functions: buildScoringFunctions(defaultConfig.internal.boostings, parameters.context), functions: buildScoringFunctions(defaultConfig.internal.boostings, parameters.context),
query: { query: {
@@ -97,7 +97,8 @@ export const buildQuery = function buildQuery(
}, },
}; };
const mustMatch = functionScoreQuery.function_score?.query?.bool?.must; const mustMatch = (functionScoreQuery.function_score as estypes.QueryDslFunctionScoreQuery | undefined)
?.query?.bool?.must;
if (Array.isArray(mustMatch)) { if (Array.isArray(mustMatch)) {
if (query !== undefined) { if (query !== undefined) {
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Sort} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCSearchSort} from '@openstapps/core'; import {SCSearchSort} from '@openstapps/core';
import {buildDistanceSort} from './sort/distance.js'; import {buildDistanceSort} from './sort/distance.js';
import {buildDucetSort} from './sort/ducet.js'; import {buildDucetSort} from './sort/ducet.js';
@@ -24,7 +24,7 @@ import {buildPriceSort} from './sort/price.js';
* @param sorts Sorting rules to apply to the data that is being queried * @param sorts Sorting rules to apply to the data that is being queried
* @returns an array of sort queries * @returns an array of sort queries
*/ */
export const buildSort = function buildSort(sorts: SCSearchSort[]): Sort { export const buildSort = function buildSort(sorts: SCSearchSort[]): estypes.Sort {
return sorts.map(sort => { return sorts.map(sort => {
switch (sort.type) { switch (sort.type) {
case 'generic': { case 'generic': {
@@ -12,14 +12,14 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {SortOptions} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCDistanceSort} from '@openstapps/core'; import {SCDistanceSort} from '@openstapps/core';
/** /**
* Converts a distance sort to elasticsearch syntax * Converts a distance sort to elasticsearch syntax
* @param sort A sorting definition * @param sort A sorting definition
*/ */
export function buildDistanceSort(sort: SCDistanceSort): SortOptions { export function buildDistanceSort(sort: SCDistanceSort): estypes.SortOptions {
return { return {
_geo_distance: { _geo_distance: {
mode: 'avg', mode: 'avg',
@@ -12,14 +12,14 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {SortOptions} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCDucetSort} from '@openstapps/core'; import {SCDucetSort} from '@openstapps/core';
/** /**
* Converts a ducet sort to elasticsearch syntax * Converts a ducet sort to elasticsearch syntax
* @param sort A sorting definition * @param sort A sorting definition
*/ */
export function buildDucetSort(sort: SCDucetSort): SortOptions { export function buildDucetSort(sort: SCDucetSort): estypes.SortOptions {
return { return {
[`${sort.arguments.field}.sort`]: sort.order, [`${sort.arguments.field}.sort`]: sort.order,
}; };
@@ -12,14 +12,14 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {SortOptions} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCGenericSort} from '@openstapps/core'; import {SCGenericSort} from '@openstapps/core';
/** /**
* Converts a generic sort to elasticsearch syntax * Converts a generic sort to elasticsearch syntax
* @param sort A sorting definition * @param sort A sorting definition
*/ */
export function buildGenericSort(sort: SCGenericSort): SortOptions { export function buildGenericSort(sort: SCGenericSort): estypes.SortOptions {
return { return {
[sort.arguments.field]: sort.order, [sort.arguments.field]: sort.order,
}; };
@@ -12,14 +12,14 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {SortOptions} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCPriceSort, SCSportCoursePriceGroup, SCThingsField} from '@openstapps/core'; import {SCPriceSort, SCSportCoursePriceGroup, SCThingsField} from '@openstapps/core';
/** /**
* Converts a price sort to elasticsearch syntax * Converts a price sort to elasticsearch syntax
* @param sort A sorting definition * @param sort A sorting definition
*/ */
export function buildPriceSort(sort: SCPriceSort): SortOptions { export function buildPriceSort(sort: SCPriceSort): estypes.SortOptions {
return { return {
_script: { _script: {
order: sort.order, order: sort.order,
@@ -13,7 +13,7 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Client} from '@elastic/elasticsearch'; import {Client, estypes} from '@elastic/elasticsearch';
import {SCThingType} from '@openstapps/core'; import {SCThingType} from '@openstapps/core';
import type {AggregationSchema} from '@openstapps/core/lib/mappings/aggregations.json.js'; import type {AggregationSchema} from '@openstapps/core/lib/mappings/aggregations.json.js';
import type {ElasticsearchTemplateCollection} from '@openstapps/core/lib/mappings/mappings.json.js'; import type {ElasticsearchTemplateCollection} from '@openstapps/core/lib/mappings/mappings.json.js';
@@ -36,7 +36,10 @@ export const aggregations = JSON.parse(
* @param client An elasticsearch client to use * @param client An elasticsearch client to use
* @param type the SCThingType of which the template should be set * @param type the SCThingType of which the template should be set
*/ */
export async function putTemplate(client: Client, type: SCThingType) { export async function putTemplate(
client: Client,
type: SCThingType,
): Promise<estypes.IndicesPutTemplateResponse> {
const sanitizedType = `template_${type.replaceAll(/\s/g, '_')}`; const sanitizedType = `template_${type.replaceAll(/\s/g, '_')}`;
return client.indices.putTemplate({ return client.indices.putTemplate({
@@ -12,8 +12,8 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {QueryDslQueryContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
export type QueryDslSpecificQueryContainer<T extends keyof QueryDslQueryContainer> = Required< export type QueryDslSpecificQueryContainer<T extends keyof estypes.QueryDslQueryContainer> = Required<
Pick<QueryDslQueryContainer, T> Pick<estypes.QueryDslQueryContainer, T>
>; >;
@@ -19,7 +19,7 @@ import sinon from 'sinon';
import {MailQueue} from '../../src/notification/mail-queue.js'; import {MailQueue} from '../../src/notification/mail-queue.js';
import {expect} from 'chai'; import {expect} from 'chai';
import Queue from 'promise-queue'; import Queue from 'promise-queue';
import {MailOptions} from 'nodemailer/lib/sendmail-transport'; import {SendMailOptions} from 'nodemailer';
import {getTransport, TRANSPORT_SEND_RESPONSE} from '../common.js'; import {getTransport, TRANSPORT_SEND_RESPONSE} from '../common.js';
describe('MailQueue', async function () { describe('MailQueue', async function () {
@@ -54,7 +54,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'};
for (let i = 0; i < numberOfMails; i++) { for (let i = 0; i < numberOfMails; i++) {
await mailQueue.push(mail); await mailQueue.push(mail);
} }
@@ -70,7 +70,7 @@ describe('MailQueue', async function () {
const queueAddStub = sandbox.stub(Queue.prototype, 'add'); const queueAddStub = sandbox.stub(Queue.prototype, 'add');
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(getTransport(false)); const mailQueue = new MailQueue(getTransport(false));
const mail: MailOptions = {}; const mail: SendMailOptions = {};
mailQueue.push(mail); mailQueue.push(mail);
expect(queueAddStub.called).to.be.false; expect(queueAddStub.called).to.be.false;
@@ -81,7 +81,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'};
// fake that transport is verified // fake that transport is verified
transport.isVerified = () => true; transport.isVerified = () => true;
mailQueue.push(mail); mailQueue.push(mail);
@@ -97,7 +97,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'};
// fake that transport is verified // fake that transport is verified
transport.isVerified = () => true; transport.isVerified = () => true;
await mailQueue.push(mail); await mailQueue.push(mail);
@@ -13,13 +13,13 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {AggregateName, AggregationsMultiTermsBucket} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {SCFacet, SCThingType} from '@openstapps/core'; import {SCFacet, SCThingType} from '@openstapps/core';
import {expect} from 'chai'; import {expect} from 'chai';
import {parseAggregations} from '../../../src/storage/elasticsearch/aggregations.js'; import {parseAggregations} from '../../../src/storage/elasticsearch/aggregations.js';
describe('Aggregations', function () { describe('Aggregations', function () {
const aggregations: Record<AggregateName, Partial<AggregationsMultiTermsBucket>> = { const aggregations: Record<estypes.AggregateName, Partial<estypes.AggregationsMultiTermsBucket>> = {
'catalog': { 'catalog': {
'doc_count': 4, 'doc_count': 4,
'superCatalogs.categories': { 'superCatalogs.categories': {
@@ -14,9 +14,7 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Client, Diagnostic} from '@elastic/elasticsearch'; import {Client, Diagnostic, estypes} from '@elastic/elasticsearch';
import Indices from '@elastic/elasticsearch/lib/api/api/indices.js';
import {CreateResponse, SearchHit, SearchResponse} from '@elastic/elasticsearch/lib/api/types.js';
import { import {
SCBook, SCBook,
SCBulkResponse, SCBulkResponse,
@@ -52,6 +50,7 @@ import {query} from './query.js';
import messageFile from '@openstapps/core/test/resources/indexable/Message.1.json' with {type: 'json'}; import messageFile from '@openstapps/core/test/resources/indexable/Message.1.json' with {type: 'json'};
import bookFile from '@openstapps/core/test/resources/indexable/Book.1.json' with {type: 'json'}; import bookFile from '@openstapps/core/test/resources/indexable/Book.1.json' with {type: 'json'};
const indicesPrototype = Object.getPrototypeOf(new Client({node: 'http://localhost:9200'}).indices);
const message = messageFile.instance as SCMessage; const message = messageFile.instance as SCMessage;
const book = bookFile.instance as SCBook; const book = bookFile.instance as SCBook;
@@ -60,7 +59,7 @@ use(chaiAsPromised);
/** /**
* *
*/ */
function searchResponse<T>(...hits: SearchHit<T>[]): SearchResponse<T> { function searchResponse<T>(...hits: estypes.SearchHit<T>[]): estypes.SearchResponse<T> {
return {hits: {hits}, took: 0, timed_out: false, _shards: {total: 1, failed: 0, successful: 1}}; return {hits: {hits}, took: 0, timed_out: false, _shards: {total: 1, failed: 0, successful: 1}};
} }
@@ -312,13 +311,13 @@ describe('Elasticsearch', function () {
beforeEach(function () { beforeEach(function () {
sandbox sandbox
.stub(Indices.default.prototype, 'getAlias') .stub(indicesPrototype, 'getAlias')
.resolves({[oldIndex]: {aliases: {[SCThingType.Book]: {}}}} as any); .resolves({[oldIndex]: {aliases: {[SCThingType.Book]: {}}}} as any);
sandbox.stub(Indices.default.prototype, 'putTemplate').resolves({} as any); sandbox.stub(indicesPrototype, 'putTemplate').resolves({} as any);
createStub = sandbox.stub(Indices.default.prototype, 'create').resolves({} as any); createStub = sandbox.stub(indicesPrototype, 'create').resolves({} as any);
deleteStub = sandbox.stub(Indices.default.prototype, 'delete').resolves({} as any); deleteStub = sandbox.stub(indicesPrototype, 'delete').resolves({} as any);
refreshStub = sandbox.stub(Indices.default.prototype, 'refresh').resolves({} as any); refreshStub = sandbox.stub(indicesPrototype, 'refresh').resolves({} as any);
updateAliasesStub = sandbox.stub(Indices.default.prototype, 'updateAliases').resolves({} as any); updateAliasesStub = sandbox.stub(indicesPrototype, 'updateAliases').resolves({} as any);
es = new Elasticsearch(backendConfig); es = new Elasticsearch(backendConfig);
}); });
@@ -445,7 +444,7 @@ describe('Elasticsearch', function () {
}); });
it('should provide the thing if object is found', async function () { it('should provide the thing if object is found', async function () {
const foundObject: SearchHit<SCMessage> = { const foundObject: estypes.SearchHit<SCMessage> = {
_id: '', _id: '',
_index: '', _index: '',
_score: 0, _score: 0,
@@ -466,7 +465,7 @@ describe('Elasticsearch', function () {
}); });
beforeEach(function () { beforeEach(function () {
sandbox.stub(Indices.default.prototype, 'getAlias').resolves({} as any); sandbox.stub(indicesPrototype, 'getAlias').resolves({} as any);
}); });
afterEach(function () { afterEach(function () {
@@ -476,7 +475,7 @@ describe('Elasticsearch', function () {
it('should not post if the object already exists in an index which will not be rolled over', async function () { it('should not post if the object already exists in an index which will not be rolled over', async function () {
const index = getIndex(); const index = getIndex();
const oldIndex = index.replace('foosource', 'barsource'); const oldIndex = index.replace('foosource', 'barsource');
const object: SearchHit<SCMessage> = { const object: estypes.SearchHit<SCMessage> = {
_id: '', _id: '',
_index: oldIndex, _index: oldIndex,
_source: message, _source: message,
@@ -490,7 +489,7 @@ describe('Elasticsearch', function () {
it('should reject if there is an object creation error on the elasticsearch side', async function () { it('should reject if there is an object creation error on the elasticsearch side', async function () {
sandbox.stub(es.client, 'search').resolves(searchResponse()); sandbox.stub(es.client, 'search').resolves(searchResponse());
sandbox.stub(es.client, 'create').resolves({result: 'not_found'} as CreateResponse); sandbox.stub(es.client, 'create').resolves({result: 'not_found'} as estypes.CreateResponse);
await es.init(); await es.init();
return expect(es.post(message, bulk)).to.rejectedWith('creation'); return expect(es.post(message, bulk)).to.rejectedWith('creation');
@@ -527,7 +526,7 @@ describe('Elasticsearch', function () {
sandbox.restore(); sandbox.restore();
}); });
it('should reject to put if the object does not already exist', async function () { it('should reject to put if the object does not already exist', async function () {
const object: SearchHit<SCMessage> = { const object: estypes.SearchHit<SCMessage> = {
_id: '', _id: '',
_index: getIndex(), _index: getIndex(),
_score: 0, _score: 0,
@@ -541,7 +540,7 @@ describe('Elasticsearch', function () {
// noinspection JSUnusedLocalSymbols // noinspection JSUnusedLocalSymbols
it('should update the object if it already exists', async function () { it('should update the object if it already exists', async function () {
let caughtParameter: any; let caughtParameter: any;
const object: SearchHit<SCMessage> = { const object: estypes.SearchHit<SCMessage> = {
_id: '', _id: '',
_index: getIndex(), _index: getIndex(),
_score: 0, _score: 0,
@@ -564,13 +563,13 @@ describe('Elasticsearch', function () {
describe('search', async function () { describe('search', async function () {
let es: Elasticsearch; let es: Elasticsearch;
const sandbox = sinon.createSandbox(); const sandbox = sinon.createSandbox();
const objectMessage: SearchHit<SCMessage> = { const objectMessage: estypes.SearchHit<SCMessage> = {
_id: '123', _id: '123',
_index: getIndex(), _index: getIndex(),
_score: 0, _score: 0,
_source: message, _source: message,
}; };
const objectBook: SearchHit<SCBook> = { const objectBook: estypes.SearchHit<SCBook> = {
_id: '321', _id: '321',
_index: getIndex(), _index: getIndex(),
_score: 0, _score: 0,
@@ -595,7 +594,7 @@ describe('Elasticsearch', function () {
}, },
}, },
}; };
const fakeSearchResponse: SearchResponse<SCThings> = { const fakeSearchResponse: estypes.SearchResponse<SCThings> = {
took: 12, took: 12,
timed_out: false, timed_out: false,
// @ts-expect-error not assignable // @ts-expect-error not assignable
@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Client} from '@elastic/elasticsearch'; import {Client} from '@elastic/elasticsearch';
import {SearchResponse} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import { import {
SCMonitoringConfiguration, SCMonitoringConfiguration,
SCMonitoringLogAction, SCMonitoringLogAction,
@@ -111,7 +111,7 @@ describe('Monitoring', async function () {
}); });
it('should log errors where conditions failed', async function () { it('should log errors where conditions failed', async function () {
const fakeSearchResponse: SearchResponse<SCThings> = { const fakeSearchResponse: estypes.SearchResponse<SCThings> = {
took: 12, took: 12,
timed_out: false, timed_out: false,
// @ts-expect-error not assignable // @ts-expect-error not assignable
@@ -31,7 +31,7 @@ import {buildQuery} from '../../../src/storage/elasticsearch/query/query.js';
import {buildSort} from '../../../src/storage/elasticsearch/query/sort.js'; import {buildSort} from '../../../src/storage/elasticsearch/query/sort.js';
import {ElasticsearchConfig} from '../../../src/storage/elasticsearch/types/elasticsearch-config.js'; import {ElasticsearchConfig} from '../../../src/storage/elasticsearch/types/elasticsearch-config.js';
import {QueryDslSpecificQueryContainer} from '../../../src/storage/elasticsearch/types/util.js'; import {QueryDslSpecificQueryContainer} from '../../../src/storage/elasticsearch/types/util.js';
import {QueryDslRangeQuery, SortCombinations} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
import {backendConfig} from '../../../src/config.js'; import {backendConfig} from '../../../src/config.js';
describe('Query', function () { describe('Query', function () {
@@ -364,9 +364,9 @@ describe('Query', function () {
expect(filter).to.deep.equal(expectedFilter); expect(filter).to.deep.equal(expectedFilter);
for (const bound of ['g', 'l']) { for (const bound of ['g', 'l']) {
const inclusiveExists = const inclusiveExists =
typeof filter.range.price?.[`${bound}t` as keyof QueryDslRangeQuery] !== 'undefined'; typeof filter.range.price?.[`${bound}t` as keyof estypes.QueryDslRangeQuery] !== 'undefined';
const exclusiveExists = const exclusiveExists =
typeof filter.range.price?.[`${bound}te` as keyof QueryDslRangeQuery] !== 'undefined'; typeof filter.range.price?.[`${bound}te` as keyof estypes.QueryDslRangeQuery] !== 'undefined';
// only one should exist at the same time // only one should exist at the same time
expect(inclusiveExists && exclusiveExists).to.be.false; expect(inclusiveExists && exclusiveExists).to.be.false;
@@ -623,8 +623,8 @@ describe('Query', function () {
}, },
}, },
]; ];
let sorts: SortCombinations[] = []; let sorts: estypes.SortCombinations[] = [];
const expectedSorts: {[key: string]: SortCombinations} = { const expectedSorts: {[key: string]: estypes.SortCombinations} = {
ducet: { ducet: {
'name.sort': 'desc', 'name.sort': 'desc',
}, },
@@ -651,7 +651,7 @@ describe('Query', function () {
}, },
}; };
before(function () { before(function () {
sorts = buildSort(searchSCSearchSort) as SortCombinations[]; sorts = buildSort(searchSCSearchSort) as estypes.SortCombinations[];
}); });
it('should build ducet sort', function () { it('should build ducet sort', function () {
@@ -1,6 +1,6 @@
import {QueryDslQueryContainer} from '@elastic/elasticsearch/lib/api/types.js'; import {estypes} from '@elastic/elasticsearch';
export const query: QueryDslQueryContainer = { export const query: estypes.QueryDslQueryContainer = {
function_score: { function_score: {
functions: [ functions: [
{ {
+1 -1
View File
@@ -1,4 +1,4 @@
FROM elasticsearch:8.14.3 FROM elasticsearch:8.19.21
EXPOSE 9200 EXPOSE 9200
EXPOSE 9300 EXPOSE 9300
+13
View File
@@ -1,5 +1,18 @@
# @openstapps/proxy # @openstapps/proxy
## 4.0.5
### Patch Changes
- 8ccbfac0: Bumping proxy version to rebuild image
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/proxy", "name": "@openstapps/proxy",
"description": "NGINX proxy that is dynamically configured by a Node.js script", "description": "NGINX proxy that is dynamically configured by a Node.js script",
"version": "4.0.0", "version": "4.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
@@ -51,7 +51,7 @@
"is-cidr": "4.0.2", "is-cidr": "4.0.2",
"mustache": "4.2.0", "mustache": "4.2.0",
"semver": "7.6.0", "semver": "7.6.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"devDependencies": { "devDependencies": {
"@openstapps/api-cli": "workspace:*", "@openstapps/api-cli": "workspace:*",
@@ -1,5 +1,11 @@
# @openstapps/backend-config # @openstapps/backend-config
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/backend-config", "name": "@openstapps/backend-config",
"description": "Backend Configuration for OpenStApps", "description": "Backend Configuration for OpenStApps",
"version": "4.0.0", "version": "4.0.3",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -10,7 +10,7 @@
<group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/> <group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/>
<group title="campus map" title.de="Campus Karte" icon="map" route="/map"/> <group title="campus map" title.de="Campus Karte" icon="map" route="/map"/>
<group title="my app" title.de="Meine App" icon="school" route="/profile"> <group title="my app" title.de="Meine App" icon="school" route="/profile">
<item title="favorites" title.de="Favoriten" icon="grade" route="/favorites"/> <item title="favorites" title.de="Favoriten" icon="star" route="/favorites"/>
<item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/> <item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/>
<item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/> <item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/>
<item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/> <item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/>
+1 -1
View File
@@ -10,7 +10,7 @@
<group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/> <group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/>
<group title="campus map" title.de="Campus Karte" icon="map" route="/map"/> <group title="campus map" title.de="Campus Karte" icon="map" route="/map"/>
<group title="my app" title.de="Meine App" icon="school" route="/profile"> <group title="my app" title.de="Meine App" icon="school" route="/profile">
<item title="favorites" title.de="Favoriten" icon="grade" route="/favorites"/> <item title="favorites" title.de="Favoriten" icon="star" route="/favorites"/>
<item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/> <item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/>
<item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/> <item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/>
<item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/> <item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/>
+6
View File
@@ -1,5 +1,11 @@
# @openstapps/eslint-config # @openstapps/eslint-config
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes
+2 -3
View File
@@ -22,7 +22,7 @@ const config = {
'plugin:unicorn/recommended', 'plugin:unicorn/recommended',
'prettier', 'prettier',
], ],
plugins: ['eslint-plugin-unicorn', 'eslint-plugin-jsdoc'], plugins: ['eslint-plugin-unicorn', 'eslint-plugin-jsdoc', '@stylistic/eslint-plugin'],
settings: { settings: {
jsdoc: { jsdoc: {
mode: 'typescript', mode: 'typescript',
@@ -76,7 +76,7 @@ const config = {
], ],
}, },
], ],
'@stylistic/lines-between-class-members': ['error', 'always'],
'@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': [ '@typescript-eslint/no-unused-vars': [
'error', 'error',
@@ -85,7 +85,6 @@ const config = {
argsIgnorePattern: '^_', argsIgnorePattern: '^_',
}, },
], ],
'@typescript-eslint/lines-between-class-members': ['error', 'always'],
'@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-non-null-assertion': 'off',
}, },
+5 -4
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/eslint-config", "name": "@openstapps/eslint-config",
"description": "A collection of configuration base files for StApps projects. Just an (unused) experiment for now.", "description": "A collection of configuration base files for StApps projects. Just an (unused) experiment for now.",
"version": "4.0.0", "version": "4.0.3",
"type": "commonjs", "type": "commonjs",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/eslint-config.git", "repository": "git@gitlab.com:openstapps/eslint-config.git",
@@ -19,11 +19,12 @@
"@openstapps/tsconfig": "workspace:*", "@openstapps/tsconfig": "workspace:*",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"eslint": "8.57.0", "eslint": "8.57.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/eslint-plugin": "7.2.0", "@stylistic/eslint-plugin": "5.10.0",
"@typescript-eslint/parser": "7.2.0", "@typescript-eslint/eslint-plugin": "8.39.1",
"@typescript-eslint/parser": "8.39.1",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-config-prettier": "9.1.0", "eslint-config-prettier": "9.1.0",
"eslint-plugin-jsdoc": "48.2.1", "eslint-plugin-jsdoc": "48.2.1",
+2 -1
View File
@@ -9,7 +9,8 @@ const config = {
trailingComma: 'all', trailingComma: 'all',
bracketSpacing: false, bracketSpacing: false,
arrowParens: 'avoid', arrowParens: 'avoid',
endOfLine: 'lf' endOfLine: 'lf',
htmlWhitespaceSensitivity: 'strict'
} }
module.exports = config; module.exports = config;
@@ -1,5 +1,19 @@
# @openstapps/projectmanagement # @openstapps/projectmanagement
## 4.0.5
### Patch Changes
- 86004881: Updated node-glob dependency
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/gitlab-api@4.0.2
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/projectmanagement", "name": "@openstapps/projectmanagement",
"description": "Main documentation and scripts for maintenance.", "description": "Main documentation and scripts for maintenance.",
"version": "4.0.1", "version": "4.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -43,7 +43,7 @@
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"commander": "10.0.0", "commander": "10.0.0",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"glob": "10.3.10", "glob": "10.5.0",
"mustache": "4.2.0" "mustache": "4.2.0"
}, },
"devDependencies": { "devDependencies": {
@@ -64,7 +64,7 @@
"mocha-junit-reporter": "2.2.0", "mocha-junit-reporter": "2.2.0",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
+17
View File
@@ -1,5 +1,22 @@
# @openstapps/minimal-connector # @openstapps/minimal-connector
## 4.0.5
### Patch Changes
- Updated dependencies [09ad903a]
- @openstapps/core@4.0.5
- @openstapps/api@4.0.5
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/api@4.0.2
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/minimal-connector", "name": "@openstapps/minimal-connector",
"description": "This is a minimal connector which serves as an example", "description": "This is a minimal connector which serves as an example",
"version": "4.0.1", "version": "4.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -55,7 +55,7 @@
"nock": "13.3.1", "nock": "13.3.1",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
+22
View File
@@ -1,5 +1,27 @@
# @openstapps/minimal-plugin # @openstapps/minimal-plugin
## 4.0.5
### Patch Changes
- Updated dependencies [86004881]
- Updated dependencies [09ad903a]
- @openstapps/core-tools@4.0.5
- @openstapps/core@4.0.5
- @openstapps/api-plugin@4.0.5
- @openstapps/api@4.0.5
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/api-plugin@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/api@4.0.2
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/minimal-plugin", "name": "@openstapps/minimal-plugin",
"description": "Minimal Plugin", "description": "Minimal Plugin",
"version": "4.0.1", "version": "4.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -44,7 +44,7 @@
"@types/express": "4.17.17", "@types/express": "4.17.17",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
+4 -3
View File
@@ -19,7 +19,7 @@
"plugin:unicorn/recommended", "plugin:unicorn/recommended",
"prettier" "prettier"
], ],
"plugins": ["eslint-plugin-unicorn", "eslint-plugin-jsdoc"], "plugins": ["eslint-plugin-unicorn", "eslint-plugin-jsdoc", "@stylistic/eslint-plugin"],
"settings": { "settings": {
"jsdoc": { "jsdoc": {
"mode": "typescript" "mode": "typescript"
@@ -63,9 +63,10 @@
"argsIgnorePattern": "^_" "argsIgnorePattern": "^_"
} }
], ],
"@typescript-eslint/lines-between-class-members": ["error", "always"], "@stylistic/lines-between-class-members": ["error", "always"],
"@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-explicit-any": "error",
"@angular-eslint/use-lifecycle-interface": "error" "@angular-eslint/use-lifecycle-interface": "error",
"@angular-eslint/prefer-standalone": "off"
} }
}, },
{ {
+26
View File
@@ -1,5 +1,31 @@
# @openstapps/app # @openstapps/app
## 4.0.5
### Patch Changes
- 09ad903a: Upgrade to Capacitor 8 and Anuglar 20
- 86004881: Updated node-glob dependency
- Updated dependencies [09ad903a]
- @openstapps/core@4.0.5
- @openstapps/api@4.0.5
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
- @openstapps/api@4.0.2
- @openstapps/collection-utils@4.0.0
- @openstapps/core@4.0.2
## 4.0.2
### Patch Changes
- @openstapps/core@4.0.2
- @openstapps/api@4.0.2
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2021 StApps * Copyright (C) 2026 StApps
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free * under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3. * Software Foundation, version 3.
@@ -13,26 +13,29 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export interface PAIAAuthorizationResponseJson { export interface URLOpenListenerEvent {
code: string; url: string;
state: string;
patron: string;
} }
export class PAIAAuthorizationResponse { export interface AppInfo {
code: string; name: string;
id: string;
build: string;
version: string;
}
state: string; export interface PluginListenerHandle {
remove: () => Promise<void>;
}
patron: string; export class AppMock {
addListener<T>(_eventName: string, _listener: (event: T) => void): Promise<PluginListenerHandle> {
constructor(response: PAIAAuthorizationResponseJson) { return Promise.resolve({remove: () => Promise.resolve()});
this.code = response.code;
this.state = response.state;
this.patron = response.patron;
} }
toJson(): PAIAAuthorizationResponseJson { getInfo(): Promise<AppInfo> {
return {code: this.code, state: this.state, patron: this.patron}; return Promise.resolve({name: 'StApps', id: 'de.anyschool.app', build: '1', version: '1.2.3'});
} }
} }
export const App = new AppMock();
+64
View File
@@ -0,0 +1,64 @@
/*
* Copyright (C) 2026 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
/*
* tsconfig.spec.json maps every `@capacitor/*` import to this folder, so this
* file replaces `@capacitor/core` in all tests – including the imports made by
* real Capacitor plugins (registerPlugin, WebPlugin, CapacitorHttp, …).
*
* Therefore everything is re-exported from the real package (imported via a
* relative path, which bypasses the path mapping) and only `Capacitor` is
* replaced by a controllable mock. The local export shadows the one from
* `export *`.
*/
export * from '../../node_modules/@capacitor/core';
type Platform = 'web' | 'ios' | 'android';
export class CapacitorMock {
private platform: Platform = 'web';
getPlatform(): Platform {
return this.platform;
}
isNativePlatform(): boolean {
return this.platform !== 'web';
}
isPluginAvailable(_name: string): boolean {
return this.isNativePlatform();
}
convertFileSrc(filePath: string): string {
return filePath;
}
/**
* Test helper: simulate running on the given platform.
*/
setPlatform(platform: Platform): void {
this.platform = platform;
}
/**
* Test helper: back to the default (web), call this in afterEach.
*/
reset(): void {
this.platform = 'web';
}
}
export const Capacitor = new CapacitorMock();
+5
View File
@@ -94,3 +94,8 @@ capacitor-cordova-android-plugins
# Copied web assets # Copied web assets
app/src/main/assets/public app/src/main/assets/public
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml
+3 -3
View File
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
namespace "de.anyschool.app" namespace = "de.anyschool.app"
compileSdk rootProject.ext.compileSdkVersion compileSdk = rootProject.ext.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "de.anyschool.app" applicationId "de.anyschool.app"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
@@ -13,7 +13,7 @@ android {
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
} }
} }
buildTypes { buildTypes {
@@ -2,13 +2,14 @@
android { android {
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_21
} }
} }
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies { dependencies {
implementation project(':capacitor-community-in-app-review')
implementation project(':capacitor-community-screen-brightness') implementation project(':capacitor-community-screen-brightness')
implementation project(':capacitor-app') implementation project(':capacitor-app')
implementation project(':capacitor-browser') implementation project(':capacitor-browser')
@@ -9,7 +9,7 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity <activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"
android:exported="true" android:exported="true"
android:label="@string/title_activity_main" android:label="@string/title_activity_main"
android:launchMode="singleTask" android:launchMode="singleTask"
@@ -1,4 +1,8 @@
[ [
{
"pkg": "@capacitor-community/in-app-review",
"classpath": "com.getcapacitor.community.inappreview.InAppReviewPlugin"
},
{ {
"pkg": "@capacitor-community/screen-brightness", "pkg": "@capacitor-community/screen-brightness",
"classpath": "com.elylucas.capscreenbrightness.ScreenBrightnessPlugin" "classpath": "com.elylucas.capscreenbrightness.ScreenBrightnessPlugin"
@@ -7,5 +7,6 @@
<item name="android:statusBarColor">@color/colorPrimary</item> <item name="android:statusBarColor">@color/colorPrimary</item>
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
</resources> </resources>
@@ -7,6 +7,7 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
@@ -17,6 +18,7 @@
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">true</item> <item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
+2 -2
View File
@@ -7,8 +7,8 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.2.1' classpath 'com.android.tools.build:gradle:8.13.0'
classpath 'com.google.gms:google-services:4.4.0' classpath 'com.google.gms:google-services:4.4.4'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
+22 -19
View File
@@ -1,57 +1,60 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
include ':capacitor-android' include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/android/capacitor') project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/android/capacitor')
include ':capacitor-community-in-app-review'
project(':capacitor-community-in-app-review').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+in-app-review@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/in-app-review/android')
include ':capacitor-community-screen-brightness' include ':capacitor-community-screen-brightness'
project(':capacitor-community-screen-brightness').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness/android') project(':capacitor-community-screen-brightness').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+screen-brightness@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/screen-brightness/android')
include ':capacitor-app' include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app/android') project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.5.2/node_modules/@capacitor/app/android')
include ':capacitor-browser' include ':capacitor-browser'
project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser/android') project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@8.0.4_@capacitor+core@8.5.2/node_modules/@capacitor/browser/android')
include ':capacitor-clipboard' include ':capacitor-clipboard'
project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard/android') project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/clipboard/android')
include ':capacitor-device' include ':capacitor-device'
project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device/android') project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@8.0.3_@capacitor+core@8.5.2/node_modules/@capacitor/device/android')
include ':capacitor-dialog' include ':capacitor-dialog'
project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog/android') project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/dialog/android')
include ':capacitor-filesystem' include ':capacitor-filesystem'
project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem/android') project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@8.1.3_@capacitor+core@8.5.2/node_modules/@capacitor/filesystem/android')
include ':capacitor-geolocation' include ':capacitor-geolocation'
project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation/android') project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@8.2.2_@capacitor+core@8.5.2/node_modules/@capacitor/geolocation/android')
include ':capacitor-haptics' include ':capacitor-haptics'
project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics/android') project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/haptics/android')
include ':capacitor-keyboard' include ':capacitor-keyboard'
project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard/android') project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@8.0.5_@capacitor+core@8.5.2/node_modules/@capacitor/keyboard/android')
include ':capacitor-local-notifications' include ':capacitor-local-notifications'
project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications/android') project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@8.3.1_@capacitor+core@8.5.2/node_modules/@capacitor/local-notifications/android')
include ':capacitor-network' include ':capacitor-network'
project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network/android') project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/network/android')
include ':capacitor-preferences' include ':capacitor-preferences'
project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences/android') project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/preferences/android')
include ':capacitor-screen-orientation' include ':capacitor-screen-orientation'
project(':capacitor-screen-orientation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation/android') project(':capacitor-screen-orientation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+screen-orientation@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/screen-orientation/android')
include ':capacitor-share' include ':capacitor-share'
project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share/android') project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/share/android')
include ':capacitor-splash-screen' include ':capacitor-splash-screen'
project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen/android') project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/splash-screen/android')
include ':transistorsoft-capacitor-background-fetch' include ':transistorsoft-capacitor-background-fetch'
project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch/android') project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@8.1.3_@capacitor+core@8.5.2/node_modules/@transistorsoft/capacitor-background-fetch/android')
include ':capacitor-secure-storage-plugin' include ':capacitor-secure-storage-plugin'
project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin/android') project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.13.0_@capacitor+core@8.5.2/node_modules/capacitor-secure-storage-plugin/android')
Binary file not shown.
@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
+22 -15
View File
@@ -15,6 +15,8 @@
# 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.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@@ -83,10 +85,8 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@@ -133,10 +133,13 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
@@ -144,7 +147,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@@ -152,7 +155,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@@ -197,16 +200,20 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.
+14 -12
View File
@@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@@ -57,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
+13 -13
View File
@@ -1,16 +1,16 @@
ext { ext {
minSdkVersion = 22 minSdkVersion = 24
compileSdkVersion = 34 compileSdkVersion = 36
targetSdkVersion = 34 targetSdkVersion = 36
androidxActivityVersion = '1.8.0' androidxActivityVersion = '1.11.0'
androidxAppCompatVersion = '1.6.1' androidxAppCompatVersion = '1.7.1'
androidxCoordinatorLayoutVersion = '1.2.0' androidxCoordinatorLayoutVersion = '1.3.0'
androidxCoreVersion = '1.12.0' androidxCoreVersion = '1.17.0'
androidxFragmentVersion = '1.6.2' androidxFragmentVersion = '1.8.9'
coreSplashScreenVersion = '1.0.1' coreSplashScreenVersion = '1.2.0'
androidxWebkitVersion = '1.9.0' androidxWebkitVersion = '1.14.0'
junitVersion = '4.13.2' junitVersion = '4.13.2'
androidxJunitVersion = '1.1.5' androidxJunitVersion = '1.3.0'
androidxEspressoCoreVersion = '3.5.1' androidxEspressoCoreVersion = '3.7.0'
cordovaAndroidVersion = '10.1.1' cordovaAndroidVersion = '14.0.1'
} }
+34
View File
@@ -40,6 +40,16 @@
"glob": "CHANGELOG.md", "glob": "CHANGELOG.md",
"input": ".", "input": ".",
"output": "assets" "output": "assets"
},
{
"glob": "maplibre-gl-worker.mjs",
"input": "node_modules/maplibre-gl/dist",
"output": "/"
},
{
"glob": "maplibre-gl-shared.mjs",
"input": "node_modules/maplibre-gl/dist",
"output": "/"
} }
], ],
"styles": [ "styles": [
@@ -195,6 +205,30 @@
}, },
"@ionic/angular-toolkit:page": { "@ionic/angular-toolkit:page": {
"styleext": "scss" "styleext": "scss"
},
"@schematics/angular:component": {
"type": "component"
},
"@schematics/angular:directive": {
"type": "directive"
},
"@schematics/angular:service": {
"type": "service"
},
"@schematics/angular:guard": {
"typeSeparator": "."
},
"@schematics/angular:interceptor": {
"typeSeparator": "."
},
"@schematics/angular:module": {
"typeSeparator": "."
},
"@schematics/angular:pipe": {
"typeSeparator": "."
},
"@schematics/angular:resolver": {
"typeSeparator": "."
} }
} }
} }
@@ -175,16 +175,6 @@
"hisometry": { "hisometry": {
"authProvider": "default", "authProvider": "default",
"url": "https://his-self-service.rz.uni-frankfurt.de" "url": "https://his-self-service.rz.uni-frankfurt.de"
},
"daia": {
"url": "https://daia.hebis.de/DAIA2/UB_Frankfurt"
},
"hebisProxy": {
"url": "https://proxy.ub.uni-frankfurt.de/login?qurl="
},
"paia": {
"authProvider": "paia",
"url": "https://hds.hebis.de/paia/core"
} }
}, },
"plugins": { "plugins": {
@@ -193,9 +183,6 @@
}, },
"feedback": { "feedback": {
"urlPath": "/feedback" "urlPath": "/feedback"
},
"hebis-plugin": {
"urlPath": "/hebissearch"
} }
} }
}, },
@@ -229,19 +216,6 @@
} }
} }
}, },
{
"icon": "local_library",
"route": "/hebis-search",
"title": "library catalog",
"translations": {
"de": {
"title": "Bibliothekskatalog"
},
"en": {
"title": "library catalog"
}
}
},
{ {
"icon": "inventory_2", "icon": "inventory_2",
"route": "/catalog", "route": "/catalog",
@@ -299,7 +273,7 @@
"icon": "school", "icon": "school",
"items": [ "items": [
{ {
"icon": "grade", "icon": "star",
"route": "/favorites", "route": "/favorites",
"title": "favorites", "title": "favorites",
"translations": { "translations": {
@@ -324,20 +298,6 @@
} }
} }
}, },
{
"authProvider": "paia",
"icon": "badge",
"route": "/library-account",
"title": "library account",
"translations": {
"de": {
"title": "Bibliothekskonto"
},
"en": {
"title": "library account"
}
}
},
{ {
"icon": "settings", "icon": "settings",
"route": "/settings", "route": "/settings",
@@ -473,24 +433,6 @@
"token": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/accessToken", "token": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/accessToken",
"userinfo": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile" "userinfo": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile"
} }
},
"paia": {
"client": {
"clientId": "",
"scopes": "",
"url": "https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php"
},
"endpoints": {
"authorization": "https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php",
"endSession": "https://ubffm.hds.hebis.de/Shibboleth.sso/Logout",
"mapping": {
"id": "$.email",
"name": "$.name",
"role": "$.type"
},
"token": "https://hds.hebis.de/paia/auth/login",
"userinfo": "https://hds.hebis.de/paia/core"
}
} }
}, },
"backend": { "backend": {
@@ -33,9 +33,9 @@ describe('dashboard', async function () {
describe('schedule section', function () { describe('schedule section', function () {
it('should lead to the week overview', function () { it('should lead to the week overview', function () {
cy.get('.schedule') cy.get('.schedule')
.contains('a', /Wochen.*übersicht/) .contains('a', /Wochen.*ansicht/)
.click(); .click();
cy.url().should('include', '/schedule/week-overview'); cy.url().should('include', '/schedule/weekly-view');
}); });
it('should lead to the calendar', function () { it('should lead to the calendar', function () {
@@ -41,8 +41,8 @@ describe('favorites', function () {
}); });
cy.get('stapps-favorite-button').click(); cy.get('stapps-favorite-button').click();
cy.get('stapps-favorite-button > ion-button > ion-icon') cy.get('stapps-favorite-button > ion-button > ion-icon')
.invoke('attr', 'ng-reflect-fill') .invoke('attr', 'class')
.should('eq', 'true'); .should('eq', 'selected');
}); });
cy.visit('/favorites'); cy.visit('/favorites');
cy.get('stapps-data-list-item').within(() => { cy.get('stapps-data-list-item').within(() => {
@@ -100,7 +100,7 @@ describe('schedule', function () {
cy.get('ion-searchbar').click().type('a'); cy.get('ion-searchbar').click().type('a');
cy.wait('@search'); cy.wait('@search');
cy.wait('@chips'); cy.wait('@chips');
cy.wait(200); cy.wait(1000);
cy.contains('ion-item', 'UNIcert (Test)') cy.contains('ion-item', 'UNIcert (Test)')
.contains('stapps-add-event-action-chip', 'Termine Auswählen') .contains('stapps-add-event-action-chip', 'Termine Auswählen')
.click(); .click();
+2 -2
View File
@@ -20,7 +20,7 @@ const config = {
htmlGlob: 'src/**/*.html', htmlGlob: 'src/**/*.html',
scriptGlob: 'src/**/*.ts', scriptGlob: 'src/**/*.ts',
additionalIcons: { additionalIcons: {
about: ['copyright', 'campaign', 'policy', 'description', 'text_snippet'], about: ['copyright', 'campaign', 'policy', 'description', 'text_snippet', 'expand_more', 'expand_all'],
navigation: [ navigation: [
'home', 'home',
'newspaper', 'newspaper',
@@ -30,7 +30,7 @@ const config = {
'local_library', 'local_library',
'inventory_2', 'inventory_2',
'map', 'map',
'grade', 'star',
'account_circle', 'account_circle',
'settings', 'settings',
'info', 'info',
+3
View File
@@ -1,5 +1,6 @@
App/build App/build
App/Pods App/Pods
App/output
App/App/public App/App/public
DerivedData DerivedData
xcuserdata xcuserdata
@@ -7,3 +8,5 @@ xcuserdata
# Cordova plugins for Capacitor # Cordova plugins for Capacitor
capacitor-cordova-ios-plugins capacitor-cordova-ios-plugins
# Generated Config files
App/App/capacitor.config.json
@@ -14,7 +14,8 @@
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C462D51B10BE605A8502F2C /* Pods_App.framework */; }; 9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9582B6842FE996800072D4E8 /* SceneDelegate.swift */; };
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -27,10 +28,10 @@
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; }; 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
7C462D51B10BE605A8502F2C /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9582B6842FE996800072D4E8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
E2D249FB277CB255005492AC /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = "<group>"; }; AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; }; AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; }; FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -38,20 +39,28 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */, A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = {
isa = PBXGroup;
children = (
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
504EC2FB1FED79650016851F = { 504EC2FB1FED79650016851F = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
504EC3061FED79650016851F /* App */, 504EC3061FED79650016851F /* App */,
504EC3051FED79650016851F /* Products */, 504EC3051FED79650016851F /* Products */,
93DA7B5AF35933F9EF51EE34 /* Pods */, 7F8756D8B27F46E3366F6CEA /* Pods */,
819423158BC1FAAD85B02762 /* Frameworks */, 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -66,7 +75,7 @@
504EC3061FED79650016851F /* App */ = { 504EC3061FED79650016851F /* App */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
E2D249FB277CB255005492AC /* App.entitlements */, 9582B6842FE996800072D4E8 /* SceneDelegate.swift */,
50379B222058CBB4000EE86E /* capacitor.config.json */, 50379B222058CBB4000EE86E /* capacitor.config.json */,
504EC3071FED79650016851F /* AppDelegate.swift */, 504EC3071FED79650016851F /* AppDelegate.swift */,
504EC30B1FED79650016851F /* Main.storyboard */, 504EC30B1FED79650016851F /* Main.storyboard */,
@@ -79,22 +88,13 @@
path = App; path = App;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
819423158BC1FAAD85B02762 /* Frameworks */ = { 7F8756D8B27F46E3366F6CEA /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7C462D51B10BE605A8502F2C /* Pods_App.framework */, FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */,
); AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */,
name = Frameworks;
sourceTree = "<group>";
};
93DA7B5AF35933F9EF51EE34 /* Pods */ = {
isa = PBXGroup;
children = (
EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */,
EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */,
); );
name = Pods; name = Pods;
path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
/* End PBXGroup section */ /* End PBXGroup section */
@@ -104,12 +104,11 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */;
buildPhases = ( buildPhases = (
947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */, 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */,
504EC3001FED79650016851F /* Sources */, 504EC3001FED79650016851F /* Sources */,
504EC3011FED79650016851F /* Frameworks */, 504EC3011FED79650016851F /* Frameworks */,
504EC3021FED79650016851F /* Resources */, 504EC3021FED79650016851F /* Resources */,
F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */, 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */,
2D217985258DD775FC9B6A72 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@@ -126,8 +125,8 @@
504EC2FC1FED79650016851F /* Project object */ = { 504EC2FC1FED79650016851F /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 920; LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 920; LastUpgradeCheck = 0920;
TargetAttributes = { TargetAttributes = {
504EC3031FED79650016851F = { 504EC3031FED79650016851F = {
CreatedOnToolsVersion = 9.2; CreatedOnToolsVersion = 9.2;
@@ -145,6 +144,8 @@
Base, Base,
); );
mainGroup = 504EC2FB1FED79650016851F; mainGroup = 504EC2FB1FED79650016851F;
packageReferences = (
);
productRefGroup = 504EC3051FED79650016851F /* Products */; productRefGroup = 504EC3051FED79650016851F /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
@@ -171,35 +172,16 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
2D217985258DD775FC9B6A72 /* [CP] Copy Pods Resources */ = { 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-resources.sh\"\n";
showEnvVarsInLog = 0;
};
947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = ( inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock", "${PODS_ROOT}/Manifest.lock",
); );
name = "[CP] Check Pods Manifest.lock"; name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = ( outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
); );
@@ -208,7 +190,7 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */ = { 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@@ -231,6 +213,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
504EC3081FED79650016851F /* AppDelegate.swift in Sources */, 504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -304,7 +287,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -355,7 +338,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -365,7 +348,7 @@
}; };
504EC3171FED79650016851F /* Debug */ = { 504EC3171FED79650016851F /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */; baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
@@ -373,7 +356,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YSGS9WV338; DEVELOPMENT_TEAM = YSGS9WV338;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app; PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app;
@@ -387,7 +370,7 @@
}; };
504EC3181FED79650016851F /* Release */ = { 504EC3181FED79650016851F /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */; baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
@@ -395,7 +378,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YSGS9WV338; DEVELOPMENT_TEAM = YSGS9WV338;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app; PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
+11 -2
View File
@@ -10,7 +10,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
let fetchManager = TSBackgroundFetch.sharedInstance(); let fetchManager = TSBackgroundFetch.sharedInstance();
fetchManager?.didFinishLaunching(); fetchManager.didFinishLaunching();
return true return true
} }
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("BackgroundFetchPlugin AppDelegate received fetch event"); print("BackgroundFetchPlugin AppDelegate received fetch event");
let fetchManager = TSBackgroundFetch.sharedInstance(); let fetchManager = TSBackgroundFetch.sharedInstance();
fetchManager?.perform(completionHandler: completionHandler, applicationState: application.applicationState); fetchManager.perform(completionHandler: completionHandler, applicationState: application.applicationState);
} }
func applicationWillResignActive(_ application: UIApplication) { func applicationWillResignActive(_ application: UIApplication) {
@@ -56,4 +56,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
} }
func application(_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
let config = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
config.delegateClass = SceneDelegate.self
return config
}
} }
@@ -1,6 +1,6 @@
{ {
"info": { "info" : {
"version": 1, "version" : 1,
"author": "xcode" "author" : "xcode"
} }
} }
+25 -3
View File
@@ -44,9 +44,29 @@
<string>Calendar access is needed to sync your schedule with the device</string> <string>Calendar access is needed to sync your schedule with the device</string>
<key>NSLocationWhenInUseUsageDescription</key> <key>NSLocationWhenInUseUsageDescription</key>
<string>Location services are used to enable all map and search features</string> <string>Location services are used to enable all map and search features</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIBackgroundModes</key> <key>UIBackgroundModes</key>
<array> <array>
<string>fetch</string> <string>fetch</string>
<string>processing</string>
</array> </array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
@@ -61,15 +81,17 @@
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UISupportedInterfaceOrientations~ipad</key> <key>UISupportedInterfaceOrientations~ipad</key>
<array> <array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string> <string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <true/>
</dict> </dict>
</plist> </plist>
@@ -0,0 +1,24 @@
import UIKit
import Capacitor
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = CAPBridgeViewController()
window?.makeKeyAndVisible()
SceneDelegateProxy.shared.scene(scene, willConnectTo: session, options: connectionOptions)
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
SceneDelegateProxy.shared.scene(scene, openURLContexts: URLContexts)
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
SceneDelegateProxy.shared.scene(scene, continue: userActivity)
}
}
+23 -22
View File
@@ -1,6 +1,6 @@
require_relative '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios/scripts/pods_helpers' require_relative '../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios/scripts/pods_helpers'
platform :ios, '13.0' platform :ios, '15.0'
use_frameworks! use_frameworks!
# workaround to avoid Xcode caching of Pods that requires # workaround to avoid Xcode caching of Pods that requires
@@ -9,26 +9,27 @@ use_frameworks!
install! 'cocoapods', :disable_input_output_paths => true install! 'cocoapods', :disable_input_output_paths => true
def capacitor_pods def capacitor_pods
pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios' pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios'
pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios' pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios'
pod 'CapacitorCommunityScreenBrightness', :path => '../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness' pod 'CapacitorCommunityInAppReview', :path => '../../../../node_modules/.pnpm/@capacitor-community+in-app-review@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/in-app-review'
pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app' pod 'CapacitorCommunityScreenBrightness', :path => '../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/screen-brightness'
pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser' pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.5.2/node_modules/@capacitor/app'
pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard' pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@8.0.4_@capacitor+core@8.5.2/node_modules/@capacitor/browser'
pod 'CapacitorDevice', :path => '../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device' pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/clipboard'
pod 'CapacitorDialog', :path => '../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog' pod 'CapacitorDevice', :path => '../../../../node_modules/.pnpm/@capacitor+device@8.0.3_@capacitor+core@8.5.2/node_modules/@capacitor/device'
pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem' pod 'CapacitorDialog', :path => '../../../../node_modules/.pnpm/@capacitor+dialog@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/dialog'
pod 'CapacitorGeolocation', :path => '../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation' pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.3_@capacitor+core@8.5.2/node_modules/@capacitor/filesystem'
pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics' pod 'CapacitorGeolocation', :path => '../../../../node_modules/.pnpm/@capacitor+geolocation@8.2.2_@capacitor+core@8.5.2/node_modules/@capacitor/geolocation'
pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard' pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/haptics'
pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications' pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.5_@capacitor+core@8.5.2/node_modules/@capacitor/keyboard'
pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network' pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@8.3.1_@capacitor+core@8.5.2/node_modules/@capacitor/local-notifications'
pod 'CapacitorPreferences', :path => '../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences' pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/network'
pod 'CapacitorScreenOrientation', :path => '../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation' pod 'CapacitorPreferences', :path => '../../../../node_modules/.pnpm/@capacitor+preferences@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/preferences'
pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share' pod 'CapacitorScreenOrientation', :path => '../../../../node_modules/.pnpm/@capacitor+screen-orientation@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/screen-orientation'
pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen' pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/share'
pod 'TransistorsoftCapacitorBackgroundFetch', :path => '../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch' pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/splash-screen'
pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin' pod 'TransistorsoftCapacitorBackgroundFetch', :path => '../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@8.1.3_@capacitor+core@8.5.2/node_modules/@transistorsoft/capacitor-background-fetch'
pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.13.0_@capacitor+core@8.5.2/node_modules/capacitor-secure-storage-plugin'
pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins' pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'
end end
+101 -83
View File
@@ -1,143 +1,161 @@
PODS: PODS:
- Capacitor (6.2.1): - Capacitor (8.5.2):
- CapacitorCordova - CapacitorCordova
- CapacitorApp (6.0.0): - CapacitorApp (8.1.1):
- Capacitor - Capacitor
- CapacitorBrowser (6.0.1): - CapacitorBrowser (8.0.4):
- Capacitor - Capacitor
- CapacitorClipboard (6.0.0): - CapacitorClipboard (8.0.1):
- Capacitor - Capacitor
- CapacitorCommunityScreenBrightness (6.0.0): - CapacitorCommunityInAppReview (8.0.0):
- Capacitor - Capacitor
- CapacitorCordova (6.2.1) - CapacitorCommunityScreenBrightness (8.0.0):
- CapacitorDevice (6.0.0):
- Capacitor - Capacitor
- CapacitorDialog (6.0.0): - CapacitorCordova (8.5.2)
- CapacitorDevice (8.0.3):
- Capacitor - Capacitor
- CapacitorFilesystem (6.0.0): - CapacitorDialog (8.0.1):
- Capacitor - Capacitor
- CapacitorGeolocation (6.0.0): - CapacitorFilesystem (8.1.3):
- Capacitor - Capacitor
- CapacitorHaptics (6.0.0): - IONFilesystemLib (~> 1.1.1)
- CapacitorGeolocation (8.2.2):
- Capacitor - Capacitor
- CapacitorKeyboard (6.0.1): - IONGeolocationLib (= 2.1.0)
- CapacitorHaptics (8.0.2):
- Capacitor - Capacitor
- CapacitorLocalNotifications (6.0.0): - CapacitorKeyboard (8.0.5):
- Capacitor - Capacitor
- CapacitorNetwork (6.0.1): - CapacitorLocalNotifications (8.3.1):
- Capacitor - Capacitor
- CapacitorPreferences (6.0.1): - CapacitorNetwork (8.0.1):
- Capacitor - Capacitor
- CapacitorScreenOrientation (6.0.1): - CapacitorPreferences (8.0.1):
- Capacitor - Capacitor
- CapacitorSecureStoragePlugin (0.10.0): - CapacitorScreenOrientation (8.0.1):
- Capacitor
- CapacitorSecureStoragePlugin (0.13.0):
- Capacitor - Capacitor
- SwiftKeychainWrapper - SwiftKeychainWrapper
- CapacitorShare (6.0.1): - CapacitorShare (8.0.2):
- Capacitor - Capacitor
- CapacitorSplashScreen (6.0.1): - CapacitorSplashScreen (8.0.2):
- Capacitor - Capacitor
- CordovaPlugins (6.2.1): - CordovaPlugins (8.5.2):
- CapacitorCordova - CapacitorCordova
- IONFilesystemLib (1.1.4)
- IONGeolocationLib (2.1.0)
- SwiftKeychainWrapper (4.0.1) - SwiftKeychainWrapper (4.0.1)
- TransistorsoftCapacitorBackgroundFetch (6.0.0): - TransistorsoftCapacitorBackgroundFetch (8.1.3):
- Capacitor - Capacitor
- TSBackgroundFetch (~> 4.1.0)
- TSBackgroundFetch (4.1.1)
DEPENDENCIES: DEPENDENCIES:
- "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios`)" - "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios`)"
- "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app`)" - "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.5.2/node_modules/@capacitor/app`)"
- "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser`)" - "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@8.0.4_@capacitor+core@8.5.2/node_modules/@capacitor/browser`)"
- "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard`)" - "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/clipboard`)"
- "CapacitorCommunityScreenBrightness (from `../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness`)" - "CapacitorCommunityInAppReview (from `../../../../node_modules/.pnpm/@capacitor-community+in-app-review@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/in-app-review`)"
- "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios`)" - "CapacitorCommunityScreenBrightness (from `../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/screen-brightness`)"
- "CapacitorDevice (from `../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device`)" - "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios`)"
- "CapacitorDialog (from `../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog`)" - "CapacitorDevice (from `../../../../node_modules/.pnpm/@capacitor+device@8.0.3_@capacitor+core@8.5.2/node_modules/@capacitor/device`)"
- "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem`)" - "CapacitorDialog (from `../../../../node_modules/.pnpm/@capacitor+dialog@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/dialog`)"
- "CapacitorGeolocation (from `../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation`)" - "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.3_@capacitor+core@8.5.2/node_modules/@capacitor/filesystem`)"
- "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics`)" - "CapacitorGeolocation (from `../../../../node_modules/.pnpm/@capacitor+geolocation@8.2.2_@capacitor+core@8.5.2/node_modules/@capacitor/geolocation`)"
- "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard`)" - "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/haptics`)"
- "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications`)" - "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.5_@capacitor+core@8.5.2/node_modules/@capacitor/keyboard`)"
- "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network`)" - "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@8.3.1_@capacitor+core@8.5.2/node_modules/@capacitor/local-notifications`)"
- "CapacitorPreferences (from `../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences`)" - "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/network`)"
- "CapacitorScreenOrientation (from `../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation`)" - "CapacitorPreferences (from `../../../../node_modules/.pnpm/@capacitor+preferences@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/preferences`)"
- "CapacitorSecureStoragePlugin (from `../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin`)" - "CapacitorScreenOrientation (from `../../../../node_modules/.pnpm/@capacitor+screen-orientation@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/screen-orientation`)"
- "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share`)" - "CapacitorSecureStoragePlugin (from `../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.13.0_@capacitor+core@8.5.2/node_modules/capacitor-secure-storage-plugin`)"
- "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen`)" - "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/share`)"
- "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/splash-screen`)"
- CordovaPlugins (from `../capacitor-cordova-ios-plugins`) - CordovaPlugins (from `../capacitor-cordova-ios-plugins`)
- "TransistorsoftCapacitorBackgroundFetch (from `../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch`)" - "TransistorsoftCapacitorBackgroundFetch (from `../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@8.1.3_@capacitor+core@8.5.2/node_modules/@transistorsoft/capacitor-background-fetch`)"
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- IONFilesystemLib
- IONGeolocationLib
- SwiftKeychainWrapper - SwiftKeychainWrapper
- TSBackgroundFetch
EXTERNAL SOURCES: EXTERNAL SOURCES:
Capacitor: Capacitor:
:path: "../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios" :path: "../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios"
CapacitorApp: CapacitorApp:
:path: "../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app" :path: "../../../../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.5.2/node_modules/@capacitor/app"
CapacitorBrowser: CapacitorBrowser:
:path: "../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser" :path: "../../../../node_modules/.pnpm/@capacitor+browser@8.0.4_@capacitor+core@8.5.2/node_modules/@capacitor/browser"
CapacitorClipboard: CapacitorClipboard:
:path: "../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard" :path: "../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/clipboard"
CapacitorCommunityInAppReview:
:path: "../../../../node_modules/.pnpm/@capacitor-community+in-app-review@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/in-app-review"
CapacitorCommunityScreenBrightness: CapacitorCommunityScreenBrightness:
:path: "../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness" :path: "../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/screen-brightness"
CapacitorCordova: CapacitorCordova:
:path: "../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios" :path: "../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.2/node_modules/@capacitor/ios"
CapacitorDevice: CapacitorDevice:
:path: "../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device" :path: "../../../../node_modules/.pnpm/@capacitor+device@8.0.3_@capacitor+core@8.5.2/node_modules/@capacitor/device"
CapacitorDialog: CapacitorDialog:
:path: "../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog" :path: "../../../../node_modules/.pnpm/@capacitor+dialog@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/dialog"
CapacitorFilesystem: CapacitorFilesystem:
:path: "../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem" :path: "../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.3_@capacitor+core@8.5.2/node_modules/@capacitor/filesystem"
CapacitorGeolocation: CapacitorGeolocation:
:path: "../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation" :path: "../../../../node_modules/.pnpm/@capacitor+geolocation@8.2.2_@capacitor+core@8.5.2/node_modules/@capacitor/geolocation"
CapacitorHaptics: CapacitorHaptics:
:path: "../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics" :path: "../../../../node_modules/.pnpm/@capacitor+haptics@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/haptics"
CapacitorKeyboard: CapacitorKeyboard:
:path: "../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard" :path: "../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.5_@capacitor+core@8.5.2/node_modules/@capacitor/keyboard"
CapacitorLocalNotifications: CapacitorLocalNotifications:
:path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications" :path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@8.3.1_@capacitor+core@8.5.2/node_modules/@capacitor/local-notifications"
CapacitorNetwork: CapacitorNetwork:
:path: "../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network" :path: "../../../../node_modules/.pnpm/@capacitor+network@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/network"
CapacitorPreferences: CapacitorPreferences:
:path: "../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences" :path: "../../../../node_modules/.pnpm/@capacitor+preferences@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/preferences"
CapacitorScreenOrientation: CapacitorScreenOrientation:
:path: "../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation" :path: "../../../../node_modules/.pnpm/@capacitor+screen-orientation@8.0.1_@capacitor+core@8.5.2/node_modules/@capacitor/screen-orientation"
CapacitorSecureStoragePlugin: CapacitorSecureStoragePlugin:
:path: "../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin" :path: "../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.13.0_@capacitor+core@8.5.2/node_modules/capacitor-secure-storage-plugin"
CapacitorShare: CapacitorShare:
:path: "../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share" :path: "../../../../node_modules/.pnpm/@capacitor+share@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/share"
CapacitorSplashScreen: CapacitorSplashScreen:
:path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen" :path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.2_@capacitor+core@8.5.2/node_modules/@capacitor/splash-screen"
CordovaPlugins: CordovaPlugins:
:path: "../capacitor-cordova-ios-plugins" :path: "../capacitor-cordova-ios-plugins"
TransistorsoftCapacitorBackgroundFetch: TransistorsoftCapacitorBackgroundFetch:
:path: "../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch" :path: "../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@8.1.3_@capacitor+core@8.5.2/node_modules/@transistorsoft/capacitor-background-fetch"
SPEC CHECKSUMS: SPEC CHECKSUMS:
Capacitor: c95400d761e376be9da6be5a05f226c0e865cebf Capacitor: 89067779e14fb7ea56af07b4817f45d1f0c2a269
CapacitorApp: 30145f2ea2311e4f3744472119ec87d2ddf4c0a7 CapacitorApp: 305bd13c44f6f9d164e2ee66a4faa956ed8c0e06
CapacitorBrowser: 6c0e04dc80556a966ebc2269ac72f09d83eec1ce CapacitorBrowser: 752e0208aa07c7aa63d1f7cde895a3e9519b2656
CapacitorClipboard: c1cb27fea166aab5c99bda605d3bc768cf00eabe CapacitorClipboard: c75fdaa6e622111119f35e7914ecfc67b05efecb
CapacitorCommunityScreenBrightness: 95d4c839fc8e925dcf75ffee66f62a00f560f146 CapacitorCommunityInAppReview: 4492bdd34aad4d27ed87949376022cc93b294ea1
CapacitorCordova: 8d93e14982f440181be7304aa9559ca631d77fff CapacitorCommunityScreenBrightness: e4075e1181f7e88259edb8b1e3b9a209e1144d45
CapacitorDevice: 38ad323d74e3a86b56253680538ac23a2c9b4a68 CapacitorCordova: 5bec5648cbd09a176ce34ce5e7b6cdabb2c8a327
CapacitorDialog: bd99f63c9788a137263b2d75e718b1fc4d9f70c3 CapacitorDevice: 708e742b60a61572cd593e44c809592e8f31da14
CapacitorFilesystem: 9c2cc1e89d3b8b91503b316e9f6c2915c9bf9419 CapacitorDialog: 854c5dac405081cae697c177ca43bcaa95ae67bf
CapacitorGeolocation: 86f82a32b238ff79d5be6fc0943f2866965d3f1b CapacitorFilesystem: b2bbd84bb91c177906c9dbc252864cb71ab9957b
CapacitorHaptics: 0cea833e6a8bf489dd6acaaebf6d953b90086c59 CapacitorGeolocation: 327f18983c8f8a55e191fcf7dee80b9294f1ab78
CapacitorKeyboard: f38d730356be5569d72eb87ad9c8166947728c36 CapacitorHaptics: 296f771ecd89c7a1bd92a7b6826a7d268e2e70f5
CapacitorLocalNotifications: d051c73ec8bf38807214f5b905ee6426e13756f8 CapacitorKeyboard: b6b0744890cdb1d9a96e2cafcc9253fdcc55de3b
CapacitorNetwork: 7ff188197e880d8485f280492b54d3202e9f3a61 CapacitorLocalNotifications: e0747a329ddde3074d52dc74a003688af90e42be
CapacitorPreferences: 97d529423bb7c1196455e9a1b6dd1074625c78bd CapacitorNetwork: 8812ce60d11fb63d8f2e4ba51a49b2e59892ebe2
CapacitorScreenOrientation: f3a0744a56f673929d18bd0d9a5ef5f5595e7352 CapacitorPreferences: cca2021f386efb75947c850334447d9ff22b14f1
CapacitorSecureStoragePlugin: 545b51d782d35e61a39231ecf99a966b060a2cbb CapacitorScreenOrientation: 6c3c84223ea1dd44aaa7184e2b416dd1192270d0
CapacitorShare: ec1bcbc16696696133740ac876192c0480ca3018 CapacitorSecureStoragePlugin: d083ff28d9ba5bc74924b9bcf9754ea605016b63
CapacitorSplashScreen: d2d8fe9541d7bebdf735839b89edf6e762cea969 CapacitorShare: 2fde721d06a6f83ff5c7578e6a91b190d341ac6a
CordovaPlugins: b40548c03c597049ef851a7014da5ac8f155d914 CapacitorSplashScreen: 7bf61c2001557ff9e195e601c6b87344480d3c65
CordovaPlugins: 3508a47f9d91d1c38fa7ff41afa75e7226c9407b
IONFilesystemLib: e6610c2b260d15e4b9cb9d5e37a87095479b669e
IONGeolocationLib: 6a7b6f76063fb1b01cfb14fae7d0f526e3c9b271
SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c
TransistorsoftCapacitorBackgroundFetch: dfa73a0fd038bc1986255360e4b20165a4a0f066 TransistorsoftCapacitorBackgroundFetch: 3fd1ea4cd2f6e8f512d366261b162c68b362e59a
TSBackgroundFetch: 18918b6449a1e3f01eb0f5b44d6d79ce6160a5a5
PODFILE CHECKSUM: 601bc3c09529fe24d68110bc709379698476efe1 PODFILE CHECKSUM: 47c2431c6197a6e8fdf2ace4f969ed028a0e002f
COCOAPODS: 1.16.2 COCOAPODS: 1.16.2
+79 -79
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/app", "name": "@openstapps/app",
"description": "The generic app tailored to fulfill needs of German universities, written using Ionic Framework.", "description": "The generic app tailored to fulfill needs of German universities, written using Ionic Framework.",
"version": "4.0.1", "version": "4.0.5",
"private": true, "private": true,
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>", "author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>",
@@ -38,7 +38,7 @@
"minify-icons": "node scripts/minify-icon-font.mjs", "minify-icons": "node scripts/minify-icon-font.mjs",
"preview": "http-server www/browser --p 8101 -o", "preview": "http-server www/browser --p 8101 -o",
"push": "git push && git push origin \"v$npm_package_version\"", "push": "git push && git push origin \"v$npm_package_version\"",
"resources:ios": "capacitor-assets generate --ios --iconBackgroundColor $(grep -oE \"^@include ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\") --splashBackgroundColor $(grep -oE \"^@include ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\")", "resources:ios": "capacitor-assets generate --ios --iconBackgroundColor $(grep -oE \"^@include color-system\\.ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\") --splashBackgroundColor $(grep -oE \"^@include color-system\\.ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\")",
"run:android": "ionic capacitor run android --livereload --external", "run:android": "ionic capacitor run android --livereload --external",
"start": "ionic serve", "start": "ionic serve",
"start:external": "ionic serve --external", "start:external": "ionic serve --external",
@@ -48,138 +48,138 @@
"test:integration": "sh integration-test.sh" "test:integration": "sh integration-test.sh"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "17.3.12", "@angular/animations": "20.3.31",
"@angular/cdk": "17.3.10", "@angular/cdk": "20.2.14",
"@angular/common": "17.3.12", "@angular/common": "20.3.31",
"@angular/core": "17.3.12", "@angular/core": "20.3.31",
"@angular/forms": "17.3.12", "@angular/forms": "20.3.31",
"@angular/platform-browser": "17.3.12", "@angular/platform-browser": "20.3.31",
"@angular/router": "17.3.12", "@angular/router": "20.3.31",
"@awesome-cordova-plugins/calendar": "6.6.0", "@awesome-cordova-plugins/calendar": "8.1.0",
"@awesome-cordova-plugins/core": "6.6.0", "@awesome-cordova-plugins/core": "8.1.0",
"@capacitor-community/screen-brightness": "6.0.0", "@capacitor-community/in-app-review": "8.0.0",
"@capacitor/app": "6.0.0", "@capacitor-community/screen-brightness": "8.0.0",
"@capacitor/browser": "6.0.1", "@capacitor/app": "8.1.1",
"@capacitor/clipboard": "6.0.0", "@capacitor/browser": "8.0.4",
"@capacitor/core": "6.2.1", "@capacitor/clipboard": "8.0.1",
"@capacitor/device": "6.0.0", "@capacitor/core": "8.5.2",
"@capacitor/dialog": "6.0.0", "@capacitor/device": "8.0.3",
"@capacitor/filesystem": "6.0.0", "@capacitor/dialog": "8.0.1",
"@capacitor/geolocation": "6.0.0", "@capacitor/filesystem": "8.1.3",
"@capacitor/haptics": "6.0.0", "@capacitor/geolocation": "8.2.2",
"@capacitor/keyboard": "6.0.1", "@capacitor/haptics": "8.0.2",
"@capacitor/local-notifications": "6.0.0", "@capacitor/keyboard": "8.0.5",
"@capacitor/network": "6.0.1", "@capacitor/local-notifications": "8.3.1",
"@capacitor/preferences": "6.0.1", "@capacitor/network": "8.0.1",
"@capacitor/screen-orientation": "6.0.1", "@capacitor/preferences": "8.0.1",
"@capacitor/share": "6.0.1", "@capacitor/screen-orientation": "8.0.1",
"@capacitor/splash-screen": "6.0.1", "@capacitor/share": "8.0.2",
"@ionic-native/core": "5.36.0", "@capacitor/splash-screen": "8.0.2",
"@ionic/angular": "8.6.1", "@ionic/angular": "8.8.19",
"@ionic/angular-server": "8.6.1", "@ionic/angular-server": "8.8.19",
"@ionic/storage-angular": "4.0.0", "@ionic/storage-angular": "4.0.0",
"@maplibre/ngx-maplibre-gl": "17.4.1", "@maplibre/ngx-maplibre-gl": "22.1.0",
"@ngx-translate/core": "15.0.0", "@ngx-translate/core": "15.0.0",
"@ngx-translate/http-loader": "8.0.0", "@ngx-translate/http-loader": "8.0.0",
"@openid/appauth": "1.3.1", "@openid/appauth": "1.4.0",
"@openstapps/api": "workspace:*", "@openstapps/api": "workspace:*",
"@openstapps/collection-utils": "workspace:*", "@openstapps/collection-utils": "workspace:*",
"@openstapps/core": "workspace:*", "@openstapps/core": "workspace:*",
"@transistorsoft/capacitor-background-fetch": "6.0.0", "@transistorsoft/capacitor-background-fetch": "8.1.3",
"@types/dom-view-transitions": "1.0.4", "@types/dom-view-transitions": "1.0.6",
"capacitor-secure-storage-plugin": "0.10.0", "capacitor-secure-storage-plugin": "0.13.0",
"cordova-plugin-calendar": "5.1.6", "cordova-plugin-calendar": "5.1.6",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"form-data": "4.0.4", "form-data": "4.0.6",
"geojson": "0.5.0", "geojson": "0.5.0",
"ionic-appauth": "0.9.0", "ionicons": "8.1.0",
"ionicons": "7.4.0",
"jsonpath-plus": "10.3.0", "jsonpath-plus": "10.3.0",
"maplibre-gl": "4.0.2", "maplibre-gl": "6.4.1",
"material-symbols": "0.17.1", "material-symbols": "0.17.1",
"moment": "2.30.1", "moment": "2.30.1",
"ngx-date-fns": "11.0.0", "ngx-date-fns": "11.0.0",
"ngx-logger": "5.0.12", "ngx-logger": "5.0.12",
"ngx-markdown": "17.2.1", "ngx-markdown": "18.1.0",
"ngx-moment": "6.0.2", "ngx-moment": "6.0.2",
"opening_hours": "3.8.0", "opening_hours": "3.8.0",
"pmtiles": "3.0.3", "pmtiles": "3.0.3",
"prettier": "3.1.1", "prettier": "3.1.1",
"rxjs": "7.8.1", "rxjs": "7.8.2",
"semver": "7.6.0", "semver": "7.6.0",
"swiper": "8.4.5", "swiper": "8.4.5",
"tslib": "2.6.2", "tslib": "2.6.2",
"zone.js": "0.14.4" "zone.js": "0.16.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/architect": "0.1703.17", "@angular-devkit/architect": "0.2003.37",
"@angular-devkit/build-angular": "17.3.17", "@angular-devkit/build-angular": "20.3.37",
"@angular-devkit/core": "17.3.17", "@angular-devkit/core": "20.3.37",
"@angular-devkit/schematics": "17.3.17", "@angular-devkit/schematics": "20.3.37",
"@angular-eslint/builder": "17.5.3", "@angular-eslint/builder": "20.7.0",
"@angular-eslint/eslint-plugin": "17.5.3", "@angular-eslint/eslint-plugin": "20.7.0",
"@angular-eslint/eslint-plugin-template": "17.5.3", "@angular-eslint/eslint-plugin-template": "20.7.0",
"@angular-eslint/schematics": "17.5.3", "@angular-eslint/schematics": "20.7.0",
"@angular-eslint/template-parser": "17.5.3", "@angular-eslint/template-parser": "20.7.0",
"@angular/cli": "17.3.17", "@angular/cli": "20.3.37",
"@angular/compiler": "17.3.12", "@angular/compiler": "20.3.31",
"@angular/compiler-cli": "17.3.12", "@angular/compiler-cli": "20.3.31",
"@angular/language-server": "17.3.2", "@angular/language-server": "20.3.0",
"@angular/language-service": "17.3.12", "@angular/language-service": "20.3.31",
"@angular/platform-browser-dynamic": "17.3.12", "@angular/platform-browser-dynamic": "20.3.31",
"@capacitor/android": "6.2.1", "@capacitor/android": "8.5.2",
"@capacitor/assets": "3.0.4", "@capacitor/assets": "3.0.5",
"@capacitor/cli": "6.2.1", "@capacitor/cli": "8.5.2",
"@capacitor/ios": "6.2.1", "@capacitor/ios": "8.5.2",
"@compodoc/compodoc": "1.1.23", "@compodoc/compodoc": "1.2.1",
"@cypress/schematic": "3.0.0", "@cypress/schematic": "4.1.1",
"@ionic/angular-toolkit": "11.0.1", "@ionic/angular-toolkit": "12.3.0",
"@ionic/cli": "7.2.0", "@ionic/cli": "7.2.1",
"@openstapps/prettier-config": "workspace:*", "@openstapps/prettier-config": "workspace:*",
"@openstapps/tsconfig": "workspace:*", "@openstapps/tsconfig": "workspace:*",
"@types/fontkit": "2.0.7", "@stylistic/eslint-plugin": "5.10.0",
"@types/fontkit": "2.0.9",
"@types/geojson": "1.0.6", "@types/geojson": "1.0.6",
"@types/glob": "8.1.0", "@types/glob": "8.1.0",
"@types/jasmine": "5.1.4", "@types/jasmine": "5.1.4",
"@types/jasminewd2": "2.0.13", "@types/jasminewd2": "2.0.13",
"@types/jsonpath": "0.2.0", "@types/jsonpath": "0.2.0",
"@types/karma": "6.3.8", "@types/karma": "6.3.9",
"@types/karma-coverage": "2.0.3", "@types/karma-coverage": "2.0.3",
"@types/karma-jasmine": "4.0.5", "@types/karma-jasmine": "4.0.5",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"@types/semver": "7.5.8", "@types/semver": "7.5.8",
"@typescript-eslint/eslint-plugin": "7.2.0", "@typescript-eslint/eslint-plugin": "8.39.1",
"@typescript-eslint/parser": "7.2.0", "@typescript-eslint/parser": "8.39.1",
"cordova-res": "0.15.4", "cordova-res": "0.15.4",
"cypress": "14.5.0", "cypress": "15.0.0",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-plugin-jsdoc": "48.2.1", "eslint-plugin-jsdoc": "48.2.1",
"eslint-plugin-prettier": "5.1.3", "eslint-plugin-prettier": "5.1.3",
"eslint-plugin-unicorn": "51.0.1", "eslint-plugin-unicorn": "51.0.1",
"fast-deep-equal": "3.1.3", "fast-deep-equal": "3.1.3",
"fontkit": "2.0.2", "fontkit": "2.0.4",
"glob": "10.3.10", "glob": "10.5.0",
"http-server": "14.1.1", "http-server": "14.1.1",
"is-docker": "2.2.1", "is-docker": "2.2.1",
"jasmine-core": "5.1.2", "jasmine-core": "5.1.2",
"jasmine-spec-reporter": "7.0.0", "jasmine-spec-reporter": "7.0.0",
"junit-report-merger": "6.0.3", "junit-report-merger": "6.0.3",
"karma": "6.4.3", "karma": "6.4.4",
"karma-chrome-launcher": "3.2.0", "karma-chrome-launcher": "3.2.0",
"karma-coverage": "2.2.1", "karma-coverage": "2.2.1",
"karma-jasmine": "5.1.0", "karma-jasmine": "5.1.0",
"karma-junit-reporter": "2.0.1", "karma-junit-reporter": "2.0.1",
"karma-mocha-reporter": "2.2.5", "karma-mocha-reporter": "2.2.5",
"license-checker": "25.0.1", "license-checker": "25.0.1",
"stylelint": "16.3.1", "stylelint": "17.14.1",
"stylelint-config-clean-order": "5.4.1", "stylelint-config-clean-order": "10.0.0",
"stylelint-config-prettier-scss": "1.0.0", "stylelint-config-prettier-scss": "1.0.0",
"stylelint-config-recommended-scss": "14.0.0", "stylelint-config-recommended-scss": "17.0.1",
"stylelint-config-standard-scss": "13.0.0", "stylelint-config-standard-scss": "17.0.0",
"surge": "0.23.1", "surge": "0.23.1",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"typescript": "5.4.2" "typescript": "5.9.3"
}, },
"cordova": { "cordova": {
"plugins": {}, "plugins": {},
@@ -73,7 +73,6 @@ export const sampleAggregations: SCBackendAggregationConfiguration[] = [
export const sampleAuthConfiguration: { export const sampleAuthConfiguration: {
default: SCAuthorizationProvider; default: SCAuthorizationProvider;
paia: SCAuthorizationProvider;
} = { } = {
default: { default: {
client: {clientId: '', scopes: '', url: ''}, client: {clientId: '', scopes: '', url: ''},
@@ -84,15 +83,6 @@ export const sampleAuthConfiguration: {
userinfo: '', userinfo: '',
}, },
}, },
paia: {
client: {clientId: '', scopes: '', url: ''},
endpoints: {
authorization: '',
mapping: {id: '', name: ''},
token: '',
userinfo: '',
},
},
}; };
export const sampleDefaultPolygon: Polygon = { export const sampleDefaultPolygon: Polygon = {
@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {HttpClient} from '@angular/common/http'; import {HttpClient} from '@angular/common/http';
import {Injectable} from '@angular/core'; import {Injectable, inject} from '@angular/core';
import { import {
SCAcademicEvent, SCAcademicEvent,
SCArticle, SCArticle,
@@ -395,7 +395,9 @@ export class SampleThings {
*/ */
http: HttpClient; http: HttpClient;
constructor(http: HttpClient) { constructor() {
const http = inject(HttpClient);
this.http = http; this.http = http;
} }
@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable} from '@angular/core'; import {Injectable, inject} from '@angular/core';
import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse} from '@angular/common/http'; import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse} from '@angular/common/http';
import {Observable, throwError} from 'rxjs'; import {Observable, throwError} from 'rxjs';
import {NGXLogger} from 'ngx-logger'; import {NGXLogger} from 'ngx-logger';
@@ -21,7 +21,7 @@ import {catchError} from 'rxjs/operators';
@Injectable() @Injectable()
export class ServiceHandlerInterceptor implements HttpInterceptor { export class ServiceHandlerInterceptor implements HttpInterceptor {
constructor(private readonly logger: NGXLogger) {} private readonly logger = inject(NGXLogger);
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
return next.handle(request).pipe( return next.handle(request).pipe(
+7 -13
View File
@@ -18,7 +18,11 @@ import {AnimationOptions} from '@ionic/angular/common/providers/nav-controller';
import {iosDuration, iosEasing, mdDuration, mdEasing} from './easings'; import {iosDuration, iosEasing, mdDuration, mdEasing} from './easings';
/** /**
* * Creates the page transition used when opening a page via a FAB: the FAB grows
* towards the screen while the new page fades in on top of it. Going back, the
* page fades out and reveals the previous page beneath it.
* @param animationController Ionic animation controller used to build the animation
* @returns animation builder to pass to `[routerAnimation]`
*/ */
export function fabExpand(animationController: AnimationController): AnimationBuilder { export function fabExpand(animationController: AnimationController): AnimationBuilder {
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -37,18 +41,11 @@ export function fabExpand(animationController: AnimationController): AnimationBu
const useReducedMotion = viewBounds.width > 500; const useReducedMotion = viewBounds.width > 500;
const reducedMotionTransform = `${Math.min(viewBounds.width * 0.3, 200)}px`; const reducedMotionTransform = `${Math.min(viewBounds.width * 0.3, 200)}px`;
const reducedMotionViewBorderRadius = '128px';
const reducedMotionFabGrow = '2'; const reducedMotionFabGrow = '2';
const reducedMotionViewShrink = '0.9';
const viewCenterX = (viewBounds.width - viewBounds.x) / 2; const viewCenterX = (viewBounds.width - viewBounds.x) / 2;
const viewCenterY = (viewBounds.height - viewBounds.y) / 2; const viewCenterY = (viewBounds.height - viewBounds.y) / 2;
const viewOnFab = useReducedMotion
? `translate(${reducedMotionTransform}, ${reducedMotionTransform}) scale(${reducedMotionViewShrink})`
: `translate(${(fabBounds.x - viewBounds.x) / 2}px, ${(fabBounds.y - viewBounds.y) / 2}px) scale(${
fabBounds.width / viewBounds.width
}, ${fabBounds.height / viewBounds.height})`;
const fabOnView = useReducedMotion const fabOnView = useReducedMotion
? `translate(-${reducedMotionTransform}, -${reducedMotionTransform}) scale(${reducedMotionFabGrow})` ? `translate(-${reducedMotionTransform}, -${reducedMotionTransform}) scale(${reducedMotionFabGrow})`
: `translate(${viewCenterX - fabBounds.x}px, ${viewCenterY - fabBounds.y}px) scale(${ : `translate(${viewCenterX - fabBounds.x}px, ${viewCenterY - fabBounds.y}px) scale(${
@@ -56,8 +53,6 @@ export function fabExpand(animationController: AnimationController): AnimationBu
}, ${viewBounds.height / fabBounds.height})`; }, ${viewBounds.height / fabBounds.height})`;
const transformNormal = `translate(0px, 0px) scale(1, 1)`; const transformNormal = `translate(0px, 0px) scale(1, 1)`;
const viewBorderRadius = useReducedMotion ? reducedMotionViewBorderRadius : '50%';
const fabViewFade = animationController const fabViewFade = animationController
.create() .create()
.beforeStyles({zIndex: -1}) .beforeStyles({zIndex: -1})
@@ -69,13 +64,12 @@ export function fabExpand(animationController: AnimationController): AnimationBu
.fromTo('transform', back ? fabOnView : transformNormal, back ? transformNormal : fabOnView) .fromTo('transform', back ? fabOnView : transformNormal, back ? transformNormal : fabOnView)
.fromTo('opacity', back ? '0' : '1', back ? '1' : '0') .fromTo('opacity', back ? '0' : '1', back ? '1' : '0')
.fromTo('borderRadius', back ? '0' : '50%', back ? '50%' : '0') .fromTo('borderRadius', back ? '0' : '50%', back ? '50%' : '0')
.addElement(fab); .addElement(back ? [] : fab);
const viewGrow = animationController const viewGrow = animationController
.create() .create()
.beforeStyles({zIndex: 200, overflow: 'hidden', transformOrigin: 'center'}) .beforeStyles({zIndex: 200, overflow: 'hidden', transformOrigin: 'center'})
.fromTo('transform', back ? transformNormal : viewOnFab, back ? viewOnFab : transformNormal)
.fromTo('opacity', back ? '1' : '0', back ? '0' : '1') .fromTo('opacity', back ? '1' : '0', back ? '0' : '1')
.fromTo('borderRadius', back ? '0' : viewBorderRadius, back ? viewBorderRadius : '0') .afterStyles(back ? {display: 'none'} : {})
.addElement(otherView); .addElement(otherView);
return rootTransition.addAnimation(fabGrow).addAnimation(viewGrow).addAnimation(fabViewFade); return rootTransition.addAnimation(fabGrow).addAnimation(viewGrow).addAnimation(fabViewFade);
@@ -26,6 +26,7 @@ const routes: Routes = [{path: '', redirectTo: '/overview', pathMatch: 'full'}];
RouterModule.forRoot(routes, { RouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules, preloadingStrategy: PreloadAllModules,
errorHandler: error => { errorHandler: error => {
console.error(error);
// Handle unknown routes, at the moment this can only be done via window.location // Handle unknown routes, at the moment this can only be done via window.location
if (error.message.includes('Cannot match any routes')) { if (error.message.includes('Cannot match any routes')) {
window.location.href = '/overview'; window.location.href = '/overview';
+4 -6
View File
@@ -33,6 +33,7 @@ import {sampleAuthConfiguration} from './_helpers/data/sample-configuration';
import {StorageProvider} from './modules/storage/storage.provider'; import {StorageProvider} from './modules/storage/storage.provider';
import {SimpleBrowser} from './util/browser.factory'; import {SimpleBrowser} from './util/browser.factory';
import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import {InAppReviewProvider} from './modules/settings/in-app-review/in-app-review.provider';
describe('AppComponent', () => { describe('AppComponent', () => {
let platformReadySpy: any; let platformReadySpy: any;
@@ -40,6 +41,7 @@ describe('AppComponent', () => {
let translateServiceSpy: jasmine.SpyObj<TranslateService>; let translateServiceSpy: jasmine.SpyObj<TranslateService>;
let thingTranslateServiceSpy: jasmine.SpyObj<ThingTranslateService>; let thingTranslateServiceSpy: jasmine.SpyObj<ThingTranslateService>;
let settingsProvider: jasmine.SpyObj<SettingsProvider>; let settingsProvider: jasmine.SpyObj<SettingsProvider>;
let inAppReviewProvider: jasmine.SpyObj<InAppReviewProvider>;
let configProvider: jasmine.SpyObj<ConfigProvider>; let configProvider: jasmine.SpyObj<ConfigProvider>;
let ngxLogger: jasmine.SpyObj<NGXLogger>; let ngxLogger: jasmine.SpyObj<NGXLogger>;
let scheduleSyncServiceSpy: jasmine.SpyObj<ScheduleSyncService>; let scheduleSyncServiceSpy: jasmine.SpyObj<ScheduleSyncService>;
@@ -70,6 +72,7 @@ describe('AppComponent', () => {
configProvider.getAnyValue = jasmine.createSpy().and.callFake(function () { configProvider.getAnyValue = jasmine.createSpy().and.callFake(function () {
return sampleAuthConfiguration; return sampleAuthConfiguration;
}); });
inAppReviewProvider = jasmine.createSpyObj('InAppReviewProvider', ['init']);
ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']); ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']);
storageProvider = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']); storageProvider = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']);
simpleBrowser = jasmine.createSpyObj('SimpleBrowser', ['open']); simpleBrowser = jasmine.createSpyObj('SimpleBrowser', ['open']);
@@ -85,6 +88,7 @@ describe('AppComponent', () => {
{provide: ThingTranslateService, useValue: thingTranslateServiceSpy}, {provide: ThingTranslateService, useValue: thingTranslateServiceSpy},
{provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy}, {provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy},
{provide: SettingsProvider, useValue: settingsProvider}, {provide: SettingsProvider, useValue: settingsProvider},
{provide: InAppReviewProvider, useValue: inAppReviewProvider},
{provide: ConfigProvider, useValue: configProvider}, {provide: ConfigProvider, useValue: configProvider},
{provide: NGXLogger, useValue: ngxLogger}, {provide: NGXLogger, useValue: ngxLogger},
{provide: StorageProvider, useValue: storageProvider}, {provide: StorageProvider, useValue: storageProvider},
@@ -105,11 +109,5 @@ describe('AppComponent', () => {
it('should initialize the app', async () => { it('should initialize the app', async () => {
TestBed.createComponent(AppComponent); TestBed.createComponent(AppComponent);
expect(platformSpy.ready).toHaveBeenCalled(); expect(platformSpy.ready).toHaveBeenCalled();
// await platformReadySpy;
// TODO: https://capacitorjs.com/docs/guides/mocking-plugins
// expect(splashScreenSpy.hide).toHaveBeenCalled();
}); });
// TODO: add more tests!
}); });
+38 -22
View File
@@ -12,27 +12,51 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {AfterContentInit, Component, NgZone} from '@angular/core'; import {AfterContentInit, Component, NgZone, inject} from '@angular/core';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {App, URLOpenListenerEvent} from '@capacitor/app'; import {App, URLOpenListenerEvent} from '@capacitor/app';
import {Platform, ToastController} from '@ionic/angular/standalone'; import {Platform, ToastController} from '@ionic/angular/standalone';
import {SettingsProvider} from './modules/settings/settings.provider'; import {SettingsProvider} from './modules/settings/settings.provider';
import {AuthHelperService} from './modules/auth/auth-helper.service'; import {InAppReviewProvider} from './modules/settings/in-app-review/in-app-review.provider';
import {AuthActions, AuthProvider} from './modules/auth/auth.provider';
import {environment} from '../environments/environment'; import {environment} from '../environments/environment';
import {Capacitor} from '@capacitor/core'; import {Capacitor} from '@capacitor/core';
import {ScheduleSyncService} from './modules/background/schedule/schedule-sync.service'; import {ScheduleSyncService} from './modules/background/schedule/schedule-sync.service';
import {Keyboard, KeyboardResize} from '@capacitor/keyboard'; import {Keyboard, KeyboardResize} from '@capacitor/keyboard';
import {AppVersionService} from './modules/about/app-version.service'; import {AppVersionService} from './modules/about/app-version.service';
import {SplashScreen} from '@capacitor/splash-screen'; import {SplashScreen} from '@capacitor/splash-screen';
import {AuthHelperService} from './modules/auth/auth-helper.service';
/** /**
* TODO * Root component of the application responsible for global initializations,
* deep linking, splash screen management, and global event bindings.
*/ */
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: 'app.component.html', templateUrl: 'app.component.html',
standalone: false,
}) })
export class AppComponent implements AfterContentInit { export class AppComponent implements AfterContentInit {
private readonly platform = inject(Platform);
private readonly settingsProvider = inject(SettingsProvider);
private readonly inAppReviewProvider = inject(InAppReviewProvider);
private readonly router = inject(Router);
private readonly zone = inject(NgZone);
private readonly authProvider = inject(AuthProvider);
private readonly authHelper = inject(AuthHelperService);
private readonly toastController = inject(ToastController);
private readonly scheduleSyncService = inject(ScheduleSyncService);
private readonly versionService = inject(AppVersionService);
/** /**
* TODO * TODO
*/ */
@@ -52,16 +76,7 @@ export class AppComponent implements AfterContentInit {
*/ */
ommitedEventSources = ['ion-input', 'ion-searchbar']; ommitedEventSources = ['ion-input', 'ion-searchbar'];
constructor( constructor() {
private readonly platform: Platform,
private readonly settingsProvider: SettingsProvider,
private readonly router: Router,
private readonly zone: NgZone,
private readonly authHelper: AuthHelperService,
private readonly toastController: ToastController,
private readonly scheduleSyncService: ScheduleSyncService,
private readonly versionService: AppVersionService,
) {
void this.initializeApp(); void this.initializeApp();
} }
@@ -86,6 +101,8 @@ export class AppComponent implements AfterContentInit {
async hideSplash() { async hideSplash() {
if (Capacitor.isNativePlatform()) { if (Capacitor.isNativePlatform()) {
void SplashScreen.hide(); void SplashScreen.hide();
await this.inAppReviewProvider.increaseSessionCount();
void this.inAppReviewProvider.startInAppReviewIfFeasible();
} }
} }
@@ -116,22 +133,21 @@ export class AppComponent implements AfterContentInit {
} }
private async authNotificationsInit() { private async authNotificationsInit() {
this.authHelper this.authProvider.events$.subscribe(action => {
.getProvider('default') const isWarning = action.action === AuthActions.SessionExpired;
.events$.subscribe(action => this.showMessage(this.authHelper.getAuthMessage('default', action)));
this.authHelper void this.showMessage(this.authHelper.getAuthMessage(action), isWarning ? 'warning' : 'success');
.getProvider('paia') });
.events$.subscribe(action => this.showMessage(this.authHelper.getAuthMessage('paia', action)));
} }
private async showMessage(message?: string) { private async showMessage(message: string | undefined, color: 'success' | 'warning' = 'success') {
if (message === undefined) { if (message === undefined) {
return; return;
} }
const toast = await this.toastController.create({ const toast = await this.toastController.create({
message: message, message: message,
duration: 2000, duration: color === 'warning' ? 4000 : 2000,
color: 'success', color,
}); });
await toast.present(); await toast.present();
} }
+8 -15
View File
@@ -15,7 +15,7 @@
import {CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData} from '@angular/common'; import {CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData} from '@angular/common';
import {HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import localeDe from '@angular/common/locales/de'; import localeDe from '@angular/common/locales/de';
import {APP_INITIALIZER, NgModule} from '@angular/core'; import {APP_INITIALIZER, NgModule, inject} 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 {IonicRouteStrategy, Platform, provideIonicAngular, IonApp} from '@ionic/angular/standalone'; import {IonicRouteStrategy, Platform, provideIonicAngular, IonApp} from '@ionic/angular/standalone';
@@ -33,7 +33,6 @@ import {CatalogModule} from './modules/catalog/catalog.module';
import {ConfigProvider} from './modules/config/config.provider'; import {ConfigProvider} from './modules/config/config.provider';
import {DashboardModule} from './modules/dashboard/dashboard.module'; import {DashboardModule} from './modules/dashboard/dashboard.module';
import {DataModule} from './modules/data/data.module'; import {DataModule} from './modules/data/data.module';
import {HebisModule} from './modules/hebis/hebis.module';
import {MapModule} from './modules/map/map.module'; import {MapModule} from './modules/map/map.module';
import {MenuModule} from './modules/menu/menu.module'; import {MenuModule} from './modules/menu/menu.module';
import {NewsModule} from './modules/news/news.module'; import {NewsModule} from './modules/news/news.module';
@@ -53,14 +52,11 @@ import {FeedbackModule} from './modules/feedback/feedback.module';
import {DebugDataCollectorService} from './modules/data/debug-data-collector.service'; import {DebugDataCollectorService} from './modules/data/debug-data-collector.service';
import {AuthModule} from './modules/auth/auth.module'; import {AuthModule} from './modules/auth/auth.module';
import {BackgroundModule} from './modules/background/background.module'; import {BackgroundModule} from './modules/background/background.module';
import {LibraryModule} from './modules/library/library.module';
import {StorageProvider} from './modules/storage/storage.provider'; import {StorageProvider} from './modules/storage/storage.provider';
import {AssessmentsModule} from './modules/assessments/assessments.module'; import {AssessmentsModule} from './modules/assessments/assessments.module';
import {ServiceHandlerInterceptor} from './_helpers/service-handler.interceptor'; import {ServiceHandlerInterceptor} from './_helpers/service-handler.interceptor';
import {RoutingStackService} from './util/routing-stack.service'; import {RoutingStackService} from './util/routing-stack.service';
import {SCLanguageCode, SCSettingValue} from '@openstapps/core'; import {SCLanguageCode, SCSettingValue} from '@openstapps/core';
import {DefaultAuthService} from './modules/auth/default-auth.service';
import {PAIAAuthService} from './modules/auth/paia/paia-auth.service';
import {NavigationModule} from './modules/menu/navigation/navigation.module'; import {NavigationModule} from './modules/menu/navigation/navigation.module';
import {browserFactory, SimpleBrowser} from './util/browser.factory'; import {browserFactory, SimpleBrowser} from './util/browser.factory';
import {getDateFnsLocale} from './translation/dfns-locale'; import {getDateFnsLocale} from './translation/dfns-locale';
@@ -68,8 +64,9 @@ import {setDefaultOptions} from 'date-fns';
import {DateFnsConfigurationService} from 'ngx-date-fns'; import {DateFnsConfigurationService} from 'ngx-date-fns';
import {Capacitor} from '@capacitor/core'; import {Capacitor} from '@capacitor/core';
import {SplashScreen} from '@capacitor/splash-screen'; import {SplashScreen} from '@capacitor/splash-screen';
import maplibregl from 'maplibre-gl'; import * as maplibregl from 'maplibre-gl';
import {Protocol} from 'pmtiles'; import {Protocol} from 'pmtiles';
import {AuthProvider} from './modules/auth/auth.provider';
registerLocaleData(localeDe); registerLocaleData(localeDe);
@@ -85,12 +82,12 @@ export function initializerFactory(
configProvider: ConfigProvider, configProvider: ConfigProvider,
translateService: TranslateService, translateService: TranslateService,
_routingStackService: RoutingStackService, _routingStackService: RoutingStackService,
defaultAuthService: DefaultAuthService, authProvider: AuthProvider,
paiaAuthService: PAIAAuthService,
dateFnsConfigurationService: DateFnsConfigurationService, dateFnsConfigurationService: DateFnsConfigurationService,
) { ) {
return async () => { return async () => {
try { try {
maplibregl.setWorkerUrl(new URL('maplibre-gl-worker.mjs', document.baseURI).href);
maplibregl.addProtocol('pmtiles', new Protocol().tile); maplibregl.addProtocol('pmtiles', new Protocol().tile);
initLogger(logger); initLogger(logger);
await storageProvider.init(); await storageProvider.init();
@@ -114,8 +111,7 @@ export function initializerFactory(
setDefaultOptions({locale: dateFnsLocale}); setDefaultOptions({locale: dateFnsLocale});
dateFnsConfigurationService.setLocale(dateFnsLocale); dateFnsConfigurationService.setLocale(dateFnsLocale);
await defaultAuthService.init(); await authProvider.init();
await paiaAuthService.init();
} catch (error) { } catch (error) {
logger.warn(error); logger.warn(error);
} }
@@ -154,10 +150,8 @@ export function createTranslateLoader(http: HttpClient) {
CommonModule, CommonModule,
DashboardModule, DashboardModule,
DataModule, DataModule,
HebisModule,
JobModule, JobModule,
FavoritesModule, FavoritesModule,
LibraryModule,
ProfilePageModule, ProfilePageModule,
FeedbackModule, FeedbackModule,
MapModule, MapModule,
@@ -207,8 +201,7 @@ export function createTranslateLoader(http: HttpClient) {
ConfigProvider, ConfigProvider,
TranslateService, TranslateService,
RoutingStackService, RoutingStackService,
DefaultAuthService, AuthProvider,
PAIAAuthService,
DateFnsConfigurationService, DateFnsConfigurationService,
], ],
useFactory: initializerFactory, useFactory: initializerFactory,
@@ -223,5 +216,5 @@ export function createTranslateLoader(http: HttpClient) {
], ],
}) })
export class AppModule { export class AppModule {
constructor(public debugDataCollectorService: DebugDataCollectorService) {} debugDataCollectorService = inject(DebugDataCollectorService);
} }
@@ -21,6 +21,7 @@ import {ConfigProvider} from '../config/config.provider';
templateUrl: 'about-changelog.html', templateUrl: 'about-changelog.html',
styleUrls: ['about-changelog.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'], styleUrls: ['about-changelog.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class AboutChangelogComponent { export class AboutChangelogComponent {
config = inject(ConfigProvider); config = inject(ConfigProvider);
@@ -20,6 +20,7 @@ import {License} from './about-licenses.component';
selector: 'about-license-modal', selector: 'about-license-modal',
templateUrl: 'about-license-modal.html', templateUrl: 'about-license-modal.html',
styleUrls: ['about-license-modal.scss'], styleUrls: ['about-license-modal.scss'],
standalone: false,
}) })
export class AboutLicenseModalComponent { export class AboutLicenseModalComponent {
@Input() license: License; @Input() license: License;
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, OnInit} from '@angular/core'; import {Component, OnInit, inject} from '@angular/core';
import {ModalController} from '@ionic/angular/standalone'; import {ModalController} from '@ionic/angular/standalone';
import {AboutLicenseModalComponent} from './about-license-modal.component'; import {AboutLicenseModalComponent} from './about-license-modal.component';
import licensesFile from 'src/assets/about/licenses.json'; import licensesFile from 'src/assets/about/licenses.json';
@@ -32,11 +32,12 @@ export interface License {
selector: 'about-changelog', selector: 'about-changelog',
templateUrl: 'about-licenses.html', templateUrl: 'about-licenses.html',
styleUrls: ['about-licenses.scss', './about-page/about-page.scss'], styleUrls: ['about-licenses.scss', './about-page/about-page.scss'],
standalone: false,
}) })
export class AboutLicensesComponent implements OnInit { export class AboutLicensesComponent implements OnInit {
licenses: License[]; private modalController = inject(ModalController);
constructor(private modalController: ModalController) {} licenses: License[];
ngOnInit() { ngOnInit() {
this.licenses = this.loadLicenses(); this.licenses = this.loadLicenses();
@@ -19,6 +19,7 @@ import {SCAboutPageContent} from '@openstapps/core';
selector: 'about-page-content', selector: 'about-page-content',
templateUrl: 'about-page-content.html', templateUrl: 'about-page-content.html',
styleUrls: ['about-page-content.scss'], styleUrls: ['about-page-content.scss'],
standalone: false,
}) })
export class AboutPageContentComponent { export class AboutPageContentComponent {
@Input() content: SCAboutPageContent; @Input() content: SCAboutPageContent;
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, OnInit} from '@angular/core'; import {Component, OnInit, inject} from '@angular/core';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute} from '@angular/router';
import {SCAboutPage, SCAppConfiguration} from '@openstapps/core'; import {SCAboutPage, SCAppConfiguration} from '@openstapps/core';
import {ConfigProvider} from '../../config/config.provider'; import {ConfigProvider} from '../../config/config.provider';
@@ -25,8 +25,13 @@ import {Capacitor} from '@capacitor/core';
selector: 'about-page', selector: 'about-page',
templateUrl: 'about-page.html', templateUrl: 'about-page.html',
styleUrls: ['about-page.scss'], styleUrls: ['about-page.scss'],
standalone: false,
}) })
export class AboutPageComponent implements OnInit { export class AboutPageComponent implements OnInit {
private readonly route = inject(ActivatedRoute);
private readonly configProvider = inject(ConfigProvider);
content: SCAboutPage; content: SCAboutPage;
name = config.appName; name = config.appName;
@@ -35,11 +40,6 @@ export class AboutPageComponent implements OnInit {
version: string; version: string;
constructor(
private readonly route: ActivatedRoute,
private readonly configProvider: ConfigProvider,
) {}
async ngOnInit() { async ngOnInit() {
const route = this.route.snapshot.url.map(it => it.path).join('/'); const route = this.route.snapshot.url.map(it => it.path).join('/');
this.content = this.content =
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@import '../../../../theme/util/mixins'; @use '../../../../theme/util/mixins';
ion-text { ion-text {
margin-inline: var(--spacing-md); margin-inline: var(--spacing-md);
@@ -64,7 +64,7 @@ ion-text {
.about-changelog, .about-changelog,
.licenses-content, .licenses-content,
.page-content { .page-content {
@include border-radius-in-parallax(var(--border-radius-default)); @include mixins.border-radius-in-parallax(var(--border-radius-default));
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -76,7 +76,7 @@ ion-text {
background: var(--ion-item-background); background: var(--ion-item-background);
& > * { & > * {
@include border-radius-in-parallax(var(--border-radius-default)); @include mixins.border-radius-in-parallax(var(--border-radius-default));
position: relative; position: relative;
overflow: hidden; overflow: hidden;
@@ -21,6 +21,7 @@ import {ConfigProvider} from '../config/config.provider';
templateUrl: 'about-release-notes.html', templateUrl: 'about-release-notes.html',
styleUrls: ['about-release-notes.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'], styleUrls: ['about-release-notes.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class AboutReleaseNotesComponent { export class AboutReleaseNotesComponent {
config = inject(ConfigProvider); config = inject(ConfigProvider);
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@import '../../../theme/util/mixins'; @use '../../../theme/util/mixins';
ion-button { ion-button {
--color: var(--ion-color-primary-contrast); --color: var(--ion-color-primary-contrast);
@@ -22,7 +22,7 @@ ion-button {
} }
.release-notes { .release-notes {
@include border-radius-in-parallax(var(--border-radius-default)); @include mixins.border-radius-in-parallax(var(--border-radius-default));
display: block; display: block;
margin: var(--spacing-md); margin: var(--spacing-md);
@@ -1,4 +1,4 @@
import {Injectable} from '@angular/core'; import {Injectable, inject} from '@angular/core';
import {StorageProvider} from '../storage/storage.provider'; import {StorageProvider} from '../storage/storage.provider';
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {ModalController} from '@ionic/angular/standalone'; import {ModalController} from '@ionic/angular/standalone';
@@ -12,11 +12,11 @@ export const RELEASE_NOTES_SHOWN_KEY = 'release_notes_shown';
@Injectable({providedIn: 'root'}) @Injectable({providedIn: 'root'})
export class AppVersionService { export class AppVersionService {
constructor( private storage = inject(StorageProvider);
private storage: StorageProvider,
private config: ConfigProvider, private config = inject(ConfigProvider);
private modalController: ModalController,
) {} private modalController = inject(ModalController);
/** /**
* Get the latest release notes that have not been presented yet * Get the latest release notes that have not been presented yet
@@ -1,7 +1,3 @@
.release-notes {
max-width: 16cm;
}
.release-notes ::ng-deep { .release-notes ::ng-deep {
h1 { h1 {
font-size: 1.5em; font-size: 1.5em;
@@ -20,7 +16,7 @@
} }
blockquote { blockquote {
background: var(--ion-item-background);
border-left: 0.25em solid var(--ion-color-medium); border-left: 0.25em solid var(--ion-color-medium);
background: var(--ion-item-background);
} }
} }

Some files were not shown because too many files have changed in this diff Show More