swpp-backends 3.0.0-alpha.1 → 3.0.0-alpha.3

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/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AllowNotFoundEnum = exports.CompilationEnv = exports.CrossDepCode = exports.CrossEnv = exports.RuntimeDepCode = exports.RuntimeCoreCode = exports.RuntimeEventCode = exports.RuntimeKeyValueDatabase = exports.KeyValueDatabase = exports.defineIndivisibleConfig = exports.defineRuntimeEvent = exports.defineRuntimeCore = exports.defineRuntimeDep = exports.defineCrossDep = exports.defineCrossEnv = exports.defineConfig = exports.defineCompilationEnv = exports.ConfigLoader = exports.FiniteConcurrencyFetcher = exports.RuntimeData = exports.SwCompiler = exports.FileParserRegistry = exports.JsonBuilder = exports.FileUpdateTracker = exports.ResourcesScanner = exports.utils = exports.version = void 0;
3
+ exports.defineCompilationEnv = exports.defineCrossEnv = exports.defineRuntimeDep = exports.defineCrossDep = exports.defineRuntimeCore = exports.defineDomConfig = exports.defineRuntimeEvent = exports.defineConfig = exports.defineIndivisibleConfig = exports.DomCode = exports.AllowNotFoundEnum = exports.CompilationEnv = exports.CrossDepCode = exports.CrossEnv = exports.RuntimeDepCode = exports.RuntimeCoreCode = exports.RuntimeEventCode = exports.RuntimeKeyValueDatabase = exports.KeyValueDatabase = exports.ConfigLoader = exports.FiniteConcurrencyFetcher = exports.RuntimeData = exports.SwCompiler = exports.FileParserRegistry = exports.JsonBuilder = exports.FileUpdateTracker = exports.ResourcesScanner = exports.utils = exports.swppVersion = void 0;
4
4
  const untils_1 = require("./swpp/untils");
5
5
  /** 版本号 */
6
- exports.version = require('../package.json').version;
6
+ exports.swppVersion = require('../package.json').version;
7
7
  var untils_2 = require("./swpp/untils");
8
8
  Object.defineProperty(exports, "utils", { enumerable: true, get: function () { return untils_2.utils; } });
9
9
  var ResourcesScanner_1 = require("./swpp/ResourcesScanner");
@@ -20,14 +20,6 @@ var NetworkFileHandler_1 = require("./swpp/NetworkFileHandler");
20
20
  Object.defineProperty(exports, "FiniteConcurrencyFetcher", { enumerable: true, get: function () { return NetworkFileHandler_1.FiniteConcurrencyFetcher; } });
21
21
  var ConfigLoader_1 = require("./swpp/config/ConfigLoader");
22
22
  Object.defineProperty(exports, "ConfigLoader", { enumerable: true, get: function () { return ConfigLoader_1.ConfigLoader; } });
23
- Object.defineProperty(exports, "defineCompilationEnv", { enumerable: true, get: function () { return ConfigLoader_1.defineCompilationEnv; } });
24
- Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return ConfigLoader_1.defineConfig; } });
25
- Object.defineProperty(exports, "defineCrossEnv", { enumerable: true, get: function () { return ConfigLoader_1.defineCrossEnv; } });
26
- Object.defineProperty(exports, "defineCrossDep", { enumerable: true, get: function () { return ConfigLoader_1.defineCrossDep; } });
27
- Object.defineProperty(exports, "defineRuntimeDep", { enumerable: true, get: function () { return ConfigLoader_1.defineRuntimeDep; } });
28
- Object.defineProperty(exports, "defineRuntimeCore", { enumerable: true, get: function () { return ConfigLoader_1.defineRuntimeCore; } });
29
- Object.defineProperty(exports, "defineRuntimeEvent", { enumerable: true, get: function () { return ConfigLoader_1.defineRuntimeEvent; } });
30
- Object.defineProperty(exports, "defineIndivisibleConfig", { enumerable: true, get: function () { return ConfigLoader_1.defineIndivisibleConfig; } });
31
23
  var KeyValueDatabase_1 = require("./swpp/database/KeyValueDatabase");
