marko 6.0.94 → 6.0.95

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.
@@ -4207,7 +4207,7 @@ function replaceAssignedNode(node) {
4207
4207
  return getBuildAssignment(extra)?.(
4208
4208
  extra.section,
4209
4209
  bindingUtil.has(
4210
- extra.fnExtra?.referencedBindingsInFunction,
4210
+ extra.assignmentFunction.referencedBindingsInFunction,
4211
4211
  extra.assignment
4212
4212
  ) ? node : node.operator === "=" ? node.right : import_compiler22.types.binaryExpression(
4213
4213
  node.operator.slice(
@@ -4237,7 +4237,7 @@ function replaceAssignedNode(node) {
4237
4237
  );
4238
4238
  if (builtAssignment) {
4239
4239
  if (!bindingUtil.has(
4240
- extra.fnExtra?.referencedBindingsInFunction,
4240
+ extra.assignmentFunction.referencedBindingsInFunction,
4241
4241
  extra.assignment
4242
4242
  )) {
4243
4243
  id.name = uid;
@@ -7992,12 +7992,24 @@ function trackReferencesForBinding(babelBinding, binding) {
7992
7992
  }
7993
7993
  function trackAssignment(assignment, binding) {
7994
7994
  const fnRoot = getFnRoot(assignment);
7995
- const fnExtra = fnRoot && (fnRoot.node.extra ??= {});
7996
7995
  const section = getOrCreateSection(assignment);
7997
7996
  setReferencesScope(assignment);
7998
7997
  forEachIdentifierPath(assignment, (id) => {
7999
7998
  if (id.node.name === binding.name) {
8000
- const extra = id.node.extra ??= {};
7999
+ if (!fnRoot) {
8000
+ throw id.buildCodeFrameError(
8001
+ `Assignments to a tag ${binding.type === 3 /* param */ ? "parameter" : "variable"} must be within a script or function.`
8002
+ );
8003
+ }
8004
+ const fnExtra = fnRoot && (fnRoot.node.extra ??= {});
8005
+ const idExtra = id.node.extra ??= {};
8006
+ idExtra.assignment = binding;
8007
+ idExtra.assignmentFunction = fnExtra;
8008
+ fnExtra.section = idExtra.section = section;
8009
+ binding.assignmentSections = sectionUtil.add(
8010
+ binding.assignmentSections,
8011
+ section
8012
+ );
8001
8013
  if (binding.upstreamAlias && binding.property !== void 0) {
8002
8014
  const changePropName = binding.property + "Change";
8003
8015
  const changeBinding = binding.upstreamAlias.propertyAliases.get(changePropName) || createBinding(
@@ -8010,16 +8022,9 @@ function trackAssignment(assignment, binding) {
8010
8022
  id.node.loc,
8011
8023
  true
8012
8024
  );
8013
- extra.assignmentTo = changeBinding;
8025
+ idExtra.assignmentTo = changeBinding;
8014
8026
  addReadToExpression(id, changeBinding);
8015
8027
  }
8016
- binding.assignmentSections = sectionUtil.add(
8017
- binding.assignmentSections,
8018
- section
8019
- );
8020
- extra.assignment = binding;
8021
- extra.section = section;
8022
- extra.fnExtra = fnExtra;
8023
8028
  }
8024
8029
  });
8025
8030
  }
@@ -8199,12 +8204,13 @@ function compareIntersections(a, b) {
8199
8204
  function finalizeReferences() {
8200
8205
  const bindings = getBindings();
8201
8206
  const readsByExpression = getReadsByExpression();
8202
- const readsByFn = getReadsByFunction();
8207
+ const fnReadsByExpression = getFunctionReadsByExpression();
8203
8208
  const mergedReferences = getMergedReferences();
8204
8209
  if (mergedReferences.size) {
8205
8210
  for (const [target, nodes] of mergedReferences) {
8206
8211
  const targetExtra = target.extra;
8207
8212
  let reads = readsByExpression.get(targetExtra);
8213
+ let exprFnReads = fnReadsByExpression.get(targetExtra);
8208
8214
  let { isEffect } = targetExtra;
8209
8215
  for (const node of nodes) {
8210
8216
  const extra = node?.extra;
@@ -8212,11 +8218,24 @@ function finalizeReferences() {
8212
8218
  setCanonicalExtra(extra, targetExtra);
8213
8219
  if (isReferencedExtra(extra)) {
8214
8220
  const additionalReads = readsByExpression.get(extra);
8221
+ const additionalExprFnReads = fnReadsByExpression.get(extra);
8215
8222
  isEffect ||= extra.isEffect;
8216
8223
  if (additionalReads) {
8217
8224
  reads = concat(reads, additionalReads);
8218
8225
  readsByExpression.delete(extra);
8219
8226
  }
8227
+ if (additionalExprFnReads) {
8228
+ if (exprFnReads) {
8229
+ for (const [key, value] of additionalExprFnReads) {
8230
+ exprFnReads.set(key, value);
8231
+ }
8232
+ } else {
8233
+ fnReadsByExpression.set(
8234
+ targetExtra,
8235
+ exprFnReads = new Map(additionalExprFnReads)
8236
+ );
8237
+ }
8238
+ }
8220
8239
  }
8221
8240
  }
8222
8241
  }
@@ -8227,14 +8246,25 @@ function finalizeReferences() {
8227
8246
  const intersectionsBySection = /* @__PURE__ */ new Map();
8228
8247
  for (const [expr, reads] of readsByExpression) {
8229
8248
  if (isReferencedExtra(expr)) {
8230
- expr.referencedBindings = resolveReferencedBindings(
8231
- expr,
8232
- reads,
8233
- intersectionsBySection
8234
- );
8235
- forEach(expr.referencedBindings, (binding) => {
8236
- binding.downstreamExpressions.add(expr);
8237
- });
8249
+ const referencedBindings = expr.referencedBindings = resolveReferencedBindings(expr, reads, intersectionsBySection);
8250
+ if (referencedBindings) {
8251
+ forEach(referencedBindings, (binding) => {
8252
+ binding.downstreamExpressions.add(expr);
8253
+ });
8254
+ const exprFnReads = fnReadsByExpression.get(expr);
8255
+ if (exprFnReads) {
8256
+ for (const [fn, fnReads] of exprFnReads) {
8257
+ if (fn === expr) {
8258
+ expr.referencedBindingsInFunction = referencedBindings;
8259
+ } else {
8260
+ fn.referencedBindingsInFunction = resolveReferencedBindingsInFunction(
8261
+ referencedBindings,
8262
+ fnReads
8263
+ );
8264
+ }
8265
+ }
8266
+ }
8267
+ }
8238
8268
  }
8239
8269
  }
8240
8270
  for (const binding of bindings) {
@@ -8404,20 +8434,29 @@ function finalizeReferences() {
8404
8434
  });
8405
8435
  });
8406
8436
  finalizeFunctionRegistry();
8407
- for (const [fn, reads] of readsByFn) {
8408
- const { registerReason } = fn;
8409
- fn.referencedBindingsInFunction = resolveReferencedBindings(
8410
- fn,
8411
- reads,
8412
- intersectionsBySection
8413
- );
8414
- if (registerReason) {
8415
- forEach(fn.referencedBindingsInFunction, (binding) => {
8416
- addSerializeReason(binding.section, registerReason, binding);
8417
- if (binding.section !== fn.section) {
8418
- addOwnerSerializeReason(fn.section, binding.section, registerReason);
8437
+ const referencedExprs = /* @__PURE__ */ new Set();
8438
+ for (const binding of bindings) {
8439
+ for (const expr of binding.downstreamExpressions) {
8440
+ referencedExprs.add(expr);
8441
+ }
8442
+ }
8443
+ for (const expr of referencedExprs) {
8444
+ const exprFnReads = fnReadsByExpression.get(expr);
8445
+ if (exprFnReads) {
8446
+ for (const fn of exprFnReads.keys()) {
8447
+ if (fn.registerReason) {
8448
+ forEach(fn.referencedBindingsInFunction, (binding) => {
8449
+ addSerializeReason(binding.section, fn.registerReason, binding);
8450
+ if (binding.section !== fn.section) {
8451
+ addOwnerSerializeReason(
8452
+ fn.section,
8453
+ binding.section,
8454
+ fn.registerReason
8455
+ );
8456
+ }
8457
+ });
8419
8458
  }
8420
- });
8459
+ }
8421
8460
  }
8422
8461
  }
8423
8462
  forEachSectionReverse((section) => {
@@ -8458,7 +8497,7 @@ function finalizeReferences() {
8458
8497
  }
8459
8498
  mergedReferences.clear();
8460
8499
  readsByExpression.clear();
8461
- readsByFn.clear();
8500
+ fnReadsByExpression.clear();
8462
8501
  }
8463
8502
  function getMaxOwnSourceOffset(intersection, section) {
8464
8503
  let scopeOffset;
@@ -8612,7 +8651,7 @@ var propsUtil = new Sorted(function compareProps(a, b) {
8612
8651
  var [getReadsByExpression] = createProgramState(
8613
8652
  () => /* @__PURE__ */ new Map()
8614
8653
  );
8615
- var [getReadsByFunction] = createProgramState(
8654
+ var [getFunctionReadsByExpression] = createProgramState(
8616
8655
  () => /* @__PURE__ */ new Map()
8617
8656
  );
8618
8657
  function addReadToExpression(root, binding) {
@@ -8628,11 +8667,14 @@ function addReadToExpression(root, binding) {
8628
8667
  push(readsByExpression.get(exprExtra), read)
8629
8668
  );
8630
8669
  if (fnRoot) {
8631
- const readsByFn = getReadsByFunction();
8670
+ const fnReadsByExpr = getFunctionReadsByExpression();
8671
+ let exprFnReads = fnReadsByExpr.get(exprExtra);
8672
+ if (!exprFnReads) {
8673
+ fnReadsByExpr.set(exprExtra, exprFnReads = /* @__PURE__ */ new Map());
8674
+ }
8632
8675
  const fnExtra = fnRoot.node.extra ??= {};
8633
- exprExtra.fnExtra = fnExtra;
8634
8676
  fnExtra.section = section;
8635
- readsByFn.set(fnExtra, push(readsByFn.get(fnExtra), read));
8677
+ exprFnReads.set(fnExtra, push(exprFnReads.get(fnExtra), read));
8636
8678
  }
8637
8679
  }
8638
8680
  function dropReferences(node) {
@@ -8804,6 +8846,45 @@ function pruneBinding(bindings, binding) {
8804
8846
  }
8805
8847
  return shouldPrune;
8806
8848
  }
8849
+ function resolveReferencedBindingsInFunction(refs, reads) {
8850
+ if (reads) {
8851
+ if (Array.isArray(reads)) {
8852
+ let referencedBindings;
8853
+ for (const read of reads) {
8854
+ referencedBindings = bindingUtil.add(
8855
+ referencedBindings,
8856
+ findClosestReference(read.binding, refs)
8857
+ );
8858
+ }
8859
+ return referencedBindings;
8860
+ } else {
8861
+ return findClosestReference(reads.binding, refs);
8862
+ }
8863
+ }
8864
+ }
8865
+ function findClosestReference(from, refs) {
8866
+ if (Array.isArray(refs)) {
8867
+ if (bindingUtil.has(refs, from)) {
8868
+ return from;
8869
+ }
8870
+ for (const ref of refs) {
8871
+ const closest = findClosestUpstream(from, ref);
8872
+ if (closest) return closest;
8873
+ }
8874
+ } else {
8875
+ const closest = findClosestUpstream(from, refs);
8876
+ if (closest) return closest;
8877
+ }
8878
+ throw new Error("Unable to resolve closest binding reference.");
8879
+ }
8880
+ function findClosestUpstream(from, to) {
8881
+ let closest = from;
8882
+ do {
8883
+ if (closest === to) {
8884
+ return closest;
8885
+ }
8886
+ } while (closest = closest.upstreamAlias);
8887
+ }
8807
8888
  function resolveReferencedBindings(expr, reads, intersectionsBySection) {
8808
8889
  let referencedBindings;
8809
8890
  if (Array.isArray(reads)) {
@@ -49,9 +49,8 @@ export interface ParamBinding extends Binding {
49
49
  }
50
50
  export type ReferencedBindings = Opt<Binding>;
51
51
  export type Intersection = Many<Binding>;
52
- type FnExtra = (t.FunctionExpressionExtra | t.ArrowFunctionExpressionExtra | t.FunctionDeclarationExtra) & {
53
- section: Section;
54
- };
52
+ interface ReferencedFunctionExtra extends t.FunctionExtra, ReferencedExtra {
53
+ }
55
54
  declare module "@marko/compiler/dist/types" {
56
55
  interface NodeExtra {
57
56
  section?: Section;
@@ -69,7 +68,11 @@ declare module "@marko/compiler/dist/types" {
69
68
  [kIsInvoked]?: true;
70
69
  }
71
70
  interface FunctionExtra {
71
+ referencesScope?: boolean;
72
72
  referencedBindingsInFunction?: ReferencedBindings;
73
+ name?: string;
74
+ registerId?: string;
75
+ registerReason?: SerializeReason;
73
76
  }
74
77
  interface ArrowFunctionExpressionExtra extends FunctionExtra {
75
78
  }
@@ -112,19 +115,17 @@ export declare function getSectionInstancesAccessorLiteral(section: Section): t.
112
115
  export declare function getReadReplacement(node: t.Identifier | t.MemberExpression | t.OptionalMemberExpression): t.Node | undefined;
113
116
  export interface ReferencedExtra extends t.NodeExtra {
114
117
  section: Section;
115
- fnExtra?: FnExtra;
116
118
  }
117
119
  export declare function isReferencedExtra(extra: t.NodeExtra | undefined): extra is ReferencedExtra;
118
120
  export interface AssignedBindingExtra extends ReferencedExtra {
119
121
  assignment: Binding;
122
+ assignmentFunction: ReferencedFunctionExtra;
120
123
  }
121
124
  export declare function isAssignedBindingExtra(extra: t.NodeExtra | undefined): extra is AssignedBindingExtra;
122
- export interface RegisteredFnExtra extends ReferencedExtra {
125
+ export interface RegisteredFnExtra extends ReferencedExtra, t.FunctionExtra {
126
+ name: string;
123
127
  registerId: string;
124
128
  registerReason: SerializeReason;
125
- name: string;
126
- referencesScope?: boolean;
127
- referencedBindingsInFunction: ReferencedBindings;
128
129
  }
129
130
  export declare function isRegisteredFnExtra(extra: t.NodeExtra | undefined): extra is RegisteredFnExtra;
130
131
  export declare function getCanonicalExtra<T extends t.NodeExtra>(extra: T): T;
@@ -1,22 +1,4 @@
1
1
  import { types as t } from "@marko/compiler";
2
- import { type SerializeReason } from "../util/serialize-reasons";
3
- declare module "@marko/compiler/dist/types" {
4
- interface FunctionDeclarationExtra {
5
- registerId?: string;
6
- registerReason?: SerializeReason;
7
- name?: string;
8
- }
9
- interface FunctionExpressionExtra {
10
- registerId?: string;
11
- registerReason?: SerializeReason;
12
- name?: string;
13
- }
14
- interface ArrowFunctionExpressionExtra {
15
- registerId?: string;
16
- registerReason?: SerializeReason;
17
- name?: string;
18
- }
19
- }
20
2
  declare const _default: {
21
3
  analyze(this: unknown, fn: t.NodePath<t.Function>): void;
22
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "marko",
3
- "version": "6.0.94",
3
+ "version": "6.0.95",
4
4
  "description": "Optimized runtime for Marko templates.",
5
5
  "keywords": [
6
6
  "api",
@@ -48,7 +48,7 @@
48
48
  "build": "node -r ~ts ./scripts/bundle.ts"
49
49
  },
50
50
  "dependencies": {
51
- "@marko/compiler": "^5.39.40",
51
+ "@marko/compiler": "^5.39.41",
52
52
  "csstype": "^3.1.3",
53
53
  "magic-string": "^0.30.17"
54
54
  },