vite 2.9.0-beta.0 → 2.9.0-beta.11

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.

Potentially problematic release.


This version of vite might be problematic. Click here for more details.

@@ -10201,7 +10201,7 @@ function is_some_comments(comment) {
10201
10201
  // multiline comment
10202
10202
  return (
10203
10203
  (comment.type === "comment2" || comment.type === "comment1")
10204
- && /@preserve|@lic|@cc_on|^\**!/i.test(comment.value)
10204
+ && /@preserve|@copyright|@lic|@cc_on|^\**!/i.test(comment.value)
10205
10205
  );
10206
10206
  }
10207
10207
 
@@ -10314,8 +10314,8 @@ function OutputStream(options) {
10314
10314
  var OUTPUT = new Rope();
10315
10315
  let printed_comments = new Set();
10316
10316
 
10317
- var to_utf8 = options.ascii_only ? function(str, identifier) {
10318
- if (options.ecma >= 2015 && !options.safari10) {
10317
+ var to_utf8 = options.ascii_only ? function(str, identifier = false, regexp = false) {
10318
+ if (options.ecma >= 2015 && !options.safari10 && !regexp) {
10319
10319
  str = str.replace(/[\ud800-\udbff][\udc00-\udfff]/g, function(ch) {
10320
10320
  var code = get_full_char_code(ch, 0).toString(16);
10321
10321
  return "\\u{" + code + "}";
@@ -11127,7 +11127,8 @@ function OutputStream(options) {
11127
11127
  var p = output.parent();
11128
11128
  if (this.args.length === 0
11129
11129
  && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]()
11130
- || p instanceof AST_Call && p.expression === this)) // (new foo)(bar)
11130
+ || p instanceof AST_Call && p.expression === this
11131
+ || p instanceof AST_PrefixedTemplateString && p.prefix === this)) // (new foo)(bar)
11131
11132
  return true;
11132
11133
  });
11133
11134
 
@@ -12242,7 +12243,7 @@ function OutputStream(options) {
12242
12243
  flags = flags ? sort_regexp_flags(flags) : "";
12243
12244
  source = source.replace(r_slash_script, slash_script_replace);
12244
12245
 
12245
- output.print(output.to_utf8(`/${source}/${flags}`));
12246
+ output.print(output.to_utf8(`/${source}/${flags}`, false, true));
12246
12247
 
12247
12248
  const parent = output.parent();
12248
12249
  if (
@@ -12666,6 +12667,11 @@ const MASK_EXPORT_WANT_MANGLE = 1 << 1;
12666
12667
 
12667
12668
  let function_defs = null;
12668
12669
  let unmangleable_names = null;
12670
+ /**
12671
+ * When defined, there is a function declaration somewhere that's inside of a block.
12672
+ * See https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-block-level-function-declarations-web-legacy-compatibility-semantics
12673
+ */
12674
+ let scopes_with_block_defuns = null;
12669
12675
 
12670
12676
  class SymbolDef {
12671
12677
  constructor(scope, orig, init) {
@@ -13216,6 +13222,15 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
13216
13222
  });
13217
13223
 
13218
13224
  function next_mangled(scope, options) {
13225
+ let defun_scope;
13226
+ if (
13227
+ scopes_with_block_defuns
13228
+ && (defun_scope = scope.get_defun_scope())
13229
+ && scopes_with_block_defuns.has(defun_scope)
13230
+ ) {
13231
+ scope = defun_scope;
13232
+ }
13233
+
13219
13234
  var ext = scope.enclosed;
13220
13235
  var nth_identifier = options.nth_identifier;
13221
13236
  out: while (true) {
@@ -13350,6 +13365,13 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
13350
13365
  lname = save_nesting;
13351
13366
  return true; // don't descend again in TreeWalker
13352
13367
  }
13368
+ if (
13369
+ node instanceof AST_Defun
13370
+ && !(tw.parent() instanceof AST_Scope)
13371
+ ) {
13372
+ scopes_with_block_defuns = scopes_with_block_defuns || new Set();
13373
+ scopes_with_block_defuns.add(node.parent_scope.get_defun_scope());
13374
+ }
13353
13375
  if (node instanceof AST_Scope) {
13354
13376
  node.variables.forEach(collect);
13355
13377
  return;
@@ -13398,6 +13420,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
13398
13420
 
13399
13421
  function_defs = null;
13400
13422
  unmangleable_names = null;
13423
+ scopes_with_block_defuns = null;
13401
13424
 
13402
13425
  function collect(symbol) {
13403
13426
  if (symbol.export & MASK_EXPORT_DONT_MANGLE) {
@@ -30781,7 +30804,54 @@ function cache_to_json(cache) {
30781
30804
  };
30782
30805
  }
30783
30806
 
30784
- async function minify(files, options) {
30807
+ function log_input(files, options, fs, debug_folder) {
30808
+ if (!(fs && fs.writeFileSync && fs.mkdirSync)) {
30809
+ return;
30810
+ }
30811
+
30812
+ try {
30813
+ fs.mkdirSync(debug_folder);
30814
+ } catch (e) {
30815
+ if (e.code !== "EEXIST") throw e;
30816
+ }
30817
+
30818
+ const log_path = `${debug_folder}/terser-debug-${(Math.random() * 9999999) | 0}.log`;
30819
+
30820
+ options = options || {};
30821
+
30822
+ const options_str = JSON.stringify(options, (_key, thing) => {
30823
+ if (typeof thing === "function") return "[Function " + thing.toString() + "]";
30824
+ if (thing instanceof RegExp) return "[RegExp " + thing.toString() + "]";
30825
+ return thing;
30826
+ }, 4);
30827
+
30828
+ const files_str = (file) => {
30829
+ if (typeof file === "object" && options.parse && options.parse.spidermonkey) {
30830
+ return JSON.stringify(file, null, 2);
30831
+ } else if (typeof file === "object") {
30832
+ return Object.keys(file)
30833
+ .map((key) => key + ": " + files_str(file[key]))
30834
+ .join("\n\n");
30835
+ } else if (typeof file === "string") {
30836
+ return "```\n" + file + "\n```";
30837
+ } else {
30838
+ return file; // What do?
30839
+ }
30840
+ };
30841
+
30842
+ fs.writeFileSync(log_path, "Options: \n" + options_str + "\n\nInput files:\n\n" + files_str(files) + "\n");
30843
+ }
30844
+
30845
+ async function minify(files, options, _fs_module) {
30846
+ if (
30847
+ _fs_module
30848
+ && typeof process === "object"
30849
+ && process.env
30850
+ && typeof process.env.TERSER_DEBUG_DIR === "string"
30851
+ ) {
30852
+ log_input(files, options, _fs_module, process.env.TERSER_DEBUG_DIR);
30853
+ }
30854
+
30785
30855
  options = defaults(options, {
30786
30856
  compress: {},
30787
30857
  ecma: undefined,
@@ -30804,6 +30874,7 @@ async function minify(files, options) {
30804
30874
  warnings: false,
30805
30875
  wrap: false,
30806
30876
  }, true);
30877
+
30807
30878
  var timings = options.timings && {
30808
30879
  start: Date.now()
30809
30880
  };
@@ -31205,7 +31276,7 @@ async function run_cli({ program, packageJson, fs, path }) {
31205
31276
 
31206
31277
  let result;
31207
31278
  try {
31208
- result = await minify(files, options);
31279
+ result = await minify(files, options, fs);
31209
31280
  } catch (ex) {
31210
31281
  if (ex.name == "SyntaxError") {
31211
31282
  print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col);
@@ -31268,14 +31339,18 @@ async function run_cli({ program, packageJson, fs, path }) {
31268
31339
  }, 2));
31269
31340
  } else if (program.output == "spidermonkey") {
31270
31341
  try {
31271
- const minified = await minify(result.code, {
31272
- compress: false,
31273
- mangle: false,
31274
- format: {
31275
- ast: true,
31276
- code: false
31277
- }
31278
- });
31342
+ const minified = await minify(
31343
+ result.code,
31344
+ {
31345
+ compress: false,
31346
+ mangle: false,
31347
+ format: {
31348
+ ast: true,
31349
+ code: false
31350
+ }
31351
+ },
31352
+ fs
31353
+ );
31279
31354
  console.log(JSON.stringify(minified.ast.to_mozilla_ast(), null, 2));
31280
31355
  } catch (ex) {
31281
31356
  fatal(ex);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite",
3
- "version": "2.9.0-beta.0",
3
+ "version": "2.9.0-beta.11",
4
4
  "license": "MIT",
5
5
  "author": "Evan You",
6
6
  "description": "Native-ESM powered web dev build tool",
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "//": "READ CONTRIBUTING.md to understand what to put under deps vs. devDeps!",
45
45
  "dependencies": {
46
- "esbuild": "^0.14.14",
47
- "postcss": "^8.4.6",
46
+ "esbuild": "^0.14.27",
47
+ "postcss": "^8.4.12",
48
48
  "resolve": "^1.22.0",
49
49
  "rollup": "^2.59.0"
50
50
  },
@@ -52,17 +52,17 @@
52
52
  "fsevents": "~2.3.2"
53
53
  },
54
54
  "devDependencies": {
55
- "@ampproject/remapping": "^2.1.0",
56
- "@babel/parser": "^7.17.0",
55
+ "@ampproject/remapping": "^2.1.2",
56
+ "@babel/parser": "^7.17.8",
57
57
  "@babel/types": "^7.17.0",
58
- "@jridgewell/trace-mapping": "^0.3.2",
58
+ "@jridgewell/trace-mapping": "^0.3.4",
59
59
  "@rollup/plugin-alias": "^3.1.9",
60
- "@rollup/plugin-commonjs": "^21.0.1",
60
+ "@rollup/plugin-commonjs": "^21.0.3",
61
61
  "@rollup/plugin-dynamic-import-vars": "^1.4.2",
62
62
  "@rollup/plugin-json": "^4.1.0",
63
63
  "@rollup/plugin-node-resolve": "13.1.3",
64
- "@rollup/plugin-typescript": "^8.3.0",
65
- "@rollup/pluginutils": "^4.1.2",
64
+ "@rollup/plugin-typescript": "^8.3.1",
65
+ "@rollup/pluginutils": "^4.2.0",
66
66
  "@types/convert-source-map": "^1.5.2",
67
67
  "@types/cross-spawn": "^6.0.2",
68
68
  "@types/debug": "^4.1.7",
@@ -71,12 +71,12 @@
71
71
  "@types/less": "^3.0.3",
72
72
  "@types/micromatch": "^4.0.2",
73
73
  "@types/mime": "^2.0.3",
74
- "@types/node": "^16.11.22",
74
+ "@types/node": "^16.11.26",
75
75
  "@types/resolve": "^1.20.1",
76
76
  "@types/sass": "~1.43.1",
77
77
  "@types/stylus": "^0.48.36",
78
- "@types/ws": "^8.2.2",
79
- "@vue/compiler-dom": "^3.2.30",
78
+ "@types/ws": "^8.5.3",
79
+ "@vue/compiler-dom": "^3.2.31",
80
80
  "acorn": "^8.7.0",
81
81
  "cac": "6.7.9",
82
82
  "chokidar": "^3.5.3",
@@ -85,34 +85,35 @@
85
85
  "convert-source-map": "^1.8.0",
86
86
  "cors": "^2.8.5",
87
87
  "cross-spawn": "^7.0.3",
88
- "debug": "^4.3.3",
88
+ "debug": "^4.3.4",
89
89
  "dotenv": "^14.3.2",
90
90
  "dotenv-expand": "^5.1.0",
91
- "es-module-lexer": "^0.9.3",
91
+ "es-module-lexer": "^0.10.4",
92
92
  "estree-walker": "^2.0.2",
93
93
  "etag": "^1.8.1",
94
94
  "fast-glob": "^3.2.11",
95
95
  "http-proxy": "^1.18.1",
96
- "json5": "^2.2.0",
96
+ "json5": "^2.2.1",
97
97
  "launch-editor-middleware": "^2.3.0",
98
- "magic-string": "^0.25.7",
99
- "micromatch": "^4.0.4",
98
+ "magic-string": "^0.26.1",
99
+ "micromatch": "^4.0.5",
100
100
  "mrmime": "^1.0.0",
101
- "node-forge": "^1.2.1",
101
+ "node-forge": "^1.3.0",
102
102
  "okie": "^1.0.1",
103
103
  "open": "^8.4.0",
104
104
  "periscopic": "^2.0.3",
105
105
  "picocolors": "^1.0.0",
106
- "postcss-import": "^14.0.2",
106
+ "postcss-import": "^14.1.0",
107
107
  "postcss-load-config": "^3.1.3",
108
- "postcss-modules": "^4.3.0",
108
+ "postcss-modules": "^4.3.1",
109
109
  "resolve.exports": "^1.1.0",
110
110
  "rollup-plugin-license": "^2.6.1",
111
111
  "sirv": "^2.0.2",
112
+ "source-map-js": "^1.0.2",
112
113
  "source-map-support": "^0.5.21",
113
114
  "strip-ansi": "^6.0.1",
114
- "terser": "^5.10.0",
115
- "tsconfck": "^1.2.0",
115
+ "terser": "^5.12.1",
116
+ "tsconfck": "^1.2.1",
116
117
  "tslib": "^2.3.1",
117
118
  "types": "link:./types",
118
119
  "ws": "^8.5.0"
@@ -1,21 +1,16 @@
1
- import type {
2
- ErrorPayload,
3
- FullReloadPayload,
4
- HMRPayload,
5
- PrunePayload,
6
- Update,
7
- UpdatePayload
8
- } from 'types/hmrPayload'
9
- import type { CustomEventName } from 'types/customEvent'
1
+ import type { ErrorPayload, HMRPayload, Update } from 'types/hmrPayload'
2
+ import type { ViteHotContext } from 'types/hot'
3
+ import type { InferCustomEventPayload } from 'types/customEvent'
10
4
  import { ErrorOverlay, overlayId } from './overlay'
11
5
  // eslint-disable-next-line node/no-missing-import
12
6
  import '@vite/env'
13
7
 
14
8
  // injected by the hmr plugin when served
15
9
  declare const __BASE__: string
16
- declare const __HMR_PROTOCOL__: string
17
- declare const __HMR_HOSTNAME__: string
18
- declare const __HMR_PORT__: string | false
10
+ declare const __HMR_PROTOCOL__: string | null
11
+ declare const __HMR_HOSTNAME__: string | null
12
+ declare const __HMR_PORT__: string | null
13
+ declare const __HMR_BASE__: string
19
14
  declare const __HMR_TIMEOUT__: number
20
15
  declare const __HMR_ENABLE_OVERLAY__: boolean
21
16
 
@@ -24,12 +19,13 @@ console.log('[vite] connecting...')
24
19
  // use server configuration, then fallback to inference
25
20
  const socketProtocol =
26
21
  __HMR_PROTOCOL__ || (location.protocol === 'https:' ? 'wss' : 'ws')
27
- const socketHost = __HMR_PORT__
28
- ? `${__HMR_HOSTNAME__ || location.hostname}:${__HMR_PORT__}`
29
- : `${__HMR_HOSTNAME__ || location.hostname}`
22
+ const socketHost = `${__HMR_HOSTNAME__ || location.hostname}:${
23
+ __HMR_PORT__ || location.port
24
+ }${__HMR_BASE__}`
30
25
 
31
26
  const socket = new WebSocket(`${socketProtocol}://${socketHost}`, 'vite-hmr')
32
27
  const base = __BASE__ || '/'
28
+ const messageBuffer: string[] = []
33
29
 
34
30
  function warnFailedFetch(err: Error, path: string | string[]) {
35
31
  if (!err.message.match('fetch')) {
@@ -59,9 +55,10 @@ async function handleMessage(payload: HMRPayload) {
59
55
  switch (payload.type) {
60
56
  case 'connected':
61
57
  console.log(`[vite] connected.`)
58
+ sendMessageBuffer()
62
59
  // proxy(nginx, docker) hmr ws maybe caused timeout,
63
60
  // so send ping package let ws keep alive.
64
- setInterval(() => socket.send('ping'), __HMR_TIMEOUT__)
61
+ setInterval(() => socket.send('{"type":"ping"}'), __HMR_TIMEOUT__)
65
62
  break
66
63
  case 'update':
67
64
  notifyListeners('vite:beforeUpdate', payload)
@@ -101,7 +98,7 @@ async function handleMessage(payload: HMRPayload) {
101
98
  })
102
99
  break
103
100
  case 'custom': {
104
- notifyListeners(payload.event as CustomEventName<any>, payload.data)
101
+ notifyListeners(payload.event, payload.data)
105
102
  break
106
103
  }
107
104
  case 'full-reload':
@@ -154,19 +151,9 @@ async function handleMessage(payload: HMRPayload) {
154
151
  }
155
152
  }
156
153
 
157
- function notifyListeners(
158
- event: 'vite:beforeUpdate',
159
- payload: UpdatePayload
160
- ): void
161
- function notifyListeners(event: 'vite:beforePrune', payload: PrunePayload): void
162
- function notifyListeners(
163
- event: 'vite:beforeFullReload',
164
- payload: FullReloadPayload
165
- ): void
166
- function notifyListeners(event: 'vite:error', payload: ErrorPayload): void
167
154
  function notifyListeners<T extends string>(
168
- event: CustomEventName<T>,
169
- data: any
155
+ event: T,
156
+ data: InferCustomEventPayload<T>
170
157
  ): void
171
158
  function notifyListeners(event: string, data: any): void {
172
159
  const cbs = customListenersMap.get(event)
@@ -361,6 +348,13 @@ async function fetchUpdate({ path, acceptedPath, timestamp }: Update) {
361
348
  }
362
349
  }
363
350
 
351
+ function sendMessageBuffer() {
352
+ if (socket.readyState === 1) {
353
+ messageBuffer.forEach((msg) => socket.send(msg))
354
+ messageBuffer.length = 0
355
+ }
356
+ }
357
+
364
358
  interface HotModule {
365
359
  id: string
366
360
  callbacks: HotCallback[]
@@ -382,9 +376,7 @@ const ctxToListenersMap = new Map<
382
376
  Map<string, ((data: any) => void)[]>
383
377
  >()
384
378
 
385
- // Just infer the return type for now
386
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
387
- export const createHotContext = (ownerPath: string) => {
379
+ export function createHotContext(ownerPath: string): ViteHotContext {
388
380
  if (!dataMap.has(ownerPath)) {
389
381
  dataMap.set(ownerPath, {})
390
382
  }
@@ -425,12 +417,12 @@ export const createHotContext = (ownerPath: string) => {
425
417
  hotModulesMap.set(ownerPath, mod)
426
418
  }
427
419
 
428
- const hot = {
420
+ const hot: ViteHotContext = {
429
421
  get data() {
430
422
  return dataMap.get(ownerPath)
431
423
  },
432
424
 
433
- accept(deps: any, callback?: any) {
425
+ accept(deps?: any, callback?: any) {
434
426
  if (typeof deps === 'function' || !deps) {
435
427
  // self-accept: hot.accept(() => {})
436
428
  acceptDeps([ownerPath], ([mod]) => deps && deps(mod))
@@ -451,10 +443,11 @@ export const createHotContext = (ownerPath: string) => {
451
443
  )
452
444
  },
453
445
 
454
- dispose(cb: (data: any) => void) {
446
+ dispose(cb) {
455
447
  disposeMap.set(ownerPath, cb)
456
448
  },
457
449
 
450
+ // @ts-expect-error untyped
458
451
  prune(cb: (data: any) => void) {
459
452
  pruneMap.set(ownerPath, cb)
460
453
  },
@@ -470,7 +463,7 @@ export const createHotContext = (ownerPath: string) => {
470
463
  },
471
464
 
472
465
  // custom events
473
- on: (event: string, cb: (data: any) => void) => {
466
+ on(event, cb) {
474
467
  const addToMap = (map: Map<string, any[]>) => {
475
468
  const existing = map.get(event) || []
476
469
  existing.push(cb)
@@ -478,6 +471,11 @@ export const createHotContext = (ownerPath: string) => {
478
471
  }
479
472
  addToMap(customListenersMap)
480
473
  addToMap(newListeners)
474
+ },
475
+
476
+ send(event, data) {
477
+ messageBuffer.push(JSON.stringify({ type: 'custom', event, data }))
478
+ sendMessageBuffer()
481
479
  }
482
480
  }
483
481
 
@@ -1,5 +1,16 @@
1
- // See https://stackoverflow.com/a/63549561.
2
- export type CustomEventName<T extends string> = (T extends `vite:${T}`
3
- ? never
4
- : T) &
5
- (`vite:${T}` extends T ? never : T)
1
+ import type {
2
+ ErrorPayload,
3
+ FullReloadPayload,
4
+ PrunePayload,
5
+ UpdatePayload
6
+ } from './hmrPayload'
7
+
8
+ export interface CustomEventMap {
9
+ 'vite:beforeUpdate': UpdatePayload
10
+ 'vite:beforePrune': PrunePayload
11
+ 'vite:beforeFullReload': FullReloadPayload
12
+ 'vite:error': ErrorPayload
13
+ }
14
+
15
+ export type InferCustomEventPayload<T extends string> =
16
+ T extends keyof CustomEventMap ? CustomEventMap[T] : any
package/types/hot.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import type { InferCustomEventPayload } from './customEvent'
2
+
3
+ export interface ViteHotContext {
4
+ readonly data: any
5
+
6
+ accept(): void
7
+ accept(cb: (mod: any) => void): void
8
+ accept(dep: string, cb: (mod: any) => void): void
9
+ accept(deps: readonly string[], cb: (mods: any[]) => void): void
10
+
11
+ /**
12
+ * @deprecated
13
+ */
14
+ acceptDeps(): never
15
+
16
+ dispose(cb: (data: any) => void): void
17
+ decline(): void
18
+ invalidate(): void
19
+
20
+ on<T extends string>(
21
+ event: T,
22
+ cb: (payload: InferCustomEventPayload<T>) => void
23
+ ): void
24
+ send<T extends string>(event: T, data?: InferCustomEventPayload<T>): void
25
+ }
@@ -20,46 +20,7 @@ interface GlobOptions {
20
20
  interface ImportMeta {
21
21
  url: string
22
22
 
23
- readonly hot?: {
24
- readonly data: any
25
-
26
- accept(): void
27
- accept(cb: (mod: any) => void): void
28
- accept(dep: string, cb: (mod: any) => void): void
29
- accept(deps: readonly string[], cb: (mods: any[]) => void): void
30
-
31
- /**
32
- * @deprecated
33
- */
34
- acceptDeps(): never
35
-
36
- dispose(cb: (data: any) => void): void
37
- decline(): void
38
- invalidate(): void
39
-
40
- on: {
41
- (
42
- event: 'vite:beforeUpdate',
43
- cb: (payload: import('./hmrPayload').UpdatePayload) => void
44
- ): void
45
- (
46
- event: 'vite:beforePrune',
47
- cb: (payload: import('./hmrPayload').PrunePayload) => void
48
- ): void
49
- (
50
- event: 'vite:beforeFullReload',
51
- cb: (payload: import('./hmrPayload').FullReloadPayload) => void
52
- ): void
53
- (
54
- event: 'vite:error',
55
- cb: (payload: import('./hmrPayload').ErrorPayload) => void
56
- ): void
57
- <T extends string>(
58
- event: import('./customEvent').CustomEventName<T>,
59
- cb: (data: any) => void
60
- ): void
61
- }
62
- }
23
+ readonly hot?: import('./hot').ViteHotContext
63
24
 
64
25
  readonly env: ImportMetaEnv
65
26