mirror of
https://github.com/cypress-io/cypress.git
synced 2026-02-04 22:30:00 -06:00
* Add winPropAccessor to security.js, remove other replacers
* Add start of Cypress.resolveWindowReference
* Add regexes for dot and bracket access
* Some security_spec tests pass with new injection
* Add resolveWindowReference unit tests
* Old security_spec now passes with resolveWindowReference
* Inject stub resolveWindowReference so proxy still works outside of Cypress
* wip: rewrite HTML + JS with tokenizer
* Move to using esprima + hyntax to rewrite JS + HTML
* remove comment; oneLine makes the whole thing commented
* Fix tests, apple.com edge case
* wip: add getOrSet
* Revert "wip: add getOrSet"
This reverts commit a5c647c00f.
* release 3.5.0 [skip ci]
* use recast to replace window property accesses
* replace assignments to top properly
* fix yarn.lock
* bump deps
* update integration tests
* remove old security ts?
* fix integration spec
* always ignore js interception failure
* use globalThis instead of window
* add experimentalSourceRewriting flag
* restore regex-writer spec
* fix types
* update config_spec
* add source rewriting spec
* cleanup
* simplify rewriting logic, move rules into rewriter package
* create threaded rewriting tool for non-streaming use
* update @packages/rewriter to use threads for async
* use async rewriting where convenient
* add worker-shim.js
* add performance info to debug logs
* properly handle +=, -=, ...
* add proxy, rewriter to unit-tests stage
* cleanup
* use parse5 to rewrite HTML, strip SRI
* update tests
* reorganization, cleanup
* rewrite ALL parent, top identifiers except in a few cases
* handle many JS edge cases
* ensure parse5@5.1.1 is installed
* update yarn.lock
* update tests
* add debugging, add tests
* add attempted repro for .href issue
* implement source maps + extending inline source maps
* update opts passing in proxy layer
* fix sourcemap naming structure
* update tests to account for sourcemaps
* sourcemap tests
* remote source maps work
* comment
* update rewriter tests
* clean up TODOs in resolveWindowReference
* remove @types/nock
* clean up todos in deferred-source-map-cache
* fix rewriter build script
* fix concatStream import
* bump expectedresultcount
* clean up js-rules
* threading improvements, workaround for Electron segfault
* no visit_spec for now
* fix 6_visit_spec
* update MAX_WORKER_THREADS
* add repro for #3975
* cleanup
* cleanup
* make better use of namedTypes and builders
* get rid of the horrific closureDetectionTernary
ast-types keeps track of scope, so it is unneeded
* fix #3975, #3994
* add x-sourcemap, sourcemap header support
* snap-shot-it 7.9.3
* add deferred-source-map-cache-spec
* add tests
* Throw error in driver if AST rewriting fails
* Fix "location = 'relative-url'"
* fix max recursion depth
* slim down some fixtures
* fix window.location usage
* don't mess with `frames` at all
* no integration tests
* skip testing apple.com for now
* update wording: regex-based vs. ast-based
* skip real-world tests for now
* add some padding to process.exit workaround
* fix resolvers_spec
* fix html-spec
* cleanup
* Update packages/rewriter/lib/js-rules.ts
* Update packages/driver/src/cypress/resolvers.ts
* just import find by itself
* privatize typedefs for Cypress.state, remove .gitignore, remove dead code
Co-authored-by: Ben Kucera <14625260+Bkucera@users.noreply.github.com>
88 lines
2.6 KiB
TypeScript
88 lines
2.6 KiB
TypeScript
import * as astTypes from 'ast-types'
|
|
import Debug from 'debug'
|
|
import { jsRules } from './js-rules'
|
|
import * as recast from 'recast'
|
|
import * as sourceMaps from './util/source-maps'
|
|
|
|
const debug = Debug('cypress:rewriter:js')
|
|
|
|
const defaultPrintOpts: recast.Options = {
|
|
// will only affect reprinted quotes
|
|
quote: 'single',
|
|
}
|
|
|
|
type OriginalSourceInfo = { url: string, js: string }
|
|
|
|
function _generateDriverError (url: string, err: Error) {
|
|
const args = JSON.stringify({
|
|
errMessage: err.message,
|
|
errStack: err.stack,
|
|
url,
|
|
})
|
|
|
|
return `window.top.Cypress.utils.throwErrByPath('proxy.js_rewriting_failed', { args: ${args} })`
|
|
}
|
|
|
|
// a function that, given source info, returns an id that can be used to build the sourcemap later
|
|
export type DeferSourceMapRewriteFn = (sourceInfo: OriginalSourceInfo) => string
|
|
|
|
export function rewriteJsSourceMap (url: string, js: string, inputSourceMap: any): any {
|
|
try {
|
|
const { sourceFileName, sourceMapName, sourceRoot } = sourceMaps.getPaths(url)
|
|
|
|
const ast = recast.parse(js, { sourceFileName })
|
|
|
|
astTypes.visit(ast, jsRules)
|
|
|
|
return recast.print(ast, {
|
|
inputSourceMap,
|
|
sourceMapName,
|
|
sourceRoot,
|
|
...defaultPrintOpts,
|
|
}).map
|
|
} catch (err) {
|
|
debug('error while parsing JS %o', { err, js: js.slice ? js.slice(0, 500) : js })
|
|
|
|
return { err }
|
|
}
|
|
}
|
|
|
|
export function _rewriteJsUnsafe (url: string, js: string, deferSourceMapRewrite?: DeferSourceMapRewriteFn): string {
|
|
const ast = recast.parse(js)
|
|
|
|
try {
|
|
astTypes.visit(ast, jsRules)
|
|
} catch (err) {
|
|
// if visiting fails, it points to a bug in our rewriting logic, so raise the error to the driver
|
|
return _generateDriverError(url, err)
|
|
}
|
|
|
|
const { code } = recast.print(ast, defaultPrintOpts)
|
|
|
|
if (!deferSourceMapRewrite) {
|
|
// no sourcemaps
|
|
return sourceMaps.stripMappingUrl(code)
|
|
}
|
|
|
|
// get an ID that can be used to lazy-generate the source map later
|
|
const sourceMapId = deferSourceMapRewrite({ url, js })
|
|
|
|
return sourceMaps.urlFormatter(
|
|
// using a relative URL ensures that required cookies + other headers are sent along
|
|
// and can be reused if the user's sourcemap requires an HTTP request to be made
|
|
`/__cypress/source-maps/${sourceMapId}.map`,
|
|
code,
|
|
)
|
|
}
|
|
|
|
export function rewriteJs (url: string, js: string, deferSourceMapRewrite?: DeferSourceMapRewriteFn): string {
|
|
try {
|
|
// rewriting can throw on invalid JS or if there are bugs in the js-rules, so always wrap it
|
|
return _rewriteJsUnsafe(url, js, deferSourceMapRewrite)
|
|
} catch (err) {
|
|
debug('error while parsing JS %o', { err, js: js.slice ? js.slice(0, 500) : js })
|
|
|
|
return js
|
|
}
|
|
}
|