@memberjunction/react-test-harness 5.37.0 → 5.39.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.
- package/README.md +30 -0
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/browser-context.d.ts +43 -0
- package/dist/lib/browser-context.d.ts.map +1 -1
- package/dist/lib/browser-context.js +87 -12
- package/dist/lib/browser-context.js.map +1 -1
- package/dist/lib/component-runner.d.ts +17 -22
- package/dist/lib/component-runner.d.ts.map +1 -1
- package/dist/lib/component-runner.js +46 -4
- package/dist/lib/component-runner.js.map +1 -1
- package/dist/lib/linter-test-tool.js +1 -1
- package/dist/lib/linter-test-tool.js.map +1 -1
- package/dist/lib/test-harness.d.ts +10 -0
- package/dist/lib/test-harness.d.ts.map +1 -1
- package/dist/lib/test-harness.js +10 -0
- package/dist/lib/test-harness.js.map +1 -1
- package/package.json +14 -13
- package/dist/lib/component-linter.d.ts +0 -77
- package/dist/lib/component-linter.d.ts.map +0 -1
- package/dist/lib/component-linter.js +0 -1205
- package/dist/lib/component-linter.js.map +0 -1
- package/dist/lib/control-flow-analyzer.d.ts +0 -184
- package/dist/lib/control-flow-analyzer.d.ts.map +0 -1
- package/dist/lib/control-flow-analyzer.js +0 -798
- package/dist/lib/control-flow-analyzer.js.map +0 -1
- package/dist/lib/library-lint-cache.d.ts +0 -50
- package/dist/lib/library-lint-cache.d.ts.map +0 -1
- package/dist/lib/library-lint-cache.js +0 -173
- package/dist/lib/library-lint-cache.js.map +0 -1
- package/dist/lib/lint-rule.d.ts +0 -70
- package/dist/lib/lint-rule.d.ts.map +0 -1
- package/dist/lib/lint-rule.js +0 -41
- package/dist/lib/lint-rule.js.map +0 -1
- package/dist/lib/lint-utils.d.ts +0 -131
- package/dist/lib/lint-utils.d.ts.map +0 -1
- package/dist/lib/lint-utils.js +0 -358
- package/dist/lib/lint-utils.js.map +0 -1
- package/dist/lib/prop-value-extractor.d.ts +0 -147
- package/dist/lib/prop-value-extractor.d.ts.map +0 -1
- package/dist/lib/prop-value-extractor.js +0 -472
- package/dist/lib/prop-value-extractor.js.map +0 -1
- package/dist/lib/runtime-rules/ai-tools-availability-check.d.ts +0 -9
- package/dist/lib/runtime-rules/ai-tools-availability-check.d.ts.map +0 -1
- package/dist/lib/runtime-rules/ai-tools-availability-check.js +0 -223
- package/dist/lib/runtime-rules/ai-tools-availability-check.js.map +0 -1
- package/dist/lib/runtime-rules/callback-event-validation.d.ts +0 -22
- package/dist/lib/runtime-rules/callback-event-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/callback-event-validation.js +0 -561
- package/dist/lib/runtime-rules/callback-event-validation.js.map +0 -1
- package/dist/lib/runtime-rules/chart-field-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/chart-field-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/chart-field-validation.js +0 -270
- package/dist/lib/runtime-rules/chart-field-validation.js.map +0 -1
- package/dist/lib/runtime-rules/child-component-prop-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/child-component-prop-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/child-component-prop-validation.js +0 -443
- package/dist/lib/runtime-rules/child-component-prop-validation.js.map +0 -1
- package/dist/lib/runtime-rules/component-name-mismatch.d.ts +0 -19
- package/dist/lib/runtime-rules/component-name-mismatch.d.ts.map +0 -1
- package/dist/lib/runtime-rules/component-name-mismatch.js +0 -82
- package/dist/lib/runtime-rules/component-name-mismatch.js.map +0 -1
- package/dist/lib/runtime-rules/component-not-in-dependencies.d.ts +0 -20
- package/dist/lib/runtime-rules/component-not-in-dependencies.d.ts.map +0 -1
- package/dist/lib/runtime-rules/component-not-in-dependencies.js +0 -92
- package/dist/lib/runtime-rules/component-not-in-dependencies.js.map +0 -1
- package/dist/lib/runtime-rules/component-props-validation.d.ts +0 -25
- package/dist/lib/runtime-rules/component-props-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/component-props-validation.js +0 -228
- package/dist/lib/runtime-rules/component-props-validation.js.map +0 -1
- package/dist/lib/runtime-rules/component-usage-without-destructuring.d.ts +0 -20
- package/dist/lib/runtime-rules/component-usage-without-destructuring.d.ts.map +0 -1
- package/dist/lib/runtime-rules/component-usage-without-destructuring.js +0 -124
- package/dist/lib/runtime-rules/component-usage-without-destructuring.js.map +0 -1
- package/dist/lib/runtime-rules/data-result-validation.d.ts +0 -9
- package/dist/lib/runtime-rules/data-result-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/data-result-validation.js +0 -763
- package/dist/lib/runtime-rules/data-result-validation.js.map +0 -1
- package/dist/lib/runtime-rules/datagrid-field-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/datagrid-field-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/datagrid-field-validation.js +0 -249
- package/dist/lib/runtime-rules/datagrid-field-validation.js.map +0 -1
- package/dist/lib/runtime-rules/dependency-shadowing.d.ts +0 -20
- package/dist/lib/runtime-rules/dependency-shadowing.d.ts.map +0 -1
- package/dist/lib/runtime-rules/dependency-shadowing.js +0 -147
- package/dist/lib/runtime-rules/dependency-shadowing.js.map +0 -1
- package/dist/lib/runtime-rules/entity-field-access-validation.d.ts +0 -12
- package/dist/lib/runtime-rules/entity-field-access-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/entity-field-access-validation.js +0 -304
- package/dist/lib/runtime-rules/entity-field-access-validation.js.map +0 -1
- package/dist/lib/runtime-rules/event-parameter-validation.d.ts +0 -22
- package/dist/lib/runtime-rules/event-parameter-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/event-parameter-validation.js +0 -406
- package/dist/lib/runtime-rules/event-parameter-validation.js.map +0 -1
- package/dist/lib/runtime-rules/index.d.ts +0 -61
- package/dist/lib/runtime-rules/index.d.ts.map +0 -1
- package/dist/lib/runtime-rules/index.js +0 -62
- package/dist/lib/runtime-rules/index.js.map +0 -1
- package/dist/lib/runtime-rules/library-variable-names.d.ts +0 -24
- package/dist/lib/runtime-rules/library-variable-names.d.ts.map +0 -1
- package/dist/lib/runtime-rules/library-variable-names.js +0 -88
- package/dist/lib/runtime-rules/library-variable-names.js.map +0 -1
- package/dist/lib/runtime-rules/no-child-implementation.d.ts +0 -18
- package/dist/lib/runtime-rules/no-child-implementation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-child-implementation.js +0 -57
- package/dist/lib/runtime-rules/no-child-implementation.js.map +0 -1
- package/dist/lib/runtime-rules/no-data-prop.d.ts +0 -22
- package/dist/lib/runtime-rules/no-data-prop.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-data-prop.js +0 -111
- package/dist/lib/runtime-rules/no-data-prop.js.map +0 -1
- package/dist/lib/runtime-rules/no-export-statements.d.ts +0 -18
- package/dist/lib/runtime-rules/no-export-statements.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-export-statements.js +0 -143
- package/dist/lib/runtime-rules/no-export-statements.js.map +0 -1
- package/dist/lib/runtime-rules/no-iife-wrapper.d.ts +0 -18
- package/dist/lib/runtime-rules/no-iife-wrapper.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-iife-wrapper.js +0 -217
- package/dist/lib/runtime-rules/no-iife-wrapper.js.map +0 -1
- package/dist/lib/runtime-rules/no-import-statements.d.ts +0 -18
- package/dist/lib/runtime-rules/no-import-statements.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-import-statements.js +0 -65
- package/dist/lib/runtime-rules/no-import-statements.js.map +0 -1
- package/dist/lib/runtime-rules/no-react-destructuring.d.ts +0 -18
- package/dist/lib/runtime-rules/no-react-destructuring.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-react-destructuring.js +0 -60
- package/dist/lib/runtime-rules/no-react-destructuring.js.map +0 -1
- package/dist/lib/runtime-rules/no-require-statements.d.ts +0 -18
- package/dist/lib/runtime-rules/no-require-statements.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-require-statements.js +0 -109
- package/dist/lib/runtime-rules/no-require-statements.js.map +0 -1
- package/dist/lib/runtime-rules/no-return-component.d.ts +0 -18
- package/dist/lib/runtime-rules/no-return-component.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-return-component.js +0 -106
- package/dist/lib/runtime-rules/no-return-component.js.map +0 -1
- package/dist/lib/runtime-rules/no-unwrap-utility-libs.d.ts +0 -20
- package/dist/lib/runtime-rules/no-unwrap-utility-libs.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-unwrap-utility-libs.js +0 -75
- package/dist/lib/runtime-rules/no-unwrap-utility-libs.js.map +0 -1
- package/dist/lib/runtime-rules/no-use-reducer.d.ts +0 -19
- package/dist/lib/runtime-rules/no-use-reducer.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-use-reducer.js +0 -78
- package/dist/lib/runtime-rules/no-use-reducer.js.map +0 -1
- package/dist/lib/runtime-rules/no-window-access.d.ts +0 -23
- package/dist/lib/runtime-rules/no-window-access.d.ts.map +0 -1
- package/dist/lib/runtime-rules/no-window-access.js +0 -136
- package/dist/lib/runtime-rules/no-window-access.js.map +0 -1
- package/dist/lib/runtime-rules/noisy-settings-updates.d.ts +0 -18
- package/dist/lib/runtime-rules/noisy-settings-updates.d.ts.map +0 -1
- package/dist/lib/runtime-rules/noisy-settings-updates.js +0 -110
- package/dist/lib/runtime-rules/noisy-settings-updates.js.map +0 -1
- package/dist/lib/runtime-rules/overflow-hidden-on-layout-container.d.ts +0 -30
- package/dist/lib/runtime-rules/overflow-hidden-on-layout-container.d.ts.map +0 -1
- package/dist/lib/runtime-rules/overflow-hidden-on-layout-container.js +0 -220
- package/dist/lib/runtime-rules/overflow-hidden-on-layout-container.js.map +0 -1
- package/dist/lib/runtime-rules/pass-standard-props.d.ts +0 -19
- package/dist/lib/runtime-rules/pass-standard-props.d.ts.map +0 -1
- package/dist/lib/runtime-rules/pass-standard-props.js +0 -82
- package/dist/lib/runtime-rules/pass-standard-props.js.map +0 -1
- package/dist/lib/runtime-rules/prefer-async-await.d.ts +0 -17
- package/dist/lib/runtime-rules/prefer-async-await.d.ts.map +0 -1
- package/dist/lib/runtime-rules/prefer-async-await.js +0 -52
- package/dist/lib/runtime-rules/prefer-async-await.js.map +0 -1
- package/dist/lib/runtime-rules/prefer-jsx-syntax.d.ts +0 -17
- package/dist/lib/runtime-rules/prefer-jsx-syntax.d.ts.map +0 -1
- package/dist/lib/runtime-rules/prefer-jsx-syntax.js +0 -51
- package/dist/lib/runtime-rules/prefer-jsx-syntax.js.map +0 -1
- package/dist/lib/runtime-rules/prop-state-sync.d.ts +0 -19
- package/dist/lib/runtime-rules/prop-state-sync.d.ts.map +0 -1
- package/dist/lib/runtime-rules/prop-state-sync.js +0 -76
- package/dist/lib/runtime-rules/prop-state-sync.js.map +0 -1
- package/dist/lib/runtime-rules/property-name-consistency.d.ts +0 -20
- package/dist/lib/runtime-rules/property-name-consistency.d.ts.map +0 -1
- package/dist/lib/runtime-rules/property-name-consistency.js +0 -172
- package/dist/lib/runtime-rules/property-name-consistency.js.map +0 -1
- package/dist/lib/runtime-rules/query-result-field-access-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/query-result-field-access-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/query-result-field-access-validation.js +0 -304
- package/dist/lib/runtime-rules/query-result-field-access-validation.js.map +0 -1
- package/dist/lib/runtime-rules/react-component-naming.d.ts +0 -19
- package/dist/lib/runtime-rules/react-component-naming.d.ts.map +0 -1
- package/dist/lib/runtime-rules/react-component-naming.js +0 -72
- package/dist/lib/runtime-rules/react-component-naming.js.map +0 -1
- package/dist/lib/runtime-rules/react-hooks-rules.d.ts +0 -27
- package/dist/lib/runtime-rules/react-hooks-rules.d.ts.map +0 -1
- package/dist/lib/runtime-rules/react-hooks-rules.js +0 -223
- package/dist/lib/runtime-rules/react-hooks-rules.js.map +0 -1
- package/dist/lib/runtime-rules/required-queries-not-called.d.ts +0 -19
- package/dist/lib/runtime-rules/required-queries-not-called.d.ts.map +0 -1
- package/dist/lib/runtime-rules/required-queries-not-called.js +0 -146
- package/dist/lib/runtime-rules/required-queries-not-called.js.map +0 -1
- package/dist/lib/runtime-rules/runquery-call-validation.d.ts +0 -11
- package/dist/lib/runtime-rules/runquery-call-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/runquery-call-validation.js +0 -886
- package/dist/lib/runtime-rules/runquery-call-validation.js.map +0 -1
- package/dist/lib/runtime-rules/runview-call-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/runview-call-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/runview-call-validation.js +0 -336
- package/dist/lib/runtime-rules/runview-call-validation.js.map +0 -1
- package/dist/lib/runtime-rules/saved-user-settings-pattern.d.ts +0 -19
- package/dist/lib/runtime-rules/saved-user-settings-pattern.d.ts.map +0 -1
- package/dist/lib/runtime-rules/saved-user-settings-pattern.js +0 -90
- package/dist/lib/runtime-rules/saved-user-settings-pattern.js.map +0 -1
- package/dist/lib/runtime-rules/search-availability-check.d.ts +0 -9
- package/dist/lib/runtime-rules/search-availability-check.d.ts.map +0 -1
- package/dist/lib/runtime-rules/search-availability-check.js +0 -220
- package/dist/lib/runtime-rules/search-availability-check.js.map +0 -1
- package/dist/lib/runtime-rules/search-call-validation.d.ts +0 -9
- package/dist/lib/runtime-rules/search-call-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/search-call-validation.js +0 -336
- package/dist/lib/runtime-rules/search-call-validation.js.map +0 -1
- package/dist/lib/runtime-rules/server-reload-on-client-operation.d.ts +0 -18
- package/dist/lib/runtime-rules/server-reload-on-client-operation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/server-reload-on-client-operation.js +0 -107
- package/dist/lib/runtime-rules/server-reload-on-client-operation.js.map +0 -1
- package/dist/lib/runtime-rules/single-function-only.d.ts +0 -18
- package/dist/lib/runtime-rules/single-function-only.d.ts.map +0 -1
- package/dist/lib/runtime-rules/single-function-only.js +0 -103
- package/dist/lib/runtime-rules/single-function-only.js.map +0 -1
- package/dist/lib/runtime-rules/string-replace-all-occurrences.d.ts +0 -19
- package/dist/lib/runtime-rules/string-replace-all-occurrences.d.ts.map +0 -1
- package/dist/lib/runtime-rules/string-replace-all-occurrences.js +0 -109
- package/dist/lib/runtime-rules/string-replace-all-occurrences.js.map +0 -1
- package/dist/lib/runtime-rules/string-template-validation.d.ts +0 -22
- package/dist/lib/runtime-rules/string-template-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/string-template-validation.js +0 -163
- package/dist/lib/runtime-rules/string-template-validation.js.map +0 -1
- package/dist/lib/runtime-rules/styles-validation.d.ts +0 -10
- package/dist/lib/runtime-rules/styles-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/styles-validation.js +0 -153
- package/dist/lib/runtime-rules/styles-validation.js.map +0 -1
- package/dist/lib/runtime-rules/type-inference-errors.d.ts +0 -23
- package/dist/lib/runtime-rules/type-inference-errors.d.ts.map +0 -1
- package/dist/lib/runtime-rules/type-inference-errors.js +0 -53
- package/dist/lib/runtime-rules/type-inference-errors.js.map +0 -1
- package/dist/lib/runtime-rules/type-mismatch-operation.d.ts +0 -23
- package/dist/lib/runtime-rules/type-mismatch-operation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/type-mismatch-operation.js +0 -141
- package/dist/lib/runtime-rules/type-mismatch-operation.js.map +0 -1
- package/dist/lib/runtime-rules/undefined-component-usage.d.ts +0 -20
- package/dist/lib/runtime-rules/undefined-component-usage.d.ts.map +0 -1
- package/dist/lib/runtime-rules/undefined-component-usage.js +0 -138
- package/dist/lib/runtime-rules/undefined-component-usage.js.map +0 -1
- package/dist/lib/runtime-rules/undefined-jsx-component.d.ts +0 -25
- package/dist/lib/runtime-rules/undefined-jsx-component.d.ts.map +0 -1
- package/dist/lib/runtime-rules/undefined-jsx-component.js +0 -269
- package/dist/lib/runtime-rules/undefined-jsx-component.js.map +0 -1
- package/dist/lib/runtime-rules/unsafe-array-operations.d.ts +0 -25
- package/dist/lib/runtime-rules/unsafe-array-operations.d.ts.map +0 -1
- package/dist/lib/runtime-rules/unsafe-array-operations.js +0 -347
- package/dist/lib/runtime-rules/unsafe-array-operations.js.map +0 -1
- package/dist/lib/runtime-rules/unsafe-formatting-methods.d.ts +0 -24
- package/dist/lib/runtime-rules/unsafe-formatting-methods.d.ts.map +0 -1
- package/dist/lib/runtime-rules/unsafe-formatting-methods.js +0 -277
- package/dist/lib/runtime-rules/unsafe-formatting-methods.js.map +0 -1
- package/dist/lib/runtime-rules/unused-component-dependencies.d.ts +0 -19
- package/dist/lib/runtime-rules/unused-component-dependencies.d.ts.map +0 -1
- package/dist/lib/runtime-rules/unused-component-dependencies.js +0 -90
- package/dist/lib/runtime-rules/unused-component-dependencies.js.map +0 -1
- package/dist/lib/runtime-rules/unused-libraries.d.ts +0 -19
- package/dist/lib/runtime-rules/unused-libraries.d.ts.map +0 -1
- package/dist/lib/runtime-rules/unused-libraries.js +0 -127
- package/dist/lib/runtime-rules/unused-libraries.js.map +0 -1
- package/dist/lib/runtime-rules/use-function-declaration.d.ts +0 -18
- package/dist/lib/runtime-rules/use-function-declaration.d.ts.map +0 -1
- package/dist/lib/runtime-rules/use-function-declaration.js +0 -127
- package/dist/lib/runtime-rules/use-function-declaration.js.map +0 -1
- package/dist/lib/runtime-rules/use-unwrap-components.d.ts +0 -19
- package/dist/lib/runtime-rules/use-unwrap-components.d.ts.map +0 -1
- package/dist/lib/runtime-rules/use-unwrap-components.js +0 -84
- package/dist/lib/runtime-rules/use-unwrap-components.js.map +0 -1
- package/dist/lib/runtime-rules/useeffect-unstable-dependencies.d.ts +0 -23
- package/dist/lib/runtime-rules/useeffect-unstable-dependencies.d.ts.map +0 -1
- package/dist/lib/runtime-rules/useeffect-unstable-dependencies.js +0 -215
- package/dist/lib/runtime-rules/useeffect-unstable-dependencies.js.map +0 -1
- package/dist/lib/runtime-rules/utilities-api-validation.d.ts +0 -24
- package/dist/lib/runtime-rules/utilities-api-validation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/utilities-api-validation.js +0 -121
- package/dist/lib/runtime-rules/utilities-api-validation.js.map +0 -1
- package/dist/lib/runtime-rules/utilities-no-direct-instantiation.d.ts +0 -20
- package/dist/lib/runtime-rules/utilities-no-direct-instantiation.d.ts.map +0 -1
- package/dist/lib/runtime-rules/utilities-no-direct-instantiation.js +0 -58
- package/dist/lib/runtime-rules/utilities-no-direct-instantiation.js.map +0 -1
- package/dist/lib/runtime-rules/validate-component-references.d.ts +0 -19
- package/dist/lib/runtime-rules/validate-component-references.d.ts.map +0 -1
- package/dist/lib/runtime-rules/validate-component-references.js +0 -255
- package/dist/lib/runtime-rules/validate-component-references.js.map +0 -1
- package/dist/lib/schema-validation/component-prop-rule.d.ts +0 -125
- package/dist/lib/schema-validation/component-prop-rule.d.ts.map +0 -1
- package/dist/lib/schema-validation/component-prop-rule.js +0 -624
- package/dist/lib/schema-validation/component-prop-rule.js.map +0 -1
- package/dist/lib/schema-validation/index.d.ts +0 -26
- package/dist/lib/schema-validation/index.d.ts.map +0 -1
- package/dist/lib/schema-validation/index.js +0 -26
- package/dist/lib/schema-validation/index.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/index.d.ts +0 -23
- package/dist/lib/schema-validation/semantic-validators/index.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/index.js +0 -23
- package/dist/lib/schema-validation/semantic-validators/index.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/required-when-validator.d.ts +0 -43
- package/dist/lib/schema-validation/semantic-validators/required-when-validator.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/required-when-validator.js +0 -94
- package/dist/lib/schema-validation/semantic-validators/required-when-validator.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/semantic-validator-registry.d.ts +0 -122
- package/dist/lib/schema-validation/semantic-validators/semantic-validator-registry.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/semantic-validator-registry.js +0 -166
- package/dist/lib/schema-validation/semantic-validators/semantic-validator-registry.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/semantic-validator.d.ts +0 -260
- package/dist/lib/schema-validation/semantic-validators/semantic-validator.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/semantic-validator.js +0 -301
- package/dist/lib/schema-validation/semantic-validators/semantic-validator.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/sql-where-clause-validator.d.ts +0 -115
- package/dist/lib/schema-validation/semantic-validators/sql-where-clause-validator.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/sql-where-clause-validator.js +0 -381
- package/dist/lib/schema-validation/semantic-validators/sql-where-clause-validator.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/subset-of-entity-fields-validator.d.ts +0 -60
- package/dist/lib/schema-validation/semantic-validators/subset-of-entity-fields-validator.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/subset-of-entity-fields-validator.js +0 -195
- package/dist/lib/schema-validation/semantic-validators/subset-of-entity-fields-validator.js.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/validation-context.d.ts +0 -335
- package/dist/lib/schema-validation/semantic-validators/validation-context.d.ts.map +0 -1
- package/dist/lib/schema-validation/semantic-validators/validation-context.js +0 -13
- package/dist/lib/schema-validation/semantic-validators/validation-context.js.map +0 -1
- package/dist/lib/styles-type-analyzer.d.ts +0 -64
- package/dist/lib/styles-type-analyzer.d.ts.map +0 -1
- package/dist/lib/styles-type-analyzer.js +0 -242
- package/dist/lib/styles-type-analyzer.js.map +0 -1
- package/dist/lib/type-context.d.ts +0 -184
- package/dist/lib/type-context.d.ts.map +0 -1
- package/dist/lib/type-context.js +0 -415
- package/dist/lib/type-context.js.map +0 -1
- package/dist/lib/type-inference-engine.d.ts +0 -181
- package/dist/lib/type-inference-engine.d.ts.map +0 -1
- package/dist/lib/type-inference-engine.js +0 -1151
- package/dist/lib/type-inference-engine.js.map +0 -1
- package/dist/lib/type-rules/type-compatibility-rule.d.ts +0 -79
- package/dist/lib/type-rules/type-compatibility-rule.d.ts.map +0 -1
- package/dist/lib/type-rules/type-compatibility-rule.js +0 -211
- package/dist/lib/type-rules/type-compatibility-rule.js.map +0 -1
package/README.md
CHANGED
|
@@ -38,6 +38,36 @@ console.log('Rendered:', result.success);
|
|
|
38
38
|
console.log('Errors:', result.errors);
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
+
### Connecting to an existing browser
|
|
42
|
+
|
|
43
|
+
By default the harness launches its own throwaway Chromium. You can instead attach
|
|
44
|
+
to an already-running browser — useful for watching component runs in a browser you
|
|
45
|
+
control, or for reusing a warm/remote browser (pool, Docker) instead of paying a
|
|
46
|
+
cold launch each run.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Attach to a real Chrome started with --remote-debugging-port=9222 (CDP)
|
|
50
|
+
const harness = new ReactTestHarness({ connect: 'http://localhost:9222' });
|
|
51
|
+
|
|
52
|
+
// Attach to a Playwright server started via chromium.launchServer() (ws endpoint)
|
|
53
|
+
const harness = new ReactTestHarness({ connect: 'ws://localhost:55001/<id>' });
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- **Auto-detect:** `http(s)://` endpoints use CDP (`connectOverCDP`); `ws(s)://`
|
|
57
|
+
endpoints use a Playwright server (`connect`). A raw CDP websocket also starts
|
|
58
|
+
with `ws://` — pass `connectType: 'cdp'` to force CDP in that case.
|
|
59
|
+
- **Env-var fallback:** set `MJ_REACT_TEST_HARNESS_CONNECT` to the endpoint instead
|
|
60
|
+
of passing `connect` (so the `mj-react-test` CLI can attach without a new flag).
|
|
61
|
+
- **Session reuse:** by default a fresh isolated context is created inside the
|
|
62
|
+
attached browser. Set `reuseExistingContext: true` (or
|
|
63
|
+
`MJ_REACT_TEST_HARNESS_REUSE_CONTEXT=true`) to reuse the browser's existing
|
|
64
|
+
default context and share its cookies/auth/session. This breaks per-test
|
|
65
|
+
isolation, so keep the default for parallel runs.
|
|
66
|
+
- **Lifecycle safety:** when attached, `harness.close()` only closes the pages and
|
|
67
|
+
contexts the harness created — it never closes a browser it did not launch, nor a
|
|
68
|
+
reused/shared context. The external browser's lifecycle is the caller's.
|
|
69
|
+
- `headless` is ignored when attaching (the external browser already decided).
|
|
70
|
+
|
|
41
71
|
### Writing Custom Rules
|
|
42
72
|
|
|
43
73
|
Rules extend `BaseLintRule` and auto-register via `@RegisterClass`:
|
package/dist/cli/index.js
CHANGED
|
@@ -8,7 +8,11 @@ import { ReactTestHarness } from '../lib/test-harness.js';
|
|
|
8
8
|
const program = new Command();
|
|
9
9
|
program
|
|
10
10
|
.name('mj-react-test')
|
|
11
|
-
.description('React component test harness for MemberJunction'
|
|
11
|
+
.description('React component test harness for MemberJunction.\n' +
|
|
12
|
+
'To attach to an existing browser instead of launching one, set ' +
|
|
13
|
+
'MJ_REACT_TEST_HARNESS_CONNECT (http(s)://… for CDP, ws(s)://… for a ' +
|
|
14
|
+
'Playwright server); optionally MJ_REACT_TEST_HARNESS_REUSE_CONTEXT=true ' +
|
|
15
|
+
'to reuse its session.')
|
|
12
16
|
.version('2.69.1');
|
|
13
17
|
program
|
|
14
18
|
.command('run <componentFile>')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export { ReactTestHarness, TestHarnessOptions } from './lib/test-harness.js';
|
|
2
|
-
export { BrowserManager, BrowserContextOptions } from './lib/browser-context.js';
|
|
2
|
+
export { BrowserManager, BrowserContextOptions, ClassifyConnectEndpoint } from './lib/browser-context.js';
|
|
3
3
|
export { ComponentRunner, ComponentExecutionOptions, ComponentExecutionResult } from './lib/component-runner.js';
|
|
4
4
|
export { AssertionHelpers } from './lib/assertion-helpers.js';
|
|
5
|
-
export { ComponentLinter, LintResult, Violation } from './lib/component-linter.js';
|
|
6
|
-
export { BaseLintRule } from './lib/lint-rule.js';
|
|
7
|
-
export { LibraryLintCache, CompiledLibraryRules, CompiledValidator } from './lib/library-lint-cache.js';
|
|
8
|
-
export { ComponentSpec } from '@memberjunction/interactive-component-types';
|
|
9
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEvG,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export { ReactTestHarness } from './lib/test-harness.js';
|
|
2
|
-
export { BrowserManager } from './lib/browser-context.js';
|
|
2
|
+
export { BrowserManager, ClassifyConnectEndpoint } from './lib/browser-context.js';
|
|
3
3
|
// Export the component runner that uses the real React runtime UMD bundle
|
|
4
4
|
export { ComponentRunner } from './lib/component-runner.js';
|
|
5
5
|
export { AssertionHelpers } from './lib/assertion-helpers.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
// NOTE: The lint engine API (ComponentLinter, LintResult, Violation, BaseLintRule,
|
|
7
|
+
// LibraryLintCache, CompiledLibraryRules, CompiledValidator, LinterOptions) was
|
|
8
|
+
// previously re-exported here for back-compat after the 5.37 extraction. Those
|
|
9
|
+
// re-exports were removed in 5.38 per the project's no-re-exports-between-packages
|
|
10
|
+
// rule.
|
|
11
|
+
//
|
|
12
|
+
// Import directly from the source packages:
|
|
13
|
+
// import { ComponentLinter, LintResult, Violation } from '@memberjunction/react-linter';
|
|
14
|
+
// import { ComponentSpec } from '@memberjunction/interactive-component-types';
|
|
10
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAyB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAyB,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvG,0EAA0E;AAC1E,OAAO,EAAE,eAAe,EAAuD,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,mFAAmF;AACnF,gFAAgF;AAChF,+EAA+E;AAC/E,mFAAmF;AACnF,QAAQ;AACR,EAAE;AACF,4CAA4C;AAC5C,2FAA2F;AAC3F,iFAAiF"}
|
|
@@ -9,13 +9,56 @@ export interface BrowserContextOptions {
|
|
|
9
9
|
deviceScaleFactor?: number;
|
|
10
10
|
locale?: string;
|
|
11
11
|
timezoneId?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Attach to an already-running browser instead of launching a new one.
|
|
14
|
+
* The connect method is auto-detected from the endpoint scheme:
|
|
15
|
+
* - `http(s)://…` → Chrome DevTools Protocol (`chromium.connectOverCDP`),
|
|
16
|
+
* e.g. a real Chrome started with `--remote-debugging-port=9222`.
|
|
17
|
+
* - `ws(s)://…` → a Playwright browser server (`chromium.connect`),
|
|
18
|
+
* e.g. one started via `chromium.launchServer()` (local pool / Docker / remote).
|
|
19
|
+
* Falls back to the `MJ_REACT_TEST_HARNESS_CONNECT` env var when unset.
|
|
20
|
+
* When attaching, `headless` is ignored — the external browser already decided.
|
|
21
|
+
*/
|
|
22
|
+
connect?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Disambiguate the connect method. A raw CDP websocket also uses `ws://`, which
|
|
25
|
+
* auto-detect would treat as a Playwright server; set `'cdp'` to force CDP.
|
|
26
|
+
* Defaults to `'auto'` (scheme-based detection).
|
|
27
|
+
*/
|
|
28
|
+
connectType?: 'cdp' | 'server' | 'auto';
|
|
29
|
+
/**
|
|
30
|
+
* When attached, reuse the running browser's existing default context so its
|
|
31
|
+
* cookies / auth / session are shared (the point of attaching to YOUR browser),
|
|
32
|
+
* instead of creating a fresh isolated context. Defaults to false. Falls back to
|
|
33
|
+
* the `MJ_REACT_TEST_HARNESS_REUSE_CONTEXT` env var (`1`/`true`/`yes`).
|
|
34
|
+
*
|
|
35
|
+
* Note: this breaks per-test isolation — parallel harness instances would share
|
|
36
|
+
* one context. Viewport/locale/userAgent options are ignored when reusing a
|
|
37
|
+
* context (they only apply to contexts the harness creates).
|
|
38
|
+
*/
|
|
39
|
+
reuseExistingContext?: boolean;
|
|
12
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Decide whether a connect endpoint refers to a CDP browser or a Playwright server.
|
|
43
|
+
* Pure (no I/O) so it can be unit-tested without launching a browser.
|
|
44
|
+
*
|
|
45
|
+
* @throws if the scheme is unrecognized and no explicit `hint` is given.
|
|
46
|
+
*/
|
|
47
|
+
export declare function ClassifyConnectEndpoint(endpoint: string, hint?: 'cdp' | 'server' | 'auto'): 'cdp' | 'server';
|
|
13
48
|
export declare class BrowserManager {
|
|
14
49
|
private options;
|
|
15
50
|
private browser;
|
|
16
51
|
private context;
|
|
17
52
|
private page;
|
|
53
|
+
/** True when we attached to an external browser rather than launching one. */
|
|
54
|
+
private connected;
|
|
55
|
+
/** True when WE created the context (so close() is allowed to close it). */
|
|
56
|
+
private ownsContext;
|
|
18
57
|
constructor(options?: BrowserContextOptions);
|
|
58
|
+
/** Options applied when the harness creates its own browser context. */
|
|
59
|
+
private contextOptions;
|
|
60
|
+
/** Resolve whether to reuse the existing context (option → env-var fallback). */
|
|
61
|
+
private shouldReuseExistingContext;
|
|
19
62
|
initialize(): Promise<void>;
|
|
20
63
|
getPage(): Promise<Page>;
|
|
21
64
|
navigateTo(url: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-context.d.ts","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-context.d.ts","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,IAAI,EAAE,MAAM,YAAY,CAAC;AAMrE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAExC;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,KAAK,GAAG,QAAQ,GAAG,MAAe,GACvC,KAAK,GAAG,QAAQ,CAclB;AAED,qBAAa,cAAc;IASb,OAAO,CAAC,OAAO;IAR3B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAAS;IAC1B,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAAS;gBAER,OAAO,GAAE,qBAA0B;IAQvD,wEAAwE;IACxE,OAAO,CAAC,cAAc;IAUtB,iFAAiF;IACjF,OAAO,CAAC,0BAA0B;IAQ5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,gBAAgB,CAAC,KAAK,GAAE,MAAM,GAAG,kBAAkB,GAAG,aAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAInG"}
|
|
@@ -1,30 +1,93 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
/** Environment-variable fallbacks for attaching to an existing browser. */
|
|
3
|
+
const CONNECT_ENV_VAR = 'MJ_REACT_TEST_HARNESS_CONNECT';
|
|
4
|
+
const REUSE_CONTEXT_ENV_VAR = 'MJ_REACT_TEST_HARNESS_REUSE_CONTEXT';
|
|
5
|
+
/**
|
|
6
|
+
* Decide whether a connect endpoint refers to a CDP browser or a Playwright server.
|
|
7
|
+
* Pure (no I/O) so it can be unit-tested without launching a browser.
|
|
8
|
+
*
|
|
9
|
+
* @throws if the scheme is unrecognized and no explicit `hint` is given.
|
|
10
|
+
*/
|
|
11
|
+
export function ClassifyConnectEndpoint(endpoint, hint = 'auto') {
|
|
12
|
+
if (hint !== 'auto') {
|
|
13
|
+
return hint;
|
|
14
|
+
}
|
|
15
|
+
if (/^wss?:\/\//i.test(endpoint)) {
|
|
16
|
+
return 'server';
|
|
17
|
+
}
|
|
18
|
+
if (/^https?:\/\//i.test(endpoint)) {
|
|
19
|
+
return 'cdp';
|
|
20
|
+
}
|
|
21
|
+
throw new Error(`Unrecognized connect endpoint "${endpoint}". Use http(s):// for CDP ` +
|
|
22
|
+
`or ws(s):// for a Playwright server, or set connectType explicitly.`);
|
|
23
|
+
}
|
|
2
24
|
export class BrowserManager {
|
|
3
25
|
constructor(options = {}) {
|
|
4
26
|
this.options = options;
|
|
5
27
|
this.browser = null;
|
|
6
28
|
this.context = null;
|
|
7
29
|
this.page = null;
|
|
30
|
+
/** True when we attached to an external browser rather than launching one. */
|
|
31
|
+
this.connected = false;
|
|
32
|
+
/** True when WE created the context (so close() is allowed to close it). */
|
|
33
|
+
this.ownsContext = false;
|
|
8
34
|
this.options = {
|
|
9
35
|
headless: true,
|
|
10
36
|
viewport: { width: 1280, height: 720 },
|
|
11
37
|
...options
|
|
12
38
|
};
|
|
13
39
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
this.browser = await chromium.launch({
|
|
19
|
-
headless: this.options.headless
|
|
20
|
-
});
|
|
21
|
-
this.context = await this.browser.newContext({
|
|
40
|
+
/** Options applied when the harness creates its own browser context. */
|
|
41
|
+
contextOptions() {
|
|
42
|
+
return {
|
|
22
43
|
viewport: this.options.viewport,
|
|
23
44
|
userAgent: this.options.userAgent,
|
|
24
45
|
deviceScaleFactor: this.options.deviceScaleFactor,
|
|
25
46
|
locale: this.options.locale,
|
|
26
47
|
timezoneId: this.options.timezoneId
|
|
27
|
-
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Resolve whether to reuse the existing context (option → env-var fallback). */
|
|
51
|
+
shouldReuseExistingContext() {
|
|
52
|
+
if (this.options.reuseExistingContext !== undefined) {
|
|
53
|
+
return this.options.reuseExistingContext;
|
|
54
|
+
}
|
|
55
|
+
const raw = (process.env[REUSE_CONTEXT_ENV_VAR] ?? '').toLowerCase();
|
|
56
|
+
return raw === '1' || raw === 'true' || raw === 'yes';
|
|
57
|
+
}
|
|
58
|
+
async initialize() {
|
|
59
|
+
if (this.browser) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const endpoint = this.options.connect ?? process.env[CONNECT_ENV_VAR];
|
|
63
|
+
if (endpoint) {
|
|
64
|
+
const method = ClassifyConnectEndpoint(endpoint, this.options.connectType);
|
|
65
|
+
this.browser = method === 'server'
|
|
66
|
+
? await chromium.connect(endpoint)
|
|
67
|
+
: await chromium.connectOverCDP(endpoint);
|
|
68
|
+
this.connected = true;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.browser = await chromium.launch({ headless: this.options.headless });
|
|
72
|
+
this.connected = false;
|
|
73
|
+
}
|
|
74
|
+
if (this.connected && this.shouldReuseExistingContext()) {
|
|
75
|
+
// CDP connections always expose at least the default context; a freshly
|
|
76
|
+
// started Playwright server has none, so fall back to creating one.
|
|
77
|
+
const existing = this.browser.contexts();
|
|
78
|
+
if (existing.length > 0) {
|
|
79
|
+
this.context = existing[0];
|
|
80
|
+
this.ownsContext = false;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.context = await this.browser.newContext(this.contextOptions());
|
|
84
|
+
this.ownsContext = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.context = await this.browser.newContext(this.contextOptions());
|
|
89
|
+
this.ownsContext = true;
|
|
90
|
+
}
|
|
28
91
|
this.page = await this.context.newPage();
|
|
29
92
|
}
|
|
30
93
|
async getPage() {
|
|
@@ -59,15 +122,27 @@ export class BrowserManager {
|
|
|
59
122
|
}
|
|
60
123
|
async close() {
|
|
61
124
|
if (this.page) {
|
|
62
|
-
|
|
125
|
+
// Always close pages we opened. Swallow errors — the page may already be
|
|
126
|
+
// gone (e.g. the external browser closed it) and that must not mask cleanup.
|
|
127
|
+
await this.page.close().catch(() => { });
|
|
63
128
|
this.page = null;
|
|
64
129
|
}
|
|
65
130
|
if (this.context) {
|
|
66
|
-
|
|
131
|
+
// Only close a context WE created. Never tear down a reused/shared context
|
|
132
|
+
// belonging to the attached browser (it may hold the user's other tabs).
|
|
133
|
+
if (this.ownsContext) {
|
|
134
|
+
await this.context.close().catch(() => { });
|
|
135
|
+
}
|
|
67
136
|
this.context = null;
|
|
68
137
|
}
|
|
69
138
|
if (this.browser) {
|
|
70
|
-
|
|
139
|
+
// Only close browsers WE launched. When attached, leave the external
|
|
140
|
+
// browser/server running — its lifecycle belongs to whoever started it.
|
|
141
|
+
// The Playwright client connection is released on process exit or when
|
|
142
|
+
// the caller drops this harness.
|
|
143
|
+
if (!this.connected) {
|
|
144
|
+
await this.browser.close().catch(() => { });
|
|
145
|
+
}
|
|
71
146
|
this.browser = null;
|
|
72
147
|
}
|
|
73
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-context.js","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-context.js","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { BrowserManager } from './browser-context.js';
|
|
2
2
|
import type { UserInfo } from '@memberjunction/core';
|
|
3
|
-
import { Violation } from '
|
|
4
|
-
import { ComponentSpec,
|
|
5
|
-
|
|
3
|
+
import { Violation, type LinterOptions } from '@memberjunction/react-linter';
|
|
4
|
+
import { ComponentSpec, SimpleAITools } from '@memberjunction/interactive-component-types';
|
|
5
|
+
/**
|
|
6
|
+
* Browser-execution options for {@link ComponentRunner}. Extends {@link LinterOptions}
|
|
7
|
+
* (which carries `componentSpec`, `contextUser`, `entityMetadata`, `utilities` —
|
|
8
|
+
* the fields the static linter reads) with Playwright-specific runtime fields
|
|
9
|
+
* (timeouts, page-ready hooks, screenshot mode). The browser harness happens
|
|
10
|
+
* to run the linter as a prelude, so accepting a superset keeps the call sites
|
|
11
|
+
* tidy without leaking browser concerns into the linter package.
|
|
12
|
+
*/
|
|
13
|
+
export interface ComponentExecutionOptions extends LinterOptions {
|
|
6
14
|
componentSpec: ComponentSpec;
|
|
7
15
|
props?: Record<string, any>;
|
|
8
16
|
setupCode?: string;
|
|
@@ -14,25 +22,6 @@ export interface ComponentExecutionOptions {
|
|
|
14
22
|
contextUser: UserInfo;
|
|
15
23
|
isRootComponent?: boolean;
|
|
16
24
|
debug?: boolean;
|
|
17
|
-
utilities?: ComponentUtilities;
|
|
18
|
-
/**
|
|
19
|
-
* Optional array of entity metadata providing complete field lists per entity.
|
|
20
|
-
* Used by the linter to validate field usage with two-tier severity:
|
|
21
|
-
* - Medium: Field exists in entity but not declared in dataRequirements
|
|
22
|
-
* - Critical: Field does not exist in entity at all
|
|
23
|
-
*
|
|
24
|
-
* If not provided, linter only checks against dataRequirements.fieldMetadata
|
|
25
|
-
* which may cause false-positive critical errors for valid but undeclared fields.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* // Caller provides metadata for entities used in component
|
|
29
|
-
* const md = new Metadata();
|
|
30
|
-
* const entityNames = spec.dataRequirements.entities.map(e => e.name);
|
|
31
|
-
* const entityMetadata = md.Entities
|
|
32
|
-
* .filter(e => entityNames.includes(e.Name))
|
|
33
|
-
* .map(e => SimpleEntityInfo.FromEntityInfo(e));
|
|
34
|
-
*/
|
|
35
|
-
entityMetadata?: SimpleEntityInfo[];
|
|
36
25
|
/**
|
|
37
26
|
* Optional callback invoked with the live Playwright page after the component
|
|
38
27
|
* has rendered successfully. The page remains open until this callback resolves,
|
|
@@ -79,6 +68,12 @@ export interface ComponentExecutionResult {
|
|
|
79
68
|
executionTime: number;
|
|
80
69
|
renderCount?: number;
|
|
81
70
|
lintViolations?: Violation[];
|
|
71
|
+
/**
|
|
72
|
+
* Raw Babel sourcemaps keyed by component name. Populated when `debug: true`
|
|
73
|
+
* (which enables Babel sourcemap generation in the compiler). Used by callers
|
|
74
|
+
* to translate runtime stack frame line numbers back to original JSX positions.
|
|
75
|
+
*/
|
|
76
|
+
sourceMaps?: Record<string, any>;
|
|
82
77
|
/**
|
|
83
78
|
* If true, the browser/page crashed during execution or cleanup.
|
|
84
79
|
* This is an infrastructure issue, not a code issue.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,OAAO,KAAK,EAAiC,QAAQ,EAAyD,MAAM,sBAAsB,CAAC;AAC3I,OAAO,EAAmB,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { Metadata, RunView, RunQuery, LogError } from '@memberjunction/core';
|
|
|
3
3
|
// ESM compatibility: require is not available in ESM, use createRequire
|
|
4
4
|
// See: https://nodejs.org/api/module.html#modulecreaterequirefilename
|
|
5
5
|
const _require = createRequire(import.meta.url);
|
|
6
|
-
import { ComponentLinter } from '
|
|
6
|
+
import { ComponentLinter } from '@memberjunction/react-linter';
|
|
7
7
|
import { ComponentMetadataEngine } from '@memberjunction/core-entities';
|
|
8
8
|
import { SimpleVectorService } from '@memberjunction/ai-vectors-memory';
|
|
9
9
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
@@ -387,6 +387,16 @@ export class ComponentRunner {
|
|
|
387
387
|
warnings: [],
|
|
388
388
|
resolvedSpec: loadResult.resolvedSpec
|
|
389
389
|
};
|
|
390
|
+
// Stash each compiled component's sourcemap so the Node-side error
|
|
391
|
+
// formatter can translate runtime stack frames back to original JSX lines.
|
|
392
|
+
window.__testHarnessSourceMaps = window.__testHarnessSourceMaps || {};
|
|
393
|
+
if (loadResult.loadedComponents) {
|
|
394
|
+
for (const c of loadResult.loadedComponents) {
|
|
395
|
+
if (c?.name && c?.sourceMap) {
|
|
396
|
+
window.__testHarnessSourceMaps[c.name] = c.sourceMap;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
390
400
|
}
|
|
391
401
|
catch (registrationError) {
|
|
392
402
|
// Capture the actual error before it gets obscured
|
|
@@ -913,7 +923,9 @@ export class ComponentRunner {
|
|
|
913
923
|
rule: e.rule || 'runtime-error', // Use specific rule from collectRuntimeErrors
|
|
914
924
|
line: 0,
|
|
915
925
|
column: 0,
|
|
916
|
-
source: e.source
|
|
926
|
+
source: e.source,
|
|
927
|
+
stack: e.stack,
|
|
928
|
+
componentStack: e.componentStack,
|
|
917
929
|
}));
|
|
918
930
|
// Add timeout error if detected
|
|
919
931
|
if (hasTimeout) {
|
|
@@ -992,7 +1004,8 @@ export class ComponentRunner {
|
|
|
992
1004
|
screenshot,
|
|
993
1005
|
executionTime: Date.now() - startTime,
|
|
994
1006
|
renderCount,
|
|
995
|
-
codeExecutionSuccess
|
|
1007
|
+
codeExecutionSuccess,
|
|
1008
|
+
sourceMaps: this._lastSourceMaps,
|
|
996
1009
|
};
|
|
997
1010
|
if (debug) {
|
|
998
1011
|
this.dumpDebugInfo(result);
|
|
@@ -1356,6 +1369,27 @@ export class ComponentRunner {
|
|
|
1356
1369
|
const originalConsoleError = console.error;
|
|
1357
1370
|
console.error = function (...args) {
|
|
1358
1371
|
const errorText = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
|
|
1372
|
+
// React dev-mode emits Rules-of-Hooks violations as "Warning:" messages.
|
|
1373
|
+
// Promote these to test-failing errors so the Code Fixer sees them directly.
|
|
1374
|
+
const hookRuleMessages = [
|
|
1375
|
+
'Rendered more hooks than during the previous render',
|
|
1376
|
+
'Rendered fewer hooks than expected',
|
|
1377
|
+
'change in the order of Hooks called',
|
|
1378
|
+
'Hooks can only be called inside the body of a function component',
|
|
1379
|
+
];
|
|
1380
|
+
const isHookRuleViolation = hookRuleMessages.some(m => errorText.includes(m));
|
|
1381
|
+
if (isHookRuleViolation) {
|
|
1382
|
+
window.__testHarnessRuntimeErrors = window.__testHarnessRuntimeErrors || [];
|
|
1383
|
+
window.__testHarnessRuntimeErrors.push({
|
|
1384
|
+
message: errorText,
|
|
1385
|
+
stack: new Error().stack,
|
|
1386
|
+
type: 'react-hooks-rules',
|
|
1387
|
+
source: 'react-framework',
|
|
1388
|
+
});
|
|
1389
|
+
window.__testHarnessTestFailed = true;
|
|
1390
|
+
originalConsoleError.apply(console, args);
|
|
1391
|
+
return;
|
|
1392
|
+
}
|
|
1359
1393
|
// Check if this is a warning rather than an error
|
|
1360
1394
|
// React warnings typically start with "Warning:" or contain warning-related text
|
|
1361
1395
|
const isWarning = errorText.includes('Warning:') ||
|
|
@@ -1487,9 +1521,12 @@ export class ComponentRunner {
|
|
|
1487
1521
|
return {
|
|
1488
1522
|
runtimeErrors: window.__testHarnessRuntimeErrors || [],
|
|
1489
1523
|
consoleErrors: window.__testHarnessConsoleErrors || [],
|
|
1490
|
-
testFailed: window.__testHarnessTestFailed || false
|
|
1524
|
+
testFailed: window.__testHarnessTestFailed || false,
|
|
1525
|
+
sourceMaps: window.__testHarnessSourceMaps || {}
|
|
1491
1526
|
};
|
|
1492
1527
|
});
|
|
1528
|
+
// Store sourcemaps on the instance so executeComponent can attach them to the result.
|
|
1529
|
+
this._lastSourceMaps = errorData.sourceMaps;
|
|
1493
1530
|
// Track unique errors and their counts
|
|
1494
1531
|
const errorMap = new Map();
|
|
1495
1532
|
// Check if we have any specific React render errors
|
|
@@ -1518,6 +1555,9 @@ export class ComponentRunner {
|
|
|
1518
1555
|
case 'react-render-error':
|
|
1519
1556
|
rule = 'react-render-error';
|
|
1520
1557
|
break;
|
|
1558
|
+
case 'react-hooks-rules':
|
|
1559
|
+
rule = 'react-hooks-rules';
|
|
1560
|
+
break;
|
|
1521
1561
|
case 'render-loop':
|
|
1522
1562
|
rule = 'infinite-render-loop';
|
|
1523
1563
|
break;
|
|
@@ -1545,6 +1585,8 @@ export class ComponentRunner {
|
|
|
1545
1585
|
errorMap.set(key, {
|
|
1546
1586
|
error: {
|
|
1547
1587
|
message: error.message,
|
|
1588
|
+
stack: error.stack,
|
|
1589
|
+
componentStack: error.componentStack,
|
|
1548
1590
|
source: error.source,
|
|
1549
1591
|
type: error.type,
|
|
1550
1592
|
rule: rule
|