-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
177 lines (144 loc) Β· 4.88 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import fs from "fs";
import path from "path"
import Conf from 'conf';
import inquirer from "inquirer";
import ora from 'ora';
import {graphql} from './graphql.mjs';
import { CREATE_REPL } from './queries.mjs';
import { spawn } from 'child_process';
import chalk from 'chalk';
import { Crosis } from "crosis4furrets";
const config = new Conf();
function readFilesSync(dir) {
const files = [];
fs.readdirSync(dir).forEach(filename => {
const name = path.parse(filename).name;
const filepath = path.resolve(dir, filename);
const stat = fs.statSync(filepath);
const isFile = stat.isFile();
if (isFile){
files.push({ filepath, name, })
}else {
let f2 = readFilesSync(filepath)
f2.forEach(file => files.push(file))
};
});
files.sort((a, b) => {
return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' });
});
return files;
}
function loginHeroku(){
let hr = spawn("heroku login",{
stdio: ['pipe', 'pipe', 'pipe'],
shell: true,
})
hr.stdin.setEncoding('utf-8');
hr.stdin.write("a")
hr.stdin.end()
console.log(chalk.yellow("A Heroku login window was just opened in your browser!,"), chalk.gray("if it didn't open, please install Heroku CLI at:" + chalk.underline(" https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli ")))
}
async function createRepl(name, lang){
console.log("Creating repl!")
const newRepl = await graphql(
CREATE_REPL,
{ input: { title:name, language:lang } },
);
if(!newRepl.data.createRepl.id) {
logger.error(
`could not create a new repl ${
newRepl.data
? `because ${newRepl.data?.createRepl?.message.toLowerCase()}`
: `, ${newRepl.errors}`
}`);
process.exit(0);
};
const { data: { createRepl: { id: newReplId, url } } } = newRepl;
const newReplClient = new Crosis({token: config.get("login").trim(), replId: newRepl.data.createRepl.id});
const spinnerConnections = ora({
text: 'Connecting to repl...',
spinner: 'point',
}).start();
await newReplClient.connect();
await newReplClient.persist();
spinnerConnections.succeed('Connected to remote repl.');
await newReplClient.removeAll();
await transferFiles(newReplClient, name);
const spinnerSave = ora({
text: 'Saving your new repl...',
spinner: 'point',
}).start();
await newReplClient.snapshot();
await newReplClient.close();
spinnerSave.succeed(chalk.bold('Your new repl is ready, view it at: https://replit.com' + url));
}
async function transferFiles(newRepl, name) {
const readingSpinner = ora({
text: 'Indexing files to transfer...',
spinner: 'point',
}).start();
const files = readFilesSync(`./${name}/`);
readingSpinner.succeed("Files indexed.")
const spinnerTransfer = ora({
text: 'Starting transfer...',
spinner: 'point',
}).start();
files.forEach(file => {
let dat = fs.readFileSync(file.filepath)
let relpath = file.filepath.split(name)[1]
let truepath = "./" + name + "/" + relpath
async function t(){
await newRepl.write(truepath, dat).catch((err) => {
console.log("could not transfer: ", truepath)
console.error(err)
});
}
t()
})
spinnerTransfer.succeed('Transferred files to new repl.');
};
function askReplitID(){
console.log(chalk.red("Reminder: do not share your Replit Session ID with anyone."), chalk.gray("To get yours follow this tutorial: https://replit.com/talk/learn/How-to-Get-Your-SID-Cookie/145979"))
inquirer.prompt({
type: 'input',
name: 'token',
message: "Your Replit Session ID (connect.sid):",
default: process.env.HEROKU_PROJECT,
}).then(async (tokenID) => {
config.set("login", tokenID.token)
askForProjectInfo()
})
}
function cloneProject(name, lang){
console.log(chalk.yellow("Cloning " + name + "..."))
let hr = spawn(`heroku git:clone -a ${name}`,{
stdio: "inherit",
shell: true,
})
hr.on("exit", () => {
hr = null;
createRepl(name, lang)
})
}
function askForProjectInfo(){
inquirer.prompt({
type: 'input',
name: 'projname',
message: "Name of your project (case sensitive):",
default: process.env.HEROKU_PROJECT,
}).then(async (heroku_project) => {
inquirer.prompt({
type: 'input',
name: 'lang',
message: "New repl language:",
default: process.env.PROJ_LANG,
}).then(async (langdata) => {
cloneProject(heroku_project.projname, langdata.lang)
})
})
}
export function main(){
console.log(chalk.green("Heroku to Repl! #teamReplit"))
loginHeroku()
askReplitID()
}