@qwik.dev/core 2.0.0-alpha.1 → 2.0.0-alpha.3

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 (39) hide show
  1. package/bindings/qwik.darwin-arm64.node +0 -0
  2. package/bindings/qwik.darwin-x64.node +0 -0
  3. package/bindings/qwik.linux-x64-gnu.node +0 -0
  4. package/bindings/qwik.wasm.cjs +259 -272
  5. package/bindings/qwik.wasm.mjs +259 -272
  6. package/bindings/qwik.win32-x64-msvc.node +0 -0
  7. package/bindings/qwik_wasm_bg.wasm +0 -0
  8. package/dist/build/package.json +1 -1
  9. package/dist/cli.cjs +1384 -761
  10. package/dist/core-internal.d.ts +14 -4
  11. package/dist/core.cjs +121 -106
  12. package/dist/core.cjs.map +1 -1
  13. package/dist/core.min.mjs +1 -1
  14. package/dist/core.mjs +121 -106
  15. package/dist/core.mjs.map +1 -1
  16. package/dist/core.prod.cjs +80 -63
  17. package/dist/core.prod.mjs +82 -65
  18. package/dist/insights/index.qwik.cjs +1 -1
  19. package/dist/insights/index.qwik.mjs +1 -1
  20. package/dist/loader/index.cjs +2 -2
  21. package/dist/loader/index.mjs +2 -2
  22. package/dist/loader/package.json +1 -1
  23. package/dist/optimizer.cjs +94 -80
  24. package/dist/optimizer.mjs +96 -82
  25. package/dist/prefetch/package.json +1 -1
  26. package/dist/qwikloader.debug.js +1 -0
  27. package/dist/qwikloader.js +2 -2
  28. package/dist/server.cjs +125 -96
  29. package/dist/server.mjs +125 -96
  30. package/dist/starters/features/auth/package.json +3 -1
  31. package/dist/starters/features/drizzle/package.json +2 -1
  32. package/dist/starters/features/postcss/package.json +3 -0
  33. package/dist/starters/features/prisma/package.json +2 -1
  34. package/dist/starters/features/tailwind/package.json +3 -0
  35. package/dist/starters/features/turso/package.json +4 -1
  36. package/dist/testing/index.cjs +121 -92
  37. package/dist/testing/index.mjs +121 -92
  38. package/dist/testing/package.json +1 -1
  39. package/package.json +6 -4
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * @qwik.dev/core/testing 2.0.0-alpha.1-dev+10f5414
3
+ * @qwik.dev/core/testing 2.0.0-alpha.3-dev+418fd6d
4
4
  * Copyright QwikDev. All Rights Reserved.
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://github.com/QwikDev/qwik/blob/main/LICENSE
@@ -23062,9 +23062,11 @@ function clearEffects(subscriber, value) {
23062
23062
  return subscriptionRemoved;
23063
23063
  }
23064
23064
 
23065
+ // packages/qwik/src/core/signal/flags.ts
23066
+ var NEEDS_COMPUTATION = Symbol("invalid");
23067
+
23065
23068
  // packages/qwik/src/core/signal/signal.ts
23066
23069
  var DEBUG = false;
23067
- var NEEDS_COMPUTATION = Symbol("invalid");
23068
23070
  var log = (...args) => console.log("SIGNAL", ...args.map(qwikDebugToString));
