1 package jspacker 2 3 import ( 4 "strconv" 5 6 "vimagination.zapto.org/javascript" 7 ) 8 9 func namespaceImport(ns *javascript.Token, prefix string) javascript.ModuleItem { 10 return wrapConst([]javascript.LexicalBinding{ 11 { 12 BindingIdentifier: ns, 13 Initializer: &javascript.AssignmentExpression{ 14 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 15 IdentifierReference: jToken(prefix), 16 }), 17 }, 18 }, 19 }) 20 } 21 22 func wrapConst(lds []javascript.LexicalBinding) javascript.ModuleItem { 23 return wrapDeclaration(&javascript.Declaration{ 24 LexicalDeclaration: &javascript.LexicalDeclaration{ 25 LetOrConst: javascript.Const, 26 BindingList: lds, 27 }, 28 }) 29 } 30 31 func wrapDeclaration(ed *javascript.Declaration) javascript.ModuleItem { 32 return javascript.ModuleItem{ 33 StatementListItem: &javascript.StatementListItem{ 34 Declaration: ed, 35 }, 36 } 37 } 38 39 func wrapVariableStatement(v *javascript.VariableStatement) javascript.ModuleItem { 40 return javascript.ModuleItem{ 41 StatementListItem: &javascript.StatementListItem{ 42 Statement: &javascript.Statement{ 43 VariableStatement: v, 44 }, 45 }, 46 } 47 } 48 49 func wrapFunctionDeclaration(f *javascript.FunctionDeclaration) javascript.ModuleItem { 50 return wrapDeclaration(&javascript.Declaration{ 51 FunctionDeclaration: f, 52 }) 53 } 54 55 func wrapClassDeclaration(c *javascript.ClassDeclaration) javascript.ModuleItem { 56 return wrapDeclaration(&javascript.Declaration{ 57 ClassDeclaration: c, 58 }) 59 } 60 61 func wrapDefaultAssignment(def *javascript.Token, a *javascript.AssignmentExpression) javascript.ModuleItem { 62 return wrapConst([]javascript.LexicalBinding{ 63 { 64 BindingIdentifier: def, 65 Initializer: a, 66 }, 67 }) 68 } 69 70 func wrapAssignmentExpression(ae javascript.AssignmentExpression) javascript.ModuleItem { 71 return javascript.ModuleItem{ 72 StatementListItem: &javascript.StatementListItem{ 73 Statement: &javascript.Statement{ 74 ExpressionStatement: &javascript.Expression{ 75 Expressions: []javascript.AssignmentExpression{ae}, 76 }, 77 }, 78 }, 79 } 80 } 81 82 func importMeta(prefix, url string) javascript.LexicalBinding { 83 return javascript.LexicalBinding{ 84 BindingIdentifier: jToken(prefix + "import"), 85 Initializer: &javascript.AssignmentExpression{ 86 ConditionalExpression: javascript.WrapConditional(&javascript.ObjectLiteral{ 87 PropertyDefinitionList: []javascript.PropertyDefinition{ 88 { 89 PropertyName: &javascript.PropertyName{ 90 LiteralPropertyName: jToken("url"), 91 }, 92 AssignmentExpression: &javascript.AssignmentExpression{ 93 ConditionalExpression: javascript.WrapConditional(&javascript.AdditiveExpression{ 94 AdditiveExpression: &javascript.AdditiveExpression{ 95 MultiplicativeExpression: javascript.MultiplicativeExpression{ 96 ExponentiationExpression: javascript.ExponentiationExpression{ 97 UnaryExpression: javascript.UnaryExpression{ 98 UpdateExpression: javascript.UpdateExpression{ 99 LeftHandSideExpression: &javascript.LeftHandSideExpression{ 100 NewExpression: &javascript.NewExpression{ 101 MemberExpression: javascript.MemberExpression{ 102 PrimaryExpression: &javascript.PrimaryExpression{ 103 IdentifierReference: jToken("o"), 104 }, 105 }, 106 }, 107 }, 108 }, 109 }, 110 }, 111 }, 112 }, 113 AdditiveOperator: javascript.AdditiveAdd, 114 MultiplicativeExpression: javascript.MultiplicativeExpression{ 115 ExponentiationExpression: javascript.ExponentiationExpression{ 116 UnaryExpression: javascript.UnaryExpression{ 117 UpdateExpression: javascript.UpdateExpression{ 118 LeftHandSideExpression: &javascript.LeftHandSideExpression{ 119 NewExpression: &javascript.NewExpression{ 120 MemberExpression: javascript.MemberExpression{ 121 PrimaryExpression: &javascript.PrimaryExpression{ 122 Literal: jToken(strconv.Quote(url)), 123 }, 124 }, 125 }, 126 }, 127 }, 128 }, 129 }, 130 }, 131 }), 132 }, 133 }, 134 }, 135 }), 136 }, 137 } 138 } 139 140 func replaceImportCall(ce *javascript.CallExpression) { 141 ce.MemberExpression = &javascript.MemberExpression{ 142 PrimaryExpression: &javascript.PrimaryExpression{ 143 IdentifierReference: jToken("include"), 144 }, 145 } 146 ce.Arguments = &javascript.Arguments{ 147 ArgumentList: []javascript.Argument{ 148 { 149 AssignmentExpression: *ce.ImportCall, 150 }, 151 }, 152 } 153 ce.ImportCall = nil 154 } 155 156 func locationOrigin() javascript.ModuleItem { 157 return wrapConst([]javascript.LexicalBinding{ 158 { 159 BindingIdentifier: jToken("o"), 160 Initializer: &javascript.AssignmentExpression{ 161 ConditionalExpression: javascript.WrapConditional(javascript.MemberExpression{ 162 MemberExpression: &javascript.MemberExpression{ 163 PrimaryExpression: &javascript.PrimaryExpression{ 164 IdentifierReference: jToken("location"), 165 }, 166 }, 167 IdentifierName: jToken("origin"), 168 }), 169 }, 170 }, 171 }) 172 } 173 174 func wrapArgument(arg string) javascript.Argument { 175 return javascript.Argument{ 176 AssignmentExpression: javascript.AssignmentExpression{ 177 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 178 Literal: jToken(strconv.Quote(arg)), 179 }), 180 }, 181 } 182 } 183 184 func wrapMemberIdentifier(id string, in *javascript.Token) javascript.MemberExpression { 185 return javascript.MemberExpression{ 186 MemberExpression: &javascript.MemberExpression{ 187 PrimaryExpression: &javascript.PrimaryExpression{ 188 IdentifierReference: jToken(id), 189 }, 190 }, 191 IdentifierName: in, 192 } 193 } 194 195 func wrapIncludeCall(ident *javascript.Token, args []javascript.Argument) javascript.ModuleItem { 196 return wrapConst([]javascript.LexicalBinding{ 197 { 198 BindingIdentifier: ident, 199 Initializer: awaitCall(&javascript.MemberExpression{ 200 PrimaryExpression: &javascript.PrimaryExpression{ 201 IdentifierReference: jToken("include"), 202 }, 203 }, 204 args, 205 ), 206 }, 207 }) 208 } 209 210 func awaitCall(me *javascript.MemberExpression, args []javascript.Argument) *javascript.AssignmentExpression { 211 return &javascript.AssignmentExpression{ 212 ConditionalExpression: javascript.WrapConditional(&javascript.UnaryExpression{ 213 UnaryOperators: []javascript.UnaryOperatorComments{{UnaryOperator: javascript.UnaryAwait}}, 214 UpdateExpression: javascript.UpdateExpression{ 215 LeftHandSideExpression: &javascript.LeftHandSideExpression{ 216 CallExpression: &javascript.CallExpression{ 217 MemberExpression: me, 218 Arguments: &javascript.Arguments{ 219 ArgumentList: args, 220 }, 221 }, 222 }, 223 }, 224 }), 225 } 226 } 227 228 func wrapIncludeAllCall(importObjectBindings []javascript.BindingElement, importURLsArrayE []javascript.ArrayElement) javascript.ModuleItem { 229 return wrapConst([]javascript.LexicalBinding{ 230 { 231 ArrayBindingPattern: &javascript.ArrayBindingPattern{ 232 BindingElementList: importObjectBindings, 233 }, 234 Initializer: awaitCall(&javascript.MemberExpression{ 235 MemberExpression: &javascript.MemberExpression{ 236 PrimaryExpression: &javascript.PrimaryExpression{ 237 IdentifierReference: jToken("Promise"), 238 }, 239 }, 240 IdentifierName: jToken("all"), 241 }, 242 []javascript.Argument{ 243 { 244 AssignmentExpression: javascript.AssignmentExpression{ 245 ConditionalExpression: javascript.WrapConditional(&javascript.CallExpression{ 246 MemberExpression: &javascript.MemberExpression{ 247 MemberExpression: &javascript.MemberExpression{ 248 PrimaryExpression: &javascript.PrimaryExpression{ 249 ArrayLiteral: &javascript.ArrayLiteral{ 250 ElementList: importURLsArrayE, 251 }, 252 }, 253 }, 254 IdentifierName: jToken("map"), 255 }, 256 Arguments: &javascript.Arguments{ 257 ArgumentList: []javascript.Argument{ 258 { 259 AssignmentExpression: javascript.AssignmentExpression{ 260 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 261 IdentifierReference: jToken("include"), 262 }), 263 }, 264 }, 265 }, 266 }, 267 }), 268 }, 269 }, 270 }, 271 ), 272 }, 273 }) 274 } 275 276 func makeGetter(binding string, id *javascript.Token) javascript.PropertyDefinition { 277 return javascript.PropertyDefinition{ 278 MethodDefinition: &javascript.MethodDefinition{ 279 Type: javascript.MethodGetter, 280 ClassElementName: javascript.ClassElementName{ 281 PropertyName: &javascript.PropertyName{ 282 LiteralPropertyName: jToken(binding), 283 }, 284 }, 285 FunctionBody: javascript.Block{ 286 StatementList: []javascript.StatementListItem{ 287 { 288 Statement: &javascript.Statement{ 289 Type: javascript.StatementReturn, 290 ExpressionStatement: &javascript.Expression{ 291 Expressions: []javascript.AssignmentExpression{ 292 { 293 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 294 IdentifierReference: id, 295 }), 296 }, 297 }, 298 }, 299 }, 300 }, 301 }, 302 }, 303 }, 304 } 305 } 306 307 func wrapNameSpaceFields(id string, fields []javascript.PropertyDefinition) javascript.LexicalBinding { 308 return javascript.LexicalBinding{ 309 BindingIdentifier: jToken(id), 310 Initializer: &javascript.AssignmentExpression{ 311 ConditionalExpression: javascript.WrapConditional(&javascript.ObjectLiteral{ 312 PropertyDefinitionList: fields, 313 }), 314 }, 315 } 316 } 317 318 func wrapURLNameSpace(url, prefix string) javascript.ArrayElement { 319 return javascript.ArrayElement{ 320 AssignmentExpression: javascript.AssignmentExpression{ 321 ConditionalExpression: javascript.WrapConditional(&javascript.ArrayLiteral{ 322 ElementList: []javascript.ArrayElement{ 323 { 324 AssignmentExpression: javascript.AssignmentExpression{ 325 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 326 Literal: jToken(strconv.Quote(url)), 327 }), 328 }, 329 }, 330 { 331 AssignmentExpression: javascript.AssignmentExpression{ 332 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 333 IdentifierReference: jToken(prefix), 334 }), 335 }, 336 }, 337 }, 338 }), 339 }, 340 } 341 } 342 343 func wrapImports(imports []javascript.ArrayElement) javascript.ModuleItem { 344 return javascript.ModuleItem{ 345 StatementListItem: &javascript.StatementListItem{ 346 Statement: &javascript.Statement{ 347 ExpressionStatement: &javascript.Expression{ 348 Expressions: []javascript.AssignmentExpression{ 349 { 350 ConditionalExpression: javascript.WrapConditional(&javascript.CallExpression{ 351 MemberExpression: &javascript.MemberExpression{ 352 MemberExpression: &javascript.MemberExpression{ 353 PrimaryExpression: &javascript.PrimaryExpression{ 354 IdentifierReference: jToken("Object"), 355 }, 356 }, 357 IdentifierName: jToken("defineProperty"), 358 }, 359 Arguments: &javascript.Arguments{ 360 ArgumentList: []javascript.Argument{ 361 { 362 AssignmentExpression: javascript.AssignmentExpression{ 363 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 364 IdentifierReference: jToken("globalThis"), 365 }), 366 }, 367 }, 368 { 369 AssignmentExpression: javascript.AssignmentExpression{ 370 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 371 Literal: jToken("include"), 372 }), 373 }, 374 }, 375 { 376 AssignmentExpression: javascript.AssignmentExpression{ 377 ConditionalExpression: javascript.WrapConditional(&javascript.ObjectLiteral{ 378 PropertyDefinitionList: []javascript.PropertyDefinition{ 379 { 380 PropertyName: &javascript.PropertyName{ 381 LiteralPropertyName: jToken("value"), 382 }, 383 AssignmentExpression: &javascript.AssignmentExpression{ 384 ConditionalExpression: javascript.WrapConditional(&javascript.CallExpression{ 385 MemberExpression: &javascript.MemberExpression{ 386 PrimaryExpression: &javascript.PrimaryExpression{ 387 ParenthesizedExpression: &javascript.ParenthesizedExpression{ 388 Expressions: []javascript.AssignmentExpression{ 389 { 390 ArrowFunction: &javascript.ArrowFunction{ 391 FormalParameters: &javascript.FormalParameters{}, 392 FunctionBody: &javascript.Block{ 393 StatementList: []javascript.StatementListItem{ 394 { 395 Declaration: &javascript.Declaration{ 396 LexicalDeclaration: &javascript.LexicalDeclaration{ 397 LetOrConst: javascript.Const, 398 BindingList: []javascript.LexicalBinding{ 399 { 400 BindingIdentifier: jToken("imports"), 401 Initializer: &javascript.AssignmentExpression{ 402 ConditionalExpression: javascript.WrapConditional(javascript.MemberExpression{ 403 MemberExpression: &javascript.MemberExpression{ 404 PrimaryExpression: &javascript.PrimaryExpression{ 405 IdentifierReference: jToken("Map"), 406 }, 407 }, 408 Arguments: &javascript.Arguments{ 409 ArgumentList: []javascript.Argument{ 410 { 411 AssignmentExpression: javascript.AssignmentExpression{ 412 ConditionalExpression: javascript.WrapConditional(&javascript.ArrayLiteral{ 413 ElementList: imports, 414 }), 415 }, 416 }, 417 }, 418 }, 419 }), 420 }, 421 }, 422 }, 423 }, 424 }, 425 }, 426 { 427 Statement: &javascript.Statement{ 428 Type: javascript.StatementReturn, 429 ExpressionStatement: &javascript.Expression{ 430 Expressions: []javascript.AssignmentExpression{ 431 { 432 ArrowFunction: &javascript.ArrowFunction{ 433 BindingIdentifier: jToken("url"), 434 AssignmentExpression: &javascript.AssignmentExpression{ 435 ConditionalExpression: javascript.WrapConditional(&javascript.CallExpression{ 436 MemberExpression: &javascript.MemberExpression{ 437 MemberExpression: &javascript.MemberExpression{ 438 PrimaryExpression: &javascript.PrimaryExpression{ 439 IdentifierReference: jToken("Promise"), 440 }, 441 IdentifierName: jToken("resolve"), 442 }, 443 }, 444 Arguments: &javascript.Arguments{ 445 ArgumentList: []javascript.Argument{ 446 { 447 AssignmentExpression: javascript.AssignmentExpression{ 448 ConditionalExpression: &javascript.ConditionalExpression{ 449 CoalesceExpression: &javascript.CoalesceExpression{ 450 CoalesceExpressionHead: &javascript.CoalesceExpression{ 451 BitwiseORExpression: javascript.WrapConditional(&javascript.CallExpression{ 452 MemberExpression: &javascript.MemberExpression{ 453 MemberExpression: &javascript.MemberExpression{ 454 PrimaryExpression: &javascript.PrimaryExpression{ 455 IdentifierReference: jToken("imports"), 456 }, 457 }, 458 IdentifierName: jToken("get"), 459 }, 460 Arguments: &javascript.Arguments{ 461 ArgumentList: []javascript.Argument{ 462 { 463 AssignmentExpression: javascript.AssignmentExpression{ 464 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 465 IdentifierReference: jToken("url"), 466 }), 467 }, 468 }, 469 }, 470 }, 471 }).LogicalORExpression.LogicalANDExpression.BitwiseORExpression, 472 }, 473 BitwiseORExpression: javascript.WrapConditional(&javascript.CallExpression{ 474 ImportCall: &javascript.AssignmentExpression{ 475 ConditionalExpression: javascript.WrapConditional(&javascript.PrimaryExpression{ 476 IdentifierReference: jToken("url"), 477 }), 478 }, 479 }).LogicalORExpression.LogicalANDExpression.BitwiseORExpression, 480 }, 481 }, 482 }, 483 }, 484 }, 485 }, 486 }), 487 }, 488 }, 489 }, 490 }, 491 }, 492 }, 493 }, 494 }, 495 }, 496 }, 497 }, 498 }, 499 }, 500 }, 501 }, 502 Arguments: &javascript.Arguments{}, 503 }), 504 }, 505 }, 506 }, 507 }), 508 }, 509 }, 510 }, 511 }, 512 }), 513 }, 514 }, 515 }, 516 }, 517 }, 518 } 519 } 520