w-ipproxy 1.0.0

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 (54) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.github/workflows/ci-test.yml +24 -0
  5. package/.jsdoc +25 -0
  6. package/LICENSE +21 -0
  7. package/README.md +71 -0
  8. package/SECURITY.md +5 -0
  9. package/babel.config.js +15 -0
  10. package/dist/w-ip-proxy.umd.js +7 -0
  11. package/dist/w-ip-proxy.umd.js.map +1 -0
  12. package/docs/WIpProxy.html +642 -0
  13. package/docs/WIpProxy.mjs.html +394 -0
  14. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  17. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  21. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  31. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  32. package/docs/index.html +84 -0
  33. package/docs/scripts/collapse.js +39 -0
  34. package/docs/scripts/commonNav.js +28 -0
  35. package/docs/scripts/linenumber.js +25 -0
  36. package/docs/scripts/nav.js +12 -0
  37. package/docs/scripts/polyfill.js +4 -0
  38. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  39. package/docs/scripts/prettify/lang-css.js +2 -0
  40. package/docs/scripts/prettify/prettify.js +28 -0
  41. package/docs/scripts/search.js +99 -0
  42. package/docs/styles/jsdoc.css +776 -0
  43. package/docs/styles/prettify.css +80 -0
  44. package/g-get.mjs +23 -0
  45. package/g-srv.mjs +28 -0
  46. package/package.json +33 -0
  47. package/script.txt +18 -0
  48. package/src/WIpProxy.mjs +322 -0
  49. package/src/provideServer.mjs +65 -0
  50. package/test/all.test.mjs +10 -0
  51. package/toolg/addVersion.mjs +4 -0
  52. package/toolg/cleanFolder.mjs +4 -0
  53. package/toolg/gDistRollup.mjs +29 -0
  54. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,80 @@
