Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit021a2b3

Browse files
committed
make ts config & typings available
1 parent621561c commit021a2b3

File tree

80 files changed

+12431
-52
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+12431
-52
lines changed

‎.npmignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
src
2+
tsconfig.json
3+
tsd.json
4+
tslint.json

‎lib/_base.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
varstore_1=require("./store/store");exports.store=store_1.store,exports.initialState=store_1.initialState,exports.dispatch=store_1.dispatch;varreducer_1=require("./reducers/reducer");exports.reducer=reducer_1["default"];
1+
"use strict";
2+
varstore_1=require('./store/store');
3+
exports.store=store_1.store;
4+
exports.initialState=store_1.initialState;
5+
exports.dispatch=store_1.dispatch;
6+
varreducer_1=require('./reducers/reducer');
7+
exports.reducer=reducer_1.default;

‎lib/actions/actionTypes.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,23 @@
1-
exports.SET_PROJECT="SET_PROJECT",exports.LOAD_TUTORIALS="LOAD_TUTORIALS",exports.SET_ROUTE="SET_ROUTE",exports.SET_PAGE="SET_PAGE",exports.NEXT_PAGE="NEXT_PAGE",exports.SET_POSITION="SET_POSITION",exports.SET_PROGRESS="SET_PROGRESS",exports.PAGE_COMPLETE="PAGE_COMPLETE",exports.CHAPTER_COMPLETE="CHAPTER_COMPLETE",exports.PROJECT_COMPLETE="PROJECT_COMPLETE",exports.SET_TASK_POSITION="SET_TASK_POSITION",exports.EDITOR_ACTIONS="EDITOR_ACTIONS",exports.SHOW_HINT="SHOW_HINT",exports.SHOW_SOLUTION="SHOW_SOLUTION",exports.RUN_TESTS="RUN_TESTS",exports.TEST_COMPLETE="TEST_COMPLETE",exports.TEST_RESULT="TEST_RESULT",exports.TOGGLE_LOG="CHECK_LOG",exports.LOG_MESSAGE="LOG_MESSAGE",exports.TOGGLE_ALERT="TOGGLE_ALERT",exports.REPLAY_ALERT="SHOW_ALERT",exports.NULL="NULL";
1+
"use strict";
2+
exports.SET_PROJECT='SET_PROJECT';
3+
exports.LOAD_TUTORIALS='LOAD_TUTORIALS';
4+
exports.SET_ROUTE='SET_ROUTE';
5+
exports.SET_PAGE='SET_PAGE';
6+
exports.NEXT_PAGE='NEXT_PAGE';
7+
exports.SET_POSITION='SET_POSITION';
8+
exports.SET_PROGRESS='SET_PROGRESS';
9+
exports.PAGE_COMPLETE='PAGE_COMPLETE';
10+
exports.CHAPTER_COMPLETE='CHAPTER_COMPLETE';
11+
exports.PROJECT_COMPLETE='PROJECT_COMPLETE';
12+
exports.SET_TASK_POSITION='SET_TASK_POSITION';
13+
exports.EDITOR_ACTIONS='EDITOR_ACTIONS';
14+
exports.SHOW_HINT='SHOW_HINT';
15+
exports.SHOW_SOLUTION='SHOW_SOLUTION';
16+
exports.RUN_TESTS='RUN_TESTS';
17+
exports.TEST_COMPLETE='TEST_COMPLETE';
18+
exports.TEST_RESULT='TEST_RESULT';
19+
exports.TOGGLE_LOG='CHECK_LOG';
20+
exports.LOG_MESSAGE='LOG_MESSAGE';
21+
exports.TOGGLE_ALERT='TOGGLE_ALERT';
22+
exports.REPLAY_ALERT='SHOW_ALERT';
23+
exports.NULL='NULL';

