Skip to content

Commit b8809c9

Browse files
authored
Merge pull request #34 from kitesjs/dev-studio
Dev react studio
2 parents 516501c + 0108816 commit b8809c9

28 files changed

+236
-131
lines changed

app.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { engine } from '@kites/core';
2+
3+
async function bootstrap() {
4+
// load config & autodiscover
5+
const app = await engine(true).init();
6+
app.logger.info('Kites application started!');
7+
}
8+
9+
bootstrap();

gulpfile.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const packages = {
1111
core: ts.createProject('packages/core/tsconfig.json'),
1212
express: ts.createProject('packages/express/tsconfig.json'),
1313
rest: ts.createProject('packages/rest/tsconfig.json'),
14+
react: ts.createProject('packages/react/tsconfig.json'),
1415
};
1516
const modules = Object.keys(packages);
1617
const source = 'packages';
@@ -37,6 +38,7 @@ gulp.task('copy-misc', function () {
3738
.pipe(gulp.dest(`${source}/core`))
3839
.pipe(gulp.dest(`${source}/express`))
3940
.pipe(gulp.dest(`${source}/rest`))
41+
.pipe(gulp.dest(`${source}/react`))
4042
});
4143

4244
gulp.task('clean:output', function () {

kites.config.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"transport": "console",
77
"level": "debug"
88
}
9-
109
},
1110
"extensions": null
1211
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"format": "prettier **/**/*.ts --ignore-path ./.prettierignore --write && git status",
1111
"tsc": "tsc",
1212
"start": "npm run start:dev",
13-
"start:dev": "npm run todo",
13+
"start:dev": "ts-node app.ts",
1414
"todo": "ts-node sample/01-todo-app/app.ts",
1515
"test": "mocha \"./packages/**/*.spec.ts\" --reporter spec --retries 3 --require ts-node/register --require node_modules/reflect-metadata/Reflect.js --exit",
1616
"clean": "gulp clean:bundle",