32
24
  Object.defineProperty(exports, "KeyValueDatabase", { enumerable: true, get: function () { return KeyValueDatabase_1.KeyValueDatabase; } });
33
25
  var RuntimeKeyValueDatabase_1 = require("./swpp/database/RuntimeKeyValueDatabase");
@@ -45,4 +37,16 @@ Object.defineProperty(exports, "CrossDepCode", { enumerable: true, get: function
45
37
  var CompilationEnv_1 = require("./swpp/database/CompilationEnv");
46
38
  Object.defineProperty(exports, "CompilationEnv", { enumerable: true, get: function () { return CompilationEnv_1.CompilationEnv; } });
47
39
  Object.defineProperty(exports, "AllowNotFoundEnum", { enumerable: true, get: function () { return CompilationEnv_1.AllowNotFoundEnum; } });
48
- untils_1.utils.printInfo('INDEX', `欢迎使用 swpp@${exports.version}`);
40
+ var DomCode_1 = require("./swpp/database/DomCode");
41
+ Object.defineProperty(exports, "DomCode", { enumerable: true, get: function () { return DomCode_1.DomCode; } });
42
+ untils_1.utils.printInfo('INDEX', `欢迎使用 swpp@${exports.swppVersion}`);
43
+ var ConfigCluster_1 = require("./swpp/config/ConfigCluster");
44
+ Object.defineProperty(exports, "defineIndivisibleConfig", { enumerable: true, get: function () { return ConfigCluster_1.defineIndivisibleConfig; } });
45
+ Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return ConfigCluster_1.defineConfig; } });
46
+ Object.defineProperty(exports, "defineRuntimeEvent", { enumerable: true, get: function () { return ConfigCluster_1.defineRuntimeEvent; } });
47
+ Object.defineProperty(exports, "defineDomConfig", { enumerable: true, get: function () { return ConfigCluster_1.defineDomConfig; } });
48
+ Object.defineProperty(exports, "defineRuntimeCore", { enumerable: true, get: function () { return ConfigCluster_1.defineRuntimeCore; } });
49
+ Object.defineProperty(exports, "defineCrossDep", { enumerable: true, get: function () { return ConfigCluster_1.defineCrossDep; } });
50
+ Object.defineProperty(exports, "defineRuntimeDep", { enumerable: true, get: function () { return ConfigCluster_1.defineRuntimeDep; } });
51
+ Object.defineProperty(exports, "defineCrossEnv", { enumerable: true, get: function () { return ConfigCluster_1.defineCrossEnv; } });
52
+ Object.defineProperty(exports, "defineCompilationEnv", { enumerable: true, get: function () { return ConfigCluster_1.defineCompilationEnv; } });
@@ -17,7 +17,7 @@ class JsonBuilder {
17
17
  }
18
18
  // noinspection JSUnusedGlobalSymbols