‎lib/actions/actions.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,54 @@
1-
"use strict";functionsetProject(){return{type:Type.SET_PROJECT}}functionsetProgress(){return{type:Type.SET_PROGRESS}}functionsetRoute(e){return{type:Type.SET_ROUTE,payload:{route:e}}}functionsetPosition(e){return{type:Type.SET_POSITION,payload:{position:e}}}functionloadTutorial(e){package_1["default"].selectPackage(e),_base_1.store.dispatch(setProject()),_base_1.store.dispatch(setPosition({chapter:0,page:0})),_base_1.store.dispatch(setProgress())}functiontoggleLog(){vare=!_base_1.store.getState().log.open;return{type:Type.TOGGLE_LOG,payload:{open:e}}}functionlogMessage(e){return{type:Type.LOG_MESSAGE,payload:{message:e}}}varType=require("./actionTypes"),_base_1=require("../_base"),package_1=require("../services/package");exports.setProject=setProject,exports.setProgress=setProgress,exports.setRoute=setRoute,exports.setPosition=setPosition,exports.loadTutorial=loadTutorial,exports.toggleLog=toggleLog,exports.logMessage=logMessage;varpage_actions_1=require("./page-actions");exports.setPage=page_actions_1.setPage,exports.nextPage=page_actions_1.nextPage;varprogress_actions_1=require("./progress-actions");exports.pageComplete=progress_actions_1.pageComplete,exports.chapterComplete=progress_actions_1.chapterComplete,exports.projectComplete=progress_actions_1.projectComplete;vartask_actions_1=require("./task-actions");exports.setTaskPosition=task_actions_1.setTaskPosition,exports.showHint=task_actions_1.showHint,exports.runTests=task_actions_1.runTests,exports.testComplete=task_actions_1.testComplete,exports.testResult=task_actions_1.testResult;vartutorials_1=require("./tutorials");exports.loadTutorials=tutorials_1.loadTutorials;varalert_1=require("./alert");exports.toggleAlert=alert_1.toggleAlert,exports.replayAlert=alert_1.replayAlert;
1+
'use strict';
2+
varType=require('./actionTypes');
3+
var_base_1=require('../_base');
4+
varpackage_1=require('../services/package');
5+
functionsetProject(){
6+
return{type:Type.SET_PROJECT};
7+
}
8+
exports.setProject=setProject;
9+
functionsetProgress(){
10+
return{type:Type.SET_PROGRESS};
11+
}
12+
exports.setProgress=setProgress;
13+
functionsetRoute(route){
14+
return{type:Type.SET_ROUTE,payload:{route:route}};
15+
}
16+
exports.setRoute=setRoute;
17+
functionsetPosition(position){
18+
return{type:Type.SET_POSITION,payload:{position:position}};
19+
}
20+
exports.setPosition=setPosition;
21+
functionloadTutorial(name){
22+
package_1.default.selectPackage(name);
23+
_base_1.store.dispatch(setProject());
24+
_base_1.store.dispatch(setPosition({chapter:0,page:0}));
25+
_base_1.store.dispatch(setProgress());
26+
}
27+
exports.loadTutorial=loadTutorial;
28+
functiontoggleLog(){
29+
varopen=!_base_1.store.getState().log.open;
30+
return{type:Type.TOGGLE_LOG,payload:{open:open}};
31+
}
32+
exports.toggleLog=toggleLog;
33+
functionlogMessage(message){
34+
return{type:Type.LOG_MESSAGE,payload:{message:message}};
35+
}
36+
exports.logMessage=logMessage;
37+
varpage_actions_1=require('./page-actions');
38+
exports.setPage=page_actions_1.setPage;
39+
exports.nextPage=page_actions_1.nextPage;
40+
varprogress_actions_1=require('./progress-actions');
41+
exports.pageComplete=progress_actions_1.pageComplete;
42+
exports.chapterComplete=progress_actions_1.chapterComplete;
43+
exports.projectComplete=progress_actions_1.projectComplete;
44+
vartask_actions_1=require('./task-actions');
45+
exports.setTaskPosition=task_actions_1.setTaskPosition;
46+
exports.showHint=task_actions_1.showHint;
47+
exports.runTests=task_actions_1.runTests;
48+
exports.testComplete=task_actions_1.testComplete;
49+
exports.testResult=task_actions_1.testResult;
50+
vartutorials_1=require('./tutorials');
51+
exports.loadTutorials=tutorials_1.loadTutorials;
52+
varalert_1=require('./alert');
53+
exports.toggleAlert=alert_1.toggleAlert;
54+
exports.replayAlert=alert_1.replayAlert;

