A tool to transform Cocos 3D project from ECMAScript to Typescript.
- Windows 10
- Visual Studio Code
- Node.js
- Typescript
-
Clone this reposity;
-
Clone reposity A fork of engine-3d and checkout to the
spy-opt
branch.
Under root directory of this reposity,
excutes the Powershell script bootstrap.ps1
.
This script would let you select two path:
- input path - Cocos 3D reposity's root directory.
- output path - The generated project's root directory.
This step would copy files that
no needs to convert to Typescript format to output directory.
Some necessary files, such as tscconfig.json
are also copied.
Open this reposity in Visual Studio Code,
run the task tsc: Build
and then run the debugging.
After this step, the newly transformed Typescript files should have been outputed to output directory.
Now that the transform work is finished,
switch to the output directory,
perform npm install
. Everything should work fine.
Main task of this tool is to convert Javascript file to Typescript file. These files include:
-
/index.js
-
All
*.js
under/lib
but not under/lib/renderer/shaders
. -
All
*.js
under/script
except for/script/rollup.config.js
and/rollup-mappings.config.js
.
Each of these file will exactlly generate a corresponding
Typescript file with extension replaced js
by ts
.
Semantics and comments
of original Javascript files are remain unchangedly.
But the spaces are not guaranteed to keep.
Some constructs of Javascript can be processed in a batched way,
while another constructs need to be modified manually to
fit grammar and semantic of Typescript.
The later changes are commited into branch spy-opt
of reposity A fork of engine-3d,
with commits containning messages 'SPY'.
The general processes are illustrated below.
The following operations are in turn performed on these Javascript files.
All expressions with form
x.schema = {/* */}
where:
x
can be decided as a class in the context
are consider as schema declaration of Cocos 3D.
Foreach schema declaration, this tool will
remove the get
and set
function from the object literal
and insert them into x
as x
's getter or setter.
Remain content of the object literal are keeped unchangely.
All file scope statements with form
x.y = /* */;
where:
x
can be decided as a class in same file scope;y
is an identifier
are converted:
A static public property named y
are insert into declaration of class x
with inializer same as what commented.
This statement ifself are removed.
For example:
class V { }
V.create = function() { return new V(); };
v.create();
will be transformed as:
class V { static create = function() { return new V(); } }
V.create();
All file scope statements with form
x.prototype.y = function(/**/) {/**/};
where:
x
can be decided as a class in same file scope;y
is an identifier
are converted:
A non-static public method named y
are insert into declaration of class x
.
It's arguments and body are same as what commented.
This statement ifself are removed.
For example:
class V { }
V.prototype.sayHello = function() { console.log('Hello'); };
(new V()).sayHello();
will be transformed as:
class V { create() { console.log('Hello'); } }
(new V()).sayHello();
Foreach class declaration for class x
,
this tool would find out
all expression with form
this.m
where:
m
is an identifier
inside the class declaration.
If the m
is not a method declarated in
class x
or its recursive base classes.
Insert a non-static public property named m
into declaration of class x
.
If that expression is occurred in an assignment expression with form
this.m = v
where:
v
is a string literal or number literal or boolean literal
this tool will make the inserted property having type
string
, number
, boolean
respectively.
Otherwise, let it having type any
.
Inside declaration of each variable or parameter,
this tool will mark the declaration type as any
,
given:
-
This declaration didn't specify a type;
-
This declaration didn't have a string literal or number literal or boolean literal initializer.
Foreach function expression, if a this
keyword is
found inside this function,
insert a new parameter with name this
and type any
into the front of the function's parameter list.
For example:
someEvent.callback = function() {
console.log(this.args);
}
will be transformed as:
someEvent.callback = function(this: any) {
console.log(this.args);
}
All expression of the form
this[/**/]
which occurred in method declaration of a class,
are replaced as:
(this as any)[/**/]
All expression of the form
document.x
or
window.y
where:
-
x is one of
mozPointerLockElement
-
y is one of
XMLHttpRequest
,ActiveXObject
,AudioContext
,webkitAudioContext
,mozAudioContext
,
are replaced as:
(document as any).x
or
(window as any).y
respectively.
All property assignment with form:
{
/**/
[true]: /**/
/**/
}
or
{
/**/
[false]: /**/
/**/
}
are replaced as
{
/**/
["true"]: /**/
/**/
}
or
{
/**/
["false"]: /**/
/**/
}
respectively.
Foreach call expression,
if this tool found that
the count of arguments is less than the count of parameters needed,
the lacked arguments are supplied with undefined
.
For example:
function fx(arg1, arg2) {}
fx(0);
will be transformed as:
function fx(arg1, arg2) {}
fx(0, undefined);
/script/rollup-mappings.config.js
and
/script/rollup-config.js
are modified:
-
babel
plugins are replaced bytypescript2
plugin; -
Replace input file names from
*.js
to*.ts
; -
For commonjs plugin in
/script/rollup-config.js
, add argument:
{namedExports: {
'cannon': ['Body', 'Vec3', 'Box', 'Sphere', 'Shape', 'World']
}}
The following npm packages are added to support project running:
-
@types/node
-
@types/cannon
Note: Typescript type declaration files under
/resource/engine-3d-ts
/types are copied into
root directory of new project.
The following npm packages are added to support project packing:
-
rollup-plugin-typescript2
-
typescript
-
ts-node
In script build:shader
:
node ./script/build-shader.js
is modified as:
ts-node ./script/build-shader.ts
In script build:effect
:
node ./script/build-effect.js
is modified as:
ts-node ./script/build-effect.ts