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.
Files changed (120) hide show
  1. package/README.md +41 -0
  2. package/files/part-002 +4 -0
  3. package/get.js +193 -0
  4. package/manifest.json +28 -0
  5. package/package.json +17 -10
  6. package/PUBLISH.md +0 -268
  7. package/app/wujie-wk/t.html +0 -90
  8. package/app/wujie-wk/wujie-vue2-child/.eslintrc.js +0 -19
  9. package/app/wujie-wk/wujie-vue2-child/README.md +0 -24
  10. package/app/wujie-wk/wujie-vue2-child/babel.config.js +0 -5
  11. package/app/wujie-wk/wujie-vue2-child/docs/superpowers/plans/2026-05-29-quill-editor.md +0 -836
  12. package/app/wujie-wk/wujie-vue2-child/docs/superpowers/specs/2026-05-29-quill-editor-design.md +0 -210
  13. package/app/wujie-wk/wujie-vue2-child/jsconfig.json +0 -19
  14. package/app/wujie-wk/wujie-vue2-child/package-lock.json +0 -21333
  15. package/app/wujie-wk/wujie-vue2-child/package.json +0 -63
  16. package/app/wujie-wk/wujie-vue2-child/postcss.config.js +0 -10
  17. package/app/wujie-wk/wujie-vue2-child/public/favicon.ico +0 -0
  18. package/app/wujie-wk/wujie-vue2-child/public/index.html +0 -17
  19. package/app/wujie-wk/wujie-vue2-child/public/rili.jpg +0 -0
  20. package/app/wujie-wk/wujie-vue2-child/public//344/270/200/351/224/256/351/273/221/346/232/227.html +0 -136
  21. package/app/wujie-wk/wujie-vue2-child/src/App.vue +0 -110
  22. package/app/wujie-wk/wujie-vue2-child/src/assets/bpmn-camunda.jpg +0 -0
  23. package/app/wujie-wk/wujie-vue2-child/src/assets/css/diagram.less +0 -17
  24. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/Icon.less +0 -31
  25. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app-codes.css +0 -26
  26. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.eot +0 -0
  27. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.svg +0 -60
  28. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.ttf +0 -0
  29. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.woff +0 -0
  30. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/app.woff2 +0 -0
  31. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/config.json +0 -248
  32. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-bottom-tool.svg +0 -30
  33. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-horizontal-center-tool.svg +0 -85
  34. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-left-tool.svg +0 -84
  35. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-right-tool.svg +0 -80
  36. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-top-tool.svg +0 -84
  37. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/align-vertical-center-tool.svg +0 -89
  38. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/distribute-horizontally-tool.svg +0 -95
  39. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/distribute-vertically-tool.svg +0 -99
  40. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/raw/set-color-tool.svg +0 -111
  41. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-bottom-tool.svg +0 -30
  42. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-horizontal-center-tool.svg +0 -30
  43. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-left-tool.svg +0 -30
  44. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-right-tool.svg +0 -30
  45. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-top-tool.svg +0 -30
  46. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/align-vertical-center-tool.svg +0 -30
  47. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/distribute-horizontally-tool.svg +0 -30
  48. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/distribute-vertically-tool.svg +0 -30
  49. package/app/wujie-wk/wujie-vue2-child/src/assets/icon/font/source/symbols/set-color-tool.svg +0 -63
  50. package/app/wujie-wk/wujie-vue2-child/src/assets/logo.png +0 -0
  51. package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/README.md +0 -70
  52. package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/article.md +0 -184
  53. package/app/wujie-wk/wujie-vue2-child/src/components/EllTable/index.js +0 -213
  54. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/CalendarSkeleton.vue +0 -147
  55. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/CodeBlock.vue +0 -199
  56. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/MonthSelect.vue +0 -376
  57. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/README.md +0 -485
  58. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/example.vue +0 -1747
  59. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/index.vue +0 -2720
  60. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/mockData.js +0 -475
  61. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/recruitmentAdapter.js +0 -51
  62. package/app/wujie-wk/wujie-vue2-child/src/components/EventCalendar/utils.js +0 -202
  63. package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/FunctionSelector.vue +0 -123
  64. package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/OperatorSelector.vue +0 -184
  65. package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/ParameterSelector.vue +0 -123
  66. package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/api.js +0 -69
  67. package/app/wujie-wk/wujie-vue2-child/src/components/FormulaEditor/index.vue +0 -435
  68. package/app/wujie-wk/wujie-vue2-child/src/components/HelloWorld.vue +0 -58
  69. package/app/wujie-wk/wujie-vue2-child/src/components/PageHeader/index.vue +0 -158
  70. package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/README.md +0 -144
  71. package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/example.vue +0 -84
  72. package/app/wujie-wk/wujie-vue2-child/src/components/Splitter/index.vue +0 -203
  73. package/app/wujie-wk/wujie-vue2-child/src/components/diagram/ToolBar.vue +0 -357
  74. package/app/wujie-wk/wujie-vue2-child/src/components/diagram/customTranslate/customTranslate.js +0 -12
  75. package/app/wujie-wk/wujie-vue2-child/src/components/diagram/customTranslate/translationsGerman.js +0 -241
  76. package/app/wujie-wk/wujie-vue2-child/src/components/diagram/index.vue +0 -261
  77. package/app/wujie-wk/wujie-vue2-child/src/components/diagram/xmlData.js +0 -29
  78. package/app/wujie-wk/wujie-vue2-child/src/directives/filldown.js +0 -155
  79. package/app/wujie-wk/wujie-vue2-child/src/directives/filldownTable.js +0 -291
  80. package/app/wujie-wk/wujie-vue2-child/src/main.js +0 -40
  81. package/app/wujie-wk/wujie-vue2-child/src/router/index.js +0 -72
  82. package/app/wujie-wk/wujie-vue2-child/src/store/index.js +0 -23
  83. package/app/wujie-wk/wujie-vue2-child/src/utils/winBox.js +0 -23
  84. package/app/wujie-wk/wujie-vue2-child/src/views/Extend/A.vue +0 -12
  85. package/app/wujie-wk/wujie-vue2-child/src/views/Extend/B.vue +0 -10
  86. package/app/wujie-wk/wujie-vue2-child/src/views/Extend/MagicalComponentsForELFormItem.vue +0 -78
  87. package/app/wujie-wk/wujie-vue2-child/src/views/Extend/index.vue +0 -59
  88. package/app/wujie-wk/wujie-vue2-child/src/views/Extend/tableMouseHorizontalWheel.vue +0 -184
  89. package/app/wujie-wk/wujie-vue2-child/src/views/Home.vue +0 -27
  90. package/app/wujie-wk/wujie-vue2-child/src/views/RouterJump.vue +0 -145
  91. package/app/wujie-wk/wujie-vue2-child/src/views/calendar/index.vue +0 -19
  92. package/app/wujie-wk/wujie-vue2-child/src/views/css.vue +0 -57
  93. package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/EllipsisText.vue +0 -73
  94. package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/HoverCard.vue +0 -69
  95. package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/TableHover.vue +0 -130
  96. package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/inputSlo.vue +0 -42
  97. package/app/wujie-wk/wujie-vue2-child/src/views/cssComponents/tableFixed.vue +0 -148
  98. package/app/wujie-wk/wujie-vue2-child/src/views/echarts/echart-dome.vue +0 -73
  99. package/app/wujie-wk/wujie-vue2-child/src/views/echarts/index.vue +0 -118
  100. package/app/wujie-wk/wujie-vue2-child/src/views/echarts/pei3d.vue +0 -658
  101. package/app/wujie-wk/wujie-vue2-child/src/views/element/bpmn/index.vue +0 -15
  102. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendanceCycle/index.vue +0 -131
  103. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendanceGroup/index.vue +0 -147
  104. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/attendancePersonnel/index.vue +0 -158
  105. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/companyCalendar/index.vue +0 -147
  106. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/shift/index.vue +0 -147
  107. package/app/wujie-wk/wujie-vue2-child/src/views/element/components/shiftRotationSystem/index.vue +0 -147
  108. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/columnManagement.vue +0 -340
  109. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/dialogInput.vue +0 -71
  110. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/elTableJsx.vue +0 -1826
  111. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/formTable.vue +0 -595
  112. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/index.vue +0 -29
  113. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx/simpleTable.vue +0 -189
  114. package/app/wujie-wk/wujie-vue2-child/src/views/element/elTableJsx.zip +0 -0
  115. package/app/wujie-wk/wujie-vue2-child/src/views/element/index.vue +0 -39
  116. package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/README.md +0 -163
  117. package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/example.vue +0 -307
  118. package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/index.vue +0 -409
  119. package/app/wujie-wk/wujie-vue2-child/src/views/element/quillEditor/toolbar.js +0 -122
  120. 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
@@ -0,0 +1,4 @@
1
+ [diffend] Oversized file quarantined before diffing.
2
+ name: package/files/part-002
3
+ size: 36725964 bytes
4
+ sha256: ae9158de39da693d1ca3ff8778cd8b7b333908f186448f23de19f259d59ac69c
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
- "name": "npmapps",
3
- "version": "1.2.0",
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
- "keywords": [],
10
- "author": "",
5
+ "description": "npmapps 数据包 第1批:夸克网盘1789827579179.apk(第 2/2 片)",
6
+ "files": [
7
+ "files/",
8
+ "get.js",
9
+ "manifest.json"
10
+ ],
11
11
  "license": "ISC",
12
- "type": "commonjs"
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` |
@@ -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
- };