@tramvai/module-progressive-web-app 2.109.0 → 2.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -42
- package/lib/manifest/server.es.js +20 -1
- package/lib/manifest/server.js +20 -1
- package/lib/workbox/browser.browser.js +36 -23
- package/lib/workbox/server.es.js +31 -1
- package/lib/workbox/server.js +30 -0
- package/lib/workbox/shared.browser.js +0 -2
- package/lib/workbox/shared.es.js +0 -2
- package/lib/workbox/shared.js +0 -2
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,56 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @tramvai/module-progressive-web-app
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Progressiwe Web App module.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Complete documentation is available in [PWA page](03-features/017-pwa.md).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
You need to install `@tramvai/module-progressive-web-app` module:
|
|
8
10
|
|
|
9
11
|
```bash
|
|
10
|
-
|
|
12
|
+
npx tramvai add @tramvai/module-progressive-web-app
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
Then, connect `TramvaiPwaModule` from this package to `createApp` function:
|
|
14
16
|
|
|
15
|
-
```
|
|
17
|
+
```ts
|
|
16
18
|
import { createApp } from '@tramvai/core';
|
|
17
19
|
import { TramvaiPwaModule } from '@tramvai/module-progressive-web-app';
|
|
18
20
|
|
|
19
21
|
createApp({
|
|
20
22
|
name: 'tincoin',
|
|
21
|
-
modules: [
|
|
23
|
+
modules: [TramvaiPwaModule],
|
|
22
24
|
});
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Переменные окружения
|
|
26
|
-
|
|
27
|
-
- `SOME_ENV` - описание
|
|
28
|
-
|
|
29
|
-
## Explanation
|
|
30
|
-
<!-- Цель: Рассказать подробно про доступные фичи в этой библиотеке -->
|
|
31
|
-
<!-- О чем написать: Рассмотреть подробно основные фичи которые есть в библиотеке и рассказать как они работают и их особенности. Лучше акцентировать внимание на самих фичах, а не на том, как можно проинтегрировать или использовать (для этого есть раздел How to) -->
|
|
32
|
-
|
|
33
|
-
### Супер фича
|
|
34
|
-
|
|
35
|
-
Что делает эта фича и как эта фича будет полезна пользователю?
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
## API
|
|
39
|
-
<!-- Цель: Подробно расписать интерфейс библиотеки -->
|
|
40
|
-
<!-- О чем написать: Описать интерфейс библиотеки какие есть поля и что они означают. -->
|
|
41
|
-
|
|
42
|
-
### createApp
|
|
43
|
-
|
|
44
|
-
Описание интерфейсов и способ использований
|
|
45
|
-
|
|
46
|
-
## How to
|
|
47
|
-
<!-- Цель: ответить на вопрос как сделать что-то или как решить определенную проблему -->
|
|
48
|
-
<!-- О чем написать: рассмотреть основные вопросы, которые могут возниктуь у нового пользователя -->
|
|
49
|
-
### Как можно сделать что-то и решить проблему?
|
|
50
|
-
|
|
51
|
-
Стоит описывать различные кейсы пользователей и как их можно решить
|
|
52
|
-
|
|
53
|
-
## Экспортируемые токены
|
|
54
|
-
<!-- Цель: Вывести все доступные токены -->
|
|
55
|
-
|
|
56
|
-
@inline src/tokens.ts
|
|
25
|
+
```
|
|
@@ -4,6 +4,14 @@ import { PROXY_CONFIG_TOKEN } from '@tramvai/tokens-server';
|
|
|
4
4
|
import { appConfig } from '@tramvai/cli/lib/external/config';
|
|
5
5
|
import { PWA_MANIFEST_URL_TOKEN, PWA_SW_SCOPE_TOKEN } from '../tokens.es.js';
|
|
6
6
|
|
|
7
|
+
const validateRelativeUrl = (url) => {
|
|
8
|
+
if (!url.startsWith('/')) {
|
|
9
|
+
throw new Error(`Webmanifest url should start from "/", got ${url}`);
|
|
10
|
+
}
|
|
11
|
+
if (!(url.endsWith('.json') || url.endsWith('.webmanifest'))) {
|
|
12
|
+
throw new Error(`Webmanifest url should has .json or .webmanifest extension, got ${url}`);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
7
15
|
const TramvaiPwaManifestModule = declareModule({
|
|
8
16
|
name: 'TramvaiPwaManifestModule',
|
|
9
17
|
providers: [
|
|
@@ -51,13 +59,24 @@ const TramvaiPwaManifestModule = declareModule({
|
|
|
51
59
|
const normalizedUrl = manifestDest.startsWith('/') ? manifestDest : `/${manifestDest}`;
|
|
52
60
|
const normalizedScope = swScope.replace(/\/$/, '');
|
|
53
61
|
const finalUrl = `${normalizedScope}${normalizedUrl}`;
|
|
54
|
-
// @todo check that finalUrl is relative and ends with .json or .webmanifest and no slash duplicates
|
|
55
62
|
return finalUrl;
|
|
56
63
|
},
|
|
57
64
|
deps: {
|
|
58
65
|
swScope: PWA_SW_SCOPE_TOKEN,
|
|
59
66
|
},
|
|
60
67
|
}),
|
|
68
|
+
provide({
|
|
69
|
+
provide: commandLineListTokens.init,
|
|
70
|
+
useFactory: ({ manifestUrl }) => function validateSwUrlAndScope() {
|
|
71
|
+
if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
validateRelativeUrl(manifestUrl);
|
|
75
|
+
},
|
|
76
|
+
deps: {
|
|
77
|
+
manifestUrl: PWA_MANIFEST_URL_TOKEN,
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
61
80
|
],
|
|
62
81
|
});
|
|
63
82
|
|
package/lib/manifest/server.js
CHANGED
|
@@ -8,6 +8,14 @@ var tokensServer = require('@tramvai/tokens-server');
|
|
|
8
8
|
var config = require('@tramvai/cli/lib/external/config');
|
|
9
9
|
var tokens = require('../tokens.js');
|
|
10
10
|
|
|
11
|
+
const validateRelativeUrl = (url) => {
|
|
12
|
+
if (!url.startsWith('/')) {
|
|
13
|
+
throw new Error(`Webmanifest url should start from "/", got ${url}`);
|
|
14
|
+
}
|
|
15
|
+
if (!(url.endsWith('.json') || url.endsWith('.webmanifest'))) {
|
|
16
|
+
throw new Error(`Webmanifest url should has .json or .webmanifest extension, got ${url}`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
11
19
|
const TramvaiPwaManifestModule = core.declareModule({
|
|
12
20
|
name: 'TramvaiPwaManifestModule',
|
|
13
21
|
providers: [
|
|
@@ -55,13 +63,24 @@ const TramvaiPwaManifestModule = core.declareModule({
|
|
|
55
63
|
const normalizedUrl = manifestDest.startsWith('/') ? manifestDest : `/${manifestDest}`;
|
|
56
64
|
const normalizedScope = swScope.replace(/\/$/, '');
|
|
57
65
|
const finalUrl = `${normalizedScope}${normalizedUrl}`;
|
|
58
|
-
// @todo check that finalUrl is relative and ends with .json or .webmanifest and no slash duplicates
|
|
59
66
|
return finalUrl;
|
|
60
67
|
},
|
|
61
68
|
deps: {
|
|
62
69
|
swScope: tokens.PWA_SW_SCOPE_TOKEN,
|
|
63
70
|
},
|
|
64
71
|
}),
|
|
72
|
+
core.provide({
|
|
73
|
+
provide: core.commandLineListTokens.init,
|
|
74
|
+
useFactory: ({ manifestUrl }) => function validateSwUrlAndScope() {
|
|
75
|
+
if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
validateRelativeUrl(manifestUrl);
|
|
79
|
+
},
|
|
80
|
+
deps: {
|
|
81
|
+
manifestUrl: tokens.PWA_MANIFEST_URL_TOKEN,
|
|
82
|
+
},
|
|
83
|
+
}),
|
|
65
84
|
],
|
|
66
85
|
});
|
|
67
86
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { declareModule, provide, Scope, optional, commandLineListTokens } from '@tramvai/core';
|
|
2
2
|
import { MODERN_SATISFIES_TOKEN } from '@tramvai/tokens-render';
|
|
3
|
-
import { ENV_MANAGER_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { ENV_MANAGER_TOKEN, LOGGER_TOKEN } from '@tramvai/tokens-common';
|
|
4
4
|
import { PWA_WORKBOX_TOKEN, PWA_SW_URL_TOKEN, PWA_SW_SCOPE_TOKEN, PWA_SW_PARAMS_TOKEN } from '../tokens.browser.js';
|
|
5
5
|
import { providers } from './shared.browser.js';
|
|
6
6
|
|
|
@@ -11,14 +11,19 @@ const TramvaiPwaWorkboxModule = declareModule({
|
|
|
11
11
|
provide({
|
|
12
12
|
provide: PWA_WORKBOX_TOKEN,
|
|
13
13
|
scope: Scope.SINGLETON,
|
|
14
|
-
useFactory: ({ swUrl, swScope, modern, swParams, envManager }) => {
|
|
14
|
+
useFactory: ({ swUrl, swScope, modern, swParams, envManager, logger }) => {
|
|
15
|
+
const log = logger('pwa:workbox');
|
|
15
16
|
let workbox = null;
|
|
16
17
|
return async () => {
|
|
17
18
|
if (!('serviceWorker' in navigator)) {
|
|
18
|
-
|
|
19
|
+
log.info('Service Worker is not supported');
|
|
19
20
|
return workbox;
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
if (workbox) {
|
|
23
|
+
return workbox;
|
|
24
|
+
}
|
|
25
|
+
const { Workbox } = await import(
|
|
26
|
+
/* webpackChunkName: "tramvai-workbox-window" */ 'workbox-window/Workbox');
|
|
22
27
|
const hasModernBuild = !!process.env.TRAMVAI_MODERN_BUILD;
|
|
23
28
|
const isCsrMode = envManager.get('TRAMVAI_FORCE_CLIENT_SIDE_RENDERING') === 'true';
|
|
24
29
|
// tramvai modern build is not supported for CSR and not compatible with PWA module in CSR mode
|
|
@@ -49,35 +54,43 @@ const TramvaiPwaWorkboxModule = declareModule({
|
|
|
49
54
|
modern: MODERN_SATISFIES_TOKEN,
|
|
50
55
|
swParams: optional(PWA_SW_PARAMS_TOKEN),
|
|
51
56
|
envManager: ENV_MANAGER_TOKEN,
|
|
57
|
+
logger: LOGGER_TOKEN,
|
|
52
58
|
},
|
|
53
59
|
}),
|
|
54
60
|
provide({
|
|
55
61
|
provide: commandLineListTokens.init,
|
|
56
|
-
useFactory: ({ workbox }) =>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
const wb = await workbox();
|
|
63
|
-
if (!wb) {
|
|
64
|
-
// @todo: logs
|
|
62
|
+
useFactory: ({ workbox, logger }) => {
|
|
63
|
+
const log = logger('pwa:workbox');
|
|
64
|
+
return async function registerWorkbox() {
|
|
65
|
+
if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
try {
|
|
69
|
+
const wb = await workbox();
|
|
70
|
+
if (!wb) {
|
|
71
|
+
log.info('Service Worker registration stopped');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// @todo unregister when Workbox is disabled in config !!!
|
|
75
|
+
// https://github.com/nuxt-community/pwa-module/blob/main/templates/workbox/workbox.unregister.js
|
|
76
|
+
await wb.register();
|
|
77
|
+
// @todo support force update strategies?
|
|
78
|
+
if (process.env.NODE_ENV === 'development') {
|
|
79
|
+
await wb.update();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
log.error({
|
|
84
|
+
event: 'register-failed',
|
|
85
|
+
message: 'Service Worker registration failed',
|
|
86
|
+
error,
|
|
87
|
+
});
|
|
73
88
|
}
|
|
74
|
-
}
|
|
75
|
-
catch (e) {
|
|
76
|
-
// @todo: logs
|
|
77
|
-
}
|
|
89
|
+
};
|
|
78
90
|
},
|
|
79
91
|
deps: {
|
|
80
92
|
workbox: PWA_WORKBOX_TOKEN,
|
|
93
|
+
logger: LOGGER_TOKEN,
|
|
81
94
|
},
|
|
82
95
|
}),
|
|
83
96
|
],
|
package/lib/workbox/server.es.js
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
|
-
import { declareModule, provide, Scope } from '@tramvai/core';
|
|
1
|
+
import { declareModule, provide, Scope, commandLineListTokens } from '@tramvai/core';
|
|
2
2
|
import { PROXY_CONFIG_TOKEN } from '@tramvai/tokens-server';
|
|
3
3
|
import { appConfig } from '@tramvai/cli/lib/external/config';
|
|
4
4
|
import { PWA_SW_URL_TOKEN, PWA_SW_SCOPE_TOKEN } from '../tokens.es.js';
|
|
5
5
|
import { providers } from './shared.es.js';
|
|
6
6
|
|
|
7
|
+
const validateSwScope = (scope) => {
|
|
8
|
+
if (!scope.startsWith('/')) {
|
|
9
|
+
throw new Error(`Service Worker scope should start from "/", got ${scope}`);
|
|
10
|
+
}
|
|
11
|
+
if (!scope.endsWith('/')) {
|
|
12
|
+
throw new Error(`Service Worker scope should ends with slash, got ${scope}`);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const validateRelativeUrl = (url) => {
|
|
16
|
+
if (!url.startsWith('/')) {
|
|
17
|
+
throw new Error(`Service Worker url should start from "/", got ${url}`);
|
|
18
|
+
}
|
|
19
|
+
if (!url.endsWith('.js')) {
|
|
20
|
+
throw new Error(`Service Worker url should has .js extension, got ${url}`);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
7
23
|
const TramvaiPwaWorkboxModule = declareModule({
|
|
8
24
|
name: 'TramvaiPwaWorkboxModule',
|
|
9
25
|
providers: [
|
|
@@ -26,6 +42,20 @@ const TramvaiPwaWorkboxModule = declareModule({
|
|
|
26
42
|
swScope: PWA_SW_SCOPE_TOKEN,
|
|
27
43
|
},
|
|
28
44
|
}),
|
|
45
|
+
provide({
|
|
46
|
+
provide: commandLineListTokens.init,
|
|
47
|
+
useFactory: ({ swUrl, swScope }) => function validateSwUrlAndScope() {
|
|
48
|
+
if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
validateSwScope(swScope);
|
|
52
|
+
validateRelativeUrl(swUrl);
|
|
53
|
+
},
|
|
54
|
+
deps: {
|
|
55
|
+
swUrl: PWA_SW_URL_TOKEN,
|
|
56
|
+
swScope: PWA_SW_SCOPE_TOKEN,
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
29
59
|
],
|
|
30
60
|
});
|
|
31
61
|
|
package/lib/workbox/server.js
CHANGED
|
@@ -8,6 +8,22 @@ var config = require('@tramvai/cli/lib/external/config');
|
|
|
8
8
|
var tokens = require('../tokens.js');
|
|
9
9
|
var shared = require('./shared.js');
|
|
10
10
|
|
|
11
|
+
const validateSwScope = (scope) => {
|
|
12
|
+
if (!scope.startsWith('/')) {
|
|
13
|
+
throw new Error(`Service Worker scope should start from "/", got ${scope}`);
|
|
14
|
+
}
|
|
15
|
+
if (!scope.endsWith('/')) {
|
|
16
|
+
throw new Error(`Service Worker scope should ends with slash, got ${scope}`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const validateRelativeUrl = (url) => {
|
|
20
|
+
if (!url.startsWith('/')) {
|
|
21
|
+
throw new Error(`Service Worker url should start from "/", got ${url}`);
|
|
22
|
+
}
|
|
23
|
+
if (!url.endsWith('.js')) {
|
|
24
|
+
throw new Error(`Service Worker url should has .js extension, got ${url}`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
11
27
|
const TramvaiPwaWorkboxModule = core.declareModule({
|
|
12
28
|
name: 'TramvaiPwaWorkboxModule',
|
|
13
29
|
providers: [
|
|
@@ -30,6 +46,20 @@ const TramvaiPwaWorkboxModule = core.declareModule({
|
|
|
30
46
|
swScope: tokens.PWA_SW_SCOPE_TOKEN,
|
|
31
47
|
},
|
|
32
48
|
}),
|
|
49
|
+
core.provide({
|
|
50
|
+
provide: core.commandLineListTokens.init,
|
|
51
|
+
useFactory: ({ swUrl, swScope }) => function validateSwUrlAndScope() {
|
|
52
|
+
if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
validateSwScope(swScope);
|
|
56
|
+
validateRelativeUrl(swUrl);
|
|
57
|
+
},
|
|
58
|
+
deps: {
|
|
59
|
+
swUrl: tokens.PWA_SW_URL_TOKEN,
|
|
60
|
+
swScope: tokens.PWA_SW_SCOPE_TOKEN,
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
33
63
|
],
|
|
34
64
|
});
|
|
35
65
|
|
|
@@ -6,7 +6,6 @@ const providers = [
|
|
|
6
6
|
provide: PWA_SW_SCOPE_TOKEN,
|
|
7
7
|
useFactory: () => {
|
|
8
8
|
const swScope = process.env.TRAMVAI_PWA_SW_SCOPE;
|
|
9
|
-
// @todo validate
|
|
10
9
|
return swScope;
|
|
11
10
|
},
|
|
12
11
|
}),
|
|
@@ -17,7 +16,6 @@ const providers = [
|
|
|
17
16
|
const normalizedUrl = swDest.startsWith('/') ? swDest : `/${swDest}`;
|
|
18
17
|
const normalizedScope = swScope.replace(/\/$/, '');
|
|
19
18
|
const finalUrl = `${normalizedScope}${normalizedUrl}`;
|
|
20
|
-
// @todo check that finalUrl is relative and ends with .js and no slash duplicates
|
|
21
19
|
return finalUrl;
|
|
22
20
|
},
|
|
23
21
|
deps: {
|
package/lib/workbox/shared.es.js
CHANGED
|
@@ -6,7 +6,6 @@ const providers = [
|
|
|
6
6
|
provide: PWA_SW_SCOPE_TOKEN,
|
|
7
7
|
useFactory: () => {
|
|
8
8
|
const swScope = process.env.TRAMVAI_PWA_SW_SCOPE;
|
|
9
|
-
// @todo validate
|
|
10
9
|
return swScope;
|
|
11
10
|
},
|
|
12
11
|
}),
|
|
@@ -17,7 +16,6 @@ const providers = [
|
|
|
17
16
|
const normalizedUrl = swDest.startsWith('/') ? swDest : `/${swDest}`;
|
|
18
17
|
const normalizedScope = swScope.replace(/\/$/, '');
|
|
19
18
|
const finalUrl = `${normalizedScope}${normalizedUrl}`;
|
|
20
|
-
// @todo check that finalUrl is relative and ends with .js and no slash duplicates
|
|
21
19
|
return finalUrl;
|
|
22
20
|
},
|
|
23
21
|
deps: {
|
package/lib/workbox/shared.js
CHANGED
|
@@ -10,7 +10,6 @@ const providers = [
|
|
|
10
10
|
provide: tokens.PWA_SW_SCOPE_TOKEN,
|
|
11
11
|
useFactory: () => {
|
|
12
12
|
const swScope = process.env.TRAMVAI_PWA_SW_SCOPE;
|
|
13
|
-
// @todo validate
|
|
14
13
|
return swScope;
|
|
15
14
|
},
|
|
16
15
|
}),
|
|
@@ -21,7 +20,6 @@ const providers = [
|
|
|
21
20
|
const normalizedUrl = swDest.startsWith('/') ? swDest : `/${swDest}`;
|
|
22
21
|
const normalizedScope = swScope.replace(/\/$/, '');
|
|
23
22
|
const finalUrl = `${normalizedScope}${normalizedUrl}`;
|
|
24
|
-
// @todo check that finalUrl is relative and ends with .js and no slash duplicates
|
|
25
23
|
return finalUrl;
|
|
26
24
|
},
|
|
27
25
|
deps: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tramvai/module-progressive-web-app",
|
|
3
|
-
"version": "2.109.
|
|
3
|
+
"version": "2.109.1",
|
|
4
4
|
"description": "Pwa integration - SW, manifest, icons and meta",
|
|
5
5
|
"browser": "lib/browser.js",
|
|
6
6
|
"main": "lib/server.js",
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
"registry": "https://registry.npmjs.org/"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@tramvai/tokens-common": "2.109.
|
|
27
|
-
"@tramvai/tokens-render": "2.109.
|
|
28
|
-
"@tramvai/tokens-server": "2.109.
|
|
26
|
+
"@tramvai/tokens-common": "2.109.1",
|
|
27
|
+
"@tramvai/tokens-render": "2.109.1",
|
|
28
|
+
"@tramvai/tokens-server": "2.109.1",
|
|
29
29
|
"workbox-window": "^6.4.1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@tramvai/cli": "2.109.
|
|
34
|
-
"@tramvai/core": "2.109.
|
|
33
|
+
"@tramvai/cli": "2.109.1",
|
|
34
|
+
"@tramvai/core": "2.109.1",
|
|
35
35
|
"@tinkoff/dippy": "0.8.15",
|
|
36
36
|
"tslib": "^2.4.0"
|
|
37
37
|
}
|