next2d-development-mcp 0.0.1
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/README.md +344 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +211 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/prompts.test.d.ts +2 -0
- package/dist/prompts/prompts.test.d.ts.map +1 -0
- package/dist/prompts/prompts.test.js +23 -0
- package/dist/prompts/prompts.test.js.map +1 -0
- package/dist/references/develop-specs.md +1576 -0
- package/dist/references/framework-specs.md +1687 -0
- package/dist/references/player-specs.md +3292 -0
- package/dist/resources/index.d.ts +3 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +185 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/resources.test.d.ts +2 -0
- package/dist/resources/resources.test.d.ts.map +1 -0
- package/dist/resources/resources.test.js +32 -0
- package/dist/resources/resources.test.js.map +1 -0
- package/dist/templates/animation.d.ts +6 -0
- package/dist/templates/animation.d.ts.map +1 -0
- package/dist/templates/animation.js +65 -0
- package/dist/templates/animation.js.map +1 -0
- package/dist/templates/animation.test.d.ts +2 -0
- package/dist/templates/animation.test.d.ts.map +1 -0
- package/dist/templates/animation.test.js +30 -0
- package/dist/templates/animation.test.js.map +1 -0
- package/dist/templates/domainService.d.ts +9 -0
- package/dist/templates/domainService.d.ts.map +1 -0
- package/dist/templates/domainService.js +56 -0
- package/dist/templates/domainService.js.map +1 -0
- package/dist/templates/domainService.test.d.ts +2 -0
- package/dist/templates/domainService.test.d.ts.map +1 -0
- package/dist/templates/domainService.test.js +33 -0
- package/dist/templates/domainService.test.js.map +1 -0
- package/dist/templates/interfaceFile.d.ts +5 -0
- package/dist/templates/interfaceFile.d.ts.map +1 -0
- package/dist/templates/interfaceFile.js +16 -0
- package/dist/templates/interfaceFile.js.map +1 -0
- package/dist/templates/interfaceFile.test.d.ts +2 -0
- package/dist/templates/interfaceFile.test.d.ts.map +1 -0
- package/dist/templates/interfaceFile.test.js +30 -0
- package/dist/templates/interfaceFile.test.js.map +1 -0
- package/dist/templates/loading.d.ts +5 -0
- package/dist/templates/loading.d.ts.map +1 -0
- package/dist/templates/loading.js +62 -0
- package/dist/templates/loading.js.map +1 -0
- package/dist/templates/loading.test.d.ts +2 -0
- package/dist/templates/loading.test.d.ts.map +1 -0
- package/dist/templates/loading.test.js +31 -0
- package/dist/templates/loading.test.js.map +1 -0
- package/dist/templates/repository.d.ts +2 -0
- package/dist/templates/repository.d.ts.map +1 -0
- package/dist/templates/repository.js +42 -0
- package/dist/templates/repository.js.map +1 -0
- package/dist/templates/repository.test.d.ts +2 -0
- package/dist/templates/repository.test.d.ts.map +1 -0
- package/dist/templates/repository.test.js +44 -0
- package/dist/templates/repository.test.js.map +1 -0
- package/dist/templates/uiComponent.d.ts +4 -0
- package/dist/templates/uiComponent.d.ts.map +1 -0
- package/dist/templates/uiComponent.js +108 -0
- package/dist/templates/uiComponent.js.map +1 -0
- package/dist/templates/uiComponent.test.d.ts +2 -0
- package/dist/templates/uiComponent.test.d.ts.map +1 -0
- package/dist/templates/uiComponent.test.js +76 -0
- package/dist/templates/uiComponent.test.js.map +1 -0
- package/dist/templates/usecase.d.ts +2 -0
- package/dist/templates/usecase.d.ts.map +1 -0
- package/dist/templates/usecase.js +31 -0
- package/dist/templates/usecase.js.map +1 -0
- package/dist/templates/usecase.test.d.ts +2 -0
- package/dist/templates/usecase.test.d.ts.map +1 -0
- package/dist/templates/usecase.test.js +23 -0
- package/dist/templates/usecase.test.js.map +1 -0
- package/dist/templates/view.d.ts +3 -0
- package/dist/templates/view.d.ts.map +1 -0
- package/dist/templates/view.js +112 -0
- package/dist/templates/view.js.map +1 -0
- package/dist/templates/view.test.d.ts +2 -0
- package/dist/templates/view.test.d.ts.map +1 -0
- package/dist/templates/view.test.js +71 -0
- package/dist/templates/view.test.js.map +1 -0
- package/dist/tools/addRoute.d.ts +3 -0
- package/dist/tools/addRoute.d.ts.map +1 -0
- package/dist/tools/addRoute.js +101 -0
- package/dist/tools/addRoute.js.map +1 -0
- package/dist/tools/createAnimation.d.ts +3 -0
- package/dist/tools/createAnimation.d.ts.map +1 -0
- package/dist/tools/createAnimation.js +53 -0
- package/dist/tools/createAnimation.js.map +1 -0
- package/dist/tools/createDomainService.d.ts +3 -0
- package/dist/tools/createDomainService.d.ts.map +1 -0
- package/dist/tools/createDomainService.js +82 -0
- package/dist/tools/createDomainService.js.map +1 -0
- package/dist/tools/createInterface.d.ts +3 -0
- package/dist/tools/createInterface.d.ts.map +1 -0
- package/dist/tools/createInterface.js +59 -0
- package/dist/tools/createInterface.js.map +1 -0
- package/dist/tools/createLoading.d.ts +3 -0
- package/dist/tools/createLoading.d.ts.map +1 -0
- package/dist/tools/createLoading.js +52 -0
- package/dist/tools/createLoading.js.map +1 -0
- package/dist/tools/createRepository.d.ts +3 -0
- package/dist/tools/createRepository.d.ts.map +1 -0
- package/dist/tools/createRepository.js +55 -0
- package/dist/tools/createRepository.js.map +1 -0
- package/dist/tools/createUiComponent.d.ts +3 -0
- package/dist/tools/createUiComponent.d.ts.map +1 -0
- package/dist/tools/createUiComponent.js +80 -0
- package/dist/tools/createUiComponent.js.map +1 -0
- package/dist/tools/createUseCase.d.ts +3 -0
- package/dist/tools/createUseCase.d.ts.map +1 -0
- package/dist/tools/createUseCase.js +52 -0
- package/dist/tools/createUseCase.js.map +1 -0
- package/dist/tools/createView.d.ts +3 -0
- package/dist/tools/createView.d.ts.map +1 -0
- package/dist/tools/createView.js +59 -0
- package/dist/tools/createView.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +25 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tools.test.d.ts +2 -0
- package/dist/tools/tools.test.d.ts.map +1 -0
- package/dist/tools/tools.test.js +58 -0
- package/dist/tools/tools.test.js.map +1 -0
- package/dist/tools/validateArchitecture.d.ts +3 -0
- package/dist/tools/validateArchitecture.d.ts.map +1 -0
- package/dist/tools/validateArchitecture.js +134 -0
- package/dist/tools/validateArchitecture.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +34 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.test.d.ts","sourceRoot":"","sources":["../../src/templates/loading.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateLoading } from "./loading.js";
|
|
3
|
+
describe("generateLoading", () => {
|
|
4
|
+
it("generates Loading class with start and end methods", () => {
|
|
5
|
+
const code = generateLoading();
|
|
6
|
+
expect(code).toContain("export class Loading");
|
|
7
|
+
expect(code).toContain("start (): void");
|
|
8
|
+
expect(code).toContain("end (): void");
|
|
9
|
+
});
|
|
10
|
+
it("uses stage.addChild in start()", () => {
|
|
11
|
+
const code = generateLoading();
|
|
12
|
+
expect(code).toContain("stage.addChild(this._shape)");
|
|
13
|
+
});
|
|
14
|
+
it("uses shape.remove in end()", () => {
|
|
15
|
+
const code = generateLoading();
|
|
16
|
+
expect(code).toContain("this._shape.remove()");
|
|
17
|
+
});
|
|
18
|
+
it("imports Shape and stage from @next2d/display", () => {
|
|
19
|
+
const code = generateLoading();
|
|
20
|
+
expect(code).toContain('import { Shape, stage } from "@next2d/display"');
|
|
21
|
+
});
|
|
22
|
+
it("accepts custom class name", () => {
|
|
23
|
+
const code = generateLoading("CustomLoader");
|
|
24
|
+
expect(code).toContain("export class CustomLoader");
|
|
25
|
+
});
|
|
26
|
+
it("has constructor that initializes shape", () => {
|
|
27
|
+
const code = generateLoading();
|
|
28
|
+
expect(code).toContain("this._shape = new Shape()");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=loading.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.test.js","sourceRoot":"","sources":["../../src/templates/loading.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/templates/repository.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAc,GAAG,MAAM,CAuCnF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { toPascalCase } from "../utils.js";
|
|
2
|
+
export function generateRepository(name, methodName = "get") {
|
|
3
|
+
const pascal = toPascalCase(name);
|
|
4
|
+
return `import type { I${pascal}Response } from "@/interface/I${pascal}Response";
|
|
5
|
+
import { config } from "@/config/Config";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @class
|
|
9
|
+
*/
|
|
10
|
+
export class ${pascal}Repository {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @return {Promise<I${pascal}Response>}
|
|
14
|
+
* @method
|
|
15
|
+
* @static
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
static async ${methodName} (): Promise<I${pascal}Response>
|
|
19
|
+
{
|
|
20
|
+
try {
|
|
21
|
+
|
|
22
|
+
const response = await fetch(
|
|
23
|
+
\`\${config.api.endPoint}api/${name.toLowerCase()}.json\`
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(\`HTTP error! status: \${response.status}\`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return await response.json() as I${pascal}Response;
|
|
31
|
+
|
|
32
|
+
} catch (error) {
|
|
33
|
+
|
|
34
|
+
console.error("Failed to fetch:", error);
|
|
35
|
+
throw error;
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/templates/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,aAAqB,KAAK;IACvE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,kBAAkB,MAAM,iCAAiC,MAAM;;;;;;eAM3D,MAAM;;;2BAGM,MAAM;;;;;mBAKd,UAAU,iBAAiB,MAAM;;;;;+CAKL,IAAI,CAAC,WAAW,EAAE;;;;;;;+CAOlB,MAAM;;;;;;;;;;CAUpD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.test.d.ts","sourceRoot":"","sources":["../../src/templates/repository.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateRepository } from "./repository.js";
|
|
3
|
+
describe("generateRepository", () => {
|
|
4
|
+
it("generates Repository class with correct name", () => {
|
|
5
|
+
const code = generateRepository("HomeText");
|
|
6
|
+
expect(code).toContain("export class HomeTextRepository");
|
|
7
|
+
});
|
|
8
|
+
it("uses default method name 'get'", () => {
|
|
9
|
+
const code = generateRepository("HomeText");
|
|
10
|
+
expect(code).toContain("static async get ()");
|
|
11
|
+
});
|
|
12
|
+
it("uses custom method name", () => {
|
|
13
|
+
const code = generateRepository("HomeText", "fetchAll");
|
|
14
|
+
expect(code).toContain("static async fetchAll ()");
|
|
15
|
+
});
|
|
16
|
+
it("includes try-catch block", () => {
|
|
17
|
+
const code = generateRepository("HomeText");
|
|
18
|
+
expect(code).toContain("try {");
|
|
19
|
+
expect(code).toContain("} catch (error)");
|
|
20
|
+
});
|
|
21
|
+
it("uses config for endpoint", () => {
|
|
22
|
+
const code = generateRepository("HomeText");
|
|
23
|
+
expect(code).toContain("config.api.endPoint");
|
|
24
|
+
});
|
|
25
|
+
it("imports config", () => {
|
|
26
|
+
const code = generateRepository("HomeText");
|
|
27
|
+
expect(code).toContain('import { config } from "@/config/Config"');
|
|
28
|
+
});
|
|
29
|
+
it("returns typed interface instead of unknown", () => {
|
|
30
|
+
const code = generateRepository("HomeText");
|
|
31
|
+
expect(code).toContain("Promise<IHomeTextResponse>");
|
|
32
|
+
expect(code).toContain('import type { IHomeTextResponse }');
|
|
33
|
+
expect(code).not.toContain("Promise<unknown>");
|
|
34
|
+
});
|
|
35
|
+
it("uses .json extension in API path for mock compatibility", () => {
|
|
36
|
+
const code = generateRepository("HomeText");
|
|
37
|
+
expect(code).toContain("api/hometext.json");
|
|
38
|
+
});
|
|
39
|
+
it("casts response to typed interface", () => {
|
|
40
|
+
const code = generateRepository("HomeText");
|
|
41
|
+
expect(code).toContain("as IHomeTextResponse");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=repository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.test.js","sourceRoot":"","sources":["../../src/templates/repository.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACtB,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type AtomicLevel = "atom" | "molecule" | "organism" | "page";
|
|
2
|
+
export declare function generateUiComponent(name: string, level: AtomicLevel, parentClass?: string, screen?: string): string;
|
|
3
|
+
export declare function generateContent(name: string): string;
|
|
4
|
+
//# sourceMappingURL=uiComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiComponent.d.ts","sourceRoot":"","sources":["../../src/templates/uiComponent.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEpE,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,WAAW,GAAE,MAAiB,EAC9B,MAAM,GAAE,MAAW,GACpB,MAAM,CAkFR;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBpD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { toPascalCase } from "../utils.js";
|
|
2
|
+
export function generateUiComponent(name, level, parentClass = "Sprite", screen = "") {
|
|
3
|
+
const pascal = toPascalCase(name);
|
|
4
|
+
const suffix = level.charAt(0).toUpperCase() + level.slice(1);
|
|
5
|
+
const importDisplay = parentClass === "Sprite"
|
|
6
|
+
? "import { Sprite } from \"@next2d/display\";"
|
|
7
|
+
: parentClass === "MovieClip"
|
|
8
|
+
? "import { MovieClip } from \"@next2d/display\";"
|
|
9
|
+
: parentClass === "Shape"
|
|
10
|
+
? "import { Shape } from \"@next2d/display\";"
|
|
11
|
+
: parentClass === "TextField"
|
|
12
|
+
? "import { TextField } from \"@next2d/text\";"
|
|
13
|
+
: `// TODO: Adjust import path for ${parentClass}\nimport { ${parentClass} } from "@next2d/display";`;
|
|
14
|
+
// Page components receive typed ViewModel and use config for positioning
|
|
15
|
+
if (level === "page") {
|
|
16
|
+
const screenDir = screen || name.toLowerCase();
|
|
17
|
+
return `import type { ${pascal}ViewModel } from "@/view/${screenDir}/${pascal}ViewModel";
|
|
18
|
+
import { config } from "@/config/Config";
|
|
19
|
+
${importDisplay}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @description ${pascal}画面のページ
|
|
23
|
+
* ${pascal} Screen Page
|
|
24
|
+
*
|
|
25
|
+
* @class
|
|
26
|
+
* @extends {${parentClass}}
|
|
27
|
+
*/
|
|
28
|
+
export class ${pascal}Page extends ${parentClass} {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @description 初期起動関数
|
|
32
|
+
* Initializer function
|
|
33
|
+
*
|
|
34
|
+
* @param {${pascal}ViewModel} vm
|
|
35
|
+
* @return {void}
|
|
36
|
+
* @method
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
initialize (vm: ${pascal}ViewModel): void
|
|
40
|
+
{
|
|
41
|
+
// TODO: Create child components and set positions using config.stage.width/height
|
|
42
|
+
// TODO: Bind events to ViewModel methods via arrow functions:
|
|
43
|
+
// component.addEventListener(PointerEvent.POINTER_UP, async (): Promise<void> => {
|
|
44
|
+
// await vm.onClickSomething();
|
|
45
|
+
// });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @description ページ表示時の処理
|
|
50
|
+
* Processing when the page is displayed
|
|
51
|
+
*
|
|
52
|
+
* @return {Promise<void>}
|
|
53
|
+
* @method
|
|
54
|
+
* @public
|
|
55
|
+
*/
|
|
56
|
+
async onEnter (): Promise<void>
|
|
57
|
+
{
|
|
58
|
+
// TODO: Start entry animations
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
return `${importDisplay}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @class
|
|
67
|
+
* @extends {${parentClass}}
|
|
68
|
+
*/
|
|
69
|
+
export class ${pascal}${suffix} extends ${parentClass} {
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @constructor
|
|
73
|
+
* @public
|
|
74
|
+
*/
|
|
75
|
+
constructor ()
|
|
76
|
+
{
|
|
77
|
+
super();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
export function generateContent(name) {
|
|
83
|
+
const pascal = toPascalCase(name);
|
|
84
|
+
return `import { MovieClipContent } from "@next2d/framework";
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @see file/sample.n2d
|
|
88
|
+
*
|
|
89
|
+
* @class
|
|
90
|
+
* @extends {MovieClipContent}
|
|
91
|
+
*/
|
|
92
|
+
export class ${pascal}Content extends MovieClipContent {
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @description Animation Toolのシンボル名を返す
|
|
96
|
+
* Returns the Animation Tool symbol name
|
|
97
|
+
*
|
|
98
|
+
* @return {string}
|
|
99
|
+
* @readonly
|
|
100
|
+
*/
|
|
101
|
+
get namespace (): string
|
|
102
|
+
{
|
|
103
|
+
return "${pascal}Content";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=uiComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiComponent.js","sourceRoot":"","sources":["../../src/templates/uiComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,UAAU,mBAAmB,CAC/B,IAAY,EACZ,KAAkB,EAClB,cAAsB,QAAQ,EAC9B,SAAiB,EAAE;IAEnB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9D,MAAM,aAAa,GAAG,WAAW,KAAK,QAAQ;QAC1C,CAAC,CAAC,6CAA6C;QAC/C,CAAC,CAAC,WAAW,KAAK,WAAW;YACzB,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,WAAW,KAAK,OAAO;gBACrB,CAAC,CAAC,4CAA4C;gBAC9C,CAAC,CAAC,WAAW,KAAK,WAAW;oBACzB,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,mCAAmC,WAAW,cAAc,WAAW,4BAA4B,CAAC;IAEtH,yEAAyE;IACzE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,iBAAiB,MAAM,4BAA4B,SAAS,IAAI,MAAM;;EAEnF,aAAa;;;kBAGG,MAAM;kBACN,MAAM;;;eAGT,WAAW;;eAEX,MAAM,gBAAgB,WAAW;;;;;;kBAM9B,MAAM;;;;;sBAKF,MAAM;;;;;;;;;;;;;;;;;;;;;;CAsB3B,CAAC;IACE,CAAC;IAED,OAAO,GAAG,aAAa;;;;eAIZ,WAAW;;eAEX,MAAM,GAAG,MAAM,YAAY,WAAW;;;;;;;;;;;CAWpD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;;;;;;;;eAQI,MAAM;;;;;;;;;;;kBAWH,MAAM;;;CAGvB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiComponent.test.d.ts","sourceRoot":"","sources":["../../src/templates/uiComponent.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateUiComponent, generateContent } from "./uiComponent.js";
|
|
3
|
+
describe("generateUiComponent", () => {
|
|
4
|
+
it("generates Atom component", () => {
|
|
5
|
+
const code = generateUiComponent("Button", "atom");
|
|
6
|
+
expect(code).toContain("export class ButtonAtom extends Sprite");
|
|
7
|
+
});
|
|
8
|
+
it("generates Molecule component", () => {
|
|
9
|
+
const code = generateUiComponent("SearchBar", "molecule");
|
|
10
|
+
expect(code).toContain("export class SearchBarMolecule extends Sprite");
|
|
11
|
+
});
|
|
12
|
+
it("generates Organism component", () => {
|
|
13
|
+
const code = generateUiComponent("Header", "organism");
|
|
14
|
+
expect(code).toContain("export class HeaderOrganism extends Sprite");
|
|
15
|
+
});
|
|
16
|
+
it("generates Page component with typed ViewModel", () => {
|
|
17
|
+
const code = generateUiComponent("Home", "page");
|
|
18
|
+
expect(code).toContain("export class HomePage extends Sprite");
|
|
19
|
+
expect(code).toContain("import type { HomeViewModel }");
|
|
20
|
+
expect(code).toContain("initialize (vm: HomeViewModel): void");
|
|
21
|
+
expect(code).toContain('import { config } from "@/config/Config"');
|
|
22
|
+
});
|
|
23
|
+
it("page component has no any type", () => {
|
|
24
|
+
const code = generateUiComponent("Home", "page");
|
|
25
|
+
expect(code).not.toContain("any");
|
|
26
|
+
});
|
|
27
|
+
it("page component has onEnter method", () => {
|
|
28
|
+
const code = generateUiComponent("Home", "page");
|
|
29
|
+
expect(code).toContain("async onEnter ()");
|
|
30
|
+
});
|
|
31
|
+
it("page component has event binding hint with arrow function", () => {
|
|
32
|
+
const code = generateUiComponent("Home", "page");
|
|
33
|
+
expect(code).toContain("PointerEvent.POINTER_UP");
|
|
34
|
+
});
|
|
35
|
+
it("uses MovieClip as parent class", () => {
|
|
36
|
+
const code = generateUiComponent("AnimButton", "atom", "MovieClip");
|
|
37
|
+
expect(code).toContain("export class AnimButtonAtom extends MovieClip");
|
|
38
|
+
expect(code).toContain('import { MovieClip } from "@next2d/display"');
|
|
39
|
+
});
|
|
40
|
+
it("uses TextField from @next2d/text (not @next2d/display)", () => {
|
|
41
|
+
const code = generateUiComponent("Label", "atom", "TextField");
|
|
42
|
+
expect(code).toContain("export class LabelAtom extends TextField");
|
|
43
|
+
expect(code).toContain('import { TextField } from "@next2d/text"');
|
|
44
|
+
expect(code).not.toContain("@next2d/display");
|
|
45
|
+
});
|
|
46
|
+
it("adds TODO for unknown parent classes", () => {
|
|
47
|
+
const code = generateUiComponent("Custom", "atom", "ButtonAtom");
|
|
48
|
+
expect(code).toContain("TODO: Adjust import path for ButtonAtom");
|
|
49
|
+
});
|
|
50
|
+
it("atom/molecule/organism have no initialize with any type", () => {
|
|
51
|
+
const code = generateUiComponent("Button", "atom");
|
|
52
|
+
expect(code).not.toContain("any");
|
|
53
|
+
});
|
|
54
|
+
it("imports Sprite by default", () => {
|
|
55
|
+
const code = generateUiComponent("Button", "atom");
|
|
56
|
+
expect(code).toContain('import { Sprite } from "@next2d/display"');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("generateContent", () => {
|
|
60
|
+
it("generates Content class", () => {
|
|
61
|
+
const code = generateContent("HomeAnim");
|
|
62
|
+
expect(code).toContain("export class HomeAnimContent extends MovieClipContent");
|
|
63
|
+
});
|
|
64
|
+
it("uses getter for namespace (not constructor assignment)", () => {
|
|
65
|
+
const code = generateContent("HomeAnim");
|
|
66
|
+
expect(code).toContain('get namespace (): string');
|
|
67
|
+
expect(code).toContain('return "HomeAnimContent"');
|
|
68
|
+
// Must NOT use constructor assignment
|
|
69
|
+
expect(code).not.toContain("this.namespace =");
|
|
70
|
+
});
|
|
71
|
+
it("imports MovieClipContent from framework", () => {
|
|
72
|
+
const code = generateContent("HomeAnim");
|
|
73
|
+
expect(code).toContain('import { MovieClipContent } from "@next2d/framework"');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=uiComponent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiComponent.test.js","sourceRoot":"","sources":["../../src/templates/uiComponent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.d.ts","sourceRoot":"","sources":["../../src/templates/usecase.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BzE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { toPascalCase } from "../utils.js";
|
|
2
|
+
export function generateUseCase(name, _screenName) {
|
|
3
|
+
const pascal = toPascalCase(name);
|
|
4
|
+
const className = pascal.endsWith("UseCase") ? pascal : `${pascal}UseCase`;
|
|
5
|
+
return `/**
|
|
6
|
+
* @class
|
|
7
|
+
*/
|
|
8
|
+
export class ${className} {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @constructor
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
constructor ()
|
|
15
|
+
{
|
|
16
|
+
// TODO: Inject dependencies
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @return {void}
|
|
21
|
+
* @method
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
execute (): void
|
|
25
|
+
{
|
|
26
|
+
// TODO: Implement business logic
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=usecase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.js","sourceRoot":"","sources":["../../src/templates/usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,WAAmB;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,SAAS,CAAC;IAC3E,OAAO;;;eAGI,SAAS;;;;;;;;;;;;;;;;;;;;;CAqBvB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.test.d.ts","sourceRoot":"","sources":["../../src/templates/usecase.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateUseCase } from "./usecase.js";
|
|
3
|
+
describe("generateUseCase", () => {
|
|
4
|
+
it("generates UseCase class with correct name", () => {
|
|
5
|
+
const code = generateUseCase("StartDrag", "home");
|
|
6
|
+
expect(code).toContain("export class StartDragUseCase");
|
|
7
|
+
});
|
|
8
|
+
it("includes execute method", () => {
|
|
9
|
+
const code = generateUseCase("StartDrag", "home");
|
|
10
|
+
expect(code).toContain("execute (): void");
|
|
11
|
+
});
|
|
12
|
+
it("includes constructor", () => {
|
|
13
|
+
const code = generateUseCase("StartDrag", "home");
|
|
14
|
+
expect(code).toContain("constructor ()");
|
|
15
|
+
});
|
|
16
|
+
it("handles name already ending with UseCase", () => {
|
|
17
|
+
const code = generateUseCase("StartDragUseCase", "home");
|
|
18
|
+
expect(code).toContain("export class StartDragUseCase");
|
|
19
|
+
// Should NOT produce "StartDragUseCaseUseCase"
|
|
20
|
+
expect(code).not.toContain("UseCaseUseCase");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=usecase.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.test.js","sourceRoot":"","sources":["../../src/templates/usecase.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,eAAe,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACxD,+CAA+C;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/templates/view.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoEjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwCtD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { toPascalCase, toCamelCase } from "../utils.js";
|
|
2
|
+
export function generateView(name) {
|
|
3
|
+
const pascal = toPascalCase(name);
|
|
4
|
+
const camel = toCamelCase(name);
|
|
5
|
+
// Screen directory is the first segment for slash-separated routes (e.g. "quest/list" → "quest")
|
|
6
|
+
const screenDir = name.includes("/") ? name.split("/")[0].toLowerCase() : name.toLowerCase();
|
|
7
|
+
return `import type { ${pascal}ViewModel } from "./${pascal}ViewModel";
|
|
8
|
+
import { View } from "@next2d/framework";
|
|
9
|
+
import { ${pascal}Page } from "@/ui/component/page/${screenDir}/${pascal}Page";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @class
|
|
13
|
+
* @extends {View}
|
|
14
|
+
*/
|
|
15
|
+
export class ${pascal}View extends View<${pascal}ViewModel> {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @private
|
|
19
|
+
* @readonly
|
|
20
|
+
*/
|
|
21
|
+
private readonly _${camel}Page: ${pascal}Page;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {${pascal}ViewModel} vm
|
|
25
|
+
* @constructor
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
constructor (vm: ${pascal}ViewModel)
|
|
29
|
+
{
|
|
30
|
+
super(vm);
|
|
31
|
+
|
|
32
|
+
this._${camel}Page = new ${pascal}Page();
|
|
33
|
+
this.addChild(this._${camel}Page);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @return {Promise<void>}
|
|
38
|
+
* @method
|
|
39
|
+
* @override
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
async initialize (): Promise<void>
|
|
43
|
+
{
|
|
44
|
+
this._${camel}Page.initialize(this.vm);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @return {Promise<void>}
|
|
49
|
+
* @method
|
|
50
|
+
* @override
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
async onEnter (): Promise<void>
|
|
54
|
+
{
|
|
55
|
+
await this._${camel}Page.onEnter();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @return {Promise<void>}
|
|
60
|
+
* @method
|
|
61
|
+
* @override
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
async onExit (): Promise<void>
|
|
65
|
+
{
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
export function generateViewModel(name) {
|
|
72
|
+
const pascal = toPascalCase(name);
|
|
73
|
+
return `import { ViewModel, app } from "@next2d/framework";
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @class
|
|
77
|
+
* @extends {ViewModel}
|
|
78
|
+
*/
|
|
79
|
+
export class ${pascal}ViewModel extends ViewModel {
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @constructor
|
|
83
|
+
* @public
|
|
84
|
+
*/
|
|
85
|
+
constructor ()
|
|
86
|
+
{
|
|
87
|
+
super();
|
|
88
|
+
// TODO: Initialize UseCases
|
|
89
|
+
// this.yourUseCase = new YourUseCase();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @description ViewModelの初期化 (Viewのinitialize()より前に呼ばれる)
|
|
94
|
+
* Initialize ViewModel (called before View's initialize())
|
|
95
|
+
*
|
|
96
|
+
* @return {Promise<void>}
|
|
97
|
+
* @method
|
|
98
|
+
* @override
|
|
99
|
+
* @public
|
|
100
|
+
*/
|
|
101
|
+
async initialize (): Promise<void>
|
|
102
|
+
{
|
|
103
|
+
// routing.json の requests で取得したデータを受け取る
|
|
104
|
+
// const response = app.getResponse();
|
|
105
|
+
// if (response.has("YourData")) {
|
|
106
|
+
// this.data = response.get("YourData") as IYourResponse;
|
|
107
|
+
// }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/templates/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,iGAAiG;IACjG,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7F,OAAO,iBAAiB,MAAM,uBAAuB,MAAM;;WAEpD,MAAM,oCAAoC,SAAS,IAAI,MAAM;;;;;;eAMzD,MAAM,qBAAqB,MAAM;;;;;;wBAMxB,KAAK,SAAS,MAAM;;;iBAG3B,MAAM;;;;uBAIA,MAAM;;;;gBAIb,KAAK,cAAc,MAAM;8BACX,KAAK;;;;;;;;;;;gBAWnB,KAAK;;;;;;;;;;;sBAWC,KAAK;;;;;;;;;;;;;;CAc1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;;;;;;eAMI,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BpB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.test.d.ts","sourceRoot":"","sources":["../../src/templates/view.test.ts"],"names":[],"mappings":""}
|