19
19
  async buildJson() {
20
- const json = await this.compilation.compilationEnv.read('VERSION_FILE')();
20
+ const json = await this.compilation.compilationEnv.read('VERSION_FILE').fetcher();
21
21
  if (json.info.length == 0) {
22
22
  json.info.push({ version: 1 });
23
23
  return json;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineConfig = defineConfig;
4
+ exports.defineCompilationEnv = defineCompilationEnv;
5
+ exports.defineCrossEnv = defineCrossEnv;
6
+ exports.defineRuntimeDep = defineRuntimeDep;
7
+ exports.defineCrossDep = defineCrossDep;
8
+ exports.defineRuntimeCore = defineRuntimeCore;
9
+ exports.defineDomConfig = defineDomConfig;
10
+ exports.defineRuntimeEvent = defineRuntimeEvent;
11
+ exports.defineIndivisibleConfig = defineIndivisibleConfig;
12
+ const ConfigLoader_1 = require("./ConfigLoader");
13
+ /** 定义一个通过 `export default` 导出的配置 */
14
+ function defineConfig(config) {
15
+ return config;
16
+ }
17
+ /** 定义一个通过 `export const compilationEnv` 导出的配置 */
18
+ function defineCompilationEnv(config) {
19
+ return config;
20
+ }
21
+ /** 定义一个通过 `export const crossEnv` 导出的配置 */
22
+ function defineCrossEnv(config) {
23
+ return config;
24
+ }
25
+ /** 定义一个通过 `export const runtimeDep` 导出的配置 */
26
+ function defineRuntimeDep(config) {
27
+ return config;
28
+ }
29
+ /** 定义一个通过 `export const crossDep` 导出的配置 */
30
+ function defineCrossDep(config) {
31
+ return config;
32
+ }
33
+ /** 定义一个通过 `export const runtimeCore` 导出的配置 */
34
+ function defineRuntimeCore(config) {
35
+ return config;
36
+ }
37
+ /** 定义一个通过 `export const domConfig` 导出的配置 */
38
+ function defineDomConfig(config) {
39
+ return config;
40
+ }
41
+ /** 定义一个通过 `export const runtimeEvent` 导出的配置 */
42
+ function defineRuntimeEvent(config) {
43
+ return config;
44
+ }
45
+ /**
46
+ * 定义一个无法分割的对象配置,这对一些强依赖对象内部属性的设置很有用,可以避免对象被错误地拼接。
47
+ *
48
+ * 默认情况下,当定义一个对象配置时,将允许从其它配置文件中合并一部分配置到对象中,比如:
49
+ *
50
+ * ```typescript
51
+ * // 当前配置
52
+ * exampleConfig.obj = {
53
+ * value1: 'hello world'
54
+ * }
55
+ * // 如果还有一个配置文件中也声明了这个配置
56
+ * exampleConfig.obj = {
57
+ * value2: 'hello swpp'
58
+ * }
59
+ * // 最终将合并生成如下配置
60
+ * exampleConfig.obj = {
61
+ * value1: 'hello world',
62
+ * value2: 'hello swpp'
63
+ * }
64
+ * ```
65
+ *
66
+ * 通过该函数,可以禁止 swpp 合并配置时仅选取对象的部分字段,要么全部使用 [value] 的值,要么完全不使用 [value] 的值。
67
+ *
68
+ * 放入到上述例子中,假如两个 obj 任意一个或多个通过 `defineIndivisibleConfig({ xxx: xxx })` 设置,最终的值将取决于两个配置文件的优先级,
69
+ * 若 `value2` 的优先级高将产生:
70
+ *
71
+ * ```typescript
72
+ * // 最终结果
73
+ * exampleConfig.obj = {
74
+ * value2: 'hello swpp'
75
+ * }
76
+ * ```
77
+ */
78
+ function defineIndivisibleConfig(value) {
79
+ Object.defineProperty(value, ConfigLoader_1.IndivisibleName, {
80
+ value: true,
81
+ writable: false,
82
+ configurable: false,
83
+ enumerable: false
84
+ });
85
+ return value;
86
+ }
@@ -3,21 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ConfigLoader = void 0;
7
- exports.defineConfig = defineConfig;
8
- exports.defineCompilationEnv = defineCompilationEnv;
9
- exports.defineCrossEnv = defineCrossEnv;
10
- exports.defineRuntimeDep = defineRuntimeDep;
11
- exports.defineCrossDep = defineCrossDep;
12
- exports.defineRuntimeCore = defineRuntimeCore;
13
- exports.defineRuntimeEvent = defineRuntimeEvent;
14
- exports.defineIndivisibleConfig = defineIndivisibleConfig;
6
+ exports.ConfigLoader = exports.IndivisibleName = void 0;
15
7
  const jiti_1 = require("jiti");
16
8
  const path_1 = __importDefault(require("path"));
9
+ const CompilationEnv_1 = require("../database/CompilationEnv");
10
+ const SwCompiler_1 = require("../SwCompiler");
17
11
  const untils_1 = require("../untils");
18
- const IndivisibleName = '1indivisible__';
12
+ exports.IndivisibleName = '1indivisible__';
19
13
  class ConfigLoader {
20
14
  constructor() {
15
+ this.modifierList = [];
21
16
  this.isBuilt = false;
22
17
  }
23
18
  // noinspection JSUnusedGlobalSymbols
@@ -43,6 +38,9 @@ class ConfigLoader {
43
38
  // @ts-ignore
44
39
  const content = await ConfigLoader.jiti.import(file);
45
40
  let newConfig = 'default' in content ? content.default : content;
41
+ if ('modifier' in newConfig) {
42
+ this.modifierList.push(newConfig.modifier);
43
+ }
46
44
  if (this.config)
47
45
  this.mergeConfig(newConfig);
48
46
  else
@@ -50,12 +48,22 @@ class ConfigLoader {
50
48
  }
51
49
  // noinspection JSUnusedGlobalSymbols
52
50
  /** 将配置项的内容写入到环境中 */
53
- write(runtime, compilation) {
51
+ generate() {
54
52
  if (!this.config)
55
53
  throw {
56
54
  code: untils_1.exceptionNames.nullPoint,
57
55
  message: '构建配之前必须至少加载一个配置文件'
58
56
  };
57
+ // 构建属性集
58
+ const { runtime, compilation } = (this.modifierList.find(it => it.build)?.build ?? (() => {
59
+ const runtime = new SwCompiler_1.RuntimeData();
60
+ const compilation = {
61
+ compilationEnv: new CompilationEnv_1.CompilationEnv(runtime.crossEnv, runtime.crossDep),
62
+ crossDep: runtime.crossDep,
63
+ crossEnv: runtime.crossEnv
64
+ };
65
+ return { runtime, compilation };
66
+ }))();
59
67
  const config = this.config;
60
68
  // 写入运行时信息
61
69
  const writeRuntime = () => {
@@ -118,14 +126,27 @@ class ConfigLoader {
118
126
  }
119
127
  }
120
128
  };
129
+ // 运行 registry
130
+ for (let i = this.modifierList.length - 1; i >= 0; i--) {
131
+ const modifier = this.modifierList[i];
132
+ modifier.registry?.(runtime, compilation);
133
+ }
121
134
  writeRuntime();
122
135
  writeCompilation();
123
136
  writeCross();
137
+ // 运行 dynamic
138
+ for (let i = this.modifierList.length - 1; i >= 0; i--) {
139
+ const modifier = this.modifierList[i];
140
+ modifier.dynamic?.(runtime, compilation);
141
+ }
142
+ return Object.freeze({ runtime, compilation });
124
143
  }
125
144
  /** 将新配置合并到已有配置中 */
126
145
  mergeConfig(other) {
127
- function mergeHelper(high, low) {
146
+ function mergeHelper(high, low, skip) {
128
147
  for (let key in low) {
148
+ if (skip && key == 'modifier')
149
+ continue;
129
150
  const lowValue = low[key];
130
151
  if (key in high) {
131
152
  const highValue = high[key];
@@ -135,8 +156,8 @@ class ConfigLoader {
135
156
  }
136
157
  if (typeof highValue != typeof lowValue)
137
158
  continue;
138
- if (typeof highValue == 'object' && !highValue[IndivisibleName] && !lowValue[IndivisibleName]) {
139
- mergeHelper(highValue, lowValue);
159
+ if (typeof highValue == 'object' && !highValue[exports.IndivisibleName] && !lowValue[exports.IndivisibleName]) {
160
+ mergeHelper(highValue, lowValue, false);
140
161
  }
141
162
  }
142
163
  else {
@@ -144,7 +165,7 @@ class ConfigLoader {
144
165
  }
145
166
  }
146
167
  }
147
- mergeHelper(this.config, other);
168
+ mergeHelper(this.config, other, true);
148
169
  }
149
170
  }
150
171
  exports.ConfigLoader = ConfigLoader;
@@ -158,73 +179,3 @@ ConfigLoader.jiti = (0, jiti_1.createJiti)(__filename, {
158
179
  'swpp-backends': path_1.default.join(__dirname, '..', '..', 'index')
159
180
  }
160
181
  });
161
- /** 定义一个通过 `export default` 导出的配置 */
162
- function defineConfig(config) {
163
- return config;
164
- }
165
- /** 定义一个通过 `export const compilationEnv` 导出的配置 */
166
- function defineCompilationEnv(config) {
167
- return config;
168
- }
169
- /** 定义一个通过 `export const crossEnv` 导出的配置 */
170
- function defineCrossEnv(config) {
171
- return config;
172
- }
173
- /** 定义一个通过 `export const runtimeDep` 导出的配置 */
174
- function defineRuntimeDep(config) {
175
- return config;
176
- }
177
- /** 定义一个通过 `export const crossDep` 导出的配置 */
178
- function defineCrossDep(config) {
179
- return config;
180
- }
181
- /** 定义一个通过 `export const runtimeCore` 导出的配置 */
182
- function defineRuntimeCore(config) {
183
- return config;
184
- }
185
- /** 定义一个通过 `export const runtimeEvent` 导出的配置 */
186
- function defineRuntimeEvent(config) {
187
- return config;
188
- }
189
- /**
190
- * 定义一个无法分割的对象配置,这对一些强依赖对象内部属性的设置很有用,可以避免对象被错误地拼接。
191
- *
192
- * 默认情况下,当定义一个对象配置时,将允许从其它配置文件中合并一部分配置到对象中,比如:
193
- *
194
- * ```typescript
195
- * // 当前配置
196
- * exampleConfig.obj = {
197
- * value1: 'hello world'
198
- * }
199
- * // 如果还有一个配置文件中也声明了这个配置
200
- * exampleConfig.obj = {
201
- * value2: 'hello swpp'
202
- * }
203
- * // 最终将合并生成如下配置
204
- * exampleConfig.obj = {
205
- * value1: 'hello world',
206
- * value2: 'hello swpp'
207
- * }
208
- * ```
209
- *
210
- * 通过该函数,可以禁止 swpp 合并配置时仅选取对象的部分字段,要么全部使用 [value] 的值,要么完全不使用 [value] 的值。
211
- *
212
- * 放入到上述例子中,假如两个 obj 任意一个或多个通过 `defineIndivisibleConfig({ xxx: xxx })` 设置,最终的值将取决于两个配置文件的优先级,
213
- * 若 `value2` 的优先级高将产生:
214
- *
215
- * ```typescript
216
- * // 最终结果
217
- * exampleConfig.obj = {
218
- * value2: 'hello swpp'
219
- * }
220
- * ```
221
- */
222
- function defineIndivisibleConfig(value) {
223
- Object.defineProperty(value, IndivisibleName, {
224
- value: true,
225
- writable: false,
226
- configurable: false,
227
- enumerable: false
228
- });
229
- return value;
230
- }
@@ -98,22 +98,25 @@ function buildCommon(_env, crossEnv, crossCode) {
98
98
  }),
99
99
  /** 获取已经上线的版本文件 */
100
100
  VERSION_FILE: (0, KeyValueDatabase_1.buildEnv)({
101
- default: async () => {
102
- const host = env.read('DOMAIN_HOST');
103
- const fetcher = env.read('FETCH_NETWORK_FILE');
104
- const isNotFound = env.read('IS_NOT_FOUND');
105
- try {
106
- const response = await fetcher.fetch(`https://${host}/update.json`);
107
- if (!isNotFound.response(response)) {
108
- const json = await response.json();
109
- return json;
101
+ default: {
102
+ path: 'update.json',
103
+ async fetcher() {
104
+ const host = env.read('DOMAIN_HOST');
105
+ const fetcher = env.read('FETCH_NETWORK_FILE');
106
+ const isNotFound = env.read('IS_NOT_FOUND');
107
+ try {
108
+ const response = await fetcher.fetch(`https://${host}/${this.path}`);
109
+ if (!isNotFound.response(response)) {
110
+ const json = await response.json();
111
+ return json;
112
+ }
110
113
  }
114
+ catch (e) {
115
+ if (!isNotFound.error(e))
116
+ throw e;
117
+ }
118
+ return { global: 0, info: [] };
111
119
  }
112
- catch (e) {
113
- if (!isNotFound.error(e))
114
- throw e;
115
- }
116
- return { global: 0, info: [] };
117
120
  }
118
121
  }),
119
122
  /** 读取一个本地文件 */
@@ -140,6 +143,7 @@ function buildCommon(_env, crossEnv, crossCode) {
140
143
  error: (err) => err?.cause?.code === 'ENOTFOUND'
141
144
  }
142
145
  }),
146
+ /** 是否允许 404 */
143
147
  ALLOW_NOT_FOUND: (0, KeyValueDatabase_1.buildEnv)({
144
148
  default: AllowNotFoundEnum.ALLOW_STATUS,
145
149
  checker(value) {
@@ -153,6 +157,7 @@ function buildCommon(_env, crossEnv, crossCode) {
153
157
  }
154
158
  }
155
159
  }),
160
+ /** 文件解析器 */
156
161
  FILE_PARSER: (0, KeyValueDatabase_1.buildEnv)({
157
162
  default: createRegister(env, crossEnv, crossCode)
158
163
  })
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomCode = void 0;
4
+ const untils_1 = require("../untils");
5
+ const RuntimeKeyValueDatabase_1 = require("./RuntimeKeyValueDatabase");
6
+ class DomCode extends RuntimeKeyValueDatabase_1.RuntimeKeyValueDatabase {
7
+ constructor() {
8
+ super(buildCommon());
9
+ }
10
+ buildJsSource() {
11
+ return `
12
+ document.addEventListener('DOMContentLoaded', () => {
13
+ ${this.buildInnerSource()}
14
+ }
15
+ `;
16
+ }
17
+ buildInnerSource() {
18
+ const map = this.entries();
19
+ const inlineCode = Object.keys(map)
20
+ .filter(it => it.startsWith('_inline'))
21
+ .map(it => `${it}()`);
22
+ return `
23
+ const controller = navigator.serviceWorker?.controller
24
+ if (!controller) return
25
+ ${untils_1.utils.anyToSource(map, false, 'const')};
26
+ ${inlineCode.join(';\n')}
27
+ navigator.serviceWorker.addEventListener('message', event => {
28
+ messageEvent()
29
+ })
30
+ `;
31
+ }
32
+ }
33
+ exports.DomCode = DomCode;
34
+ let controller;
35
+ let SESSION_KEY;
36
+ let onSuccess;
37
+ let pjaxUpdate;
38
+ let postMessage2Sw;
39
+ function buildCommon() {
40
+ return {
41
+ postMessage2Sw: {
42
+ default: (type) => controller.postMessage(type)
43
+ },
44
+ pjaxUpdate: {
45
+ default: (url) => {
46
+ const type = url.endsWith('js') ? 'script' : 'link';
47
+ const name = type === 'link' ? 'href' : 'src';
48
+ for (let item of document.getElementsByTagName(type)) {
49
+ // @ts-ignore
50
+ const itUrl = item[name];
51
+ if (url.length > itUrl ? url.endsWith(itUrl) : itUrl.endsWith(url)) {
52
+ const newEle = document.createElement(type);
53
+ const content = item.textContent || item.innerHTML || '';
54
+ Array.from(item.attributes).forEach(attr => newEle.setAttribute(attr.name, attr.value));
55
+ newEle.appendChild(document.createTextNode(content));
56
+ item.parentNode.replaceChildren(newEle, item);
57
+ return;
58
+ }
59
+ }
60
+ }
61
+ },
62
+ SESSION_KEY: {
63
+ default: 'updated'
64
+ },
65
+ onSuccess: {
66
+ default: () => console.log('版本更新成功')
67
+ },
68
+ _inlineA: {
69
+ default: () => {
70
+ if (sessionStorage.getItem(SESSION_KEY)) {
71
+ onSuccess();
72
+ sessionStorage.removeItem(SESSION_KEY);
73
+ }
74
+ else
75
+ postMessage2Sw('update');
76
+ }
77
+ },
78
+ messageEvent: {
79
+ default: async (event) => {
80
+ const data = event.data;
81
+ sessionStorage.setItem(SESSION_KEY, data.type);
82
+ const list = data.data?.filter((url) => /\.(js|css)$/.test(url));
83
+ if (list?.length) {
84
+ // @ts-ignore
85
+ if (window.Pjax?.isSupported?.())
86
+ list.forEach(pjaxUpdate);
87
+ location.reload();
88
+ }
89
+ else {
90
+ onSuccess();
91
+ sessionStorage.removeItem(SESSION_KEY);
92
+ }
93
+ }
94
+ }
95
+ };
96
+ }
@@ -52,11 +52,10 @@ function buildCommon() {
52
52
  /**
53
53
  * 缓存增量更新功能实现
54
54
  * @param force 是否强制更新
55
- * @return 标记缓存是否更新,-1 - 新访客,1 - 仅更新版本号,2 - 更新了缓存,否则 - 没有进行任何更新
55
+ * @return 标记缓存是否更新,-1 - 新访客,1 - 仅更新版本号,2 - 更新了缓存,string[] - 更新了部分缓存,否则 - 没有进行任何更新
56
56
  */
57
57
  handleUpdate: {
58
- default: async (force) => {
59
- const oldVersion = await readVersion();
58
+ default: async (oldVersion, force) => {
60
59
  if (!force && oldVersion && Date.now() - oldVersion.tp < UPDATE_CD)
61
60
  return;
62
61
  const json = await (await fetch(UPDATE_JSON_URL, {
@@ -68,7 +67,7 @@ function buildCommon() {
68
67
  // 新访客或触发了逃生门
69
68
  if (!oldVersion || (ESCAPE && ESCAPE !== oldVersion.escape)) {
70
69
  await writeVersion(newVersion);
71
- return oldVersion ? 2 : -1;
70
+ return oldVersion ? 1 : -1;
72
71
  }
73
72
  // 已是最新版本时跳过剩余步骤
74
73
  if (oldVersion.global === global && oldVersion.local === newVersion.local)
@@ -89,7 +88,7 @@ function buildCommon() {
89
88
  }
90
89
  }
91
90
  });
92
- return postMessage('update', urlList);
91
+ return urlList;
93
92
  }
94
93
  const changeList = infoElement.change;
95
94
  if (changeList) {
@@ -101,7 +100,7 @@ function buildCommon() {
101
100
  // 运行到这里说明版本号丢失
102
101
  await caches.delete(CACHE_NAME)
103
102
  .then(() => writeVersion(newVersion));
104
- return postMessage('reset', null);
103
+ return 2;
105
104
  }
106
105
  },
107
106
  handleFetchEvent: {
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RuntimeEventCode = void 0;
4
4
  const RuntimeKeyValueDatabase_1 = require("./RuntimeKeyValueDatabase");
5
5
  let handleFetchEvent;
6
+ let handleUpdate;
7
+ let postMessage;
8
+ let readVersion;
6
9
  class RuntimeEventCode extends RuntimeKeyValueDatabase_1.RuntimeKeyValueDatabase {
7
10
  constructor() {
8
11
  super(buildCommon());
@@ -39,14 +42,27 @@ function buildCommon() {
39
42
  }
40
43
  },
41
44
  message: {
42
- default: (event) => {
45
+ default: async (event) => {
43
46
  // @ts-ignore
44
47
  const data = event.data;
45
48
  switch (data.type) {
46
49
  case 'update':
47
- // @ts-ignore
48
- handleUpdate();
49
- break;
50
+ const oldVersion = await readVersion();
51
+ const updateResult = await handleUpdate(oldVersion);
52
+ if (!updateResult)
53
+ return;
54
+ switch (updateResult) {
55
+ case -1:
56
+ return postMessage('new', null);
57
+ case 1:
58
+ return postMessage('revise', null);
59
+ case 2:
60
+ return postMessage('update', null);
61
+ default:
62
+ if (Array.isArray(updateResult)) {
63
+ return postMessage('update', updateResult);
64
+ }
65
+ }
50
66
  }
51
67
  }
52
68
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swpp-backends",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.3",
4
4
  "main": "dist/index.js",
5
5
  "typings": "types/index.d.ts",
6
6
  "description": "Generate a powerful ServiceWorker for your website.",
package/types/index.d.ts CHANGED
@@ -1,19 +1,13 @@
1
- import { COMMON_TYPE_COMP_ENV } from './swpp/database/CompilationEnv';
2
- import { COMMON_TYPE_CROSS_DEP } from './swpp/database/CrossDepCode';
3
- import { COMMON_TYPE_CROSS_ENV } from './swpp/database/CrossEnv';
4
- import { COMMON_TYPE_RUNTIME_CORE } from './swpp/database/RuntimeCoreCode';
5
- import { COMMON_KEY_RUNTIME_DEP } from './swpp/database/RuntimeDepCode';
6
- import { COMMON_TYPE_RUNTIME_EVENT } from './swpp/database/RuntimeEventCode';
7
1
  /** 版本号 */
8
- export declare const version: any;
2
+ export declare const swppVersion: any;
9
3
  export { utils, RuntimeException } from './swpp/untils';
10
4
  export { ResourcesScanner, FileUpdateTracker, } from './swpp/ResourcesScanner';
11
5
  export { JsonBuilder, UpdateJson, UpdateChangeExp, TrackerHeaderDiff } from './swpp/JsonBuilder';
12
6
  export { FileParserRegistry, FileParser, FileMark } from './swpp/FileParser';
13
7
  export { SwCompiler, CompilationData, RuntimeData, BrowserVersion } from './swpp/SwCompiler';
14
8
  export { NetworkFileHandler, FiniteConcurrencyFetcher } from './swpp/NetworkFileHandler';
15
- export { ConfigLoader, SwppConfigRuntimeEvent, SwppConfigRuntimeCore, SwppConfigRuntimeDep, SwppConfigCrossDep, SwppConfigCrossEnv, SwppConfigCompilationEnv, SwppConfigTemplate, defineCompilationEnv, defineConfig, defineCrossEnv, defineCrossDep, defineRuntimeDep, defineRuntimeCore, defineRuntimeEvent, defineIndivisibleConfig } from './swpp/config/ConfigLoader';
16
- export { KeyValueDatabase, DatabaseValue, RuntimeEnvErrorTemplate, RuntimeEnvException } from './swpp/database/KeyValueDatabase';
9
+ export { ConfigLoader } from './swpp/config/ConfigLoader';
10
+ export { KeyValueDatabase } from './swpp/database/KeyValueDatabase';
17
11
  export { RuntimeKeyValueDatabase } from './swpp/database/RuntimeKeyValueDatabase';
18
12
  export { RuntimeEventCode } from './swpp/database/RuntimeEventCode';
19
13
  export { RuntimeCoreCode } from './swpp/database/RuntimeCoreCode';
@@ -21,11 +15,5 @@ export { RuntimeDepCode } from './swpp/database/RuntimeDepCode';
21
15
  export { CrossEnv } from './swpp/database/CrossEnv';
22
16
  export { CrossDepCode } from './swpp/database/CrossDepCode';
23
17
  export { CompilationEnv, AllowNotFoundEnum } from './swpp/database/CompilationEnv';
24
- export declare namespace SwppType {
25
- type RuntimeEventCode = COMMON_TYPE_RUNTIME_EVENT;
26
- type RuntimeCoreCode = COMMON_TYPE_RUNTIME_CORE;
27
- type RuntimeDepCode = COMMON_KEY_RUNTIME_DEP;
28
- type CrossEnv = COMMON_TYPE_CROSS_ENV;
29
- type CrossDep = COMMON_TYPE_CROSS_DEP;
30
- type CompilationEnv = COMMON_TYPE_COMP_ENV;
31
- }
18
+ export { DomCode } from './swpp/database/DomCode';
19
+ export { defineIndivisibleConfig, defineConfig, defineRuntimeEvent, defineDomConfig, defineRuntimeCore, defineCrossDep, defineRuntimeDep, defineCrossEnv, defineCompilationEnv } from './swpp/config/ConfigCluster';