23069
23071
  var throwIfQRLNotResolved = (qrl2) => {
23070
23072
  const resolved = qrl2.resolved;
@@ -23597,6 +23599,20 @@ var StoreHandler = class {
23597
23599
  if (prop === STORE_TARGET) {
23598
23600
  return true;
23599
23601
  }
23602
+ if (typeof prop === "string") {
23603
+ const ctx = tryGetInvokeContext();
23604
+ if (ctx) {
23605
+ const effectSubscriber = ctx.$effectSubscriber$;
23606
+ if (effectSubscriber) {
23607
+ addEffect(
23608
+ target,
23609
+ Array.isArray(target) ? STORE_ARRAY_PROP : prop,
23610
+ this,
23611
+ effectSubscriber
23612
+ );
23613
+ }
23614
+ }
23615
+ }
23600
23616
  return Object.prototype.hasOwnProperty.call(target, prop);
23601
23617
  }
23602
23618
  ownKeys(target) {
@@ -24333,46 +24349,45 @@ var vnode_diff = (container, jsxNode, vStartNode, scopedStyleIdPrefix) => {
24333
24349
  }
24334
24350
  }
24335
24351
  function descendContentToProject(children, host) {
24336
- if (!Array.isArray(children)) {
24337
- children = [children];
24338
- }
24339
- if (children.length) {
24340
- const createProjectionJSXNode = (slotName) => {
24341
- return new JSXNodeImpl(Projection, EMPTY_OBJ, null, [], 0, slotName);
24342
- };
24343
- const projections = [];
24344
- if (host) {
24345
- for (let i = vnode_getPropStartIndex(host); i < host.length; i = i + 2) {
24346
- const prop = host[i];
24347
- if (isSlotProp(prop)) {
24348
- const slotName = prop;
24349
- projections.push(slotName);
24350
- projections.push(createProjectionJSXNode(slotName));
24351
- }
24352
+ const projectionChildren = Array.isArray(children) ? children : [children];
24353
+ const createProjectionJSXNode = (slotName) => {
24354
+ return new JSXNodeImpl(Projection, EMPTY_OBJ, null, [], 0, slotName);
24355
+ };
24356
+ const projections = [];
24357
+ if (host) {
24358
+ for (let i = vnode_getPropStartIndex(host); i < host.length; i = i + 2) {
24359
+ const prop = host[i];
24360
+ if (isSlotProp(prop)) {
24361
+ const slotName = prop;
24362
+ projections.push(slotName);
24363
+ projections.push(createProjectionJSXNode(slotName));
24352
24364
  }
24353
24365
  }
24354
- for (let i = 0; i < children.length; i++) {
24355
- const child = children[i];
24356
- const slotName = String(
24357
- isJSXNode(child) && directGetPropsProxyProp(child, QSlot) || QDefaultSlot
24358
- );
24359
- const idx = mapApp_findIndx(projections, slotName, 0);
24360
- let jsxBucket;
24361
- if (idx >= 0) {
24362
- jsxBucket = projections[idx + 1];
24363
- } else {
24364
- projections.splice(~idx, 0, slotName, jsxBucket = createProjectionJSXNode(slotName));
24365
- }
24366
- const removeProjection = child === false;
24367
- if (!removeProjection) {
24368
- jsxBucket.children.push(child);
24369
- }
24366
+ }
24367
+ if (projections.length === 0 && children == null) {
24368
+ return;
24369
+ }
24370
+ for (let i = 0; i < projectionChildren.length; i++) {
24371
+ const child = projectionChildren[i];
24372
+ const slotName = String(
24373
+ isJSXNode(child) && directGetPropsProxyProp(child, QSlot) || QDefaultSlot
24374
+ );
24375
+ const idx = mapApp_findIndx(projections, slotName, 0);
24376
+ let jsxBucket;
24377
+ if (idx >= 0) {
24378
+ jsxBucket = projections[idx + 1];
24379
+ } else {
24380
+ projections.splice(~idx, 0, slotName, jsxBucket = createProjectionJSXNode(slotName));
24370
24381
  }
24371
- for (let i = projections.length - 2; i >= 0; i = i - 2) {
24372
- projections.splice(i, 1);
24382
+ const removeProjection = child === false;
24383
+ if (!removeProjection) {
24384
+ jsxBucket.children.push(child);
24373
24385
  }
24374
- descend(projections, true);
24375
24386
  }
24387
+ for (let i = projections.length - 2; i >= 0; i = i - 2) {
24388
+ projections.splice(i, 1);
24389
+ }
24390
+ descend(projections, true);
24376
24391
  }
24377
24392
  function expectProjection() {
24378
24393
  const jsxNode2 = jsxValue;
@@ -24824,7 +24839,7 @@ var vnode_diff = (container, jsxNode, vStartNode, scopedStyleIdPrefix) => {
24824
24839
  container.$scheduler$(7 /* COMPONENT */, host, componentQRL, jsxProps);
24825
24840
  }
24826
24841
  }
24827
- jsxNode2.children != null && descendContentToProject(jsxNode2.children, host);
24842
+ descendContentToProject(jsxNode2.children, host);
24828
24843
  } else {
24829
24844
  const lookupKey = jsxNode2.key;
24830
24845
  const vNodeLookupKey = getKey(host);
@@ -25138,7 +25153,17 @@ var createScheduler = (container, scheduleDrain, journalFlush) => {
25138
25153
  chore.$payload$
25139
25154
  ),
25140
25155
  (jsx5) => {
25141
- return chore.$type$ === 7 /* COMPONENT */ ? maybeThen(container.processJsx(host, jsx5), () => jsx5) : jsx5;
25156
+ if (chore.$type$ === 7 /* COMPONENT */) {
25157
+ const styleScopedId = container.getHostProp(host, QScopedStyle);
25158
+ return vnode_diff(
25159
+ container,
25160
+ jsx5,
25161
+ host,
25162
+ addComponentStylePrefix(styleScopedId)
25163
+ );
25164
+ } else {
25165
+ return jsx5;
25166
+ }
25142
25167
  },
25143
25168
  (err) => container.handleError(err, host)
25144
25169
  );
@@ -25226,7 +25251,10 @@ function choreComparator(a, b, shouldThrowOnHostMismatch) {
25226
25251
  return hostDiff;
25227
25252
  }
25228
25253
  } else {
25229
- const errorMessage = "SERVER: during HTML streaming, it is not possible to cause a re-run of tasks on a different host";
25254
+ const errorMessage = `SERVER: during HTML streaming, re-running tasks on a different host is not allowed.
25255
+ You are attempting to change a state that has already been streamed to the client.
25256
+ This can lead to inconsistencies between Server-Side Rendering (SSR) and Client-Side Rendering (CSR).
25257
+ Problematic Node: ${aHost.toString()}`;
25230
25258
  if (shouldThrowOnHostMismatch) {
25231
25259
  throwErrorAndStop(errorMessage);
25232
25260
  }
@@ -25340,9 +25368,10 @@ var _SharedContainer = class {
25340
25368
  trackSignalValue(signal, subscriber, property, data) {
25341
25369
  return trackSignal(() => signal.value, subscriber, property, this, data);
25342
25370
  }
25343
- serializationCtxFactory(NodeConstructor, symbolToChunkResolver, writer, prepVNodeData) {
25371
+ serializationCtxFactory(NodeConstructor, DomRefConstructor, symbolToChunkResolver, writer, prepVNodeData) {
25344
25372
  return createSerializationContext(
25345
25373
  NodeConstructor,
25374
+ DomRefConstructor,
25346
25375
  symbolToChunkResolver,
25347
25376
  this.getHostProp.bind(this),
25348
25377
  this.setHostProp.bind(this),
@@ -25995,10 +26024,6 @@ var DomContainer = class extends _SharedContainer {
25995
26024
  parseQRL(qrl2) {
25996
26025
  return inflateQRL(this, parseQRL(qrl2));
25997
26026
  }
25998
- processJsx(host, jsx4) {
25999
- const styleScopedId = this.getHostProp(host, QScopedStyle);
26000
- return vnode_diff(this, jsx4, host, addComponentStylePrefix(styleScopedId));
26001
- }
26002
26027
  handleError(err, host) {
26003
26028
  if (qDev) {
26004
26029
  if (typeof document !== "undefined") {
@@ -27863,6 +27888,11 @@ __publicField(SsrNode, "ELEMENT_NODE", 1);
27863
27888
  __publicField(SsrNode, "TEXT_NODE", 3);
27864
27889
  __publicField(SsrNode, "DOCUMENT_NODE", 9);
27865
27890
  __publicField(SsrNode, "DOCUMENT_FRAGMENT_NODE", 11);
27891
+ var DomRef = class {
27892
+ constructor($ssrNode$) {
27893
+ this.$ssrNode$ = $ssrNode$;
27894
+ }
27895
+ };
27866
27896
  var SsrComponentFrame = class {
27867
27897
  constructor(componentNode) {
27868
27898
  this.componentNode = componentNode;
@@ -28134,7 +28164,9 @@ var inflate = (container, target, typeId, data) => {
28134
28164
  if (valType === 0 /* RootRef */ || valType >= 12 /* Error */) {
28135
28165
  Object.defineProperty(target, key, {
28136
28166
  get() {
28137
- return deserializeData(container, valType, valData);
28167
+ const value = deserializeData(container, valType, valData);
28168
+ target[key] = value;
28169
+ return value;
28138
28170
  },
28139
28171
  set(value) {
28140
28172
  Object.defineProperty(target, key, {
@@ -28474,12 +28506,8 @@ function inflateQRL(container, qrl2) {
28474
28506
  }
28475
28507
  return qrl2;
28476
28508
  }
28477
- var DomVRef = class {
28478
- constructor(id) {
28479
- this.id = id;
28480
- }
28481
- };
28482
- var createSerializationContext = (NodeConstructor, symbolToChunkResolver, getProp, setProp, storeProxyMap, writer, prepVNodeData) => {
28509
+ var isDomRef = (obj) => false;
28510
+ var createSerializationContext = (NodeConstructor, DomRefConstructor, symbolToChunkResolver, getProp, setProp, storeProxyMap, writer, prepVNodeData) => {
28483
28511
  if (!writer) {
28484
28512
  const buffer = [];
28485
28513
  writer = {
@@ -28503,11 +28531,13 @@ var createSerializationContext = (NodeConstructor, symbolToChunkResolver, getPro
28503
28531
  return id;
28504
28532
  };
28505
28533
  const isSsrNode = NodeConstructor ? (obj) => obj instanceof NodeConstructor : () => false;
28534
+ isDomRef = DomRefConstructor ? (obj) => obj instanceof DomRefConstructor : () => false;
28506
28535
  return {
28507
28536
  $serialize$() {
28508
28537
  serialize(this);
28509
28538
  },
28510
28539
  $isSsrNode$: isSsrNode,
28540
+ $isDomRef$: isDomRef,
28511
28541
  $symbolToChunkResolver$: symbolToChunkResolver,
28512
28542
  $wasSeen$,
28513
28543
  $roots$: roots,
@@ -28616,6 +28646,8 @@ var createSerializationContext = (NodeConstructor, symbolToChunkResolver, getPro
28616
28646
  discoveredValues.push(obj.$el$, obj.$qrl$, obj.$state$, obj.$effectDependencies$);
28617
28647
  } else if (isSsrNode(obj)) {
28618
28648
  discoveredValues.push(obj.vnodeData);
28649
+ } else if (isDomRef(obj)) {
28650
+ discoveredValues.push(obj.$ssrNode$.id);
28619
28651
  } else if (isJSXNode(obj)) {
28620
28652
  discoveredValues.push(obj.type, obj.props, obj.constProps, obj.children);
28621
28653
  } else if (Array.isArray(obj)) {
@@ -28670,7 +28702,7 @@ var createSerializationContext = (NodeConstructor, symbolToChunkResolver, getPro
28670
28702
  };
28671
28703
  var promiseResults = /* @__PURE__ */ new WeakMap();
28672
28704
  function serialize(serializationContext) {
28673
- const { $writer$, $isSsrNode$, $setProp$, $storeProxyMap$ } = serializationContext;
28705
+ const { $writer$, $isSsrNode$, $isDomRef$, $setProp$, $storeProxyMap$ } = serializationContext;
28674
28706
  let depth = -1;
28675
28707
  let writeType = false;
28676
28708
  const output = (type, value) => {
@@ -28838,14 +28870,11 @@ function serialize(serializationContext) {
28838
28870
  }
28839
28871
  output(13 /* Object */, out);
28840
28872
  }
28841
- } else if (value instanceof DomVRef) {
28842
- output(9 /* RefVNode */, value.id);
28873
+ } else if ($isDomRef$(value)) {
28874
+ value.$ssrNode$.vnodeData[0] |= 8 /* SERIALIZE */;
28875
+ output(9 /* RefVNode */, value.$ssrNode$.id);
28843
28876
  } else if (value instanceof Signal) {
28844
- let v = value instanceof ComputedSignal && (value.$invalid$ || fastSkipSerialize(value.$untrackedValue$)) ? NEEDS_COMPUTATION : value.$untrackedValue$;
28845
- if ($isSsrNode$(v)) {
28846
- serializationContext.$addRoot$(v);
28847
- v = new DomVRef(v.id);
28848
- }
28877
+ const v = value instanceof ComputedSignal && (value.$invalid$ || fastSkipSerialize(value.$untrackedValue$)) ? NEEDS_COMPUTATION : value.$untrackedValue$;
28849
28878
  if (value instanceof WrappedSignal) {
28850
28879
  output(23 /* WrappedSignal */, [
28851
28880
  ...serializeWrappingFn(serializationContext, value),
@@ -29107,6 +29136,8 @@ var canSerialize = (value) => {
29107
29136
  return true;
29108
29137
  } else if (value instanceof Uint8Array) {
29109
29138
  return true;
29139
+ } else if (isDomRef?.(value)) {
29140
+ return true;
29110
29141
  }
29111
29142
  } else if (typeof value === "function") {
29112
29143
  if (isQrl2(value) || isQwikComponent(value)) {
@@ -29339,8 +29370,8 @@ var createQRL = (chunk, symbol, symbolRef, symbolFn, capture, captureRef, refSym
29339
29370
  }
29340
29371
  let _containerEl;
29341
29372
  const qrl2 = async function(...args) {
29342
- const fn = invokeFn.call(this, tryGetInvokeContext());
29343
- const result = await fn(...args);
29373
+ const boundedFn = bindFnToContext.call(this, tryGetInvokeContext());
29374
+ const result = await boundedFn(...args);
29344
29375
  return result;
29345
29376
  };
29346
29377
  const setContainer = (el) => {
@@ -29349,6 +29380,30 @@ var createQRL = (chunk, symbol, symbolRef, symbolFn, capture, captureRef, refSym
29349
29380
  }
29350
29381
  return _containerEl;
29351
29382
  };
29383
+ function bindFnToContext(currentCtx, beforeFn) {
29384
+ return (...args) => maybeThen(resolveLazy(), (fn) => {
29385
+ if (!isFunction(fn)) {
29386
+ throw qError(QError_qrlIsNotFunction);
29387
+ }
29388
+ if (beforeFn && beforeFn() === false) {
29389
+ return;
29390
+ }
29391
+ const context = createOrReuseInvocationContext(currentCtx);
29392
+ const prevQrl = context.$qrl$;
29393
+ const prevEvent = context.$event$;
29394
+ context.$qrl$ = qrl2;
29395
+ context.$event$ || (context.$event$ = this);
29396
+ try {
29397
+ return invoke.call(this, context, fn, ...args);
29398
+ } finally {
29399
+ context.$qrl$ = prevQrl;
29400
+ context.$event$ = prevEvent;
29401
+ }
29402
+ });
29403
+ }
29404
+ const resolveLazy = (containerEl) => {
29405
+ return symbolRef !== null ? symbolRef : resolve(containerEl);
29406
+ };
29352
29407
  const wrapFn = (fn) => {
29353
29408
  if (typeof fn !== "function" || !capture?.length && !captureRef?.length) {
29354
29409
  return fn;
@@ -29398,30 +29453,6 @@ var createQRL = (chunk, symbol, symbolRef, symbolFn, capture, captureRef, refSym
29398
29453
  }
29399
29454
  return symbolRef;
29400
29455
  };
29401
- const resolveLazy = (containerEl) => {
29402
- return symbolRef !== null ? symbolRef : resolve(containerEl);
29403
- };
29404
- function invokeFn(currentCtx, beforeFn) {
29405
- return (...args) => maybeThen(resolveLazy(), (f) => {
29406
- if (!isFunction(f)) {
29407
- throw qError(QError_qrlIsNotFunction);
29408
- }
29409
- if (beforeFn && beforeFn() === false) {
29410
- return;
29411
- }
29412
- const context = createOrReuseInvocationContext(currentCtx);
29413
- const prevQrl = context.$qrl$;
29414
- const prevEvent = context.$event$;
29415
- context.$qrl$ = qrl2;
29416
- context.$event$ || (context.$event$ = this);
29417
- try {
29418
- return invoke.call(this, context, f, ...args);
29419
- } finally {
29420
- context.$qrl$ = prevQrl;
29421
- context.$event$ = prevEvent;
29422
- }
29423
- });
29424
- }
29425
29456
  const createOrReuseInvocationContext = (invoke2) => {
29426
29457
  if (invoke2 == null) {
29427
29458
  return newInvokeContext();
@@ -29444,7 +29475,7 @@ var createQRL = (chunk, symbol, symbolRef, symbolFn, capture, captureRef, refSym
29444
29475
  $symbol$: symbol,
29445
29476
  $refSymbol$: refSymbol,
29446
29477
  $hash$: hash3,
29447
- getFn: invokeFn,
29478
+ getFn: bindFnToContext,
29448
29479
  $capture$: capture,
29449
29480
  $captureRef$: captureRef,
29450
29481
  dev: null,
@@ -31138,6 +31169,7 @@ var SSRContainer = class extends _SharedContainer2 {
31138
31169
  };
31139
31170
  this.serializationCtx = this.serializationCtxFactory(
31140
31171
  SsrNode,
31172
+ DomRef,
31141
31173
  this.symbolToChunkResolver,
31142
31174
  opts.writer,
31143
31175
  (vNodeData) => this.addVNodeToSerializationRoots(vNodeData)
@@ -31153,9 +31185,6 @@ var SSRContainer = class extends _SharedContainer2 {
31153
31185
  }
31154
31186
  ensureProjectionResolved(host) {
31155
31187
  }
31156
- processJsx(host, jsx4) {
31157
- throw new Error("Should not get here.");
31158
- }
31159
31188
  handleError(err, $host$) {
31160
31189
  throw err;
31161
31190
  }
@@ -31901,10 +31930,10 @@ var SSRContainer = class extends _SharedContainer2 {
31901
31930
  if (key === "ref") {
31902
31931
  const lastNode = this.getLastNode();
31903
31932
  if (isSignal3(value)) {
31904
- value.value = lastNode;
31933
+ value.value = new DomRef(lastNode);
31905
31934
  continue;
31906
31935
  } else if (typeof value === "function") {
31907
- value(lastNode);
31936
+ value(new DomRef(lastNode));
31908
31937
  continue;
31909
31938
  }
31910
31939
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qwik.dev/core/testing",
3
- "version": "2.0.0-alpha.1-dev+10f5414",
3
+ "version": "2.0.0-alpha.3-dev+418fd6d",
4
4
  "main": "index.mjs",
5
5
  "types": "index.d.ts",
6
6
  "private": true,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qwik.dev/core",
3
3
  "description": "An open source framework for building instant loading web apps at any scale, without the extra effort.",
4
- "version": "2.0.0-alpha.1",
4
+ "version": "2.0.0-alpha.3",
5
5
  "author": "Qwik Team",
6
6
  "bin": {
7
7
  "qwik": "./qwik-cli.cjs"
@@ -13,9 +13,11 @@
13
13
  "devDependencies": {
14
14
  "image-size": "1.1.1",
15
15
  "kleur": "4.1.5",
16
+ "ignore": "5.3.1",
16
17
  "prettier": "3.3.3",
18
+ "ts-morph": "23.0.0",
17
19
  "vitest": "2.1.4",
18
- "@qwik.dev/core": "2.0.0-alpha.1",
20
+ "@qwik.dev/core": "2.0.0-alpha.3",
19
21
  "@qwik.dev/dom": "2.1.19"
20
22
  },
21
23
  "engines": {
@@ -132,7 +134,7 @@
132
134
  "./qwikloader.debug.js": "./dist/qwikloader.debug.js",
133
135
  "./qwik-prefetch.js": "./dist/qwik-prefetch.js",
134
136
  "./qwik-prefetch.debug.js": "./dist/qwik-prefetch.debug.js",
135
- "./package.json": "./dist/package.json"
137
+ "./package.json": "./package.json"
136
138
  },
137
139
  "exports_annotation": "We use the build for the optimizer because esbuild doesn't like the html?raw imports in the server plugin and it's only used in the vite configs",
138
140
  "files": [
@@ -189,7 +191,7 @@
189
191
  "directory": "packages/qwik"
190
192
  },
191
193
  "type": "module",
192
- "types": "./dist/core.d.ts",
194
+ "types": "./public.d.ts",
193
195
  "scripts": {
194
196
  "build.insights": "cd src/insights && vite build --mode lib --emptyOutDir"
195
197
  }