@makano/rew 1.2.56 → 1.2.58

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.
@@ -17,6 +17,7 @@ const { print, input } = require('../functions/stdout');
17
17
  const colors = require('colors');
18
18
  const { req } = require('../misc/req');
19
19
  const { gen_key } = require('../misc/bin');
20
+ const { REW_FILE_TYPE } = require('../const/ext');
20
21
 
21
22
  if (!existsSync(CONFIG_PATH) || !existsSync(CONFIG_PATH + '/repos.yaml')) {
22
23
  mkdirSync(CONFIG_PATH, { recursive: true });
@@ -127,7 +128,7 @@ yargs(hideBin(process.argv))
127
128
  type: 'string',
128
129
  })
129
130
  .option('dev', {
130
- describe: 'If your entry file is a .qrew, then just use the .coffee instead',
131
+ describe: `If your entry file is a .qrew, then just use .coffe or ${REW_FILE_TYPE.EXTENSION} instead`,
131
132
  type: 'boolean',
132
133
  })
133
134
  .option('entry', {
@@ -354,7 +355,7 @@ yargs(hideBin(process.argv))
354
355
  })
355
356
  .option('remove', {
356
357
  alias: 'r',
357
- describe: 'Remove all coffee',
358
+ describe: 'Remove all .coffee and '+REW_FILE_TYPE.EXTENSION,
358
359
  type: 'boolean',
359
360
  });
360
361
  },
@@ -18,6 +18,7 @@ const { seededID } = require('../misc/seededid');
18
18
  const loading = require('loading-cli');
19
19
  const sleep = require('../functions/sleep');
20
20
  const { gen_key } = require('../misc/bin');
21
+ const { REW_FILE_TYPE } = require('../const/ext');
21
22
 
22
23
  const binpath = path.join(conf({}).create('').root, '.bin');
23
24
  const logspath = path.join(conf({}).create('').root, '.logs');