‎lib/actions/alert.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,19 @@
1-
functiontoggleAlert(e){varr=_base_1.store.getState().alert.open;returne=e?_.assign(e,{open:!r}):{message:"",action:"",open:!1},{type:Type.TOGGLE_ALERT,payload:{alert:e}}}functionreplayAlert(){return{type:Type.REPLAY_ALERT}}var_base_1=require("../_base"),Type=require("./actionTypes"),_=require("lodash");exports.toggleAlert=toggleAlert,exports.replayAlert=replayAlert;
1+
"use strict";
2+
var_base_1=require('../_base');
3+
varType=require('./actionTypes');
4+
var_=require('lodash');
5+
functiontoggleAlert(alert){
6+
varisOpen=_base_1.store.getState().alert.open;
7+
if(!alert){
8+
alert={message:'',action:'',open:false};
9+
}
10+
else{
11+
alert=_.assign(alert,{open:!isOpen});
12+
}
13+
return{type:Type.TOGGLE_ALERT,payload:{alert:alert}};
14+
}
15+
exports.toggleAlert=toggleAlert;
16+
functionreplayAlert(){
17+
return{type:Type.REPLAY_ALERT};
18+
}
19+
exports.replayAlert=replayAlert;

‎lib/actions/page-actions.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1-
functionsetPage(e){void0===e&&(e={chapter:0,page:0});vara=package_1["default"].getPage(e),t=package_1["default"].getTasks(e),s=_.flatten(t.map(function(e){returne.tests||[]})),r=t.map(function(e){returne.actions||[]});return{type:Type.SET_PAGE,payload:{page:a,tasks:t,position:e,taskTests:s,actions:r}}}functionnextPage(){vare=_base_1.store.getState().position,a=package_1["default"].getNextPosition(e);returnsetPage(a)}varType=require("./actionTypes"),_base_1=require("../_base"),package_1=require("../services/package"),_=require("lodash");exports.setPage=setPage,exports.nextPage=nextPage;
1+
"use strict";
2+
varType=require('./actionTypes');
3+
var_base_1=require('../_base');
4+
varpackage_1=require('../services/package');
5+
var_=require('lodash');
6+
functionsetPage(selectedPosition){
7+
if(selectedPosition===void0){selectedPosition={chapter:0,page:0};}
8+
varpage=package_1.default.getPage(selectedPosition);
9+
vartasks=package_1.default.getTasks(selectedPosition);
10+
vartaskTests=_.flatten(tasks.map(function(task){returntask.tests||[];}));
11+
varactions=tasks.map(function(task){returntask.actions||[];});
12+
return{type:Type.SET_PAGE,payload:{page:page,tasks:tasks,position:selectedPosition,taskTests:taskTests,actions:actions}};
13+
}
14+
exports.setPage=setPage;
15+
functionnextPage(){
16+
varposition=_base_1.store.getState().position;
17+
varnextPosition=package_1.default.getNextPosition(position);
18+
returnsetPage(nextPosition);
19+
}
20+
exports.nextPage=nextPage;