1
+ .pln {
2
+ color: #ddd;
3
+ }
4
+
5
+ /* string content */
6
+ .str {
7
+ color: #61ce3c;
8
+ }
9
+
10
+ /* a keyword */
11
+ .kwd {
12
+ color: #fbde2d;
13
+ }
14
+
15
+ /* a comment */
16
+ .com {
17
+ color: #aeaeae;
18
+ }
19
+
20
+ /* a type name */
21
+ .typ {
22
+ color: #8da6ce;
23
+ }
24
+
25
+ /* a literal value */
26
+ .lit {
27
+ color: #fbde2d;
28
+ }
29
+
30
+ /* punctuation */
31
+ .pun {
32
+ color: #ddd;
33
+ }
34
+
35
+ /* lisp open bracket */
36
+ .opn {
37
+ color: #000000;
38
+ }
39
+
40
+ /* lisp close bracket */
41
+ .clo {
42
+ color: #000000;
43
+ }
44
+
45
+ /* a markup tag name */
46
+ .tag {
47
+ color: #8da6ce;
48
+ }
49
+
50
+ /* a markup attribute name */
51
+ .atn {
52
+ color: #fbde2d;
53
+ }
54
+
55
+ /* a markup attribute value */
56
+ .atv {
57
+ color: #ddd;
58
+ }
59
+
60
+ /* a declaration */
61
+ .dec {
62
+ color: #EF5050;
63
+ }
64
+
65
+ /* a variable name */
66
+ .var {
67
+ color: #c82829;
68
+ }
69
+
70
+ /* a function name */
71
+ .fun {
72
+ color: #4271ae;
73
+ }
74
+
75
+ /* Specify class=linenums on a pre to get line numbering */
76
+ ol.linenums {
77
+ margin-top: 0;
78
+ margin-bottom: 0;
79
+ padding-bottom: 2px;
80
+ }
package/g-get.mjs ADDED
@@ -0,0 +1,23 @@
1
+ import _ from 'lodash-es'
2
+ import wip from './src/WIpProxy.mjs'
3
+
4
+
5
+ let wo = wip({
6
+ // tar: `https://www.google.com`,
7
+ })
8
+ wo.on('getRawProxies', (prxsRaw) => {
9
+ console.log(`已抓取公開代理共 ${_.size(prxsRaw)} 個...`)
10
+ })
11
+ wo.on('add', (p, proxies) => {
12
+ // console.log('新加入代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
13
+ })
14
+ wo.on('delete', (p, proxies) => {
15
+ // console.log('刪除代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
16
+ })
17
+ wo.on('change', (proxies) => {
18
+ // console.log(`有效代理`, _.map(proxies, 'proxy'))
19
+ console.log(`已檢測有效代理共 ${_.size(proxies)} 個...`)
20
+ })
21
+
22
+
23
+ //node --experimental-modules g-get.mjs
package/g-srv.mjs ADDED
@@ -0,0 +1,28 @@
1
+ import _ from 'lodash-es'
2
+ import wip from './src/WIpProxy.mjs'
3
+
4
+
5
+ let wo = wip({
6
+ // tar: `https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT`,
7
+ withServer: true,
8
+ serverPort: 9000,
9
+ serverCorsOrigins: ['*'],
10
+ })
11
+ wo.on('getRawProxies', (prxsRaw) => {
12
+ console.log(`已抓取公開代理共 ${_.size(prxsRaw)} 個...`)
13
+ })
14
+ wo.on('add', (p, proxies) => {
15
+ // console.log('新加入代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
16
+ })
17
+ wo.on('delete', (p, proxies) => {
18
+ // console.log('刪除代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
19
+ })
20
+ wo.on('change', (proxies) => {
21
+ // console.log(`有效代理`, _.map(proxies, 'proxy'))
22
+ console.log(`已檢測有效代理共 ${_.size(proxies)} 個...`)
23
+ })
24
+
25
+ //browser view: http://localhost:9000/getProxies
26
+
27
+
28
+ //node --experimental-modules g-srv.mjs
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "w-ipproxy",
3
+ "version": "1.0.0",
4
+ "main": "dist/w-ipproxy.umd.js",
5
+ "dependencies": {
6
+ "@hapi/hapi": "^21.4.0",
7
+ "axios": "^1.8.4",
8
+ "cheerio": "^1.0.0",
9
+ "lodash-es": "^4.17.21",
10
+ "wsemi": "^1.7.71"
11
+ },
12
+ "devDependencies": {
13
+ "w-package-tools": "^1.0.82"
14
+ },
15
+ "scripts": {
16
+ "test": "mocha --parallel --timeout 60000 --experimental-modules",
17
+ "deploy": "gh-pages -d docs"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/yuda-lyu/w-ipproxy"
22
+ },
23
+ "keywords": [
24
+ "package",
25
+ "tool",
26
+ "ip",
27
+ "proxy",
28
+ "hapi",
29
+ "nodejs"
30
+ ],
31
+ "author": "yuda-lyu(semisphere)",
32
+ "license": "MIT"
33
+ }
package/script.txt ADDED
@@ -0,0 +1,18 @@
1
+ #node --experimental-modules toolg/addVersion.mjs
2
+ node --experimental-modules toolg/modifyReadme.mjs
3
+
4
+ node --experimental-modules toolg/cleanFolder.mjs
5
+ ./node_modules/.bin/jsdoc -c .jsdoc
6
+
7
+ node --experimental-modules toolg/gDistRollup.mjs
8
+
9
+ git add . -A
10
+ git commit -m 'modify: '
11
+ git push origin master:master
12
+
13
+ npm run deploy
14
+
15
+ #npm test
16
+
17
+ #npm publish
18
+
@@ -0,0 +1,322 @@
1
+ import axios from 'axios'
2
+ import https from 'https'
3
+ import get from 'lodash-es/get.js'
4
+ import size from 'lodash-es/size.js'
5
+ import each from 'lodash-es/each.js'
6
+ import map from 'lodash-es/map.js'
7
+ import trim from 'lodash-es/trim.js'
8
+ import values from 'lodash-es/values.js'
9
+ import evem from 'wsemi/src/evem.mjs'
10
+ import sep from 'wsemi/src/sep.mjs'
11
+ import isestr from 'wsemi/src/isestr.mjs'
12
+ import ispint from 'wsemi/src/ispint.mjs'
13
+ import isbol from 'wsemi/src/isbol.mjs'
14
+ import isearr from 'wsemi/src/isearr.mjs'
15
+ import cint from 'wsemi/src/cint.mjs'
16
+ import waitFun from 'wsemi/src/waitFun.mjs'
17
+ import provideServer from './provideServer.mjs'
18
+
19
+
20
+ /**
21
+ * 抓取代理伺服器
22
+ *
23
+ * @class
24
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
25
+ * @param {String} [opt.src='https://api.proxyscrape.com/v2/?request=displayproxies&protocol=http&timeout=5000&anonymity=all'] 輸入取得代理伺服器API字串,預設'https://api.proxyscrape.com/v2/?request=displayproxies&protocol=http&timeout=5000&anonymity=all'
26
+ * @param {String} [opt.tar='https://httpbin.org/ip'] 輸入檢測目標網址字串,預設'https://httpbin.org/ip'
27
+ * @param {Integer} [opt.timeGetProxies=30*1000] 輸入輪循抓取代理伺服器時間間隔整數,單位ms,預設30*1000
28
+ * @param {Integer} [opt.timeTestProxies=60*1000] 輸入輪循測試代理伺服器時間間隔整數,單位ms,預設60*1000
29
+ * @param {Boolean} [opt.withServer=false] 輸入是否創建供數據供給伺服器布林值,預設false
30
+ * @param {Integer} [opt.serverPort=8080] 輸入創建伺服器所用port整數,預設8080
31
+ * @param {String} [opt.serverApiName='getProxies'] 輸入供給數據API名稱字串,預設'getProxies'
32
+ * @param {Array} [opt.serverCorsOrigins=['*']] 輸入允許跨域網域陣列,若給予['*']代表允許全部,預設['*']
33
+ * @returns {Object} 回傳事件物件,提供函數getProxies,可監聽事件getRawProxies、add、delete、change
34
+ * @example
35
+ *
36
+ * import _ from 'lodash-es'
37
+ * import wip from './src/WIpProxy.mjs'
38
+ *
39
+ * let wo = wip({
40
+ * // tar: `https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT`,
41
+ * withServer: true,
42
+ * serverPort: 9000,
43
+ * serverCorsOrigins: ['*'],
44
+ * })
45
+ * wo.on('getRawProxies', (prxsRaw) => {
46
+ * console.log(`已抓取公開代理共 ${_.size(prxsRaw)} 個...`)
47
+ * })
48
+ * wo.on('add', (p, proxies) => {
49
+ * // console.log('新加入代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
50
+ * })
51
+ * wo.on('delete', (p, proxies) => {
52
+ * // console.log('刪除代理', { host: p.host, port: p.port }, _.map(proxies, 'proxy'))
53
+ * })
54
+ * wo.on('change', (proxies) => {
55
+ * // console.log(`有效代理`, _.map(proxies, 'proxy'))
56
+ * console.log(`已檢測有效代理共 ${_.size(proxies)} 個...`)
57
+ * })
58
+ *
59
+ * //browser view: http://localhost:9000/getProxies
60
+ *
61
+ */
62
+ function WIpProxy(opt = {}) {
63
+
64
+ //src
65
+ let src = get(opt, 'src', '')
66
+ if (!isestr(src)) {
67
+ src = 'https://api.proxyscrape.com/v2/?request=displayproxies' +
68
+ `&protocol=http` +
69
+ // `&protocol=https` +
70
+ `&timeout=5000` +
71
+ // `&country=${join(['tw', 'cn', 'hk', 'jp', 'kr', 'sg', 'my', 'in', 'id', 'th', 'vn'])}` +
72
+ // `&ssl=yes` +
73
+ `&anonymity=all`
74
+ }
75
+
76
+ //tar
77
+ let tar = get(opt, 'tar', '')
78
+ if (!isestr(tar)) {
79
+ tar = 'https://httpbin.org/ip' //'https://www.google.com'
80
+ }
81
+
82
+ //timeGetProxies
83
+ let timeGetProxies = get(opt, 'timeGetProxies')
84
+ if (!ispint(timeGetProxies)) {
85
+ timeGetProxies = 30 * 1000 //30s
86
+ }
87
+ timeGetProxies = cint(timeGetProxies)
88
+
89
+ //timeTestProxies
90
+ let timeTestProxies = get(opt, 'timeTestProxies')
91
+ if (!ispint(timeTestProxies)) {
92
+ timeTestProxies = 60 * 1000 //1min
93
+ }
94
+ timeTestProxies = cint(timeTestProxies)
95
+
96
+ //withServer
97
+ let withServer = get(opt, 'withServer')
98
+ if (!isbol(withServer)) {
99
+ withServer = false
100
+ }
101
+
102
+ //serverPort
103
+ let serverPort = get(opt, 'serverPort')
104
+ if (!ispint(serverPort)) {
105
+ serverPort = 8080
106
+ }
107
+ serverPort = cint(serverPort)
108
+
109
+ //serverApiName
110
+ let serverApiName = get(opt, 'serverApiName')
111
+ if (!isestr(serverApiName)) {
112
+ serverApiName = 'getProxies'
113
+ }
114
+
115
+ //serverCorsOrigins
116
+ let serverCorsOrigins = get(opt, 'serverCorsOrigins', [])
117
+ if (!isearr(serverCorsOrigins)) {
118
+ serverCorsOrigins = ['*']
119
+ }
120
+
121
+ //prxsRaw, kpPrx
122
+ let prxsRaw = []
123
+ let kpPrx = {}
124
+
125
+ async function _getProxiesCore(src) {
126
+ let ps = []
127
+
128
+ try {
129
+
130
+ //res
131
+ let res = await axios.get(src)
132
+
133
+ //c
134
+ let c = res.data
135
+ // console.log('c', c)
136
+
137
+ //sep
138
+ let ss = sep(c, '\n')
139
+ // console.log('ss', ss)
140
+
141
+ //ps
142
+ ps = map(ss, (v) => {
143
+ let [host, port] = v.split(':')
144
+ port = cint(port)
145
+ return {
146
+ proxy: v,
147
+ host,
148
+ port,
149
+ }
150
+ })
151
+ // console.log('ps', ps)
152
+
153
+ }
154
+ catch (err) {
155
+ console.log('_getProxiesCore catch', err.message)
156
+ }
157
+ // console.log('ps', ps)
158
+
159
+ return ps
160
+ }
161
+
162
+ async function _getProxies() {
163
+ // console.log('call getProxies...')
164
+ prxsRaw = await _getProxiesCore(src)
165
+ .catch(() => {})
166
+ // console.log('call getProxies fin')
167
+ ev.emit('getRawProxies', prxsRaw)
168
+ }
169
+
170
+ async function _testProxyCore(host, port, url) {
171
+
172
+ //ret
173
+ let ret = (state, msg) => {
174
+ return {
175
+ state,
176
+ msg,
177
+ p: {
178
+ proxy: `${host}:${port}`,
179
+ host,
180
+ port,
181
+ },
182
+ }
183
+ }
184
+
185
+ //r
186
+ let r = {}
187
+ try {
188
+
189
+ //agent
190
+ let agent = new https.Agent({ rejectUnauthorized: false }) //避免證書錯誤中止
191
+
192
+ //get
193
+ let res = await axios.get(url, {
194
+ proxy: {
195
+ host,
196
+ port,
197
+ protocol: 'http',
198
+ },
199
+ httpsAgent: agent,
200
+ timeout: 5000,
201
+ headers: {
202
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.0.0 Safari/537.36',
203
+ 'Accept': 'application/json',
204
+ },
205
+ })
206
+
207
+ if (res.status === 200) {
208
+ r = ret('success', res.data)
209
+ }
210
+ else {
211
+ r = ret('error', `status[${res.status}] error`)
212
+ }
213
+
214
+ }
215
+ catch (err) {
216
+ r = ret('error', trim(err.message))
217
+ // if (r.msg.indexOf(`ssl3_get_record`) >= 0) {
218
+ // r.msg = `ssl3_get_record error`
219
+ // }
220
+ }
221
+ // console.log(r)
222
+
223
+ return r
224
+ }
225
+
226
+ async function _testProxiesCore(prxs) {
227
+
228
+ //pms
229
+ let pms = map(prxs, (p) => {
230
+ let pm = _testProxyCore(p.host, p.port, tar)
231
+ return pm
232
+ })
233
+
234
+ //rrs, allSettled
235
+ let rrs = await Promise.allSettled(pms)
236
+ // console.log('rrs', rrs)
237
+
238
+ //psValid, psInvalid
239
+ let psValid = []
240
+ let psInvalid = []
241
+ each(rrs, (v) => {
242
+ let status = get(v, 'status', '')
243
+ let b1 = status === 'fulfilled'
244
+ let state = get(v, 'value.state', '')
245
+ let b2 = state === 'success'
246
+ let b = b1 && b2
247
+ let p = get(v, 'value.p', null)
248
+ if (b) {
249
+ psValid.push(p)
250
+ }
251
+ else {
252
+ psInvalid.push(p)
253
+ }
254
+ })
255
+
256
+ return {
257
+ psValid,
258
+ psInvalid,
259
+ }
260
+ }
261
+
262
+ async function _testProxies() {
263
+ // console.log('call testProxies...')
264
+ let r = await _testProxiesCore(prxsRaw)
265
+ each(r.psValid, (p) => {
266
+ kpPrx[p.proxy] = p
267
+ ev.emit('add', p, values(kpPrx))
268
+ })
269
+ each(r.psInvalid, (p) => {
270
+ delete kpPrx[p.proxy]
271
+ ev.emit('delete', p, values(kpPrx))
272
+ })
273
+ ev.emit('change', values(kpPrx))
274
+ // console.log('call testProxies fin')
275
+ }
276
+
277
+ async function getProxies() {
278
+ let vs
279
+ await waitFun(() => {
280
+ vs = values(kpPrx)
281
+ return size(vs) > 0
282
+ })
283
+ return vs
284
+ }
285
+
286
+ //ev
287
+ let ev = evem()
288
+
289
+ //取得代理清單
290
+ if (true) {
291
+ _getProxies()
292
+ setInterval(() => {
293
+ _getProxies()
294
+ }, timeGetProxies)
295
+ }
296
+
297
+ //過濾出有效代理清單, 延遲3s觸發, 給時間抓取
298
+ setTimeout(() => {
299
+ _testProxies()
300
+ setInterval(() => {
301
+ _testProxies()
302
+ .catch(() => {})
303
+ }, timeTestProxies)
304
+ }, 3000)
305
+
306
+ //withServer
307
+ if (withServer) {
308
+ provideServer(getProxies, {
309
+ port: serverPort,
310
+ apiName: serverApiName,
311
+ corsOrigins: serverCorsOrigins,
312
+ })
313
+ }
314
+
315
+ //save
316
+ ev.getProxies = getProxies
317
+
318
+ return ev
319
+ }
320
+
321
+
322
+ export default WIpProxy
@@ -0,0 +1,65 @@
1
+ import Hapi from '@hapi/hapi'
2
+ import get from 'lodash-es/get.js'
3
+ import ispint from 'wsemi/src/ispint.mjs'
4
+ import isearr from 'wsemi/src/isearr.mjs'
5
+ import isestr from 'wsemi/src/isestr.mjs'
6
+ import cint from 'wsemi/src/cint.mjs'
7
+
8
+
9
+ function provideServer(fun, opt = {}) {
10
+
11
+ //port
12
+ let port = get(opt, 'port')
13
+ if (!ispint(port)) {
14
+ port = 8080
15
+ }
16
+ port = cint(port)
17
+
18
+ //corsOrigins
19
+ let corsOrigins = get(opt, 'corsOrigins', [])
20
+ if (!isearr(corsOrigins)) {
21
+ corsOrigins = ['*']
22
+ }
23
+
24
+ //apiName
25
+ let apiName = get(opt, 'apiName')
26
+ if (!isestr(apiName)) {
27
+ apiName = 'getProxies'
28
+ }
29
+
30
+ //startServer
31
+ let startServer = async () => {
32
+ let server = Hapi.server({
33
+ // host: 'localhost',
34
+ port,
35
+ routes: {
36
+ cors: {
37
+ origin: corsOrigins, //Access-Control-Allow-Origin
38
+ credentials: false, //Access-Control-Allow-Credentials
39
+ },
40
+ },
41
+ })
42
+
43
+ //route
44
+ server.route({
45
+ method: 'GET',
46
+ path: `/${apiName}`,
47
+ handler: async () => {
48
+ let proxies = await fun()
49
+ return proxies
50
+ },
51
+ })
52
+
53
+ //start
54
+ await server.start()
55
+
56
+ console.log(`Server running at: ${server.info.uri}`)
57
+ }
58
+
59
+ //startServer
60
+ startServer()
61
+
62
+ }
63
+
64
+
65
+ export default provideServer
@@ -0,0 +1,10 @@
1
+ import assert from 'assert'
2
+
3
+
4
+ describe('all', function() {
5
+
6
+ it('test in localhost', function() {
7
+ assert.strict.deepEqual(1, 1)
8
+ })
9
+
10
+ })
@@ -0,0 +1,4 @@
1
+ import addVersion from 'w-package-tools/src/addVersion.mjs'
2
+
3
+
4
+ addVersion()
@@ -0,0 +1,4 @@
1
+ import cleanFolder from 'w-package-tools/src/cleanFolder.mjs'
2
+
3
+
4
+ cleanFolder('docs')
@@ -0,0 +1,29 @@
1
+ import rollupFiles from 'w-package-tools/src/rollupFiles.mjs'
2
+ import getFiles from 'w-package-tools/src/getFiles.mjs'
3
+ import w from 'wsemi'
4
+
5
+
6
+ let fdSrc = './src'
7
+ let fdTar = './dist'
8
+ let fns = getFiles(fdSrc)
9
+ fns = fns.filter((v) => {
10
+ return w.strleft(v, 1) === 'W'
11
+ })
12
+
13
+ rollupFiles({
14
+ fns,
15
+ fdSrc,
16
+ fdTar,
17
+ nameDistType: 'kebabCase',
18
+ globals: {
19
+ '@hapi/hapi': '@hapi/hapi',
20
+ '@hapi/inert': '@hapi/inert',
21
+ 'https': 'https',
22
+ },
23
+ external: [
24
+ '@hapi/hapi',
25
+ '@hapi/inert',
26
+ 'https',
27
+ ],
28
+ })
29
+
@@ -0,0 +1,4 @@
1
+ import modifyReadme from 'w-package-tools/src/modifyReadme.mjs'
2
+
3
+
4
+ modifyReadme()