@replicast/vite-plugin 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.
- package/dist/ast-helpers.d.ts +6 -0
- package/dist/ast-helpers.d.ts.map +1 -0
- package/dist/ast-helpers.js +20 -0
- package/dist/ast-helpers.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/transforms/lifecycle.d.ts +4 -0
- package/dist/transforms/lifecycle.d.ts.map +1 -0
- package/dist/transforms/lifecycle.js +20 -0
- package/dist/transforms/lifecycle.js.map +1 -0
- package/dist/transforms/store.d.ts +4 -0
- package/dist/transforms/store.d.ts.map +1 -0
- package/dist/transforms/store.js +25 -0
- package/dist/transforms/store.js.map +1 -0
- package/dist/transforms/system.d.ts +4 -0
- package/dist/transforms/system.d.ts.map +1 -0
- package/dist/transforms/system.js +88 -0
- package/dist/transforms/system.js.map +1 -0
- package/package.json +24 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
export declare function parseSource(source: string): ts.SourceFile;
|
|
3
|
+
export declare function printFile(sourceFile: ts.SourceFile): string;
|
|
4
|
+
export declare function getDecoratorName(decorator: ts.Decorator): string | null;
|
|
5
|
+
export declare function hasDecorator(node: ts.ClassDeclaration | ts.PropertyDeclaration | ts.MethodDeclaration, name: string): boolean;
|
|
6
|
+
//# sourceMappingURL=ast-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-helpers.d.ts","sourceRoot":"","sources":["../src/ast-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,CAEzD;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAG3D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,iBAAiB,EACzE,IAAI,EAAE,MAAM,GACX,OAAO,CAET"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
export function parseSource(source) {
|
|
3
|
+
return ts.createSourceFile('input.ts', source, ts.ScriptTarget.ESNext, true);
|
|
4
|
+
}
|
|
5
|
+
export function printFile(sourceFile) {
|
|
6
|
+
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
|
|
7
|
+
return printer.printFile(sourceFile);
|
|
8
|
+
}
|
|
9
|
+
export function getDecoratorName(decorator) {
|
|
10
|
+
const expr = decorator.expression;
|
|
11
|
+
if (ts.isIdentifier(expr))
|
|
12
|
+
return expr.text;
|
|
13
|
+
if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression))
|
|
14
|
+
return expr.expression.text;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
export function hasDecorator(node, name) {
|
|
18
|
+
return ts.getDecorators(node)?.some(d => getDecoratorName(d) === name) ?? false;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ast-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-helpers.js","sourceRoot":"","sources":["../src/ast-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAyB;IACjD,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACtE,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAuB;IACtD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAA;IACjC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAA;IAC3C,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAA;IAC9F,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAyE,EACzE,IAAY;IAEZ,OAAO,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,CAAA;AACjF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAKlC,KAAK,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AActC,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAW3D;AAED,eAAe,eAAe,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { transformStoreFile } from './transforms/store.js';
|
|
2
|
+
import { transformSystemFile } from './transforms/system.js';
|
|
3
|
+
import { transformLifecycleFile } from './transforms/lifecycle.js';
|
|
4
|
+
function isStoreFile(id) {
|
|
5
|
+
return id.endsWith('.store.ts') || id.endsWith('.store.js');
|
|
6
|
+
}
|
|
7
|
+
function isSystemFile(id) {
|
|
8
|
+
return id.endsWith('.system.ts') || id.endsWith('.system.js');
|
|
9
|
+
}
|
|
10
|
+
function isLifecycleFile(id) {
|
|
11
|
+
return id.endsWith('.lifecycle.ts') || id.endsWith('.lifecycle.js');
|
|
12
|
+
}
|
|
13
|
+
export function replicastPlugin(target) {
|
|
14
|
+
return {
|
|
15
|
+
name: 'replicast',
|
|
16
|
+
transform(code, id) {
|
|
17
|
+
if (!id.endsWith('.ts') && !id.endsWith('.js'))
|
|
18
|
+
return null;
|
|
19
|
+
if (isStoreFile(id))
|
|
20
|
+
return transformStoreFile(code, target);
|
|
21
|
+
if (isSystemFile(id))
|
|
22
|
+
return transformSystemFile(code, target);
|
|
23
|
+
if (isLifecycleFile(id))
|
|
24
|
+
return transformLifecycleFile(code, target);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export default replicastPlugin;
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAIlE,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,OAAO,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC3D,IAAI,WAAW,CAAC,EAAE,CAAC;gBAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC5D,IAAI,YAAY,CAAC,EAAE,CAAC;gBAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC9D,IAAI,eAAe,CAAC,EAAE,CAAC;gBAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACpE,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/transforms/lifecycle.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEtC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAclF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { parseSource, printFile, hasDecorator } from '../ast-helpers.js';
|
|
3
|
+
export function transformLifecycleFile(source, target) {
|
|
4
|
+
const sourceFile = parseSource(source);
|
|
5
|
+
const transformer = (_context) => (sf) => {
|
|
6
|
+
const newStatements = sf.statements.filter(stmt => {
|
|
7
|
+
if (ts.isClassDeclaration(stmt)) {
|
|
8
|
+
if (target === 'client' && hasDecorator(stmt, 'Server'))
|
|
9
|
+
return false;
|
|
10
|
+
if (target === 'server' && hasDecorator(stmt, 'Client'))
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
});
|
|
15
|
+
return ts.factory.updateSourceFile(sf, newStatements);
|
|
16
|
+
};
|
|
17
|
+
const result = ts.transform(sourceFile, [transformer]);
|
|
18
|
+
return printFile(result.transformed[0]);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/transforms/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIxE,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,MAAmB;IACxE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,WAAW,GAAyC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE;QAC7E,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAChD,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,IAAI,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACrE,IAAI,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAAE,OAAO,KAAK,CAAA;YACvE,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;IACvD,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACtD,OAAO,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/transforms/store.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEtC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CA6B9E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { parseSource, printFile, hasDecorator } from '../ast-helpers.js';
|
|
3
|
+
export function transformStoreFile(source, target) {
|
|
4
|
+
if (target === 'server')
|
|
5
|
+
return source;
|
|
6
|
+
const sourceFile = parseSource(source);
|
|
7
|
+
const transformer = (context) => (sf) => {
|
|
8
|
+
function visit(node) {
|
|
9
|
+
if (ts.isClassDeclaration(node)) {
|
|
10
|
+
const newMembers = node.members.filter(member => {
|
|
11
|
+
if (ts.isPropertyDeclaration(member)) {
|
|
12
|
+
return !hasDecorator(member, 'ServerOnly');
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
});
|
|
16
|
+
return ts.factory.updateClassDeclaration(node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, ts.factory.createNodeArray(newMembers));
|
|
17
|
+
}
|
|
18
|
+
return ts.visitEachChild(node, visit, context);
|
|
19
|
+
}
|
|
20
|
+
return ts.visitNode(sf, visit);
|
|
21
|
+
};
|
|
22
|
+
const result = ts.transform(sourceFile, [transformer]);
|
|
23
|
+
return printFile(result.transformed[0]);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/transforms/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIxE,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAmB;IACpE,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAEtC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,WAAW,GAAyC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE;QAC5E,SAAS,KAAK,CAAC,IAAa;YAC1B,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;oBAC9C,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;wBACrC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;oBAC5C,CAAC;oBACD,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC,CAAA;gBACF,OAAO,EAAE,CAAC,OAAO,CAAC,sBAAsB,CACtC,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,eAAe,EACpB,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CACvC,CAAA;YACH,CAAC;YACD,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAkB,CAAA;IACjD,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACtD,OAAO,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/transforms/system.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAqGtC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CA8D/E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { parseSource, printFile, hasDecorator, getDecoratorName } from '../ast-helpers.js';
|
|
3
|
+
function makeClientStub(className, methodName, params) {
|
|
4
|
+
// Skip ctx (first param) — server-side parameter not sent over the wire
|
|
5
|
+
const argParams = Array.from(params).slice(1);
|
|
6
|
+
const argNames = argParams
|
|
7
|
+
.filter(p => ts.isIdentifier(p.name))
|
|
8
|
+
.map(p => p.name.text);
|
|
9
|
+
const argsArray = ts.factory.createArrayLiteralExpression(argNames.map(n => ts.factory.createIdentifier(n)));
|
|
10
|
+
return [
|
|
11
|
+
ts.factory.createReturnStatement(ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('wsClient'), 'call'), undefined, [
|
|
12
|
+
ts.factory.createStringLiteral(`${className}.${methodName}`),
|
|
13
|
+
argsArray
|
|
14
|
+
]))
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
function makeSendToClientDispatch(className, methodName, params) {
|
|
18
|
+
const argNames = Array.from(params)
|
|
19
|
+
.filter(p => ts.isIdentifier(p.name))
|
|
20
|
+
.map(p => p.name.text);
|
|
21
|
+
if (argNames.length === 0) {
|
|
22
|
+
throw new Error(`@Client method '${className}.${methodName}' must declare a targetId as its first parameter`);
|
|
23
|
+
}
|
|
24
|
+
const targetId = argNames[0];
|
|
25
|
+
const restArgs = argNames.slice(1);
|
|
26
|
+
return [
|
|
27
|
+
ts.factory.createExpressionStatement(ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('ctx'), 'sendToClient'), undefined, [
|
|
28
|
+
ts.factory.createIdentifier(targetId),
|
|
29
|
+
ts.factory.createStringLiteral(`${className}.${methodName}`),
|
|
30
|
+
...restArgs.map(n => ts.factory.createIdentifier(n))
|
|
31
|
+
]))
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
function makeBroadcastDispatch(className, methodName, params) {
|
|
35
|
+
const argNames = Array.from(params)
|
|
36
|
+
.filter(p => ts.isIdentifier(p.name))
|
|
37
|
+
.map(p => p.name.text)
|
|
38
|
+
.slice(1); // drop ctx (first param), same as makeClientStub
|
|
39
|
+
return [
|
|
40
|
+
ts.factory.createForOfStatement(undefined, ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration('_pid')], ts.NodeFlags.Const), ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('ctx'), 'players'), ts.factory.createExpressionStatement(ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('ctx'), 'sendToClient'), undefined, [
|
|
41
|
+
ts.factory.createIdentifier('_pid'),
|
|
42
|
+
ts.factory.createStringLiteral(`${className}.${methodName}`),
|
|
43
|
+
...argNames.map(n => ts.factory.createIdentifier(n))
|
|
44
|
+
])))
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
export function transformSystemFile(source, target) {
|
|
48
|
+
const sourceFile = parseSource(source);
|
|
49
|
+
const transformer = (context) => (sf) => {
|
|
50
|
+
function visitClass(classNode) {
|
|
51
|
+
const className = classNode.name?.text ?? 'UnknownSystem';
|
|
52
|
+
const newMembers = classNode.members.map(member => {
|
|
53
|
+
if (!ts.isMethodDeclaration(member))
|
|
54
|
+
return member;
|
|
55
|
+
const methodName = member.name.text;
|
|
56
|
+
const decorators = ts.getDecorators(member) ?? [];
|
|
57
|
+
const role = decorators.map(getDecoratorName).find(n => n === 'Server' || n === 'Client' || n === 'Multicast');
|
|
58
|
+
if (!role)
|
|
59
|
+
return member;
|
|
60
|
+
let newStatements;
|
|
61
|
+
if (target === 'client' && role === 'Server') {
|
|
62
|
+
newStatements = makeClientStub(className, methodName, member.parameters);
|
|
63
|
+
}
|
|
64
|
+
else if (target === 'server' && role === 'Client') {
|
|
65
|
+
newStatements = makeSendToClientDispatch(className, methodName, member.parameters);
|
|
66
|
+
}
|
|
67
|
+
else if (target === 'server' && role === 'Multicast') {
|
|
68
|
+
newStatements = makeBroadcastDispatch(className, methodName, member.parameters);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return member;
|
|
72
|
+
}
|
|
73
|
+
return ts.factory.updateMethodDeclaration(member, member.modifiers, member.asteriskToken, member.name, member.questionToken, member.typeParameters, member.parameters, member.type, ts.factory.createBlock(newStatements, true));
|
|
74
|
+
});
|
|
75
|
+
return ts.factory.updateClassDeclaration(classNode, classNode.modifiers, classNode.name, classNode.typeParameters, classNode.heritageClauses, ts.factory.createNodeArray(newMembers));
|
|
76
|
+
}
|
|
77
|
+
function visit(node) {
|
|
78
|
+
if (ts.isClassDeclaration(node) && hasDecorator(node, 'System')) {
|
|
79
|
+
return visitClass(node);
|
|
80
|
+
}
|
|
81
|
+
return ts.visitEachChild(node, visit, context);
|
|
82
|
+
}
|
|
83
|
+
return ts.visitNode(sf, visit);
|
|
84
|
+
};
|
|
85
|
+
const result = ts.transform(sourceFile, [transformer]);
|
|
86
|
+
return printFile(result.transformed[0]);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/transforms/system.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@replicast/vite-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Vite plugin for replicast — transforms store, system, and lifecycle files per build target",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": ["dist"],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc -p tsconfig.build.json",
|
|
12
|
+
"test": "vitest run"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"typescript": "^5.5.0"
|
|
16
|
+
},
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"vite": "^5.0.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"vite": "^5.3.0",
|
|
22
|
+
"vitest": "^1.6.0"
|
|
23
|
+
}
|
|
24
|
+
}
|