swpp-backends 1.1.2 → 1.2.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 +17 -17
- package/dist/FileAnalyzer.js +65 -39
- package/dist/index.js +1 -0
- package/package.json +1 -2
- package/types/index.d.ts +1 -0
package/README.md
CHANGED
|
@@ -6,29 +6,29 @@ swpp 的全拼为“ServiceWorkerPlusPlus”(或“ServiceWorker++”),但
|
|
|
6
6
|
|
|
7
7
|
swpp 生成的 SW 与其它插件的对比:
|
|
8
8
|
|
|
9
|
-
| |
|
|
10
|
-
|
|
11
|
-
| 本地缓存 |
|
|
12
|
-
| 缓存增量更新 |
|
|
13
|
-
| 缓存过期时间 |
|
|
14
|
-
| 缓存大小限制 |
|
|
15
|
-
| 预缓存 |
|
|
16
|
-
| Request 篡改 |
|
|
17
|
-
| URL 竞速 |
|
|
18
|
-
| 备用 URL |
|
|
19
|
-
| 阻塞响应 |
|
|
20
|
-
| 逃生门 |
|
|
21
|
-
| 跨平台 |
|
|
22
|
-
| 高度自由 |
|
|
23
|
-
| 更新 |
|
|
9
|
+
| | swpp | hexo-offline |
|
|
10
|
+
|:----------:|:-------------:|:------------:|
|
|
11
|
+
| 本地缓存 | ✔️ | ✔️ |
|
|
12
|
+
| 缓存增量更新 | ✔️ | ❌ |
|
|
13
|
+
| 缓存过期时间 | ❌<sup>1</sup> | ✔️ |
|
|
14
|
+
| 缓存大小限制 | ❌ | ✔️ |
|
|
15
|
+
| 预缓存 | ❌ | ✔️ |
|
|
16
|
+
| Request 篡改 | ✔️ | ❌ |
|
|
17
|
+
| URL 竞速 | ✔️ | ❌ |
|
|
18
|
+
| 备用 URL | ✔️ | ❌ |
|
|
19
|
+
| 阻塞响应 | ✔️ | ❌ |
|
|
20
|
+
| 逃生门 | ✔️ | ❌ |
|
|
21
|
+
| 跨平台 | ✔️ | ❌ |
|
|
22
|
+
| 高度自由 | ✔️ | ❌ |
|
|
23
|
+
| 更新 | 非常频繁 | 超过两年没有更新 |
|
|
24
|
+
|
|
25
|
+
<small> 注:上面提到的跨平台是指跨越框架(比如 Hexo、WordPress 等)。</small>
|
|
24
26
|
|
|
25
27
|
+ ✔️:支持
|
|
26
28
|
+ ❌:不支持
|
|
27
29
|
|
|
28
30
|
1. 因为有增量更新,所以没提供过期的实现,没必要
|
|
29
|
-
2. 目前只有 hexo 平台存在具体实现,其它平台的暂时还没有
|
|
30
31
|
|
|
31
|
-
注:上面提到的跨平台是指跨越框架(比如 Hexo、WordPress 等)。
|
|
32
32
|
|
|
33
33
|
目前支持的平台:
|
|
34
34
|
|
package/dist/FileAnalyzer.js
CHANGED
|
@@ -34,7 +34,6 @@ const SwppRules_1 = require("./SwppRules");
|
|
|
34
34
|
const crypto = __importStar(require("crypto"));
|
|
35
35
|
const buffer_1 = require("buffer");
|
|
36
36
|
const fast_html_parser_1 = __importDefault(require("fast-html-parser"));
|
|
37
|
-
const css_1 = __importDefault(require("css"));
|
|
38
37
|
const Utils_1 = require("./Utils");
|
|
39
38
|
/**
|
|
40
39
|
* 遍历指定目录及其子目录中包含的所有文件(不遍历文件夹)
|
|
@@ -316,7 +315,6 @@ async function eachAllLinkInUrl(domain, url, result, event) {
|
|
|
316
315
|
}
|
|
317
316
|
exports.eachAllLinkInUrl = eachAllLinkInUrl;
|
|
318
317
|
async function eachAllLinkInHtml(domain, url, content, result, event) {
|
|
319
|
-
const root = url.substring(0, url.lastIndexOf('/') + 1);
|
|
320
318
|
const taskList = [];
|
|
321
319
|
const each = (node) => {
|
|
322
320
|
let subUrl = undefined;
|
|
@@ -364,48 +362,64 @@ async function eachAllLinkInHtml(domain, url, content, result, event) {
|
|
|
364
362
|
return Promise.all(taskList);
|
|
365
363
|
}
|
|
366
364
|
async function eachAllLinkInCss(domain, url, content, result, event) {
|
|
367
|
-
const root = url.substring(0, url.lastIndexOf('/')
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
const list = value.match(/url\(['"]?([^'")]+)['"]?\)/g)
|
|
379
|
-
?.map(it => it.replace(/(^url\(['"]?)|(['"]?\)$)/g, ''));
|
|
380
|
-
if (list) {
|
|
381
|
-
for (let url of list) {
|
|
382
|
-
if (!/^(https?:)|(\/\/)/.test(url)) {
|
|
383
|
-
if (url[0] === '/')
|
|
384
|
-
url = root + url.substring(1);
|
|
385
|
-
else
|
|
386
|
-
url = root + url;
|
|
387
|
-
}
|
|
388
|
-
taskList.push(eachAllLinkInUrl(domain, url, result, event));
|
|
389
|
-
}
|
|
390
|
-
}
|
|
365
|
+
const root = url.substring(0, url.lastIndexOf('/'));
|
|
366
|
+
const urls = new Set();
|
|
367
|
+
/** 从指定位置开始查询注释 */
|
|
368
|
+
const findComment = (tag, start) => {
|
|
369
|
+
for (let i = start; i < content.length;) {
|
|
370
|
+
const item = content[i];
|
|
371
|
+
switch (item) {
|
|
372
|
+
case tag[0]:
|
|
373
|
+
if (content[i + 1] === tag[1])
|
|
374
|
+
return i;
|
|
375
|
+
++i;
|
|
391
376
|
break;
|
|
392
|
-
case '
|
|
393
|
-
|
|
394
|
-
|
|
377
|
+
case '"':
|
|
378
|
+
case '\'':
|
|
379
|
+
while (true) {
|
|
380
|
+
const index = content.indexOf(item, i + 1);
|
|
381
|
+
if (index < 0)
|
|
382
|
+
return -1;
|
|
383
|
+
i = index + 1;
|
|
384
|
+
if (content[index - 1] !== '\\')
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
395
387
|
break;
|
|
396
388
|
}
|
|
397
389
|
}
|
|
390
|
+
return -1;
|
|
398
391
|
};
|
|
399
|
-
let
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
392
|
+
for (let i = 0; i < content.length;) {
|
|
393
|
+
const left = findComment('/*', i);
|
|
394
|
+
let sub;
|
|
395
|
+
if (left === -1) {
|
|
396
|
+
sub = content.substring(i);
|
|
397
|
+
i = Number.MAX_VALUE;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
sub = content.substring(i, left);
|
|
401
|
+
const right = findComment('*/', left + 2);
|
|
402
|
+
if (right === -1)
|
|
403
|
+
i = Number.MAX_VALUE;
|
|
404
|
+
else
|
|
405
|
+
i = right + 2;
|
|
406
|
+
}
|
|
407
|
+
sub.match(/(url\(.*?\))|(@import\s+['"].*?['"])|((https?:)?\/\/[^\s/$.?#].\S*)/g)
|
|
408
|
+
?.map(it => it.replace(/(^url\((['"]?))|((['"]?)\)$)|(^@import\s+['"])|(['"]$)/g, ''))
|
|
409
|
+
?.map(it => {
|
|
410
|
+
switch (true) {
|
|
411
|
+
case it.startsWith('http'):
|
|
412
|
+
return it;
|
|
413
|
+
case it.startsWith('//'):
|
|
414
|
+
return 'http' + it;
|
|
415
|
+
case it.startsWith('/'):
|
|
416
|
+
return root + it;
|
|
417
|
+
default:
|
|
418
|
+
return root + '/' + it;
|
|
419
|
+
}
|
|
420
|
+
})?.forEach(it => urls.add(it));
|
|
405
421
|
}
|
|
406
|
-
|
|
407
|
-
each(css);
|
|
408
|
-
return Promise.all(taskList);
|
|
422
|
+
return Promise.all(Array.from(urls).map(it => eachAllLinkInUrl(domain, it, result, event)));
|
|
409
423
|
}
|
|
410
424
|
function eachAllLinkInJavaScript(domain, _, content, result, event) {
|
|
411
425
|
const taskList = [];
|
|
@@ -414,6 +428,16 @@ function eachAllLinkInJavaScript(domain, _, content, result, event) {
|
|
|
414
428
|
(0, Utils_1.error)('LinkItorInJS', '不应发生的异常');
|
|
415
429
|
throw 'ruleList 为空';
|
|
416
430
|
}
|
|
431
|
+
const calcRegLength = (item) => {
|
|
432
|
+
let length = item.length;
|
|
433
|
+
for (let i = 0; i < item.length; ++i) {
|
|
434
|
+
if (item[i] === '\\') {
|
|
435
|
+
++i;
|
|
436
|
+
--length;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return length;
|
|
440
|
+
};
|
|
417
441
|
for (let value of ruleList) {
|
|
418
442
|
if (typeof value === 'function') {
|
|
419
443
|
const urls = value(content);
|
|
@@ -423,9 +447,11 @@ function eachAllLinkInJavaScript(domain, _, content, result, event) {
|
|
|
423
447
|
}
|
|
424
448
|
else {
|
|
425
449
|
const { head, tail } = value;
|
|
450
|
+
const headLength = calcRegLength(head);
|
|
451
|
+
const tailLength = calcRegLength(tail);
|
|
426
452
|
const reg = new RegExp(`${head}(['"\`])(.*?)(['"\`])${tail}`, 'mg');
|
|
427
453
|
const list = content.match(reg)
|
|
428
|
-
?.map(it => it.substring(
|
|
454
|
+
?.map(it => it.substring(headLength, it.length - tailLength).trim())
|
|
429
455
|
?.map(it => it.replace(/^['"`]|['"`]$/g, ''));
|
|
430
456
|
if (list) {
|
|
431
457
|
for (let url of list) {
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const UpdateJsonBuilder_1 = require("./UpdateJsonBuilder");
|
|
|
8
8
|
const VersionAnalyzer_1 = require("./VersionAnalyzer");
|
|
9
9
|
// noinspection JSUnusedGlobalSymbols
|
|
10
10
|
exports.default = {
|
|
11
|
+
version: '1.2.1',
|
|
11
12
|
cache: {
|
|
12
13
|
readEjectData: Utils_1.readEjectData, readUpdateJson: UpdateJsonBuilder_1.readUpdateJson,
|
|
13
14
|
readRules: SwppRules_1.readRules, readMergeVersionMap: FileAnalyzer_1.readMergeVersionMap,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swpp-backends",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"typings": "types/index.d.ts",
|
|
6
6
|
"description": "Generate a powerful ServiceWorker for your website.",
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
"typescript": "^5.1.6"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"css": "^3.0.0",
|
|
23
22
|
"fast-html-parser": "^1.0.1",
|
|
24
23
|
"hexo-log": "^4.1.0",
|
|
25
24
|
"node-fetch": "^2.6.12"
|
package/types/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { readRules, loadRules, addRulesMapEvent } from './SwppRules';
|
|
|
5
5
|
import { readUpdateJson, loadUpdateJson, submitChange, getShorthand, buildNewInfo } from './UpdateJsonBuilder';
|
|
6
6
|
import { refreshUrl, analyze } from './VersionAnalyzer';
|
|
7
7
|
declare const _default: {
|
|
8
|
+
version: string;
|
|
8
9
|
cache: {
|
|
9
10
|
readEjectData: typeof readEjectData;
|
|
10
11
|
readUpdateJson: typeof readUpdateJson;
|