2222 *
2323 * MetaMetrics (top-level `metametrics` namespace): static scan of
2424 * `tests/helpers/analytics/expectations/*.ts` plus `LEGACY_INLINE_METAMETRICS_PATHS`
25- * for specs not yet using declarative expectations.
25+ * for specs not yet using declarative expectations. Event names are picked from
26+ * `name:` fields, `eventNames: [...]`, `onboardingEvents.*`, and event-ish `const` arrays.
2627 *
2728 * Example output:
2829 * {
@@ -348,7 +349,63 @@ function parseConstStringLiterals(source) {
348349}
349350
350351/**
351- * Event names from declarative `*.analytics.ts` modules (onboarding refs, `name:` entries, event arrays).
352+ * Content between "[" and matching "]" at the same nesting depth (naive bracket count).
353+ *
354+ * @param {string } source
355+ * @param {number } openBracketIdx index of '[' opening the array
356+ * @returns {string|null }
357+ */
358+ function sliceBalancedSquareBracketInner ( source , openBracketIdx ) {
359+ if ( source [ openBracketIdx ] !== '[' ) return null ;
360+ let depth = 0 ;
361+ for ( let i = openBracketIdx ; i < source . length ; i += 1 ) {
362+ const c = source [ i ] ;
363+ if ( c === '[' ) depth += 1 ;
364+ else if ( c === ']' ) {
365+ depth -= 1 ;
366+ if ( depth === 0 ) return source . slice ( openBracketIdx + 1 , i ) ;
367+ }
368+ }
369+ return null ;
370+ }
371+
372+ /**
373+ * Segment from CSV inside `eventNames:` or event-ish `const` arrays. Spread/rest is skipped —
374+ * duplicated by a sibling `const *Names*` list when present (e.g. `...transactionEventNames`).
375+ *
376+ * @param {string } token
377+ * @param {Record<string, string> } onboardingMap
378+ * @param {Record<string, string> } strConsts
379+ * @returns {string|null }
380+ */
381+ function resolveDeclarativeExpectationListToken ( token , onboardingMap , strConsts ) {
382+ const t = token . replace ( / ^ \s + | \s + $ / g, '' ) ;
383+ if ( ! t ) return null ;
384+ const lit = t . match ( / ^ [ ' " ] ( [ ^ ' " ] + ) [ ' " ] $ / ) ;
385+ if ( lit ) return lit [ 1 ] ;
386+ const onb = t . match ( / ^ o n b o a r d i n g E v e n t s \. ( \w + ) $ / ) ;
387+ if ( onb && onboardingMap [ onb [ 1 ] ] ) return onboardingMap [ onb [ 1 ] ] ;
388+ if ( / ^ \. \. \. \s * \w + $ / . test ( t ) ) return null ;
389+ if ( strConsts [ t ] ) return strConsts [ t ] ;
390+ return null ;
391+ }
392+
393+ /**
394+ * @param {string } inner
395+ * @param {Record<string, string> } onboardingMap
396+ * @param {Record<string, string> } strConsts
397+ * @param {Set<string> } out
398+ */
399+ function collectExpectationCsvArrayInner ( inner , onboardingMap , strConsts , out ) {
400+ for ( const part of inner . split ( ',' ) ) {
401+ const v = resolveDeclarativeExpectationListToken ( part , onboardingMap , strConsts ) ;
402+ if ( v ) out . add ( v ) ;
403+ }
404+ }
405+
406+ /**
407+ * Event names from declarative `*.analytics.ts`: `eventNames:` arrays, onboarding refs,
408+ * `name:` entries, string/const lookups, and event-ish `const [...]` declarations.
352409 *
353410 * @param {string } source
354411 * @param {Record<string, string> } onboardingMap
@@ -368,11 +425,18 @@ function collectFromDeclarativeExpectationsSource(source, onboardingMap, out) {
368425 const v = onboardingMap [ m [ 1 ] ] ;
369426 if ( v ) out . add ( v ) ;
370427 }
371- for ( const m of source . matchAll ( / \b n a m e : \s * ( \w + ) \s * , / g) ) {
428+ // Allow `name: IDENT,` (more properties follow) or `name: IDENT }` (single-field expectation object).
429+ for ( const m of source . matchAll ( / \b n a m e : \s * ( \w + ) \s * [ } , ] / g) ) {
372430 const v = strConsts [ m [ 1 ] ] ;
373431 if ( v ) out . add ( v ) ;
374432 }
375433
434+ for ( const em of source . matchAll ( / \b e v e n t N a m e s : \s * \[ / g) ) {
435+ const openIdx = em . index + em [ 0 ] . length - 1 ;
436+ const inner = sliceBalancedSquareBracketInner ( source , openIdx ) ;
437+ if ( inner ) collectExpectationCsvArrayInner ( inner , onboardingMap , strConsts , out ) ;
438+ }
439+
376440 const reArrays = / \b c o n s t \s + ( \w + ) \s * = \s * \[ ( [ \s \S ] * ?) \] ; / g;
377441 let am ;
378442 while ( ( am = reArrays . exec ( source ) ) !== null ) {
@@ -382,21 +446,7 @@ function collectFromDeclarativeExpectationsSource(source, onboardingMap, out) {
382446 / (?: e v e n t | E v e n t | E x p e c t e d | e x p e c t a t i o n | a n a l y t i c s | N a m e s ) / . test ( varName ) ||
383447 / \b o n b o a r d i n g E v e n t s \b | \b e x p e c t e d E v e n t s \b / . test ( inner ) ;
384448 if ( ! looksLikeEventList ) continue ;
385- for ( const part of inner . split ( ',' ) ) {
386- const t = part . replace ( / ^ \s + | \s + $ / g, '' ) ;
387- if ( ! t ) continue ;
388- const lit = t . match ( / ^ [ ' " ] ( [ ^ ' " ] + ) [ ' " ] $ / ) ;
389- if ( lit ) {
390- out . add ( lit [ 1 ] ) ;
391- continue ;
392- }
393- const onb = t . match ( / ^ o n b o a r d i n g E v e n t s \. ( \w + ) $ / ) ;
394- if ( onb && onboardingMap [ onb [ 1 ] ] ) {
395- out . add ( onboardingMap [ onb [ 1 ] ] ) ;
396- continue ;
397- }
398- if ( strConsts [ t ] ) out . add ( strConsts [ t ] ) ;
399- }
449+ collectExpectationCsvArrayInner ( inner , onboardingMap , strConsts , out ) ;
400450 }
401451}
402452
0 commit comments