‎lib/actions/progress-actions.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,29 @@
1-
functionpageComplete(){vare=_base_1.store.getState().position,t=_base_1.store.getState().progress.chapters[e.chapter].pages.length,p={type:Type.PAGE_COMPLETE,payload:{position:e}};returne.page>=t-1?(_base_1.store.dispatch(chapterComplete()),p):p}functionchapterComplete(){vare=_base_1.store.getState().position.chapter,t=_base_1.store.getState().progress.chapters.length,p={type:Type.CHAPTER_COMPLETE,payload:{chapter:e}};returne>=t-1?(_base_1.store.dispatch(projectComplete()),p):p}functionprojectComplete(){return{type:Type.PROJECT_COMPLETE}}varType=require("./actionTypes"),_base_1=require("../_base");exports.pageComplete=pageComplete,exports.chapterComplete=chapterComplete,exports.projectComplete=projectComplete;
1+
"use strict";
2+
varType=require('./actionTypes');
3+
var_base_1=require('../_base');
4+
functionpageComplete(){
5+
varposition=_base_1.store.getState().position;
6+
varpageLength=_base_1.store.getState().progress.chapters[position.chapter].pages.length;
7+
varaction={type:Type.PAGE_COMPLETE,payload:{position:position}};
8+
if(position.page>=pageLength-1){
9+
_base_1.store.dispatch(chapterComplete());
10+
returnaction;
11+
}
12+
returnaction;
13+
}
14+
exports.pageComplete=pageComplete;
15+
functionchapterComplete(){
16+
varchapter=_base_1.store.getState().position.chapter;
17+
varchapterLength=_base_1.store.getState().progress.chapters.length;
18+
varaction={type:Type.CHAPTER_COMPLETE,payload:{chapter:chapter}};
19+
if(chapter>=chapterLength-1){
20+
_base_1.store.dispatch(projectComplete());
21+
returnaction;
22+
}
23+
returnaction;
24+
}
25+
exports.chapterComplete=chapterComplete;
26+
functionprojectComplete(){
27+
return{type:Type.PROJECT_COMPLETE};
28+
}
29+
exports.projectComplete=projectComplete;

‎lib/actions/task-actions.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,36 @@
1-
functioncheckPageComplete(t){vare=_base_1.store.getState().taskTests.length;t>e&&_base_1.store.dispatch(Action.pageComplete())}functionsetTaskPosition(t){vare=_base_1.store.getState().taskPosition;returne===t?{type:Type.NULL}:(checkPageComplete(t),{type:Type.SET_TASK_POSITION,payload:{taskPosition:t}})}functionshowHint(){return{type:Type.SHOW_HINT}}functionrunTests(){return{type:Type.RUN_TESTS}}functiontestResult(t){vare=_base_1.store.getState().editorActions;return{type:Type.TEST_RESULT,payload:{result:t,actions:e}}}functiontestComplete(){return{type:Type.TEST_COMPLETE}}varType=require("./actionTypes"),Action=require("./actions"),_base_1=require("../_base");exports.setTaskPosition=setTaskPosition,exports.showHint=showHint,exports.runTests=runTests,exports.testResult=testResult,exports.testComplete=testComplete;
1+
"use strict";
2+
varType=require('./actionTypes');
3+
varAction=require('./actions');
4+
var_base_1=require('../_base');
5+
functioncheckPageComplete(taskPosition){
6+
vartaskLength=_base_1.store.getState().taskTests.length;
7+
if(taskPosition>taskLength){
8+
_base_1.store.dispatch(Action.pageComplete());
9+
}
10+
}
11+
functionsetTaskPosition(taskPosition){
12+
varcurrentTaskPosition=_base_1.store.getState().taskPosition;
13+
if(currentTaskPosition===taskPosition){
14+
return{type:Type.NULL};
15+
}
16+
checkPageComplete(taskPosition);
17+
return{type:Type.SET_TASK_POSITION,payload:{taskPosition:taskPosition}};
18+
}
19+
exports.setTaskPosition=setTaskPosition;
20+
functionshowHint(){
21+
return{type:Type.SHOW_HINT};
22+
}
23+
exports.showHint=showHint;
24+
functionrunTests(){
25+
return{type:Type.RUN_TESTS};
26+
}
27+
exports.runTests=runTests;
28+
functiontestResult(result){
29+
varactions=_base_1.store.getState().editorActions;
30+
return{type:Type.TEST_RESULT,payload:{result:result,actions:actions}};
31+
}
32+
exports.testResult=testResult;
33+
functiontestComplete(){
34+
return{type:Type.TEST_COMPLETE};
35+
}
36+
exports.testComplete=testComplete;

