@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 CHANGED
@@ -1,56 +1,25 @@
1
- # Pwa
1
+ # @tramvai/module-progressive-web-app
2
2
 
3
- Pwa integration sw manifest icons meta
3
+ Progressiwe Web App module.
4
4
 
5
- ## Подключение
5
+ Complete documentation is available in [PWA page](03-features/017-pwa.md).
6
6
 
7
- Необходимо установить `@tramvai/module-progressive-web-app`
7
+ ## Installation
8
+
9
+ You need to install `@tramvai/module-progressive-web-app` module:
8
10
 
9
11
  ```bash
10
- yarn add @tramvai/module-progressive-web-app
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
- ```tsx
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: [ TramvaiPwaModule ],
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
 
@@ -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
- // @todo: logs
19
+ log.info('Service Worker is not supported');
19
20
  return workbox;
20
21
  }
21
- const { Workbox } = await import('workbox-window/Workbox');
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 }) => async function registerWorkbox() {
57
- // @todo why boolean here?
58
- if (!process.env.TRAMVAI_PWA_WORKBOX_ENABLED) {
59
- return;
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
- // @todo unregister when Workbox is disabled in config !!!
68
- // https://github.com/nuxt-community/pwa-module/blob/main/templates/workbox/workbox.unregister.js
69
- await wb.register();
70
- // @todo support force update strategies?
71
- if (process.env.NODE_ENV === 'development') {
72
- await wb.update();
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
  ],
@@ -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
 
@@ -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: {
@@ -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: {
@@ -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.0",
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.0",
27
- "@tramvai/tokens-render": "2.109.0",
28
- "@tramvai/tokens-server": "2.109.0",
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.0",
34
- "@tramvai/core": "2.109.0",
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
  }