packages/core/engine/kites-factory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const KITES_INSTANCE = new InjectionToken('KITES_INSTANCE');
1111
export function engine(options?: IKitesOptions | boolean) {
1212
if (typeof options === 'boolean') {
1313
options = {
14+
loadConfig: options,
1415
discover: options
1516
};
1617
}

packages/core/engine/kites-instance.spec.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,14 @@ describe('kites engine', () => {
3838
});
3939

4040
it('should use a legal extension', async () => {
41-
class Aa implements KitesExtension {
42-
get name() {
43-
return 'abc';
44-
}
4541

46-
init(core: IKites) {
47-
core.logger.info('Kites extension initializing ...');
48-
expect(core.isInitialized).eq(false, 'The application should not be ready!');
42+
const app = await engine().use({
43+
name: 'test',
44+
main: function (kites: KitesInstance, definition: KitesExtension) {
45+
kites.logger.info('Kites extension initializing ...');
46+
expect(kites.isInitialized).eq(false, 'The application should not be ready!');
4947
}
50-
}
51-
52-
const app = await engine().use(new Aa()).init();
48+
}).init();
5349
expect(app.isInitialized).eq(true, 'The application should be ready!');
5450
expect(app).instanceOf(KitesInstance);
5551
});

packages/core/engine/kites-instance.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export class KitesInstance extends EventEmitter implements IKites {
105105
const parent = module.parent || module;
106106
const defaultLevel = process.env.NODE_ENV === 'production' ? 'info' : 'debug';
107107
return {
108+
loadConfig: false,
108109
appDirectory: appRoot.toString(),
109110
// TODO: separate kites discover as an api
110111
// EXAMPLE 1: kites.discover(true)
@@ -240,10 +241,10 @@ export class KitesInstance extends EventEmitter implements IKites {
240241
await this.extensionsManager.init();
241242
await this.initializeListeners.fire();
242243

244+
this.initialized = true;
243245
this.logger.info('kites initialized!');
244-
this.emit('ready', this);
245246

246-
this.initialized = true;
247+
this.emit('ready', this);
247248
return this;
248249
}
249250

packages/core/extensions/discover.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe('Discover extensions', () => {
99
const logger = getDebugLogger('kites:discover');
1010
let extensions: any = await discover({
1111
logger,
12-
rootDirectory: [location]
12+
directories: [location]
1313
});
1414
logger.info('Discovery location: ' + location);
1515
expect(extensions.length).eq(1);

packages/core/extensions/discover.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export type DiscoverOptions = string | boolean | [boolean, number, ...string[]];
1717
export interface IDiscoverOptions {
1818
readonly logger: Logger;
1919
readonly depth?: number;
20-
readonly rootDirectory: string[];
20+
readonly directories: string[];
2121
readonly env?: any;
2222
readonly cacheAvailableExtensions?: any;
2323
readonly tempDirectory?: any;
@@ -33,20 +33,23 @@ var availableExtensionsCache: any;
3333
*/
3434
export async function discover(config: IDiscoverOptions) {
3535

36-
config.logger.info('Searching for available extensions in ' + config.rootDirectory);
36+
config.logger.info('Searching for available extensions in ' + config.directories);
3737

3838
if (config.cacheAvailableExtensions && availableExtensionsCache != null) {
3939
config.logger.info(`Loading extensions from cache: count(${availableExtensionsCache.length})`);
4040
return Promise.resolve(availableExtensionsCache);
4141
} else {
42+
let availableExtensions = [];
4243
let results = await cache.get(config);
44+
4345
config.logger.info(`Found: ${results.length} extensions!`);
44-
let availableExtensions = results.map((configFile) => {
45-
let extension = require(configFile);
46-
return _.extend({
47-
directory: path.dirname(configFile)
48-
}, extension);
49-
});
46+
for (const configFile of results) {
47+
let extension = await import(configFile);
48+
availableExtensions.push({
49+
directory: path.dirname(configFile),
50+
...extension,
51+
});
52+
}
5053

5154
availableExtensionsCache = availableExtensions;
5255
await cache.save(availableExtensions, config);

packages/core/extensions/extensions-manager.ts

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,13 @@ class ExtensionsManager extends EventEmitter {
5454
if (typeof this.kites.options.discover === 'undefined') {
5555
this.kites.options.discover = [false, 0];
5656
} else if (typeof this.kites.options.discover === 'boolean') {
57-
this.kites.options.discover = [this.kites.options.discover, 2, this.kites.options.appDirectory];
57+
this.kites.options.discover = [this.kites.options.discover, 3, this.kites.options.appDirectory];
5858
} else if (typeof this.kites.options.discover === 'string') {
59-
this.kites.options.discover = [true, 2, this.kites.options.discover];
59+
this.kites.options.discover = [true, 3, this.kites.options.discover];
6060
} else if (this.kites.options.discover.length < 2) {
6161
throw new Error('Discover options as array requires at least 2 elements! Example: [true, 2]');
62+
} else if (this.kites.options.discover.length < 3) {
63+
this.kites.options.discover.push(this.kites.options.appDirectory);
6264
}
6365

6466
// autodiscover extensions
@@ -73,7 +75,7 @@ class ExtensionsManager extends EventEmitter {
7375
logger: this.kites.logger,
7476
env: this.kites.options.env,
7577
depth: depth,
76-
rootDirectory: directories,
78+
directories: directories,
7779
tempDirectory: this.kites.options.tempDirectory,
7880
});
7981
this.kites.logger.debug('Autodiscover ' + extensions.length + ' extensions!');
@@ -96,69 +98,70 @@ class ExtensionsManager extends EventEmitter {
9698
* Execute init extensions
9799
* @param extensions
98100
*/
99-
private useMany(extensions: KitesExtension[]) {
100-
var promises = extensions.map((e) => this.useOne(e));
101-
return Promise.all(promises);
101+
private async useMany(extensions: KitesExtension[]) {
102+
for (const e of extensions) {
103+
await this.useOne(e);
104+
}
102105
}
103106

104107
/**
105108
* Execute init one extension
106109
* @param extension
107110
*/
108-
private useOne(extension: KitesExtension) {
109-
// extends options
110-
// Review _.assign(), _.defaults(), or _.merge?
111-
const xname = extension.name && extension.name.toLowerCase();
112-
const options = _.assign<
113-
ExtensionOptions,
114-
ExtensionOptions | undefined,
115-
ExtensionOptions | undefined>({}, extension.options, this.kites.options[xname]);
116-
117-
extension.options = options;
118-
this.kites.options[xname] = options;
119-
120-
if (options.enabled === false) {
121-
this.kites.logger.debug(`Extension ${extension.name} is disabled, skipping`);
122-
return Promise.resolve();
123-
}
111+
private async useOne(extension: KitesExtension) {
112+
try {
124113

125-
return Promise.resolve()
126-
.then(() => {
127-
if (typeof extension.main === 'function') {
128-
(extension.main as Function).call(this, this.kites, extension);
129-
return Promise.resolve();
130-
} else if (typeof extension.main === 'string' && extension.directory) {
131-
// TODO: REMOVE, reason: Un-Support
132-
let extPath = path.join(extension.directory, extension.main);
133-
let extModule = require(extPath);
134-
extModule.call(this, this.kites, extension);
135-
return Promise.resolve();
136-
} else if (typeof extension.init === 'function') {
137-
(extension.init as Function).call(this, this.kites, extension);
138-
return Promise.resolve();
139-
} else {
140-
return Promise.reject('Invalid kites extension: ' + extension.name);
141-
}
142-
})
143-
.then(() => {
144-
if (options.enabled !== false) {
145-
this.emit('extension:registered', extension);
146-
} else {
147-
this.kites.logger.debug(`Extension ${extension.name} was disabled`);
148-
}
149-
})
150-
.catch((e: Error) => {
151-
let errorMsg;
114+
// extends options
115+
// Review _.assign(), _.defaults(), or _.merge?
116+
const xname = extension.name && extension.name.toLowerCase();
117+
const options = _.assign<
118+
ExtensionOptions,
119+
ExtensionOptions | undefined,
120+
ExtensionOptions | undefined>({}, extension.options, this.kites.options[xname]);
121+
122+
extension.options = options;
123+
this.kites.options[xname] = options;
152124

125+
if (options.enabled === false) {
153126
if (!extension.name) {
154-
errorMsg = `Error when loading anonymous extension ${extension.directory != null ? ` at ${extension.directory}` : ''}${os.EOL}${e.stack}`;
127+
this.kites.logger.debug(`Anonymous Extension${extension.directory != null ? ` at ${extension.directory}` : ''} is disabled, skipping`);
155128
} else {
156-
errorMsg = `Error when loading extension ${extension.name}${os.EOL}${e.stack}`;
129+
this.kites.logger.debug(`Extension ${extension.name} is disabled, skipping`);
157130
}
158-
159-
this.kites.logger.error(errorMsg);
160-
throw new Error(errorMsg);
161-
});
131+
return;
132+
}
133+
134+
if (!extension.name) {
135+
this.kites.logger.info(`Register extension: anonymous${extension.directory != null ? ` at ${extension.directory}` : ''}`);
136+
} else {
137+
this.kites.logger.info(`Register extension: ${extension.name}`);
138+
}
139+
140+
if (typeof extension.main === 'function') {
141+
// execute main function without await!
142+
(extension.main as Function).call(this, this.kites, extension);
143+
} else if (typeof extension.main === 'string' && extension.directory) {
144+
const main = await import(path.join(extension.directory, extension.main));
145+
// ES6 Module support
146+
// execute main function without await!
147+
(main && main.default).call(this, this.kites, extension);
148+
} else {
149+
throw new Error('Invalid kites extension: ' + extension.name + ' -> ' + JSON.stringify(extension));
150+
}
151+
152+
this.emit('extension:registered', extension);
153+
} catch (error) {
154+
let errorMsg;
155+
156+
if (!extension.name) {
157+
errorMsg = `Error when loading anonymous extension ${extension.directory != null ? ` at ${extension.directory}` : ''}${os.EOL}${error.stack}`;
158+
} else {
159+
errorMsg = `Error when loading extension ${extension.name}${os.EOL}${error.stack}`;
160+
}
161+
162+
this.kites.logger.error(errorMsg);
163+
throw new Error(errorMsg);
164+
}
162165
}
163166

164167
}

0 commit comments

Comments
 (0)