swf-toolkit 0.0.0-stage → 0.1.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -2
  3. package/README.tr.md +126 -0
  4. package/dist/abc/abc-file.d.ts +168 -0
  5. package/dist/abc/abc-file.js +656 -0
  6. package/dist/abc/analysis.d.ts +36 -0
  7. package/dist/abc/analysis.js +213 -0
  8. package/dist/abc/code.d.ts +59 -0
  9. package/dist/abc/code.js +379 -0
  10. package/dist/abc/constants.d.ts +80 -0
  11. package/dist/abc/constants.js +93 -0
  12. package/dist/abc/interner.d.ts +46 -0
  13. package/dist/abc/interner.js +168 -0
  14. package/dist/abc/model.d.ts +40 -0
  15. package/dist/abc/model.js +146 -0
  16. package/dist/abc/opcodes.d.ts +39 -0
  17. package/dist/abc/opcodes.js +196 -0
  18. package/dist/abc/pcode/assembler.d.ts +42 -0
  19. package/dist/abc/pcode/assembler.js +635 -0
  20. package/dist/abc/pcode/disassembler.d.ts +17 -0
  21. package/dist/abc/pcode/disassembler.js +147 -0
  22. package/dist/abc/pcode/format.d.ts +23 -0
  23. package/dist/abc/pcode/format.js +131 -0
  24. package/dist/abc/pcode/lexer.d.ts +34 -0
  25. package/dist/abc/pcode/lexer.js +183 -0
  26. package/dist/assets/assets.d.ts +26 -0
  27. package/dist/assets/assets.js +151 -0
  28. package/dist/assets/images.d.ts +31 -0
  29. package/dist/assets/images.js +238 -0
  30. package/dist/assets/png.d.ts +12 -0
  31. package/dist/assets/png.js +196 -0
  32. package/dist/assets/sounds.d.ts +37 -0
  33. package/dist/assets/sounds.js +236 -0
  34. package/dist/avm1/avm1.d.ts +55 -0
  35. package/dist/avm1/avm1.js +642 -0
  36. package/dist/avm1/project.d.ts +16 -0
  37. package/dist/avm1/project.js +81 -0
  38. package/dist/cjs/abc/abc-file.d.ts +168 -0
  39. package/dist/cjs/abc/abc-file.js +663 -0
  40. package/dist/cjs/abc/analysis.d.ts +36 -0
  41. package/dist/cjs/abc/analysis.js +221 -0
  42. package/dist/cjs/abc/code.d.ts +59 -0
  43. package/dist/cjs/abc/code.js +387 -0
  44. package/dist/cjs/abc/constants.d.ts +80 -0
  45. package/dist/cjs/abc/constants.js +97 -0
  46. package/dist/cjs/abc/interner.d.ts +46 -0
  47. package/dist/cjs/abc/interner.js +172 -0
  48. package/dist/cjs/abc/model.d.ts +40 -0
  49. package/dist/cjs/abc/model.js +155 -0
  50. package/dist/cjs/abc/opcodes.d.ts +39 -0
  51. package/dist/cjs/abc/opcodes.js +201 -0
  52. package/dist/cjs/abc/pcode/assembler.d.ts +42 -0
  53. package/dist/cjs/abc/pcode/assembler.js +640 -0
  54. package/dist/cjs/abc/pcode/disassembler.d.ts +17 -0
  55. package/dist/cjs/abc/pcode/disassembler.js +152 -0
  56. package/dist/cjs/abc/pcode/format.d.ts +23 -0
  57. package/dist/cjs/abc/pcode/format.js +141 -0
  58. package/dist/cjs/abc/pcode/lexer.d.ts +34 -0
  59. package/dist/cjs/abc/pcode/lexer.js +188 -0
  60. package/dist/cjs/assets/assets.d.ts +26 -0
  61. package/dist/cjs/assets/assets.js +159 -0
  62. package/dist/cjs/assets/images.d.ts +31 -0
  63. package/dist/cjs/assets/images.js +246 -0
  64. package/dist/cjs/assets/png.d.ts +12 -0
  65. package/dist/cjs/assets/png.js +202 -0
  66. package/dist/cjs/assets/sounds.d.ts +37 -0
  67. package/dist/cjs/assets/sounds.js +246 -0
  68. package/dist/cjs/avm1/avm1.d.ts +55 -0
  69. package/dist/cjs/avm1/avm1.js +649 -0
  70. package/dist/cjs/avm1/project.d.ts +16 -0
  71. package/dist/cjs/avm1/project.js +88 -0
  72. package/dist/cjs/compiler/ast.d.ts +285 -0
  73. package/dist/cjs/compiler/ast.js +3 -0
  74. package/dist/cjs/compiler/class-compiler.d.ts +34 -0
  75. package/dist/cjs/compiler/class-compiler.js +440 -0
  76. package/dist/cjs/compiler/codegen.d.ts +144 -0
  77. package/dist/cjs/compiler/codegen.js +1589 -0
  78. package/dist/cjs/compiler/lexer.d.ts +27 -0
  79. package/dist/cjs/compiler/lexer.js +254 -0
  80. package/dist/cjs/compiler/parser.d.ts +58 -0
  81. package/dist/cjs/compiler/parser.js +989 -0
  82. package/dist/cjs/compiler/program.d.ts +29 -0
  83. package/dist/cjs/compiler/program.js +36 -0
  84. package/dist/cjs/compiler/scope.d.ts +22 -0
  85. package/dist/cjs/compiler/scope.js +242 -0
  86. package/dist/cjs/compression/lzma.d.ts +37 -0
  87. package/dist/cjs/compression/lzma.js +575 -0
  88. package/dist/cjs/compression/swf-container.d.ts +19 -0
  89. package/dist/cjs/compression/swf-container.js +92 -0
  90. package/dist/cjs/decompiler/ast.d.ts +228 -0
  91. package/dist/cjs/decompiler/ast.js +455 -0
  92. package/dist/cjs/decompiler/cfg.d.ts +40 -0
  93. package/dist/cjs/decompiler/cfg.js +236 -0
  94. package/dist/cjs/decompiler/class-printer.d.ts +9 -0
  95. package/dist/cjs/decompiler/class-printer.js +173 -0
  96. package/dist/cjs/decompiler/method.d.ts +41 -0
  97. package/dist/cjs/decompiler/method.js +436 -0
  98. package/dist/cjs/decompiler/simulate.d.ts +55 -0
  99. package/dist/cjs/decompiler/simulate.js +591 -0
  100. package/dist/cjs/decompiler/structure.d.ts +48 -0
  101. package/dist/cjs/decompiler/structure.js +764 -0
  102. package/dist/cjs/errors.d.ts +11 -0
  103. package/dist/cjs/errors.js +25 -0
  104. package/dist/cjs/index.d.ts +41 -0
  105. package/dist/cjs/index.js +82 -0
  106. package/dist/cjs/io/reader.d.ts +48 -0
  107. package/dist/cjs/io/reader.js +180 -0
  108. package/dist/cjs/io/writer.d.ts +37 -0
  109. package/dist/cjs/io/writer.js +175 -0
  110. package/dist/cjs/package.json +1 -0
  111. package/dist/cjs/project/pcode-project.d.ts +32 -0
  112. package/dist/cjs/project/pcode-project.js +210 -0
  113. package/dist/cjs/project/source-export.d.ts +12 -0
  114. package/dist/cjs/project/source-export.js +51 -0
  115. package/dist/cjs/project/source-import.d.ts +13 -0
  116. package/dist/cjs/project/source-import.js +73 -0
  117. package/dist/cjs/swf/swf.d.ts +63 -0
  118. package/dist/cjs/swf/swf.js +147 -0
  119. package/dist/cjs/swf/tag-codes.d.ts +77 -0
  120. package/dist/cjs/swf/tag-codes.js +109 -0
  121. package/dist/cjs/swf/tags.d.ts +118 -0
  122. package/dist/cjs/swf/tags.js +330 -0
  123. package/dist/cli.d.ts +2 -0
  124. package/dist/cli.js +296 -0
  125. package/dist/compiler/ast.d.ts +285 -0
  126. package/dist/compiler/ast.js +2 -0
  127. package/dist/compiler/class-compiler.d.ts +34 -0
  128. package/dist/compiler/class-compiler.js +437 -0
  129. package/dist/compiler/codegen.d.ts +144 -0
  130. package/dist/compiler/codegen.js +1585 -0
  131. package/dist/compiler/lexer.d.ts +27 -0
  132. package/dist/compiler/lexer.js +249 -0
  133. package/dist/compiler/parser.d.ts +58 -0
  134. package/dist/compiler/parser.js +984 -0
  135. package/dist/compiler/program.d.ts +29 -0
  136. package/dist/compiler/program.js +32 -0
  137. package/dist/compiler/scope.d.ts +22 -0
  138. package/dist/compiler/scope.js +238 -0
  139. package/dist/compression/lzma.d.ts +37 -0
  140. package/dist/compression/lzma.js +569 -0
  141. package/dist/compression/swf-container.d.ts +19 -0
  142. package/dist/compression/swf-container.js +87 -0
  143. package/dist/decompiler/ast.d.ts +228 -0
  144. package/dist/decompiler/ast.js +441 -0
  145. package/dist/decompiler/cfg.d.ts +40 -0
  146. package/dist/decompiler/cfg.js +231 -0
  147. package/dist/decompiler/class-printer.d.ts +9 -0
  148. package/dist/decompiler/class-printer.js +170 -0
  149. package/dist/decompiler/method.d.ts +41 -0
  150. package/dist/decompiler/method.js +427 -0
  151. package/dist/decompiler/simulate.d.ts +55 -0
  152. package/dist/decompiler/simulate.js +586 -0
  153. package/dist/decompiler/structure.d.ts +48 -0
  154. package/dist/decompiler/structure.js +760 -0
  155. package/dist/errors.d.ts +11 -0
  156. package/dist/errors.js +20 -0
  157. package/dist/index.d.ts +41 -0
  158. package/dist/index.js +49 -0
  159. package/dist/io/reader.d.ts +48 -0
  160. package/dist/io/reader.js +176 -0
  161. package/dist/io/writer.d.ts +37 -0
  162. package/dist/io/writer.js +169 -0
  163. package/dist/project/pcode-project.d.ts +32 -0
  164. package/dist/project/pcode-project.js +203 -0
  165. package/dist/project/source-export.d.ts +12 -0
  166. package/dist/project/source-export.js +47 -0
  167. package/dist/project/source-import.d.ts +13 -0
  168. package/dist/project/source-import.js +70 -0
  169. package/dist/swf/swf.d.ts +63 -0
  170. package/dist/swf/swf.js +143 -0
  171. package/dist/swf/tag-codes.d.ts +77 -0
  172. package/dist/swf/tag-codes.js +105 -0
  173. package/dist/swf/tags.d.ts +118 -0
  174. package/dist/swf/tags.js +316 -0
  175. package/package.json +71 -4
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ActionScript 3 tokenizer.
3
+ */
4
+ export declare class CompileError extends Error {
5
+ readonly line: number;
6
+ readonly column: number;
7
+ readonly source?: string | undefined;
8
+ constructor(message: string, line: number, column: number, source?: string | undefined);
9
+ }
10
+ export type TokKind = 'id' | 'kw' | 'num' | 'str' | 'regex' | 'punct' | 'eof';
11
+ export interface Tok {
12
+ kind: TokKind;
13
+ value: string;
14
+ /** Numeric value for numbers. */
15
+ num?: number;
16
+ /** Regex flags. */
17
+ flags?: string;
18
+ line: number;
19
+ col: number;
20
+ /** Offset of first char in the source. */
21
+ start: number;
22
+ end: number;
23
+ /** A line terminator precedes this token (for automatic semicolon insertion). */
24
+ nl: boolean;
25
+ }
26
+ export declare const KEYWORDS: Set<string>;
27
+ export declare function tokenize(src: string, source?: string): Tok[];
@@ -0,0 +1,249 @@
1
+ /**
2
+ * ActionScript 3 tokenizer.
3
+ */
4
+ export class CompileError extends Error {
5
+ line;
6
+ column;
7
+ source;
8
+ constructor(message, line, column, source) {
9
+ super(`${source ? source + ':' : ''}${line}:${column}: ${message}`);
10
+ this.line = line;
11
+ this.column = column;
12
+ this.source = source;
13
+ this.name = 'CompileError';
14
+ }
15
+ }
16
+ export const KEYWORDS = new Set([
17
+ 'as', 'break', 'case', 'catch', 'class', 'const', 'continue', 'default', 'delete', 'do', 'else', 'extends',
18
+ 'false', 'finally', 'for', 'function', 'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'internal',
19
+ 'is', 'new', 'null', 'package', 'private', 'protected', 'public', 'return', 'super', 'switch', 'this', 'throw',
20
+ 'true', 'try', 'typeof', 'use', 'var', 'void', 'while', 'with',
21
+ ]);
22
+ const PUNCTS = [
23
+ '>>>=', '...', '===', '!==', '>>>', '<<=', '>>=', '&&=', '||=',
24
+ '::', '.<', '..', '==', '!=', '<=', '>=', '&&', '||', '++', '--', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<', '>>',
25
+ '{', '}', '(', ')', '[', ']', ';', ',', '<', '>', '+', '-', '*', '/', '%', '&', '|', '^', '!', '~', '?', ':', '=', '.', '@',
26
+ ];
27
+ const ID_START = /[A-Za-z_$\u00c0-\uffff]/;
28
+ const ID_PART = /[A-Za-z0-9_$\u00c0-\uffff]/;
29
+ /** Tokens after which a `/` is a division operator rather than a regex. */
30
+ function slashIsDivision(prev) {
31
+ if (!prev)
32
+ return false;
33
+ if (prev.kind === 'num' || prev.kind === 'str' || prev.kind === 'regex' || prev.kind === 'id')
34
+ return true;
35
+ if (prev.kind === 'kw')
36
+ return ['this', 'super', 'null', 'true', 'false'].includes(prev.value);
37
+ if (prev.kind === 'punct')
38
+ return [')', ']', '}', '++', '--'].includes(prev.value);
39
+ return false;
40
+ }
41
+ export function tokenize(src, source) {
42
+ const toks = [];
43
+ let i = 0;
44
+ let line = 1;
45
+ let lineStart = 0;
46
+ let nl = false;
47
+ const n = src.length;
48
+ const err = (msg, at = i) => new CompileError(msg, line, at - lineStart + 1, source);
49
+ while (i < n) {
50
+ const c = src[i];
51
+ if (c === '\n') {
52
+ i++;
53
+ line++;
54
+ lineStart = i;
55
+ nl = true;
56
+ continue;
57
+ }
58
+ if (c === ' ' || c === '\t' || c === '\r' || c === '\f' || c === '\v' || c === '\ufeff' || c === '\u00a0') {
59
+ i++;
60
+ continue;
61
+ }
62
+ if (c === '/' && src[i + 1] === '/') {
63
+ while (i < n && src[i] !== '\n')
64
+ i++;
65
+ continue;
66
+ }
67
+ if (c === '/' && src[i + 1] === '*') {
68
+ const end = src.indexOf('*/', i + 2);
69
+ if (end < 0)
70
+ throw err('Unterminated comment');
71
+ for (let k = i; k < end; k++) {
72
+ if (src[k] === '\n') {
73
+ line++;
74
+ lineStart = k + 1;
75
+ nl = true;
76
+ }
77
+ }
78
+ i = end + 2;
79
+ continue;
80
+ }
81
+ const start = i;
82
+ const col = i - lineStart + 1;
83
+ const push = (kind, value, extra = {}) => {
84
+ toks.push({ kind, value, line, col, start, end: i, nl, ...extra });
85
+ nl = false;
86
+ };
87
+ // Numbers
88
+ if (/[0-9]/.test(c) || (c === '.' && /[0-9]/.test(src[i + 1] ?? ''))) {
89
+ let text;
90
+ if (c === '0' && (src[i + 1] === 'x' || src[i + 1] === 'X')) {
91
+ i += 2;
92
+ while (i < n && /[0-9a-fA-F]/.test(src[i]))
93
+ i++;
94
+ text = src.slice(start, i);
95
+ push('num', text, { num: parseInt(text.slice(2), 16) });
96
+ }
97
+ else {
98
+ while (i < n && /[0-9]/.test(src[i]))
99
+ i++;
100
+ if (src[i] === '.' && /[0-9]/.test(src[i + 1] ?? '')) {
101
+ i++;
102
+ while (i < n && /[0-9]/.test(src[i]))
103
+ i++;
104
+ }
105
+ else if (src[i] === '.' && !/[.A-Za-z_$]/.test(src[i + 1] ?? '')) {
106
+ i++;
107
+ }
108
+ if (src[i] === 'e' || src[i] === 'E') {
109
+ let j = i + 1;
110
+ if (src[j] === '+' || src[j] === '-')
111
+ j++;
112
+ if (/[0-9]/.test(src[j] ?? '')) {
113
+ i = j;
114
+ while (i < n && /[0-9]/.test(src[i]))
115
+ i++;
116
+ }
117
+ }
118
+ text = src.slice(start, i);
119
+ push('num', text, { num: Number(text) });
120
+ }
121
+ if (i < n && ID_START.test(src[i]))
122
+ throw err('Invalid number literal');
123
+ continue;
124
+ }
125
+ // Strings
126
+ if (c === '"' || c === "'") {
127
+ i++;
128
+ let out = '';
129
+ while (i < n && src[i] !== c) {
130
+ let ch = src[i];
131
+ if (ch === '\n')
132
+ throw err('Unterminated string');
133
+ if (ch === '\\') {
134
+ i++;
135
+ ch = src[i];
136
+ switch (ch) {
137
+ case 'n':
138
+ out += '\n';
139
+ break;
140
+ case 'r':
141
+ out += '\r';
142
+ break;
143
+ case 't':
144
+ out += '\t';
145
+ break;
146
+ case 'b':
147
+ out += '\b';
148
+ break;
149
+ case 'f':
150
+ out += '\f';
151
+ break;
152
+ case 'v':
153
+ out += '\v';
154
+ break;
155
+ case '0':
156
+ out += '\0';
157
+ break;
158
+ case 'x':
159
+ out += String.fromCharCode(parseInt(src.slice(i + 1, i + 3), 16));
160
+ i += 2;
161
+ break;
162
+ case 'u':
163
+ if (src[i + 1] === '{') {
164
+ const close = src.indexOf('}', i);
165
+ out += String.fromCodePoint(parseInt(src.slice(i + 2, close), 16));
166
+ i = close;
167
+ }
168
+ else {
169
+ out += String.fromCharCode(parseInt(src.slice(i + 1, i + 5), 16));
170
+ i += 4;
171
+ }
172
+ break;
173
+ case '\r':
174
+ if (src[i + 1] === '\n')
175
+ i++;
176
+ break;
177
+ case '\n':
178
+ line++;
179
+ lineStart = i + 1;
180
+ break;
181
+ default: out += ch;
182
+ }
183
+ i++;
184
+ continue;
185
+ }
186
+ out += ch;
187
+ i++;
188
+ }
189
+ if (i >= n)
190
+ throw err('Unterminated string', start);
191
+ i++;
192
+ push('str', out);
193
+ continue;
194
+ }
195
+ // Regex literal
196
+ if (c === '/' && !slashIsDivision(toks[toks.length - 1])) {
197
+ i++;
198
+ let inClass = false;
199
+ while (i < n) {
200
+ const ch = src[i];
201
+ if (ch === '\n')
202
+ throw err('Unterminated regular expression', start);
203
+ if (ch === '\\') {
204
+ i += 2;
205
+ continue;
206
+ }
207
+ if (ch === '[')
208
+ inClass = true;
209
+ else if (ch === ']')
210
+ inClass = false;
211
+ else if (ch === '/' && !inClass)
212
+ break;
213
+ i++;
214
+ }
215
+ const body = src.slice(start + 1, i);
216
+ i++;
217
+ const fstart = i;
218
+ while (i < n && /[a-z]/i.test(src[i]))
219
+ i++;
220
+ push('regex', body, { flags: src.slice(fstart, i) });
221
+ continue;
222
+ }
223
+ // Identifiers / keywords
224
+ if (ID_START.test(c) || c === '\\') {
225
+ while (i < n && ID_PART.test(src[i]))
226
+ i++;
227
+ const text = src.slice(start, i);
228
+ push(KEYWORDS.has(text) ? 'kw' : 'id', text);
229
+ continue;
230
+ }
231
+ // Punctuation
232
+ let matched = '';
233
+ for (const p of PUNCTS) {
234
+ if (src.startsWith(p, i)) {
235
+ matched = p;
236
+ break;
237
+ }
238
+ }
239
+ if (!matched)
240
+ throw err(`Unexpected character '${c}'`);
241
+ // ".<" only starts a type parameter list when followed by an identifier/'*'.
242
+ if (matched === '.<' && !/[\sA-Za-z_$*]/.test(src[i + 2] ?? ''))
243
+ matched = '.';
244
+ i += matched.length;
245
+ push('punct', matched);
246
+ }
247
+ toks.push({ kind: 'eof', value: '', line, col: i - lineStart + 1, start: i, end: i, nl: true });
248
+ return toks;
249
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Recursive-descent parser for ActionScript 3 source files.
3
+ */
4
+ import type { CompilationUnit, Expr, Stmt } from './ast.js';
5
+ export declare class Parser {
6
+ readonly src: string;
7
+ readonly source?: string | undefined;
8
+ private toks;
9
+ private p;
10
+ constructor(src: string, source?: string | undefined);
11
+ private get t();
12
+ private peek;
13
+ private pos;
14
+ private error;
15
+ private is;
16
+ private isId;
17
+ private next;
18
+ private eat;
19
+ private expect;
20
+ /** Identifier (keywords allowed where `allowKeyword` is set, e.g. after '.'). */
21
+ private ident;
22
+ private semicolon;
23
+ parseUnit(): CompilationUnit;
24
+ private dottedName;
25
+ private parseDirectives;
26
+ private parseMetadataList;
27
+ private metaValue;
28
+ private parseModifiers;
29
+ private accessOf;
30
+ private parseType;
31
+ private parseClass;
32
+ private parseMember;
33
+ private parseMethodMember;
34
+ /** Parses `(params):Type { body }` (body optional for interfaces / native). */
35
+ private parseFunctionRest;
36
+ private parseBlock;
37
+ private parseVarDecls;
38
+ parseStatement(): Stmt;
39
+ private parseFor;
40
+ private parseSwitch;
41
+ private parseTry;
42
+ parseExpr(noIn?: boolean): Expr;
43
+ parseAssign(noIn?: boolean): Expr;
44
+ private parseConditional;
45
+ private binaryOp;
46
+ private parseBinary;
47
+ private parseUnary;
48
+ private parsePostfix;
49
+ private parseArgs;
50
+ private parseLeftHandSide;
51
+ /** Member expression without call suffixes (for `new X.Y(args)`). */
52
+ private parseMemberOnly;
53
+ private parseSuffixes;
54
+ private parsePrimary;
55
+ /** Very small XML literal support: the literal is kept as text and parsed at runtime with `new XML(...)`. */
56
+ private parseXmlLiteral;
57
+ }
58
+ export declare function parseAs3(src: string, source?: string): CompilationUnit;