‎lib/actions/tutorials.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,54 @@
1-
functionloadTutorials(){vare=[];if(global.coderoad.dir){vara=loadRootPackageJson();if(a)e=[].concat(searchForTutorials(a.dependencies)).concat(searchForTutorials(a.devDependencies));else{global.coderoad["package"]=null;varo='No package.json file available. Try running "npm init --y" in terminal';console.log(o),_base_1.store.dispatch(Action.toggleAlert({message:o,action:"tip",duration:6e3}))}}return{type:Type.LOAD_TUTORIALS,payload:{tutorials:e}}}functionloadRootPackageJson(){vare=path.join(global.coderoad.dir,"package.json");returnexists_1.fileExists(e)?JSON.parse(fs.readFileSync(e,"utf8")):!1}functionisTutorial(e){vara=path.join(global.coderoad.dir,"node_modules",e,"package.json");if(exists_1.fileExists(a)){varo=JSON.parse(fs.readFileSync(a,"utf8"));if(o.main&&o.main.match(/coderoad.json$/)){varr=path.join(global.coderoad.dir,"node_modules",e,o.main);if(exists_1.fileExists(r))return!0}}return!1}functionsearchForTutorials(e){returne&&Object.keys(e).length>0?Object.keys(e).filter(function(e){returnisTutorial(e)}):[]}var_base_1=require("../_base"),Action=require("./actions"),path=require("path"),fs=require("fs"),Type=require("./actionTypes"),exists_1=require("../services/exists");exports.loadTutorials=loadTutorials;
1+
"use strict";
2+
var_base_1=require('../_base');
3+
varAction=require('./actions');
4+
varpath=require('path');
5+
varfs=require('fs');
6+
varType=require('./actionTypes');
7+
varexists_1=require('../services/exists');
8+
functionloadTutorials(){
9+
vartutorials=[];
10+
if(global.coderoad.dir){
11+
varpackageJson=loadRootPackageJson();
12+
if(!packageJson){
13+
global.coderoad.package=null;
14+
varmessage='No package.json file available. Try running "npm init --y" in terminal';
15+
console.log(message);
16+
_base_1.store.dispatch(Action.toggleAlert({message:message,action:'tip',duration:6000}));
17+
}
18+
else{
19+
tutorials=[]
20+
.concat(searchForTutorials(packageJson.dependencies))
21+
.concat(searchForTutorials(packageJson.devDependencies));
22+
}
23+
}
24+
return{type:Type.LOAD_TUTORIALS,payload:{tutorials:tutorials}};
25+
}
26+
exports.loadTutorials=loadTutorials;
27+
functionloadRootPackageJson(){
28+
varpathToPackageJson=path.join(global.coderoad.dir,'package.json');
29+
if(exists_1.fileExists(pathToPackageJson)){
30+
returnJSON.parse(fs.readFileSync(pathToPackageJson,'utf8'));
31+
}
32+
returnfalse;
33+
}
34+
functionisTutorial(name){
35+
varpathToTutorialPackageJson=path.join(global.coderoad.dir,'node_modules',name,'package.json');
36+
if(exists_1.fileExists(pathToTutorialPackageJson)){
37+
varpackageJson=JSON.parse(fs.readFileSync(pathToTutorialPackageJson,'utf8'));
38+
if(packageJson.main&&packageJson.main.match(/coderoad.json$/)){
39+
varpathToCoderoadJson=path.join(global.coderoad.dir,'node_modules',name,packageJson.main);
40+
if(exists_1.fileExists(pathToCoderoadJson)){
41+
returntrue;
42+
}
43+
}
44+
}
45+
returnfalse;
46+
}
47+
functionsearchForTutorials(location){
48+
if(!!location&&Object.keys(location).length>0){
49+
returnObject.keys(location).filter(function(name){returnisTutorial(name);});
50+
}
51+
else{
52+
return[];
53+
}
54+
}

