npmapps 1.2.0 → 1.3.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 +41 -0
- package/files/part-002 +4 -0
- package/get.js +193 -0
- package/manifest.json +28 -0
- package/package.json +17 -10
- package/PUBLISH.md +0 -268
- package/app/wujie-wk/t.html +0 -90
- package/app/wujie-wk/wujie-vue2-child/.eslintrc.js +0 -19
- package/app/wujie-wk/wujie-vue2-child/README.md +0 -24
- package/app/wujie-wk/wujie-vue2-child/babel.config.js +0 -5
- package/app/wujie-wk/wujie-vue2-child/docs/superpowers/plans/2026-05-29-quill-editor.md +0 -836
- package/app/wujie-wk/wujie-vue2-child/docs/superpowers/specs/2026-05-29-quill-editor-design.md +0 -210
- package/app/wujie-wk/wujie-vue2-child/jsconfig.json +0 -19
- package/app/wujie-wk/wujie-vue2-child/package-lock.json +0 -21333
- package/app/wujie-wk/wujie-vue2-child/package.json +0 -63
- package/app/wujie-wk/wujie-vue2-child/postcss.config.js +0 -10
- package/app/wujie-wk/wujie-vue2-child/public/favicon.ico +0 -0
- package/app/wujie-wk/wujie-vue2-child/public/index.html +0 -17
- package/app/wujie-wk/wujie-vue2-child/public/rili.jpg +0 -0
- package/app/wujie-wk/wujie-vue2-child/public//344/270/200/351/224/256/351/273/221/346/232/227.html +0 -136
- package/app/wujie-wk/wujie-vue2-child/src/App.vue +0 -110
- package/app/wujie-wk/wujie-vue2-child/src/assets/bpmn-camunda.jpg +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/assets/css/diagram.less +0 -17
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/Icon.less +0 -31
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app-codes.css +0 -26
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.eot +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.svg +0 -60
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.ttf +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.woff +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.woff2 +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/config.json +0 -248
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-bottom-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-horizontal-center-tool.svg +0 -85
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-left-tool.svg +0 -84
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-right-tool.svg +0 -80
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-top-tool.svg +0 -84
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-vertical-center-tool.svg +0 -89
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/distribute-horizontally-tool.svg +0 -95
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/distribute-vertically-tool.svg +0 -99
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/set-color-tool.svg +0 -111
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-bottom-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-horizontal-center-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-left-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-right-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-top-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-vertical-center-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/distribute-horizontally-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/distribute-vertically-tool.svg +0 -30
- package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/set-color-tool.svg +0 -63
- package/app/wujie-wk/wujie-vue2-child/src/assets/logo.png +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/README.md +0 -70
- package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/article.md +0 -184
- package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/index.js +0 -213
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/CalendarSkeleton.vue +0 -147
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/CodeBlock.vue +0 -199
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/MonthSelect.vue +0 -376
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/README.md +0 -485
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/example.vue +0 -1747
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/index.vue +0 -2720
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/mockData.js +0 -475
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/recruitmentAdapter.js +0 -51
- package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/utils.js +0 -202
- package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/FunctionSelector.vue +0 -123
- package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/OperatorSelector.vue +0 -184
- package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/ParameterSelector.vue +0 -123
- package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/api.js +0 -69
- package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/index.vue +0 -435
- package/app/wujie-wk/wujie-vue2-child/src/components/HelloWorld.vue +0 -58
- package/app/wujie-wk/wujie-vue2-child/src/components/PageHeader/index.vue +0 -158
- package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/README.md +0 -144
- package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/example.vue +0 -84
- package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/index.vue +0 -203
- package/app/wujie-wk/wujie-vue2-child/src/components/diagram/ToolBar.vue +0 -357
- package/app/wujie-wk/wujie-vue2-child/src/components/diagram/customTranslate/customTranslate.js +0 -12
- package/app/wujie-wk/wujie-vue2-child/src/components/diagram/customTranslate/translationsGerman.js +0 -241
- package/app/wujie-wk/wujie-vue2-child/src/components/diagram/index.vue +0 -261
- package/app/wujie-wk/wujie-vue2-child/src/components/diagram/xmlData.js +0 -29
- package/app/wujie-wk/wujie-vue2-child/src/directives/filldown.js +0 -155
- package/app/wujie-wk/wujie-vue2-child/src/directives/filldownTable.js +0 -291
- package/app/wujie-wk/wujie-vue2-child/src/main.js +0 -40
- package/app/wujie-wk/wujie-vue2-child/src/router/index.js +0 -72
- package/app/wujie-wk/wujie-vue2-child/src/store/index.js +0 -23
- package/app/wujie-wk/wujie-vue2-child/src/utils/winBox.js +0 -23
- package/app/wujie-wk/wujie-vue2-child/src/views/Extend/A.vue +0 -12
- package/app/wujie-wk/wujie-vue2-child/src/views/Extend/B.vue +0 -10
- package/app/wujie-wk/wujie-vue2-child/src/views/Extend/MagicalComponentsForELFormItem.vue +0 -78
- package/app/wujie-wk/wujie-vue2-child/src/views/Extend/index.vue +0 -59
- package/app/wujie-wk/wujie-vue2-child/src/views/Extend/tableMouseHorizontalWheel.vue +0 -184
- package/app/wujie-wk/wujie-vue2-child/src/views/Home.vue +0 -27
- package/app/wujie-wk/wujie-vue2-child/src/views/RouterJump.vue +0 -145
- package/app/wujie-wk/wujie-vue2-child/src/views/calendar/index.vue +0 -19
- package/app/wujie-wk/wujie-vue2-child/src/views/css.vue +0 -57
- package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/EllipsisText.vue +0 -73
- package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/HoverCard.vue +0 -69
- package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/TableHover.vue +0 -130
- package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/inputSlo.vue +0 -42
- package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/tableFixed.vue +0 -148
- package/app/wujie-wk/wujie-vue2-child/src/views/echarts/echart-dome.vue +0 -73
- package/app/wujie-wk/wujie-vue2-child/src/views/echarts/index.vue +0 -118
- package/app/wujie-wk/wujie-vue2-child/src/views/echarts/pei3d.vue +0 -658
- package/app/wujie-wk/wujie-vue2-child/src/views/element/bpmn/index.vue +0 -15
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendanceCycle/index.vue +0 -131
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendanceGroup/index.vue +0 -147
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendancePersonnel/index.vue +0 -158
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/companyCalendar/index.vue +0 -147
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/shift/index.vue +0 -147
- package/app/wujie-wk/wujie-vue2-child/src/views/element/components/shiftRotationSystem/index.vue +0 -147
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/columnManagement.vue +0 -340
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/dialogInput.vue +0 -71
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/elTableJsx.vue +0 -1826
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/formTable.vue +0 -595
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/index.vue +0 -29
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/simpleTable.vue +0 -189
- package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx.zip +0 -0
- package/app/wujie-wk/wujie-vue2-child/src/views/element/index.vue +0 -39
- package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/README.md +0 -163
- package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/example.vue +0 -307
- package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/index.vue +0 -409
- package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/toolbar.js +0 -122
- package/app/wujie-wk/wujie-vue2-child/vue.config.js +0 -15
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# npmapps 数据包
|
|
2
|
+
|
|
3
|
+
本版本 `1.3.1` 是 **第 1 批:夸克网盘1789827579179.apk** 的第 2/2 片。
|
|
4
|
+
|
|
5
|
+
说明:测试
|
|
6
|
+
|
|
7
|
+
## 取回这一批文件
|
|
8
|
+
|
|
9
|
+
在想保存文件的目录下执行(只需要能访问淘宝源):
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx -y --registry=https://registry.npmmirror.com npmapps@1.3.0
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
脚本会下载这一批的全部分片,逐片校验 SHA-256,拼接后还原成原文件名。
|
|
16
|
+
|
|
17
|
+
<details><summary>不用 npx,手动下载合并</summary>
|
|
18
|
+
|
|
19
|
+
逐个下载下面的 tgz,解压后按顺序拼接 `package/files/part-NNN`:
|
|
20
|
+
|
|
21
|
+
- 第 1 片:https://registry.npmmirror.com/npmapps/-/npmapps-1.3.0.tgz(SHA-256 `fbaa807fd248f3c326793cecbe3d6cabde4ac4e1213050dad055b0a8e5d1a4ce`)
|
|
22
|
+
- 第 2 片:https://registry.npmmirror.com/npmapps/-/npmapps-1.3.1.tgz(SHA-256 `ae9158de39da693d1ca3ff8778cd8b7b333908f186448f23de19f259d59ac69c`)
|
|
23
|
+
|
|
24
|
+
macOS / Linux:`cat part-001 part-002 … > 原文件名`;Windows:`copy /b part-001+part-002 原文件名`。
|
|
25
|
+
|
|
26
|
+
整个文件的 SHA-256:`49aa2b536a45c70492286d9098a57acc7eed15b418469fe11a9c8ca277696ff7`
|
|
27
|
+
|
|
28
|
+
</details>
|
|
29
|
+
|
|
30
|
+
## 全部批次目录
|
|
31
|
+
|
|
32
|
+
> 每次发布都会更新这份目录。需要哪一批,复制对应的下载命令即可。
|
|
33
|
+
|
|
34
|
+
### 第 1 批:夸克网盘1789827579179.apk
|
|
35
|
+
|
|
36
|
+
- 说明:测试
|
|
37
|
+
- 大小:110.0 MB,2 片,版本 `1.3.0 ~ 1.3.1`
|
|
38
|
+
- 发布时间:—
|
|
39
|
+
- SHA-256:`49aa2b536a45c70492286d9098a57acc7eed15b418469fe11a9c8ca277696ff7`
|
|
40
|
+
- 下载:`npx -y --registry=https://registry.npmmirror.com npmapps@1.3.0`
|
|
41
|
+
|
package/files/part-002
ADDED
package/get.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* npmapps 分包下载合并脚本(随每个分片一起发布,纯 Node,无依赖)。
|
|
4
|
+
*
|
|
5
|
+
* 用法:在想保存文件的目录下执行(只需要能访问淘宝源)
|
|
6
|
+
* npx -y --registry=https://registry.npmmirror.com npmapps@<这一批里任意一个版本号>
|
|
7
|
+
* 也可以解压某个分片后执行:
|
|
8
|
+
* node package/get.js [--registry=源地址] [--out=保存目录]
|
|
9
|
+
*
|
|
10
|
+
* 流程:读 manifest.json 拿到这一批全部分片的版本号和 SHA-256
|
|
11
|
+
* → 本包自带的分片直接读,其余分片从源下载 tgz 并解出分片文件
|
|
12
|
+
* → 逐片校验 SHA-256 → 按顺序拼接 → 校验整个文件的 SHA-256 → 改回原文件名。
|
|
13
|
+
*/
|
|
14
|
+
'use strict'
|
|
15
|
+
|
|
16
|
+
const fs = require('fs')
|
|
17
|
+
const path = require('path')
|
|
18
|
+
const zlib = require('zlib')
|
|
19
|
+
const crypto = require('crypto')
|
|
20
|
+
const https = require('https')
|
|
21
|
+
const http = require('http')
|
|
22
|
+
|
|
23
|
+
const manifest = require('./manifest.json')
|
|
24
|
+
const self = require('./package.json')
|
|
25
|
+
const PKG = manifest.package || self.name
|
|
26
|
+
const MIRROR = 'https://registry.npmmirror.com'
|
|
27
|
+
|
|
28
|
+
function argValue(name) {
|
|
29
|
+
const hit = process.argv.find((a) => a.indexOf('--' + name + '=') === 0)
|
|
30
|
+
return hit ? hit.slice(name.length + 3) : ''
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 源地址:命令行 --registry 优先;其次是 npx 传进来的 npm_config_registry;
|
|
34
|
+
// 另一台电脑只能访问淘宝源,所以没有显式指定时,官方源一律换成淘宝源。
|
|
35
|
+
function pickRegistry() {
|
|
36
|
+
let r = argValue('registry')
|
|
37
|
+
if (!r) {
|
|
38
|
+
r = process.env.npm_config_registry || MIRROR
|
|
39
|
+
if (/registry\.npmjs\.org/.test(r)) r = MIRROR
|
|
40
|
+
}
|
|
41
|
+
return r.replace(/\/+$/, '')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function sha256(buf) {
|
|
45
|
+
return crypto.createHash('sha256').update(buf).digest('hex')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function formatSize(n) {
|
|
49
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB']
|
|
50
|
+
let i = 0
|
|
51
|
+
while (n >= 1024 && i < units.length - 1) {
|
|
52
|
+
n /= 1024
|
|
53
|
+
i++
|
|
54
|
+
}
|
|
55
|
+
return n.toFixed(i ? 1 : 0) + ' ' + units[i]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 下载为 Buffer,自动跟随跳转(淘宝源的 tgz 会 302 到 CDN),显示进度。
|
|
59
|
+
function download(url, label, redirects) {
|
|
60
|
+
redirects = redirects || 0
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
const lib = url.indexOf('https:') === 0 ? https : http
|
|
63
|
+
const req = lib.get(url, { headers: { 'User-Agent': 'npmapps-get' } }, (res) => {
|
|
64
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
65
|
+
res.resume()
|
|
66
|
+
if (redirects > 5) return reject(new Error('跳转次数过多'))
|
|
67
|
+
const next = new URL(res.headers.location, url).toString()
|
|
68
|
+
return resolve(download(next, label, redirects + 1))
|
|
69
|
+
}
|
|
70
|
+
if (res.statusCode !== 200) {
|
|
71
|
+
res.resume()
|
|
72
|
+
return reject(new Error('HTTP ' + res.statusCode + ':' + url))
|
|
73
|
+
}
|
|
74
|
+
const total = Number(res.headers['content-length'] || 0)
|
|
75
|
+
const chunks = []
|
|
76
|
+
let got = 0
|
|
77
|
+
let last = 0
|
|
78
|
+
res.on('data', (c) => {
|
|
79
|
+
chunks.push(c)
|
|
80
|
+
got += c.length
|
|
81
|
+
const now = Date.now()
|
|
82
|
+
if (process.stderr.isTTY && now - last > 300) {
|
|
83
|
+
last = now
|
|
84
|
+
const pct = total ? ' ' + Math.floor((got / total) * 100) + '%' : ''
|
|
85
|
+
process.stderr.write('\r ' + label + ' 下载中 ' + formatSize(got) + pct + ' ')
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
res.on('end', () => {
|
|
89
|
+
if (process.stderr.isTTY) process.stderr.write('\r' + ' '.repeat(60) + '\r')
|
|
90
|
+
resolve(Buffer.concat(chunks))
|
|
91
|
+
})
|
|
92
|
+
res.on('error', reject)
|
|
93
|
+
})
|
|
94
|
+
req.setTimeout(120000, () => req.destroy(new Error('下载超时(120 秒没有数据)')))
|
|
95
|
+
req.on('error', reject)
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 从 npm 的 tgz 里取出指定文件。npm 包是标准 ustar 格式,文件都在 package/ 目录下。
|
|
100
|
+
function extractFromTgz(tgz, wanted) {
|
|
101
|
+
const tar = zlib.gunzipSync(tgz)
|
|
102
|
+
let off = 0
|
|
103
|
+
let paxPath = null
|
|
104
|
+
const field = (h, s, e) => h.toString('utf8', s, e).replace(/\0[\s\S]*$/, '')
|
|
105
|
+
while (off + 512 <= tar.length) {
|
|
106
|
+
const h = tar.slice(off, off + 512)
|
|
107
|
+
if (h.every((b) => b === 0)) break
|
|
108
|
+
let name = field(h, 0, 100)
|
|
109
|
+
const prefix = field(h, 345, 500)
|
|
110
|
+
if (prefix) name = prefix + '/' + name
|
|
111
|
+
const size = parseInt(field(h, 124, 136).trim() || '0', 8)
|
|
112
|
+
const type = String.fromCharCode(h[156])
|
|
113
|
+
const body = tar.slice(off + 512, off + 512 + size)
|
|
114
|
+
off += 512 + Math.ceil(size / 512) * 512
|
|
115
|
+
if (type === 'x') {
|
|
116
|
+
// pax 扩展头:长文件名放在 path= 里,作用于下一个条目
|
|
117
|
+
const m = /\d+ path=([^\n]*)\n/.exec(body.toString('utf8'))
|
|
118
|
+
paxPath = m ? m[1] : null
|
|
119
|
+
continue
|
|
120
|
+
}
|
|
121
|
+
if (type === 'g') continue
|
|
122
|
+
if (paxPath) {
|
|
123
|
+
name = paxPath
|
|
124
|
+
paxPath = null
|
|
125
|
+
}
|
|
126
|
+
if (name === wanted && (type === '0' || type === '\0')) return Buffer.from(body)
|
|
127
|
+
}
|
|
128
|
+
throw new Error('压缩包里没有找到 ' + wanted)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 输出文件已存在时自动加序号,不覆盖已有文件。
|
|
132
|
+
function uniquePath(dir, name) {
|
|
133
|
+
const ext = path.extname(name)
|
|
134
|
+
const base = name.slice(0, name.length - ext.length)
|
|
135
|
+
let p = path.join(dir, name)
|
|
136
|
+
for (let i = 1; fs.existsSync(p); i++) p = path.join(dir, base + '(' + i + ')' + ext)
|
|
137
|
+
return p
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function fetchPart(registry, part) {
|
|
141
|
+
const own = path.join(__dirname, part.file)
|
|
142
|
+
if (part.version === self.version && fs.existsSync(own)) return fs.readFileSync(own)
|
|
143
|
+
const url = registry + '/' + PKG + '/-/' + PKG + '-' + part.version + '.tgz'
|
|
144
|
+
let lastErr
|
|
145
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
146
|
+
try {
|
|
147
|
+
const tgz = await download(url, '第 ' + part.index + ' 片')
|
|
148
|
+
return extractFromTgz(tgz, 'package/' + part.file)
|
|
149
|
+
} catch (e) {
|
|
150
|
+
lastErr = e
|
|
151
|
+
console.error(' 第 ' + part.index + ' 片第 ' + attempt + ' 次下载失败:' + e.message)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
throw lastErr
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function main() {
|
|
158
|
+
const registry = pickRegistry()
|
|
159
|
+
const outDir = path.resolve(argValue('out') || process.cwd())
|
|
160
|
+
const parts = manifest.parts
|
|
161
|
+
console.log('npmapps 第 ' + manifest.batch + ' 批:' + manifest.fileName + '(' + formatSize(manifest.size) + ',共 ' + parts.length + ' 片)')
|
|
162
|
+
if (manifest.note) console.log('说明:' + manifest.note)
|
|
163
|
+
console.log('源:' + registry)
|
|
164
|
+
fs.mkdirSync(outDir, { recursive: true })
|
|
165
|
+
const target = uniquePath(outDir, manifest.fileName)
|
|
166
|
+
const temp = target + '.downloading'
|
|
167
|
+
const fd = fs.openSync(temp, 'w')
|
|
168
|
+
const whole = crypto.createHash('sha256')
|
|
169
|
+
try {
|
|
170
|
+
for (const part of parts) {
|
|
171
|
+
const data = await fetchPart(registry, part)
|
|
172
|
+
if (data.length !== part.size || sha256(data) !== part.sha256) {
|
|
173
|
+
throw new Error('第 ' + part.index + ' 片(' + part.version + ')校验失败,文件可能损坏,请重试')
|
|
174
|
+
}
|
|
175
|
+
fs.writeSync(fd, data)
|
|
176
|
+
whole.update(data)
|
|
177
|
+
console.log(' ✔ 第 ' + part.index + '/' + parts.length + ' 片 ' + part.version + ' 已校验')
|
|
178
|
+
}
|
|
179
|
+
} finally {
|
|
180
|
+
fs.closeSync(fd)
|
|
181
|
+
}
|
|
182
|
+
if (whole.digest('hex') !== manifest.sha256) {
|
|
183
|
+
fs.unlinkSync(temp)
|
|
184
|
+
throw new Error('合并后的文件校验失败,请重试')
|
|
185
|
+
}
|
|
186
|
+
fs.renameSync(temp, target)
|
|
187
|
+
console.log('完成:' + target)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
main().catch((e) => {
|
|
191
|
+
console.error('失败:' + e.message)
|
|
192
|
+
process.exit(1)
|
|
193
|
+
})
|
package/manifest.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tool": "npmapps",
|
|
3
|
+
"schema": 1,
|
|
4
|
+
"package": "npmapps",
|
|
5
|
+
"batch": 1,
|
|
6
|
+
"fileName": "夸克网盘1789827579179.apk",
|
|
7
|
+
"size": 115369164,
|
|
8
|
+
"sha256": "49aa2b536a45c70492286d9098a57acc7eed15b418469fe11a9c8ca277696ff7",
|
|
9
|
+
"note": "测试",
|
|
10
|
+
"createdAt": "2026-11-09T22:51:59+08:00",
|
|
11
|
+
"partSize": 78643200,
|
|
12
|
+
"parts": [
|
|
13
|
+
{
|
|
14
|
+
"index": 1,
|
|
15
|
+
"version": "1.3.0",
|
|
16
|
+
"file": "files/part-001",
|
|
17
|
+
"size": 78643200,
|
|
18
|
+
"sha256": "fbaa807fd248f3c326793cecbe3d6cabde4ac4e1213050dad055b0a8e5d1a4ce"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"index": 2,
|
|
22
|
+
"version": "1.3.1",
|
|
23
|
+
"file": "files/part-002",
|
|
24
|
+
"size": 36725964,
|
|
25
|
+
"sha256": "ae9158de39da693d1ca3ff8778cd8b7b333908f186448f23de19f259d59ac69c"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
2
|
+
"bin": {
|
|
3
|
+
"npmapps": "get.js"
|
|
8
4
|
},
|
|
9
|
-
"
|
|
10
|
-
"
|
|
5
|
+
"description": "npmapps 数据包 第1批:夸克网盘1789827579179.apk(第 2/2 片)",
|
|
6
|
+
"files": [
|
|
7
|
+
"files/",
|
|
8
|
+
"get.js",
|
|
9
|
+
"manifest.json"
|
|
10
|
+
],
|
|
11
11
|
"license": "ISC",
|
|
12
|
-
"
|
|
13
|
-
|
|
12
|
+
"name": "npmapps",
|
|
13
|
+
"npmapps": {
|
|
14
|
+
"batch": 1,
|
|
15
|
+
"part": 2,
|
|
16
|
+
"parts": 2,
|
|
17
|
+
"sha256": "ae9158de39da693d1ca3ff8778cd8b7b333908f186448f23de19f259d59ac69c"
|
|
18
|
+
},
|
|
19
|
+
"version": "1.3.1"
|
|
20
|
+
}
|
package/PUBLISH.md
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
# npmapps 发布流程
|
|
2
|
-
|
|
3
|
-
> 本机作为「内网文件分发 / 跨设备搬运」工具的 npm 发布会话。包名 `npmapps`,基于公网 npmjs.org。每次发布照本流程做,5-10 分钟跑完。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 0. 前置检查(30 秒)
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
cd /Users/wk/Documents/npmapps
|
|
11
|
-
cat package.json | grep -E '"(name|version)"'
|
|
12
|
-
npm config get registry
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
期望:
|
|
16
|
-
- `name: "npmapps"`
|
|
17
|
-
- `version: "1.0.<上次版本号>"`
|
|
18
|
-
- `registry: https://registry.npmjs.org/`
|
|
19
|
-
|
|
20
|
-
如果 `registry` 是内网,后面所有命令一致,只是发布目标不同。
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 1. 阶段 1:搬运源文件到 `app/`(2-5 分钟)
|
|
25
|
-
|
|
26
|
-
### 1.1 搬整个文件夹(过滤 `node_modules`)
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
# 源
|
|
30
|
-
SRC=/Users/wk/Documents/wk/web/wujie-wk/wujie-vue2-child
|
|
31
|
-
|
|
32
|
-
# 目标
|
|
33
|
-
DST=/Users/wk/Documents/npmapps/app
|
|
34
|
-
|
|
35
|
-
# 同步(过滤 node_modules)
|
|
36
|
-
rsync -a --exclude='node_modules' "$SRC/" "$DST/"
|
|
37
|
-
|
|
38
|
-
# 删除原目录(完成"移动"语义)
|
|
39
|
-
rm -rf "$SRC"
|
|
40
|
-
|
|
41
|
-
# 验证:确认没漏
|
|
42
|
-
du -sh "$DST"
|
|
43
|
-
find "$DST" -type d -name node_modules # 应该无输出
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### 1.2 搬单个文件(zip / 压缩包 / 二进制)
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
mv /path/to/some.zip /Users/wk/Documents/npmapps/app/
|
|
50
|
-
|
|
51
|
-
# 验证
|
|
52
|
-
ls -la /Users/wk/Documents/npmapps/app/some.zip
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 1.3 验证 `app/` 状态
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
ls -la /Users/wk/Documents/npmapps/app
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
确认:
|
|
62
|
-
- ✅ `wujie-vue2-child/` 子目录在(整个 Vue2 子应用)
|
|
63
|
-
- ✅ `*.zip` 文件在
|
|
64
|
-
- ✅ 没有 `node_modules`
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 2. 阶段 2:更新版本号(10 秒)
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
# 推荐用 npm 内置命令(自动修改 package.json)
|
|
72
|
-
npm version patch # 1.0.25 → 1.0.26
|
|
73
|
-
# 其它选项:minor → 1.1.0,major → 2.0.0,具体版本号 → 1.0.27
|
|
74
|
-
|
|
75
|
-
# 或者手动改 package.json
|
|
76
|
-
# "version": "1.0.25" → "1.0.26"
|
|
77
|
-
|
|
78
|
-
# 验证
|
|
79
|
-
grep '"version"' package.json
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
> ⚠️ 注意:`npm version` 默认会 `git commit` + `git tag`。这个项目不是 git 仓库所以没事。如果以后初始化了 git,加 `--no-git-tag-version` 防止自动 commit。
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 3. 阶段 3:预览(20 秒,发布前最后一道检查)
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
npm pack --dry-run
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
期望输出:
|
|
93
|
-
```
|
|
94
|
-
npm notice name: npmapps
|
|
95
|
-
npm notice version: 1.0.26
|
|
96
|
-
npm notice total files: 109 (大概)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**重点检查**:
|
|
100
|
-
- ⚠️ 警告 `No .npmignore file found, using .gitignore` —— 这个项目外层没 `.gitignore`,npm 会读 `app/wujie-vue2-child/.gitignore`(嵌套目录的 gitignore npm 不读),所以 .codegraph、.DS_Store 之类的不会被自动排除
|
|
101
|
-
- ⚠️ 出现 `app/.codegraph/daemon.pid` —— 这是本地 codegraph 索引 daemon 运行时残留文件,会进包。按需决定:
|
|
102
|
-
- 想干净:加 `.npmignore`(见附录 A)
|
|
103
|
-
- 无所谓:照发,166B 不影响
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## 4. 阶段 4:处理 2FA / token(最容易卡住的环节)
|
|
108
|
-
|
|
109
|
-
### 4.1 现状诊断
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
|
-
npm whoami # 应该返回 npm 用户名
|
|
113
|
-
npm profile get | grep "two-factor"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
- `npm whoami` 返回用户名 ✅ token 有效
|
|
117
|
-
- `two-factor auth: auth-and-writes` ❌ publish 会被 2FA 拦
|
|
118
|
-
|
|
119
|
-
### 4.2 如果 `npm whoami` 401(token 失效)
|
|
120
|
-
|
|
121
|
-
在终端跑(交互式):
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
! npm login
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
走 web flow:浏览器打开,登录授权,完成后 npm 自动把 token 写到 `~/.npmrc`。
|
|
128
|
-
|
|
129
|
-
### 4.3 如果 publish 报 EOTP(2FA 拦下)
|
|
130
|
-
|
|
131
|
-
**最快路径 —— 生成 bypass 2FA 的 token**:
|
|
132
|
-
|
|
133
|
-
1. 浏览器打开 https://www.npmjs.com/settings/<用户名>/tokens
|
|
134
|
-
2. **Generate New Token** → 名字随便(例如 `local-publish`)
|
|
135
|
-
3. 类型选 **"Publish"**
|
|
136
|
-
4. **关键:勾上 "Bypass two-factor authentication"** ⚠️ 这步必须勾,否则 publish 仍要 OTP
|
|
137
|
-
5. 复制 token(`npm_xxxxxx...`)
|
|
138
|
-
6. 替换 `~/.npmrc`:
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# 备份 + 替换
|
|
142
|
-
cp ~/.npmrc ~/.npmrc.bak
|
|
143
|
-
# 编辑 ~/.npmrc,把 _authToken 那行的 token 换成新复制的
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
或者直接跑(把新 token 替换成你拿到的):
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
TOKEN=npm_xxxxxxxx
|
|
150
|
-
sed -i '' "s|//registry.npmjs.org/:_authToken=.*|//registry.npmjs.org/:_authToken=$TOKEN|" ~/.npmrc
|
|
151
|
-
|
|
152
|
-
# 验证
|
|
153
|
-
npm whoami
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### 4.4 替代方案:从账号层改 2FA 模式
|
|
157
|
-
|
|
158
|
-
如果不想用 bypass token:
|
|
159
|
-
1. 浏览器打开 https://www.npmjs.com/settings/<用户名>/security
|
|
160
|
-
2. Two-Factor Authentication 改成 **"Authorization only"** 或 **Disabled**
|
|
161
|
-
3. 保存(可能需要再输一次 OTP 或点邮件 magic link)
|
|
162
|
-
4. 回来重试 publish
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## 5. 阶段 5:真正发布(10 秒)
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
cd /Users/wk/Documents/npmapps
|
|
170
|
-
npm publish
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
成功标志:
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
+ npmapps@1.0.26
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
失败标志:
|
|
180
|
-
- `EOTP`:回到阶段 4.3 换 bypass token
|
|
181
|
-
- `E404: PUT ... npmapps`:token 失效,回到阶段 4.2
|
|
182
|
-
- `ENEEDAUTH`:同上
|
|
183
|
-
- `You do not have permission`:包名在公网被占,需要换名
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## 6. 阶段 6:验证(10 秒)
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
# 1. 查公网版本列表
|
|
191
|
-
npm view npmapps versions --json | tail -5
|
|
192
|
-
# 期望看到刚发的版本
|
|
193
|
-
|
|
194
|
-
# 2. 查发布时间戳
|
|
195
|
-
npm view npmapps time --json | grep "<新版本号>"
|
|
196
|
-
# 期望: "<新版本号>": "2026-..."
|
|
197
|
-
|
|
198
|
-
# 3. 查 tarball 信息
|
|
199
|
-
npm view npmapps dist
|
|
200
|
-
# 期望:tarball URL 指向新版本
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## 7. 收尾(可选,2 分钟)
|
|
206
|
-
|
|
207
|
-
```bash
|
|
208
|
-
# 1. 清理 .npmrc 备份
|
|
209
|
-
rm -f ~/.npmrc.bak
|
|
210
|
-
|
|
211
|
-
# 2. 在 npm 网站 revoke 失效/过期的 token
|
|
212
|
-
# https://www.npmjs.com/settings/<用户名>/tokens
|
|
213
|
-
# 只保留当前 .npmrc 里的那个,其余全 revoke
|
|
214
|
-
|
|
215
|
-
# 3. 检查发布的 tarball 内容
|
|
216
|
-
npm pack
|
|
217
|
-
tar -tzf npmapps-<新版本号>.tgz | head -20
|
|
218
|
-
# 看到不应该出现的文件就清理后再发新版本
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
## 附录 A:加 `.npmignore` 让发布更干净(可选)
|
|
224
|
-
|
|
225
|
-
如果想排除 `.codegraph`、`.DS_Store`、`package-lock.json`、`dist/` 等:
|
|
226
|
-
|
|
227
|
-
```bash
|
|
228
|
-
cat > /Users/wk/Documents/npmapps/.npmignore <<'EOF'
|
|
229
|
-
.DS_Store
|
|
230
|
-
.codegraph
|
|
231
|
-
*.pid
|
|
232
|
-
node_modules
|
|
233
|
-
package-lock.json
|
|
234
|
-
dist
|
|
235
|
-
EOF
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
之后 `npm pack --dry-run` 会用这个文件,不再读 `.gitignore`。
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## 附录 B:常用命令速查
|
|
243
|
-
|
|
244
|
-
| 目的 | 命令 |
|
|
245
|
-
|---|---|
|
|
246
|
-
| 查包是否被占 | `npm view <name> name version` |
|
|
247
|
-
| 查包全部元信息 | `npm view <name> --json` |
|
|
248
|
-
| 查自己是谁 | `npm whoami` |
|
|
249
|
-
| 查账号 2FA 模式 | `npm profile get` |
|
|
250
|
-
| 生成 tarball(不发布) | `npm pack` |
|
|
251
|
-
| 预览 tarball 内容 | `npm pack --dry-run` |
|
|
252
|
-
| 登录 | `npm login`(交互) |
|
|
253
|
-
| 登出 | `npm logout` |
|
|
254
|
-
| 撤销发布(24 小时内) | `npm unpublish <pkg>@<version>` ⚠️ 慎用 |
|
|
255
|
-
| deprecate 版本 | `npm deprecate <pkg>@<version> "msg"` |
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## 附录 C:本次踩过的坑(避坑指南)
|
|
260
|
-
|
|
261
|
-
| 坑 | 原因 | 解法 |
|
|
262
|
-
|---|---|---|
|
|
263
|
-
| `npm whoami` 401 | `~/.npmrc` 里 token 失效 | `npm login` 重新登录 |
|
|
264
|
-
| publish E404 | 包名被占,token 无权覆盖 | 确认包归属 / 换名 / 用有 publish 权限的 token |
|
|
265
|
-
| publish EOTP | 账号 `auth-and-writes` 2FA 模式 | 生成 **bypass 2FA** 的 token,或网站改 2FA 模式 |
|
|
266
|
-
| tarball 里有 `.codegraph/` | 外层没 `.gitignore`/`.npmignore` | 加 `.npmignore`(附录 A),或接受 166B 的 daemon.pid 跟着发 |
|
|
267
|
-
| `npm version` 自动 commit | 项目变成 git 仓库后 | 加 `--no-git-tag-version` 标志 |
|
|
268
|
-
| `npmrc` 改了没生效 | 缓存 / 文件权限 | `cat ~/.npmrc` 确认;`chmod 600 ~/.npmrc` |
|
package/app/wujie-wk/t.html
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<title>vue.draggable vue3例子</title>
|
|
6
|
-
<meta name="viewport"
|
|
7
|
-
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
|
|
8
|
-
<script src="https://www.itxst.com/package/vue3/vue.global.js"></script>
|
|
9
|
-
<script src="https://www.itxst.com/package/sortable/Sortable.min.js"></script>
|
|
10
|
-
<script src="https://www.itxst.com/package/vuedraggablenext/vuedraggable.umd.min.js"></script>
|
|
11
|
-
</head>
|
|
12
|
-
<body style="padding:10px;">
|
|
13
|
-
<div id="app" class="demo">
|
|
14
|
-
<draggable :list="list" ghost-class="ghost" :force-fallback="true" chosen-class="chosenClass" animation="300"
|
|
15
|
-
@start="onStart" @end="onEnd">
|
|
16
|
-
<template #item="{ element }">
|
|
17
|
-
<div class="item">
|
|
18
|
-
{{ element.name }}
|
|
19
|
-
</div>
|
|
20
|
-
</template>
|
|
21
|
-
</draggable>
|
|
22
|
-
</div>
|
|
23
|
-
<script>
|
|
24
|
-
const app = {
|
|
25
|
-
data() {
|
|
26
|
-
return {
|
|
27
|
-
//需要拖拽的数据
|
|
28
|
-
list: [
|
|
29
|
-
{ name: "www.itxst.com", id: 0 },
|
|
30
|
-
{ name: "www.baidu.com", id: 1 },
|
|
31
|
-
{ name: "www.google.com", id: 2 },
|
|
32
|
-
]
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
//注册draggable组件
|
|
36
|
-
components: {
|
|
37
|
-
'draggable': window.vuedraggable
|
|
38
|
-
},
|
|
39
|
-
methods: {
|
|
40
|
-
//开始拖拽事件
|
|
41
|
-
onStart() {
|
|
42
|
-
|
|
43
|
-
},
|
|
44
|
-
//结束拖拽事件
|
|
45
|
-
onEnd() {
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
Vue.createApp(app).mount('#app')
|
|
51
|
-
</script>
|
|
52
|
-
<style>
|
|
53
|
-
.itxst {
|
|
54
|
-
width: 600px;
|
|
55
|
-
display: flex;
|
|
56
|
-
}
|
|
57
|
-
.itxst>div:nth-of-type(1) {
|
|
58
|
-
flex: 1;
|
|
59
|
-
}
|
|
60
|
-
.itxst>div:nth-of-type(2) {
|
|
61
|
-
width: 270px;
|
|
62
|
-
padding-left: 20px;
|
|
63
|
-
}
|
|
64
|
-
.item {
|
|
65
|
-
border: solid 1px #eee;
|
|
66
|
-
padding: 6px 10px;
|
|
67
|
-
text-align: left;
|
|
68
|
-
}
|
|
69
|
-
.item:hover {
|
|
70
|
-
cursor: move;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.item+.item {
|
|
74
|
-
margin-top: 10px;
|
|
75
|
-
}
|
|
76
|
-
.ghost {
|
|
77
|
-
border: solid 1px rgb(19, 41, 239) !important;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.chosenClass {
|
|
81
|
-
background-color: #eee;
|
|
82
|
-
opacity: 1;
|
|
83
|
-
border: solid 1px red;
|
|
84
|
-
}
|
|
85
|
-
.fallbackClass {
|
|
86
|
-
background-color: aquamarine;
|
|
87
|
-
}
|
|
88
|
-
</style>
|
|
89
|
-
</body>
|
|
90
|
-
</html>
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
root: true,
|
|
3
|
-
env: {
|
|
4
|
-
node: true,
|
|
5
|
-
es6: true
|
|
6
|
-
},
|
|
7
|
-
extends: [
|
|
8
|
-
'plugin:vue/essential',
|
|
9
|
-
'eslint:recommended'
|
|
10
|
-
],
|
|
11
|
-
parserOptions: {
|
|
12
|
-
parser: 'babel-eslint',
|
|
13
|
-
ecmaVersion: 2020,
|
|
14
|
-
sourceType: 'module'
|
|
15
|
-
},
|
|
16
|
-
rules: {
|
|
17
|
-
'vue/multi-word-component-names': 'off'
|
|
18
|
-
}
|
|
19
|
-
};
|