@@ -49,7 +50,7 @@ module.exports = {
49
50
  runFileWithArgv(filePath, options = {}, cargv) {
50
51
  const argv = cargv || process.argv;
51
52
  argv.shift();
52
- if (argv[0].endsWith('rew')) {
53
+ if (argv[0].endsWith(REW_FILE_TYPE.EXTENSION) || argv[0].endsWith('.coffee')) {
53
54
  if (argv[1] == 'run') {
54
55
  argv.splice(0, 3);
55
56
  } else if(argv[1] == '-w' || argv[1] == '--watch'){
@@ -118,8 +119,8 @@ module.exports = {
118
119
  const create = () => {
119
120
  fs.mkdirSync(projectPath, { recursive: true });
120
121
  const confPath = path.join(projectPath, 'app.yaml');
121
- const entryFile = path.join(projectPath, 'main.coffee');
122
- fs.writeFileSync(confPath, jsYaml.dump({ manifest: { package: project.package, private: false }, exec: { entry: 'main.coffee' }, assets: { icon: 'assets/icon.png', folder: './assets' }, install: { requirements: [] } }));
122
+ const entryFile = path.join(projectPath, 'main'+(project.civet ? REW_FILE_TYPE.EXTENSION : '.coffee'));
123
+ fs.writeFileSync(confPath, jsYaml.dump({ manifest: { package: project.package, private: false }, exec: { entry: 'main'+(project.civet ? REW_FILE_TYPE.EXTENSION : '.coffee') }, assets: { icon: 'assets/icon.png', folder: './assets' }, install: { requirements: [] } }));
123
124
  fs.writeFileSync(entryFile, `print("Hello World!")`);
124
125
  fs.mkdirSync(path.join(projectPath, 'assets'), { recursive: true });
125
126
  if (project.git) {
@@ -127,10 +128,14 @@ module.exports = {
127
128
  execSync('cd ' + projectPath + ' && git init . && git branch -m main', { stdio: 'ignore' });
128
129
  }
129
130
  if(project.intellisense){
130
- fs.copyFileSync(path.join(__dirname, '../../../jsconfig.json'), path.join(projectPath, 'jsconfig.json'));
131
+ fs.copyFileSync(path.join(__dirname, '../../../tsconfig.json'), path.join(projectPath, 'tsconfig.json'));
131
132
  fs.copyFileSync(path.join(__dirname, '../../../runtime.d.ts'), path.join(projectPath, 'runtime.d.ts'));
132
133
  }
133
134
  execSync('cd ' + projectPath + ' && npm init -y', { stdio: 'ignore' });
135
+ if(project.civet){
136
+ log('Installing NPM Packages');
137
+ execSync('cd '+projectPath+' && npm i @types/node --no-save', { stdio: 'ignore' });
138
+ }
134
139
  // log('Installing '+npm_package_name);
135
140
  // exec('cd '+projectPath+' && npm i '+npm_package_name, (err) => {
136
141
  // if(err){
@@ -149,9 +154,12 @@ module.exports = {
149
154
  project.package = pkg.trim();
150
155
  rl.question(logget(' Use intellisense declarations ? (y/N): '.magenta.bold), (inteli) => {
151
156
  project.intellisense = inteli.toLowerCase() == 'y' || inteli.toLowerCase() == 'yes';
152
- rl.question(logget('󰊢 Use git ? (y/N): '.yellow.bold), (use_git) => {
153
- project.git = use_git.toLowerCase() == 'y' || use_git.toLowerCase() == 'yes';
154
- create();
157
+ rl.question(logget(' Use Civet For main ? (y/N): '.blue.bold), (civet) => {
158
+ project.civet = civet.toLowerCase() == 'y' || civet.toLowerCase() == 'yes';
159
+ rl.question(logget('󰊢 Use git ? (y/N): '.yellow.bold), (use_git) => {
160
+ project.git = use_git.toLowerCase() == 'y' || use_git.toLowerCase() == 'yes';
161
+ create();
162
+ });
155
163
  });
156
164
  });
157
165
  } else {
@@ -173,8 +181,8 @@ module.exports = {
173
181
  c.exec.entry = c.exec[options.entry] || c.exec.entry;
174
182
  }
175
183
  if (c.exec.entry) {
176
- if (byPath && options.dev) c.exec.entry = c.entry.endsWith('.qrew') ? c.exec.entry.replace(/\.qrew$/, '.coffee') : c.exec.entry;
177
184
  let r = path.resolve(root, c.exec.entry);
185
+ if (byPath && options.dev) r = r.endsWith('.qrew') ? r.replace(/\.qrew$/, (a, b) => fs.existsSync(r.replace(a, '.coffee')) ? '.coffee' : REW_FILE_TYPE.EXTENSION) : r;
178
186
  if (options.build) {
179
187
  this.build({
180
188
  file: r,
@@ -357,6 +365,9 @@ module.exports = {
357
365
  if (fs.existsSync(importedFilePath)) {
358
366
  importsArray.push(importStatement);
359
367
  processFile(importedFilePath, importsArray);
368
+ } else if (fs.existsSync(importedFilePath + REW_FILE_TYPE.EXTENSION)) {
369
+ importsArray.push(importStatement);
370
+ processFile(importedFilePath + REW_FILE_TYPE.EXTENSION, importsArray);
360
371
  } else if (fs.existsSync(importedFilePath + '.coffee')) {
361
372
  importsArray.push(importStatement);
362
373
  processFile(importedFilePath + '.coffee', importsArray);
@@ -369,7 +380,7 @@ module.exports = {
369
380
 
370
381
  const appPath = findAppInfo(filePath);
371
382
 
372
- const compiled = argv.translate ? compile({ content }, {}) : to_qrew(content, appPath?.config?.manifest?.package || path.basename(filePath).split('.').slice(0, -1).join('.'));
383
+ const compiled = argv.translate ? compile({ content }, {}) : to_qrew(`"initFile ${filePath}"\n${path.basename(content)}`, appPath?.config?.manifest?.package || path.basename(filePath).split('.').slice(0, -1).join('.'));
373
384
  writeCompiledFile(filePath, compiled);
374
385
  }
375
386
 
@@ -7,7 +7,7 @@ const { match } = require('../functions/match');
7
7
  const { map } = require('../functions/map');
8
8
  const { typex, typeis, typedef, typei, int, float, num, str, bool } = require('../functions/types');
9
9
  const { isEmpty, clone, deepClone, merge, uniqueId, compose, curry } = require('../functions/core');
10
- const { print, input, clear } = require('../functions/stdout');
10
+ const { print, input, clear, printf } = require('../functions/stdout');
11
11
  const { curl } = require('../functions/curl');
12
12
  const { wait } = require('../functions/wait');
13
13
  const { scheduleFrame } = require('../functions/misc');
@@ -55,5 +55,6 @@ module.exports = {
55
55
  curl,
56
56
 
57
57
  print,
58
+ printf,
58
59
  input,
59
60
  };
@@ -0,0 +1,5 @@
1
+
2
+ module.exports.REW_FILE_TYPE = {
3
+ EXTENSION: '.civet',
4
+ TYPE: 'civet'
5
+ }
@@ -1,11 +1,15 @@
1
+ const { REW_FILE_TYPE } = require("./ext");
2
+
1
3
  const execOptions = {
2
4
  sharedContext: true,
3
- resolveExtensions: ['.coffee', { ext: '.js', options: { type: 'js' } }, { ext: '.qrew', options: { qrew: true } }],
5
+ resolveExtensions: [REW_FILE_TYPE.EXTENSION, ".coffee", { ext: '.js', options: { type: 'js' } }, { ext: '.qrew', options: { qrew: true } }],
4
6
  nativeRequire: false,
5
7
  useImport: false,
6
8
  cwdAlias: '$',
7
- jsxPragma: 'createElement',
8
- jsx: false
9
+ jsxPragma: '__using__.JSX.createElement',
10
+ jsx: false,
11
+ typescript: false,
12
+ decorators: false
9
13
  };
10
14
 
11
15
  module.exports.execOptions = execOptions;
@@ -0,0 +1,15 @@
1
+
2
+
3
+
4
+ module.exports.USING_DEFAULT = {
5
+ JSX: {
6
+ param: (param) => ({ createElement: param }),
7
+ use: (options) => options.jsx = true
8
+ },
9
+ TYPES: {
10
+ use: (options) => options.typescript = true
11
+ },
12
+ DECORATORS: {
13
+ use: (options) => options.decorators = true
14
+ }
15
+ }
@@ -31,7 +31,11 @@ module.exports = (currentFile) => {
31
31
  }
32
32
 
33
33
  function rm(filepath, options) {
34
- return fs.unlinkSync(filepath);
34
+ return fs.rmSync(gp(filepath), { recursive: true,...options });
35
+ }
36
+
37
+ function unlink(filepath, options) {
38
+ return fs.unlinkSync(gp(filepath));
35
39
  }
36
40
 
37
41
  function chmod(filepath, mode, options) {
@@ -51,6 +55,7 @@ module.exports = (currentFile) => {
51
55
  mkdir,
52
56
  chmod,
53
57
  rm,
58
+ unlink,
54
59
  fstat,
55
60
  exists,
56
61
  write,
@@ -6,6 +6,7 @@ const { existsSync, readFileSync } = require('fs');
6
6
  const conf = require('../pkgs/conf');
7
7
  const jsYaml = require('js-yaml');
8
8
  const { execOptions } = require('../const/opt');
9
+ const { REW_FILE_TYPE } = require('../const/ext');
9
10
 
10
11
  const cachedFiles = [];
11
12
  module.exports.cleanCache = () => {
@@ -34,7 +35,7 @@ const lookUpInOtherApps = (fullPath) => {
34
35
  module.exports.imp = function (runPath, context) {
35
36
  return function (filename, options = {}) {
36
37
  if (!options) options = {};
37
- let type = options.type || 'coffee';
38
+ let type = options.type || filename.endsWith('.coffee') ? 'coffee' : REW_FILE_TYPE.TYPE;
38
39
  let exports,
39
40
  ispkg = findPackage(filename);
40
41
 
@@ -72,8 +73,8 @@ module.exports.imp = function (runPath, context) {
72
73
  } else lookUp();
73
74
  }
74
75
 
75
- const exec = (coptions = {}) =>
76
- runPath(
76
+ const exec = (coptions = {}) => {
77
+ const r = runPath(
77
78
  filepath,
78
79
  {
79
80
  import: options,
@@ -86,13 +87,18 @@ module.exports.imp = function (runPath, context) {
86
87
  package: context.app ? context.app.config.package : path.basename(filepath)
87
88
  },
88
89
  execOptions.sharedContext == false ? {} : options.context && options.context == 'new' ? {} : context,
89
- ).context.module.exports;
90
+ );
91
+ if(r instanceof Promise){
92
+ return new Promise((resolve) => r.then(c => resolve(c.context.module.exports)));
93
+ }
94
+ return r.context.module.exports;
95
+ }
90
96
 
91
97
  if (ispkg) {
92
98
  const pkg = getPackage(filename)(context, options);
93
99
  exports = pkg._onImport ? pkg._onImport() : pkg;
94
100
  } else if (foundCache) {
95
- } else if (type == 'coffee') {
101
+ } else if (type == REW_FILE_TYPE.TYPE || type == "coffee") {
96
102
  exports = exec({});
97
103
  } else if (type == 'js') {
98
104
  exports = exec({ compile: false });
@@ -111,7 +117,7 @@ module.exports.imp = function (runPath, context) {
111
117
  }
112
118
  }
113
119
 
114
- if (options.save && (type == 'js' || type == 'coffee')) {
120
+ if (options.save && (type == 'js' || type == REW_FILE_TYPE.TYPE || type == "coffee")) {
115
121
  if (typeof options.save == 'string') context[options.save] = exports[i];
116
122
  else
117
123
  for (let i in exports) {
@@ -135,7 +141,6 @@ module.exports.imp = function (runPath, context) {
135
141
  //** Mock imports section
136
142
  /**/ if(!exports) exports = options.mock;
137
143
  /**/ if(options.mock === null) return null;
138
- /**/ if(!exports) throw new Error('Import '+filename+' does not export anything. Use the "mock" option to mock a value.');
139
144
  //**
140
145
 
141
146
  return exports;
@@ -8,7 +8,7 @@ const cahcedRequires = {};
8
8
  const doImp = (path) => wait(async () => await import(resolvedPath));
9
9
 
10
10
  module.exports.customRequire = function customRequire(modulePath, filePath) {
11
- const pathname = modulePath;
11
+ let pathname = modulePath;
12
12
  if (modulePath.startsWith('./') || modulePath.startsWith('../') || path.isAbsolute(modulePath)) {
13
13
  pathname = path.resolve(modulePath);
14
14
  }
@@ -4,6 +4,10 @@ const print = (module.exports.print = function print(...args) {
4
4
  return console.log(...args);
5
5
  });
6
6
 
7
+ module.exports.printf = function printf(buffer, cb) {
8
+ return process.stdout.write(buffer, cb);
9
+ };
10
+
7
11
  print.stdout = process.stdout;
8
12
  print.stdin = process.stdin;
9
13
 
package/lib/rew/main.js CHANGED
@@ -1,17 +1,5 @@
1
- const { compileFile } = require('./modules/compiler');
2
- const { exec, runPath } = require('./modules/runtime');
3
- const fs = require('fs');
4
- const { imp } = require('./functions/import');
5
- const { FILES } = require('./const/files');
1
+ const { runPath } = require('./modules/runtime');
6
2
 
7
3
  module.exports.run = function (filepath, options = {}, custom_context = {}) {
8
- FILES.forEach((file) => {
9
- if (fs.existsSync(file.path)) return;
10
- if (file.content) {
11
- fs.writeFileSync(file.path, file.content);
12
- } else {
13
- fs.mkdirSync(file.path, { recursive: true });
14
- }
15
- });
16
4
  return runPath(filepath, options, custom_context);
17
5
  };
@@ -1,4 +1,4 @@
1
- const { compile } = require('../../coffeescript/coffeescript');
1
+ const { compile: compileCivet } = require('../../civet/main');
2
2
  const { execOptions } = require('../const/opt');
3
3
  const { findAppInfo } = require('../misc/findAppInfo');
4
4
  const { from_qrew } = require('../qrew/compile');
@@ -7,6 +7,9 @@ const babel = require('@babel/core');
7
7
  const path = require('path');
8
8
  const babelReact = require('@babel/preset-react');
9
9
  const { readFileSync } = require('fs');
10
+ const { wait } = require('../functions/wait');
11
+ const { REW_FILE_TYPE } = require('../const/ext');
12
+ const { USING_DEFAULT } = require('../const/usage');
10
13
 
11
14
  function tokenizeCoffeeScript(code) {
12
15
  const tokens = [];
@@ -115,6 +118,9 @@ function compileRewStuff(content, options) {
115
118
  const token = tokens[i];
116
119
  let { token: nextToken, n } = gnextToken(i, 1, tokens) || {};
117
120
 
121
+ if(token.type == "COMMENT" && i < 2 && token.value.startsWith('#!')){
122
+ continue;
123
+ }
118
124
 
119
125
  if (token.type === 'IDENTIFIER' && token.value === 'opt.set') {
120
126
  const { token: nextNextToken } = gnextToken(i, 2, tokens) || {};
@@ -150,18 +156,19 @@ function compileRewStuff(content, options) {
150
156
  }
151
157
 
152
158
 
153
- if (token.type === 'IDENTIFIER' && token.value === 'let' && !options.keepImports) {
154
- result += '`'
155
- hooks.push({
156
- index: fnextToken(i, tokens, 'OTHER', ';').ti,
157
- value: `\``,
158
- });
159
- }
160
-
161
159
  if (token.type === 'IDENTIFIER' && token.value === 'export' && !options.keepImports) {
162
160
  token.value = 'pub';
163
161
  }
164
162
 
163
+ if (token.type === 'IDENTIFIER' && token.value === 'using' && !options.disableUse) {
164
+ const next = nextToken.value;
165
+ if(next in USING_DEFAULT) {
166
+ const { use } = USING_DEFAULT[next];
167
+ use?.(options);
168
+ nextToken.value = `"${nextToken.value}"`
169
+ }
170
+ }
171
+
165
172
  if (token.type === 'IDENTIFIER' && token.value === 'import' && !options.keepImports) {
166
173
  // console.log(nextToken.type);
167
174
  let ind = i + n + 2;
@@ -177,9 +184,12 @@ function compileRewStuff(content, options) {
177
184
  const exportsTokens = tokens.slice(ind, closingBraceToken.ti);
178
185
  const exports = exportsTokens
179
186
  .filter((t) => t.type === 'IDENTIFIER')
180
- .map((t) => t.value)
187
+ .map((t, i, arr) => t.value == 'as' ? [arr[i-1].value +': '+arr[i+1].value] : t.value)
188
+ .flat(1)
189
+ .filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
181
190
  .join(', ');
182
- result += `{ ${exports} } = inc ${nameToken.value}`;
191
+
192
+ result += `{ ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
183
193
  i = nameToken.ti;
184
194
  }
185
195
  } else if (nextToken.value === '*') {
@@ -188,7 +198,7 @@ function compileRewStuff(content, options) {
188
198
  if (asToken) {
189
199
  const nextToken = fnextToken(asToken.ti + 1, tokens, 'IDENTIFIER');
190
200
  defaultName = nextToken.value;
191
- result += `${defaultName} = inc ${nameToken.value}`;
201
+ result += `${defaultName} ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
192
202
  i = ind + 6;
193
203
  }
194
204
  } else if (nextToken) {
@@ -201,13 +211,15 @@ function compileRewStuff(content, options) {
201
211
  const exportsTokens = tokens.slice(ind, closingBraceToken.ti);
202
212
  const exports = exportsTokens
203
213
  .filter((t) => t.type === 'IDENTIFIER')
204
- .map((t) => t.value)
214
+ .map((t, i, arr) => t.value == 'as' ? [arr[i-1].value +': '+arr[i+1].value] : t.value)
215
+ .flat(1)
216
+ .filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
205
217
  .join(', ');
206
- result += `{ default: ${defaultName}, ${exports} } = inc ${nameToken?.value || ''}`;
218
+ result += `{ default: ${defaultName}, ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
207
219
  i = closingBraceToken.ti + 4;
208
220
  }
209
221
  } else {
210
- result += `{ default: ${defaultName} } = inc ${nameToken?.value || ''}`;
222
+ result += `{ default: ${defaultName} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
211
223
  i = ind + 2;
212
224
  }
213
225
  }
@@ -259,21 +271,65 @@ function compileRewStuff(content, options) {
259
271
  return result;
260
272
  }
261
273
 
262
- const cpl = (module.exports.compile = function (file, options = {}) {
263
- let c = options.type == 'js' || options.compile == false ? file.content : compile(compileRewStuff(file.content, options), {
274
+ const compileCivetStuff = (file, options) => {
275
+ const compileOptions = {
264
276
  ...options,
265
- filename: file.path,
266
- bare: options.bare ?? false,
277
+ bare: true,
278
+ filename: file.content,
267
279
  inlineMap: false,
268
- });2
280
+ js: true
281
+ };
282
+
283
+ const prepared = compileRewStuff(file.content, options);
284
+
285
+ const compiled = options.async ? compileCivet(prepared, compileOptions) : wait(compileCivet, prepared, compileOptions);
286
+
287
+ return {
288
+ compiled,
289
+ options
290
+ };
291
+ }
292
+
293
+ const cpl = (module.exports.compile = function (file, options = {}) {
294
+ let compiledCode;
295
+ const result = compileCivetStuff(file, {
296
+ ...options,
297
+ parseOptions: {
298
+ coffeeCompat: options.type == "coffee",
299
+ }
300
+ });
301
+
302
+ options = result.options;
303
+ compiledCode = result.compiled;
304
+
305
+ const babelify = (code, options) => babel.transformSync(code, {
306
+ presets: [
307
+ ...(doJSX ? [[babelReact, { pragma: options.jsxPragma || execOptions.jsxPragma }]] : [])
308
+ ],
309
+ plugins: [
310
+ ...(doDecorators ? [[require('@babel/plugin-proposal-decorators'), { version: '2023-05' }], [require('@babel/plugin-proposal-class-properties'), { loose: true }], [require('@babel/plugin-transform-class-static-block'), {}]] : [])
311
+ ],
312
+ }).code;
313
+
314
+ const doJSX = execOptions.jsx || options.jsx;
315
+ const doTypes = execOptions.typescript || options.typescript;
316
+ const doDecorators = execOptions.decorators || options.decorators;
317
+ const doBabel = doJSX || doTypes || doDecorators;
318
+
319
+ if(compiledCode instanceof Promise){
320
+ return compiledCode.then((compiledCode) => {
321
+ if (doBabel) {
322
+ compiledCode = babelify(compiledCode, options);
323
+ }
324
+ return compiledCode;
325
+ });
326
+ }
327
+
269
328
  // console.log(c);
270
- if (execOptions.jsx || options.jsx) {
271
- c = babel.transformSync(c, {
272
- presets: [[babelReact, { pragma: options.jsxPragma || execOptions.jsxPragma }]],
273
- plugins: [],
274
- }).code;
329
+ if (doBabel) {
330
+ compiledCode = babelify(compiledCode, options);
275
331
  }
276
- return c;
332
+ return compiledCode;
277
333
  });
278
334
 
279
335
  module.exports.compileFile = function (filepath, options = {}) {
@@ -284,13 +340,21 @@ module.exports.compileFile = function (filepath, options = {}) {
284
340
  if(options.qrew || path.extname(filepath) == '.qrew') {
285
341
  qrew = true
286
342
  f.content = from_qrew(readFileSync(f.path), options.package || findAppInfo(filepath)?.config.manifest.package || path.basename(filepath).split('.').slice(0, -1).join('.')).toString();
343
+ options.type = f.content.split('\n')[0]?.match(/"initFile (.+)"/)?.[1]?.split('.').pop();
287
344
  }
288
345
 
289
346
  let compiled_code = cpl(f, { ...options });
290
347
 
291
348
  if(options.onlyCompile && !qrew){
292
- console.log(compiled_code);
293
- process.exit();
349
+ if(compiled_code instanceof Promise){
350
+ compiled_code.then((r) => {
351
+ console.log(r);
352
+ process.exit();
353
+ });
354
+ } else {
355
+ console.log(compiled_code);
356
+ process.exit();
357
+ }
294
358
  }
295
359
 
296
360
  return {
@@ -7,6 +7,7 @@ const fsLib = require("../functions/fs");
7
7
  const pathLib = require("../functions/path");
8
8
  const execLib = require("../functions/exec");
9
9
  const { findAppInfo } = require("../misc/findAppInfo");
10
+ const { USING_DEFAULT } = require("../const/usage");
10
11
 
11
12
  let mainFile = "";
12
13
  const isMainFile = (filepath) => filepath == mainFile;
@@ -30,6 +31,7 @@ module.exports.prepareContext = function (
30
31
  },
31
32
  app: findAppInfo(filepath),
32
33
  ...fsLib(filepath),
34
+ __using__: {}
33
35
  };
34
36
  if (options.useContext) {
35
37
  context = {
@@ -91,6 +93,16 @@ module.exports.prepareContext = function (
91
93
  context.pub = pubFunction(context);
92
94
  context.exports = exportsFunction(context);
93
95
 
96
+ context.using = (name, ...params) => {
97
+ if(USING_DEFAULT[name]){
98
+ if(USING_DEFAULT[name].param) {
99
+ context.__using__[name] = USING_DEFAULT[name].param(...params);
100
+ }
101
+ } else {
102
+ context.__using__[name] = params.length ? params.length > 1 ? [...params] : params : true;
103
+ }
104
+ };
105
+
94
106
  if (
95
107
  context.module.main ||
96
108
  (options.fromMain == true && options.as == "main")
@@ -17,26 +17,44 @@ const exec = (module.exports.exec = function (code, context, original = '') {
17
17
 
18
18
  module.exports.runPath = function runPath(filepath, options = {}, custom_context = {}) {
19
19
  if(filepath.endsWith('.js')) options.type = 'js';
20
+ if(filepath.endsWith('.coffee')) options.type = 'coffee';
21
+ if(filepath.endsWith('.qrew')) options.type = 'qrew';
22
+
23
+ if(options.import?.async) options.async = true;
20
24
  let { compiled_code, file } = compileFile(options.code ? { content: options.code, path: filepath } : filepath, options);
21
- const context = options.import?.takeThisContext ? custom_context : prepareContext(custom_context, options, file.path, runPath);
22
25
  // context.module.compiled = compiled_code;
23
26
  // context.process.exit = (int) => process.exit(int);
24
27
 
25
- if(context.app){
26
- const p = path.join(CONFIG_PATH, context.app.config.manifest.package, 'app');
27
- if(existsSync(p) && context.app.path !== p){
28
- console.log("App with the same package name has been installed. Conflicts happened. \nTo fix this, change your app's package name or remove the app making the conflict.");
29
- return {
30
- context: { module: { exports: null } },
31
- returns: null
28
+ const doCode = () => {
29
+ const context = options.import?.takeThisContext ? custom_context : prepareContext(custom_context, options, file.path, runPath);
30
+
31
+ if(context.app){
32
+ const p = path.join(CONFIG_PATH, context.app.config.manifest.package, 'app');
33
+ if(existsSync(p) && context.app.path !== p){
34
+ console.log("App with the same package name has been installed. Conflicts happened. \nTo fix this, change your app's package name or remove the app making the conflict.");
35
+ return {
36
+ context: { module: { exports: null } },
37
+ returns: null
38
+ }
32
39
  }
33
40
  }
41
+
42
+ compiled_code = preScript+'\n'+compiled_code;
43
+
44
+ return {
45
+ context,
46
+ returns: exec(compiled_code, context, file.content),
47
+ };
34
48
  }
35
49
 
36
- compiled_code = preScript+'\n'+compiled_code;
50
+ if(options.async){
51
+ return new Promise(async (r, re) => {
52
+ compiled_code.then((e) => {
53
+ compiled_code = e;
54
+ r(doCode());
55
+ });
56
+ });
57
+ }
37
58
 
38
- return {
39
- context,
40
- returns: exec(compiled_code, context, file.content),
41
- };
59
+ return doCode();
42
60
  };
@@ -5,6 +5,10 @@ const path = require('path');
5
5
  const { run } = require('../main');
6
6
  const { runPath } = require('../modules/runtime');
7
7
  const { cleanCache } = require('../functions/import');
8
+ const { REW_FILE_TYPE } = require('../const/ext');
9
+
10
+ const lookUpFiles = ['route', 'page', 'page.s'];
11
+
8
12
  module.exports = (context) => {
9
13
 
10
14
  // http.createServer((req, res) => {
@@ -105,7 +109,7 @@ module.exports = (context) => {
105
109
  }
106
110
  }
107
111
 
108
- function findLayoutFiles(filePath, root, isClientSide = true, resolveExtensions = ['.coffee', '.js', '.jsx']) {
112
+ function findLayoutFiles(filePath, root, isClientSide = true, resolveExtensions = [REW_FILE_TYPE.EXTENSION, '.coffee', '.js', '.jsx']) {
109
113
  const layouts = [];
110
114
  const rootDir = root;
111
115
  let currentDir = path.dirname(filePath);
@@ -162,13 +166,11 @@ module.exports = (context) => {
162
166
  onError = () => error(404, 'Path not found'),
163
167
  root = '',
164
168
  basePath = '',
165
- resolveExtensions = ['.coffee', '.js', '.jsx'],
169
+ resolveExtensions = [REW_FILE_TYPE.EXTENSION, '.coffee', '.js', '.jsx'],
166
170
  bundlerOptions = {},
167
171
  bundlerEntry = defaultBundlerEntry,
168
172
  ssrBundlerEntry = defaultSsrBundlerEntry,
169
173
  }) {
170
-
171
- const lookUpFiles = ['route', 'page', 'page.s'];
172
174
 
173
175
  const params = {};
174
176
 
@@ -176,6 +178,7 @@ module.exports = (context) => {
176
178
  const routeParts = pathname.split('/').filter(Boolean);
177
179
  let routePath = root;
178
180
 
181
+
179
182
  Object.keys(params).forEach(key => delete params[key]);
180
183
 
181
184
  for (const part of routeParts) {
@@ -3,6 +3,7 @@ const emitter = require("../functions/emitter");
3
3
  const { compile } = require("../modules/compiler");
4
4
  const { wait } = require("../functions/wait");
5
5
  const { generateRandomID } = require("../functions/id");
6
+ const { REW_FILE_TYPE } = require("../const/ext");
6
7
 
7
8
 
8
9
  const selfClosingElements = new Set([
@@ -476,11 +477,11 @@ module.exports = (context, importOptions) => {
476
477
  }
477
478
  return null;
478
479
  },
479
- transform(code, id) {
480
- if (id.endsWith('.coffee')) {
481
- const result = compile({ content: code, path: filepath }, { jsx: true, keepImports: true });
480
+ async transform(code, id) {
481
+ if (id.endsWith(REW_FILE_TYPE.EXTENSION) || id.endsWith('.coffee')) {
482
+ const result = compile({ content: code, path: filepath }, { jsx: true, async: true, keepImports: true });
482
483
  return {
483
- code: result,
484
+ code: await result,
484
485
  map: null,
485
486
  };
486
487
  }