‎lib/atom/editor.js

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,77 @@
1-
functionsetAtomGlobals(){if(atom.project.rootDirectories.length>0)global.coderoad.dir=atom.project.rootDirectories[0].path;else{vart="Create a new Atom project. In Atom: File > Open > any folder";_base_1.store.dispatch(Action.toggleAlert({message:t,action:"tip",duration:6e3})),console.log(t),global.coderoad.dir=!1}}functionfindEditor(){vart=atom.workspace.getActiveTextEditor();returnt?getEditorCount>1e3?voidconsole.log("Failed to find active editor"):(getEditorCount=0,t):(getEditorCount+=1,voidsetTimeout(function(){returnfindEditor()},10))}functiongetEditor(){returnnewPromise(function(t,o){t(findEditor())})}functionopen(t,o){returnatom.workspace.open(t,o),!0}functionset(t){getEditor().then(function(o){o.setText(t),o.insertNewline(),o.moveToBottom(),o.save()})}functioninsert(t,o){o=Object.assign(o,{autoIndent:!0}),getEditor().then(function(e){e.moveToBottom(),e.insertText(t,o),e.insertNewline(),e.moveToBottom(),e.save()})}functioncloseAllPanels(){vart=atom.workspace.getTextEditors();t.forEach(function(t){t.destroy()})}functionquit(){}var_base_1=require("../_base"),Action=require("../actions/actions");exports.setAtomGlobals=setAtomGlobals;vargetEditorCount=0;exports.findEditor=findEditor,exports.getEditor=getEditor,exports.open=open,exports.set=set,exports.insert=insert,exports.closeAllPanels=closeAllPanels,exports.quit=quit;
1+
"use strict";
2+
var_base_1=require('../_base');
3+
varAction=require('../actions/actions');
4+
functionsetAtomGlobals(){
5+
if(atom.project.rootDirectories.length>0){
6+
global.coderoad.dir=atom.project.rootDirectories[0].path;
7+
}
8+
else{
9+
varmessage='Create a new Atom project. In Atom: File > Open > any folder';
10+
_base_1.store.dispatch(Action.toggleAlert({message:message,action:'tip',duration:6000}));
11+
console.log(message);
12+
global.coderoad.dir=false;
13+
}
14+
}
15+
exports.setAtomGlobals=setAtomGlobals;
16+
vargetEditorCount=0;
17+
functionfindEditor(){
18+
vareditor=atom.workspace.getActiveTextEditor();
19+
if(!editor){
20+
getEditorCount+=1;
21+
setTimeout(function(){
22+
returnfindEditor();
23+
},10);
24+
}
25+
elseif(getEditorCount>1000){
26+
console.log('Failed to find active editor');
27+
returnundefined;
28+
}
29+
else{
30+
getEditorCount=0;
31+
returneditor;
32+
}
33+
}
34+
exports.findEditor=findEditor;
35+
functiongetEditor(){
36+
returnnewPromise(function(resolve,reject){
37+
resolve(findEditor());
38+
});
39+
}
40+
exports.getEditor=getEditor;
41+
functionopen(filePath,options){
42+
atom.workspace.open(filePath,options);
43+
returntrue;
44+
}
45+
exports.open=open;
46+
functionset(text){
47+
getEditor().then(function(editor){
48+
editor.setText(text);
49+
editor.insertNewline();
50+
editor.moveToBottom();
51+
editor.save();
52+
});
53+
}
54+
exports.set=set;
55+
functioninsert(text,options){
56+
options=Object.assign(options,{
57+
autoIndent:true
58+
});
59+
getEditor().then(function(editor){
60+
editor.moveToBottom();
61+
editor.insertText(text,options);
62+
editor.insertNewline();
63+
editor.moveToBottom();
64+
editor.save();
65+
});
66+
}
67+
exports.insert=insert;
68+
functioncloseAllPanels(){
69+
vareditors=atom.workspace.getTextEditors();
70+
editors.forEach(function(editor){
71+
editor.destroy();
72+
});
73+
}
74+
exports.closeAllPanels=closeAllPanels;
75+
functionquit(){
76+
}
77+
exports.quit=quit;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp