mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 06:20:02 -04:00
scuffed ahh assignmentrewriter
This commit is contained in:
parent
3d30e20150
commit
02fbb25778
10 changed files with 240 additions and 12 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -10,3 +10,5 @@ meta.json
|
||||||
rewriter/target
|
rewriter/target
|
||||||
rewriter/out
|
rewriter/out
|
||||||
static/wasm.js
|
static/wasm.js
|
||||||
|
rewriter/*.js
|
||||||
|
pnpm-lock.yaml
|
||||||
|
|
27
farm.config.ts
Normal file
27
farm.config.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import { defineConfig } from "@farmfe/core";
|
||||||
|
// import { RsdoctorRspackPlugin } from "@rsdoctor/rspack-plugin";
|
||||||
|
import { join } from "path";
|
||||||
|
|
||||||
|
import sj from "scramjet-farm-plugin";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [sj()],
|
||||||
|
compilation: {
|
||||||
|
presetEnv: false,
|
||||||
|
mode: "development",
|
||||||
|
sourcemap: false,
|
||||||
|
input: {
|
||||||
|
worker: "src/worker/index.ts",
|
||||||
|
thread: "src/thread/thread.ts",
|
||||||
|
client: "src/client/index.ts",
|
||||||
|
config: "src/scramjet.config.ts",
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
path: "dist",
|
||||||
|
format: "cjs",
|
||||||
|
targetEnv: "browser-esnext",
|
||||||
|
entryFilename: "scramjet.[entryName].js",
|
||||||
|
filename: "scramjet.split.[name].js",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
18
pnpm-lock.yaml
generated
18
pnpm-lock.yaml
generated
|
@ -52,8 +52,8 @@ importers:
|
||||||
specifier: ^2.1.3
|
specifier: ^2.1.3
|
||||||
version: 2.1.3(typescript@5.4.5)
|
version: 2.1.3(typescript@5.4.5)
|
||||||
'@mercuryworkshop/libcurl-transport':
|
'@mercuryworkshop/libcurl-transport':
|
||||||
specifier: ^1.3.6
|
specifier: ^1.3.7
|
||||||
version: 1.3.6(typescript@5.4.5)
|
version: 1.3.7(typescript@5.4.5)
|
||||||
'@rsdoctor/rspack-plugin':
|
'@rsdoctor/rspack-plugin':
|
||||||
specifier: ^0.3.7
|
specifier: ^0.3.7
|
||||||
version: 0.3.7(@rspack/core@0.7.5)(bufferutil@4.0.8)(utf-8-validate@6.0.4)
|
version: 0.3.7(@rspack/core@0.7.5)(bufferutil@4.0.8)(utf-8-validate@6.0.4)
|
||||||
|
@ -216,8 +216,8 @@ packages:
|
||||||
'@mercuryworkshop/epoxy-transport@2.1.3':
|
'@mercuryworkshop/epoxy-transport@2.1.3':
|
||||||
resolution: {integrity: sha512-cxuaPCVUmGnB1c/8cdoyhTIrZfL5feqH/sZRclkj8wFmrGz4PzzOHZRNMOrlzNoEiJDPYqHC4qJ6mNuiPC4vCw==}
|
resolution: {integrity: sha512-cxuaPCVUmGnB1c/8cdoyhTIrZfL5feqH/sZRclkj8wFmrGz4PzzOHZRNMOrlzNoEiJDPYqHC4qJ6mNuiPC4vCw==}
|
||||||
|
|
||||||
'@mercuryworkshop/libcurl-transport@1.3.6':
|
'@mercuryworkshop/libcurl-transport@1.3.7':
|
||||||
resolution: {integrity: sha512-K4/TSfHlkjuzY6j0XXFmIbG8m3tpMoTxLga46fhmeuX8k3EJR/FVbW8JTXOD34Iofu0vCZuuY8n/ywNCcB6XjA==}
|
resolution: {integrity: sha512-Ef2BpZRPzkWaCf6FDv63uYyocz96sIwbScI2GrU/Oiu5Etyyq5bOo0mA6sHh8KCwioFSulvh61lO2MbfaEzH9g==}
|
||||||
|
|
||||||
'@module-federation/runtime-tools@0.1.6':
|
'@module-federation/runtime-tools@0.1.6':
|
||||||
resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==}
|
resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==}
|
||||||
|
@ -1658,8 +1658,8 @@ packages:
|
||||||
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
|
|
||||||
libcurl.js@0.6.10:
|
libcurl.js@0.6.11:
|
||||||
resolution: {integrity: sha512-GDyxCRi7+R7XFhcCRFAsNYxg3x91LiwiBISo+pWfUXfgO45J/9ZWcHqjKQg8/FbWHRkV1wwSCyPOZ8pLlbdivg==}
|
resolution: {integrity: sha512-mCYCfjb5hnThNq0qzKPDUCRnHkDZENpCqGZ1flh4npu+zqWGun2/gsDmXCi+0J3TOsCDjmyMEt+W/eGNvqEHvQ==}
|
||||||
|
|
||||||
light-my-request@5.13.0:
|
light-my-request@5.13.0:
|
||||||
resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==}
|
resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==}
|
||||||
|
@ -2741,10 +2741,10 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
'@mercuryworkshop/libcurl-transport@1.3.6(typescript@5.4.5)':
|
'@mercuryworkshop/libcurl-transport@1.3.7(typescript@5.4.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild-plugin-umd-wrapper: 2.0.0
|
esbuild-plugin-umd-wrapper: 2.0.0
|
||||||
libcurl.js: 0.6.10
|
libcurl.js: 0.6.11
|
||||||
rollup: 4.17.2
|
rollup: 4.17.2
|
||||||
rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2)
|
rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2)
|
||||||
rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5)
|
rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5)
|
||||||
|
@ -4441,7 +4441,7 @@ snapshots:
|
||||||
prelude-ls: 1.2.1
|
prelude-ls: 1.2.1
|
||||||
type-check: 0.4.0
|
type-check: 0.4.0
|
||||||
|
|
||||||
libcurl.js@0.6.10: {}
|
libcurl.js@0.6.11: {}
|
||||||
|
|
||||||
light-my-request@5.13.0:
|
light-my-request@5.13.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
|
@ -9,7 +9,7 @@ use oxc_ast::{
|
||||||
};
|
};
|
||||||
use oxc_parser::Parser;
|
use oxc_parser::Parser;
|
||||||
use oxc_span::{SourceType, Span};
|
use oxc_span::{SourceType, Span};
|
||||||
use oxc_syntax::scope::ScopeFlags;
|
use oxc_syntax::{operator::AssignmentOperator, scope::ScopeFlags};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use urlencoding::encode;
|
use urlencoding::encode;
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ enum JsChange {
|
||||||
name: String,
|
name: String,
|
||||||
entirespan: Span,
|
entirespan: Span,
|
||||||
rhsspan: Span,
|
rhsspan: Span,
|
||||||
|
op: AssignmentOperator,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +123,76 @@ impl<'a> Visit<'a> for Rewriter {
|
||||||
|
|
||||||
walk::walk_object_expression(self, it);
|
walk::walk_object_expression(self, it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_assignment_expression(&mut self, it: &oxc_ast::ast::AssignmentExpression<'a>) {
|
||||||
|
match &it.left {
|
||||||
|
AssignmentTarget::AssignmentTargetIdentifier(s) => {
|
||||||
|
if ["location"].contains(&s.name.to_string().as_str()) {
|
||||||
|
self.jschanges.push(JsChange::Assignment {
|
||||||
|
name: s.name.to_string(),
|
||||||
|
entirespan: it.span,
|
||||||
|
rhsspan: expression_span(&it.right),
|
||||||
|
op: it.operator,
|
||||||
|
});
|
||||||
|
|
||||||
|
// avoid walking rest of tree, i would need to figure out nested rewrites
|
||||||
|
// somehow
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
walk::walk_assignment_expression(self, it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn expression_span(e: &Expression) -> Span {
|
||||||
|
// enums.split("\n").filter(f=>f).map(p=>p.trimLeft()).filter(p=>!p.startsWith("#")).map(p=>p.replace(/\(.*/,"")).map(p=>`E::${p}(s) => s.span`).join(",\n")
|
||||||
|
use Expression as E;
|
||||||
|
match e {
|
||||||
|
E::BooleanLiteral(s) => s.span,
|
||||||
|
E::NullLiteral(s) => s.span,
|
||||||
|
E::NumericLiteral(s) => s.span,
|
||||||
|
E::BigIntLiteral(s) => s.span,
|
||||||
|
E::RegExpLiteral(s) => s.span,
|
||||||
|
E::StringLiteral(s) => s.span,
|
||||||
|
E::TemplateLiteral(s) => s.span,
|
||||||
|
E::Identifier(s) => s.span,
|
||||||
|
E::MetaProperty(s) => s.span,
|
||||||
|
E::Super(s) => s.span,
|
||||||
|
E::ArrayExpression(s) => s.span,
|
||||||
|
E::ArrowFunctionExpression(s) => s.span,
|
||||||
|
E::AssignmentExpression(s) => s.span,
|
||||||
|
E::AwaitExpression(s) => s.span,
|
||||||
|
E::BinaryExpression(s) => s.span,
|
||||||
|
E::CallExpression(s) => s.span,
|
||||||
|
E::ChainExpression(s) => s.span,
|
||||||
|
E::ClassExpression(s) => s.span,
|
||||||
|
E::ConditionalExpression(s) => s.span,
|
||||||
|
E::FunctionExpression(s) => s.span,
|
||||||
|
E::ImportExpression(s) => s.span,
|
||||||
|
E::LogicalExpression(s) => s.span,
|
||||||
|
E::NewExpression(s) => s.span,
|
||||||
|
E::ObjectExpression(s) => s.span,
|
||||||
|
E::ParenthesizedExpression(s) => s.span,
|
||||||
|
E::SequenceExpression(s) => s.span,
|
||||||
|
E::TaggedTemplateExpression(s) => s.span,
|
||||||
|
E::ThisExpression(s) => s.span,
|
||||||
|
E::UnaryExpression(s) => s.span,
|
||||||
|
E::UpdateExpression(s) => s.span,
|
||||||
|
E::YieldExpression(s) => s.span,
|
||||||
|
E::PrivateInExpression(s) => s.span,
|
||||||
|
E::JSXElement(s) => s.span,
|
||||||
|
E::JSXFragment(s) => s.span,
|
||||||
|
E::TSAsExpression(s) => s.span,
|
||||||
|
E::TSSatisfiesExpression(s) => s.span,
|
||||||
|
E::TSTypeAssertion(s) => s.span,
|
||||||
|
E::TSNonNullExpression(s) => s.span,
|
||||||
|
E::TSInstantiationExpression(s) => s.span,
|
||||||
|
E::ComputedMemberExpression(s) => s.span,
|
||||||
|
E::StaticMemberExpression(s) => s.span,
|
||||||
|
E::PrivateFieldExpression(s) => s.span,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// js MUST not be able to get a reference to any of these because sbx
|
// js MUST not be able to get a reference to any of these because sbx
|
||||||
|
@ -166,6 +237,7 @@ pub fn rewrite(js: &str, url: Url) -> Vec<u8> {
|
||||||
name,
|
name,
|
||||||
entirespan,
|
entirespan,
|
||||||
rhsspan,
|
rhsspan,
|
||||||
|
op,
|
||||||
} => entirespan.start,
|
} => entirespan.start,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
|
@ -175,6 +247,7 @@ pub fn rewrite(js: &str, url: Url) -> Vec<u8> {
|
||||||
name,
|
name,
|
||||||
entirespan,
|
entirespan,
|
||||||
rhsspan,
|
rhsspan,
|
||||||
|
op,
|
||||||
} => entirespan.start,
|
} => entirespan.start,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
|
@ -189,6 +262,12 @@ pub fn rewrite(js: &str, url: Url) -> Vec<u8> {
|
||||||
JsChange::GenericChange { span, text } => {
|
JsChange::GenericChange { span, text } => {
|
||||||
difference += text.len() as i32 - (span.end - span.start) as i32;
|
difference += text.len() as i32 - (span.end - span.start) as i32;
|
||||||
}
|
}
|
||||||
|
JsChange::Assignment {
|
||||||
|
name,
|
||||||
|
entirespan,
|
||||||
|
rhsspan,
|
||||||
|
op,
|
||||||
|
} => difference += entirespan.size() as i32 + name.len() as i32 + 10,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,7 +279,6 @@ pub fn rewrite(js: &str, url: Url) -> Vec<u8> {
|
||||||
for change in ast_pass.jschanges {
|
for change in ast_pass.jschanges {
|
||||||
match &change {
|
match &change {
|
||||||
JsChange::GenericChange { span, text } => {
|
JsChange::GenericChange { span, text } => {
|
||||||
let len = (span.end - span.start) as usize;
|
|
||||||
let start = span.start as usize;
|
let start = span.start as usize;
|
||||||
let end = span.end as usize;
|
let end = span.end as usize;
|
||||||
|
|
||||||
|
@ -208,8 +286,47 @@ pub fn rewrite(js: &str, url: Url) -> Vec<u8> {
|
||||||
|
|
||||||
buffer.extend_from_slice(text.as_bytes());
|
buffer.extend_from_slice(text.as_bytes());
|
||||||
offset = end;
|
offset = end;
|
||||||
|
}
|
||||||
|
JsChange::Assignment {
|
||||||
|
name,
|
||||||
|
entirespan,
|
||||||
|
rhsspan,
|
||||||
|
op,
|
||||||
|
} => {
|
||||||
|
let start = entirespan.start as usize;
|
||||||
|
buffer.extend_from_slice(&js[offset..start].as_bytes());
|
||||||
|
|
||||||
// offset = (offset as i64 + (text.len() as i64 - len as i64)) as usize;
|
let opstr = match op {
|
||||||
|
AssignmentOperator::Assign => "=",
|
||||||
|
AssignmentOperator::Addition => "+=",
|
||||||
|
AssignmentOperator::Subtraction => "-=",
|
||||||
|
AssignmentOperator::Multiplication => "*=",
|
||||||
|
AssignmentOperator::Division => "/=",
|
||||||
|
AssignmentOperator::Remainder => "%=",
|
||||||
|
AssignmentOperator::Exponential => "**=",
|
||||||
|
AssignmentOperator::ShiftLeft => "<<=",
|
||||||
|
AssignmentOperator::ShiftRight => ">>=",
|
||||||
|
AssignmentOperator::ShiftRightZeroFill => ">>>=",
|
||||||
|
AssignmentOperator::BitwiseAnd => "&=",
|
||||||
|
AssignmentOperator::BitwiseXOR => "^=",
|
||||||
|
AssignmentOperator::BitwiseOR => "|=",
|
||||||
|
AssignmentOperator::LogicalAnd => "&&=",
|
||||||
|
AssignmentOperator::LogicalOr => "||=",
|
||||||
|
AssignmentOperator::LogicalNullish => "??=",
|
||||||
|
};
|
||||||
|
|
||||||
|
buffer.extend_from_slice(
|
||||||
|
format!(
|
||||||
|
"((t)=>$tryset({},\"{}\",t)||{}=t)({})",
|
||||||
|
name,
|
||||||
|
opstr,
|
||||||
|
name,
|
||||||
|
&js[rhsspan.start as usize..rhsspan.end as usize]
|
||||||
|
)
|
||||||
|
.as_bytes(),
|
||||||
|
);
|
||||||
|
|
||||||
|
offset = entirespan.end as usize;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,3 +6,22 @@ consle.log(globalThis["win" + "dow"]);
|
||||||
globalThis.eval("..");
|
globalThis.eval("..");
|
||||||
|
|
||||||
let ref = { b: this.top.window, c: globalThis["win" + "dow"] };
|
let ref = { b: this.top.window, c: globalThis["win" + "dow"] };
|
||||||
|
|
||||||
|
|
||||||
|
export default ref;
|
||||||
|
|
||||||
|
export { ref };
|
||||||
|
|
||||||
|
|
||||||
|
export { ref as default };
|
||||||
|
|
||||||
|
export { S } from "module";
|
||||||
|
export * from "module";
|
||||||
|
import sd from "d"
|
||||||
|
|
||||||
|
location += "http://example.com";
|
||||||
|
|
||||||
|
function f() { return import("x") }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
39
rollup.config.js
Normal file
39
rollup.config.js
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import typescript from "rollup-plugin-typescript2";
|
||||||
|
import { join } from "node:path";
|
||||||
|
import fs from "node:fs";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
import { nodeResolve } from "@rollup/plugin-node-resolve";
|
||||||
|
|
||||||
|
// check if its
|
||||||
|
const production = !process.env.ROLLUP_WATCH;
|
||||||
|
console.log(production);
|
||||||
|
fs.rmSync(join(fileURLToPath(new URL(".", import.meta.url)), "./dist"), {
|
||||||
|
recursive: true,
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const commonPlugins = () => [
|
||||||
|
typescript({
|
||||||
|
tsconfig: "tsconfig.json",
|
||||||
|
}),
|
||||||
|
nodeResolve(),
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
plugins: commonPlugins(),
|
||||||
|
input: {
|
||||||
|
client: "./src/client/index.ts",
|
||||||
|
worker: "./src/worker/index.ts",
|
||||||
|
config: "./src/scramjet.config.ts",
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
entryFileNames: "scramjet.[name].js",
|
||||||
|
dir: "./dist",
|
||||||
|
format: "system",
|
||||||
|
bundle: true,
|
||||||
|
minify: production,
|
||||||
|
sourcemap: true,
|
||||||
|
treeshake: "recommended",
|
||||||
|
},
|
||||||
|
};
|
10
src/client/cookie.ts
Normal file
10
src/client/cookie.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Object.defineProperty(document, "cookie", {
|
||||||
|
get() {
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
console.log("COOKIE SET", value);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
delete window.cookieStore;
|
|
@ -3,6 +3,7 @@ import { decodeUrl } from "./shared";
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
$s: any;
|
$s: any;
|
||||||
|
$tryset: any;
|
||||||
$sImport: any;
|
$sImport: any;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,3 +20,12 @@ function scope(identifier: any) {
|
||||||
|
|
||||||
// shorthand because this can get out of hand reall quickly
|
// shorthand because this can get out of hand reall quickly
|
||||||
window.$s = scope;
|
window.$s = scope;
|
||||||
|
|
||||||
|
window.$tryset = function (lhs: any, op: string, rhs: any) {
|
||||||
|
if (lhs instanceof Location) {
|
||||||
|
// @ts-ignore
|
||||||
|
locationProxy.href = rhs;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -54,6 +54,10 @@ function traverseParsedHtml(node, origin?: URL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node.name === "meta" && hasAttrib(node, "http-equiv")) {
|
||||||
|
node.attribs["http-equiv"] = "a";
|
||||||
|
}
|
||||||
|
|
||||||
if (hasAttrib(node, "srcdoc"))
|
if (hasAttrib(node, "srcdoc"))
|
||||||
node.attribs.srcdoc = rewriteHtml(node.attribs.srcdoc, origin);
|
node.attribs.srcdoc = rewriteHtml(node.attribs.srcdoc, origin);
|
||||||
if (hasAttrib(node, "style"))
|
if (hasAttrib(node, "style"))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue