Skip to content
Snippets Groups Projects
Commit 8db32865 authored by Loïc Correnson's avatar Loïc Correnson
Browse files

[dome] refactor directories

parent 2f75f831
No related branches found
No related tags found
No related merge requests found
Showing
with 26 additions and 325 deletions
// --------------------------------------------------------------------------
// --- Dome Plugins Management
// --------------------------------------------------------------------------
import fs from 'fs' ;
import path from 'path' ;
const registry = {} ;
// --------------------------------------------------------------------------
// --- Installing Bundle
// --------------------------------------------------------------------------
export function register( id, exports )
{
registry[id] = Object.assign( {} , exports );
}
const WRAPPER_OPEN = '(function(module,require,__static){\n' ;
const WRAPPER_CLOSE = '\n})' ;
const PLUGINS = '@plugins/' ;
export function install( name )
{
// Resolve plugin directory
let dir = path.resolve( __static , "plugins" , name );
if (!fs.isDirectory())
throw `Plugin '${name}' not installed` ;
// Resolve plugin configuration
let pkg = path.resolve( dir , 'package.json' );
if (!fs.isFile(pkg))
throw `Plugin '${name}' has no 'package.json' file` ;
let config ;
try { config = JSON.pargse(fs.readFileSync( pkg , 'UTF-8' )); }
catch(err) {
console.error( `[Dome] Reading '${pkg}':\n`, err );
throw `Plugin '${name}' has invalid 'package.json' file` ;
}
// Resolve plugin entry points
let bundlejs = path.resolve( dir, config.main || 'bundle.js' );
if (!fs.isFile(bundlejs))
throw `Plugin '${name}' entry point not found` ;
let static_d = path.resolve( dir, 'static' );
if (!fs.isDirectory(static_d)) static_d = undefined;
// Load bundle file
let bundle ;
try { bundle = fs.readFileSync( bundlejs , 'UTF-8' ); }
catch(err) {
console.error( `[Dome] Loading '${bundlejs}':\n`, err );
throw `Plugin '${name}' can not load its entry point` ;
}
// Install bundle file
let id = PLUGINS + name ;
let exports = {} ;
register( id, exports ); // cut circularities
try {
let wrapped = WRAPPER_OPEN + bundle + WRAPPER_CLOSE ;
let compiled ; eval(wrapped);
let module = { id, exports };
compiled( module, require, static_d );
} catch(err) {
console.error( `[Dome] Running '${bundlejs}':\n`, err );
throw `Plugin '${name}' can not install bundle` ;
}
register( id, exports ); // final exports
// Finally return exports
return exports ;
}
// --------------------------------------------------------------------------
// --- Resolving Modules
// --------------------------------------------------------------------------
export function require(id)
{
let exports = registry[id];
if (exports) return Object.assign( {} , exports );
// Resolving plugin
if (id.startsWith(PLUGINS))
{
let exports = install( id.substring(PLUGINS.length) );
return Object.assign( {} , exports );
}
// Trap
throw `Module '${id}' not found` ;
}
// --------------------------------------------------------------------------
......@@ -13,7 +13,6 @@
import React from 'react' ;
import * as Dome from 'dome' ;
import 'dome/misc/exports' ;
export default (() => (
<h1 className='dome-text-title' style={{margin: 24}}>
......
......@@ -13,8 +13,6 @@ DOME?=dome
DOME_ARGS?=
DOME_DEV_ARGS?=
DOME_APP_ARGS?=
DOME_EXPORTS?=
DOME_PLUGINS?=
DOME_CLI?=./bin/$(DOME_MK_NAME)
DOME_DOC?=./doc/html
DOME_API?=
......@@ -38,15 +36,12 @@ dome-help:
@echo " make dome-templ Update templates"
@echo " make dome-reboot Rebuild templates from scratch"
@echo " make dome-clean Remove dome temporary files"
@echo " make dome-plugins Package plugins for distribution"
@echo
@echo "[Dome] Development:"
@echo " Dome framework DOME = '$(DOME)'"
@echo " Local command DOME_CLI = '$(DOME_CLI)'"
@echo " Local arguments DOME_ARGS = '$(DOME_ARGS)'"
@echo " Extra arg.(dev) DOME_DEV = '$(DOME_DEV)'"
@echo " Export modules DOME_EXPORTS = '$(DOME_EXPORTS)'"
@echo " Plugin modules DOME_PLUGINS = '$(DOME_PLUGINS)'"
@echo
@echo "[Dome] Documentation:"
@echo " Application APP = '$(APP)'"
......@@ -134,7 +129,6 @@ DOME_MK_TEMPLATES= \
.gitignore \
.babelrc \
webpack.main.js \
webpack.plugin.js \
webpack.renderer.js \
electron-webpack.json \
src/main/index.js \
......@@ -169,9 +163,6 @@ webpack.main.js: $(DOME)/template/update.sh $(DOME)/template/webpack.main.js
webpack.renderer.js: $(DOME)/template/update.sh $(DOME)/template/webpack.renderer.js
@$^ $@
webpack.plugin.js: $(DOME)/template/update.sh $(DOME)/template/webpack.plugin.js
@$^ $@
electron-webpack.json: $(DOME)/template/update.sh $(DOME)/template/electron-webpack.json
@$^ $@
......@@ -205,82 +196,6 @@ src/renderer/Preferences.js:
endif
# --------------------------------------------------------------------------
# --- Exported API for Plugins
# --------------------------------------------------------------------------
.PHONY: dome-export-dev dome-export-app
DOME_MK_EXPORTS_JS=$(DOME)/src/misc/exports.js
# --------------------------------------------------------------------------
dome-export-dev:
@rm -f $(DOME_MK_EXPORTS_JS)
@echo "// Static Plugins Loader" > $(DOME_MK_EXPORTS_JS)
@for m in $(DOME_EXPORTS) ;\
do \
echo "[Dome] installing '$$m'" ;\
echo "import '$$m';" \
>> $(DOME_MK_EXPORTS_JS) ;\
done
@for m in $(DOME_PLUGINS) ;\
do \
echo "[Dome] loading plugin $$m" ;\
echo "import '@plugins/$$m';" >> $(DOME_MK_EXPORTS_JS) ;\
done
@chmod a-w $(DOME_MK_EXPORTS_JS)
# --------------------------------------------------------------------------
dome-export-app:
@rm -f $(DOME_MK_EXPORTS_JS)
@echo "// Static Loader (Generated by Dome)" > $(DOME_MK_EXPORTS_JS)
@echo "import { register } from 'dome/misc/plugins' ;" >> $(DOME_MK_EXPORTS_JS) ;
@echo "[Dome] export 'dome'" ;
@$(DOME)/template/export.sh $(DOME) >> $(DOME_MK_EXPORTS_JS)
@for m in $(DOME_EXPORTS) ;\
do \
echo "[Dome] export '$$m'" ;\
echo "{ let m = require('$$m'); register('$$m',m); }" \
>> $(DOME_MK_EXPORTS_JS) ;\
done
@for m in $(DOME_PLUGINS) ;\
do \
echo "[Dome] install '@plugins/$$m'" ;\
echo "{ let m = require('@plugins/$$m'); register('@plugins/$$m',m); }" \
>> $(DOME_MK_EXPORTS_JS) ;\
done
@chmod a-w $(DOME_MK_EXPORTS_JS)
# --------------------------------------------------------------------------
# --- Packaging Plugins
# --------------------------------------------------------------------------
.PHONY: dome-plugins dome-plugin-%
DOME_MK_PLUGINS_TARGET=$(addprefix dome-plugin-, $(DOME_PLUGINS))
DOME_MK_PLUGINS_SOURCE=$(addprefix src/plugins/, $(DOME_PLUGINS))
DOME_MK_PLUGINS_CONFIG=$(addsuffix /package.json, $(DOME_MK_PLUGINS_SOURCE))
dome-plugins: $(DOME_MK_PLUGINS_CONFIG) $(DOME_MK_PLUGINS_TARGET)
dome-plugin-%: src/plugins/%/package.json webpack.plugin.js
@echo "[Dome] building plugin '$*'"
@rm -fr dist/plugins/$*
@mkdir -p dist/plugins/$*
@node $(DOME)/template/packplugin.js '$*'
DOME=$(DOME) DOME_PLUGIN='$*' yarn run webpack -p --config webpack.plugin.js
@echo "[Dome] plugin packaged in ./dist/plugins/$*"
src/plugins/%/package.json:
@echo "[Dome] creating package.json for plugin '$*'"
@echo '{' > $@
@echo ' "name": "$*",' >> $@
@echo ' "version": "0.1",' >> $@
@echo ' "license": "UNLICENSED"' >> $@
@echo '}' >> $@
# --------------------------------------------------------------------------
# --- Application Development
# --------------------------------------------------------------------------
......@@ -289,7 +204,7 @@ DOME_MK_CLIDIR=$(dir $(DOME_CLI))
.PHONY: dome-dev
dome-dev: dome-pkg dome-templ dome-export-dev
dome-dev: dome-pkg dome-templ
@echo "[Dome] linking $(DOME_CLI)"
@mkdir -p $(DOME_MK_CLIDIR)
@rm -f $(DOME_CLI)
......@@ -307,7 +222,7 @@ dome-dev: dome-pkg dome-templ dome-export-dev
.PHONY: dome-app
dome-app: dome-pkg dome-templ dome-export-app
dome-app: dome-pkg dome-templ
@echo "[Dome] compiling application (production)"
DOME=$(DOME) DOME_ENV='app' yarn run electron-webpack app
@echo "[Dome] linking $(DOME_CLI)"
......@@ -334,7 +249,7 @@ dome-dist: dome-app
# --------------------------------------------------------------------------
DOME_MK_ICON_MAKE=$(DOME)/doc/icons.js
DOME_MK_ICON_DATA=$(DOME)/src/renderer/controls/icons.json
DOME_MK_ICON_DATA=$(DOME)/renderer/controls/icons.json
DOME_MK_ICON_HTML=$(DOME)/doc/template/gallery-icons.html
$(DOME_MK_ICON_HTML): $(DOME_MK_ICON_MAKE) $(DOME_MK_ICON_DATA)
......@@ -345,8 +260,7 @@ $(DOME_MK_ICON_HTML): $(DOME_MK_ICON_MAKE) $(DOME_MK_ICON_DATA)
# --- Dome Documentation
# --------------------------------------------------------------------------
DOME_MK_DOC_SRC=$(DOME_API) $(addprefix src/plugins/, $(DOME_PLUGINS))
DOME_MK_DOC_API=$(addprefix $(CURDIR)/, $(DOME_MK_DOC_SRC))
DOME_MK_DOC_API=$(addprefix $(CURDIR)/, $(DOME_API))
DOME_MK_DOC_OUT=$(addprefix $(CURDIR)/, $(DOME_DOC))
dome-doc: $(DOME_MK_BIN)/jsdoc $(DOME_MK_ICON_HTML)
......
#!/bin/node
const fs = require('fs');
const name = process.argv[2];
const INFOS = [
'name',
'version',
'description',
'homepage',
'bugs',
'keywords',
'author',
'contributors',
'repository',
'license'
];
const dst = {
name,
version: '0.1',
license: 'UNLICENSED',
main: 'bundle.js'
};
let src = './src/plugins/' + name + '/package.json' ;
let tgt = './dist/plugins/' + name + '/package.json' ;
let pkg = JSON.parse( fs.readFileSync( src , 'UTF-8' ) );
INFOS.forEach((fd) => { let d = pkg[fd] ; if (!d) dst[fd] = d });
fs.writeFileSync( tgt , JSON.stringify(dst) , 'UTF-8' );
// End.
......@@ -21,7 +21,7 @@ function domeDevtools() {
case 'dev':
return 'electron-devtools-installer';
default:
return path.resolve( DOME , 'src/misc/devtools.js' );
return path.resolve( DOME , 'misc/devtools.js' );
}
}
......@@ -37,8 +37,8 @@ module.exports = {
resolve: {
extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
alias: {
'dome$': path.resolve( DOME , 'src/main/dome.ts' ),
'dome/system$': path.resolve( DOME , 'src/misc/system.ts' ),
'dome$': path.resolve( DOME , 'main/dome.ts' ),
'dome/system$': path.resolve( DOME , 'misc/system.ts' ),
'dome/devtools': domeDevtools()
}
}
......
// --------------------------------------------------------------------------
// --- Webpack configuration for packing plugins
// --------------------------------------------------------------------------
/*
Template of ./webpack.plugin.js from $(DOME)/template/webpack.plugin.js
This webpack definitions will be used to make plugin bundles.
You may extend it with your own additions.
*/
const path = require('path');
const DOME = process.env.DOME || path.resolve( __dirname , 'dome' );
const PLUGIN = process.env.DOME_PLUGIN ;
const ENTRY = path.resolve( __dirname , 'src/plugins' , PLUGIN );
const DIST = path.resolve( __dirname , 'dist/plugins' , PLUGIN );
module.exports = {
entry: ENTRY,
output: {
path: DIST,
filename: 'bundle.js',
libraryTarget: 'commonjs2'
},
module: {
rules: [
{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
{ test: /\.js$/, use: [ 'babel-loader' ], exclude: /(node_modules)/ }
]
},
externals: [
'lodash',
'react',
/^dome\/.+$/,
/^@plugins\/.+$/,
/^@\/.+$/
]
};
// --------------------------------------------------------------------------
......@@ -27,11 +27,10 @@ module.exports = {
resolve: {
extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
alias: {
'@plugins': path.resolve( __dirname , 'src/plugins' ),
'dome/misc': path.resolve( DOME , 'src/misc' ),
'dome/system': path.resolve( DOME , 'src/misc/system.ts' ),
'dome$': path.resolve( DOME , 'src/renderer/dome.tsx' ),
'dome': path.resolve( DOME , 'src/renderer' ),
'dome/misc': path.resolve( DOME , 'misc' ),
'dome/system': path.resolve( DOME , 'misc/system.ts' ),
'dome$': path.resolve( DOME , 'renderer/dome.tsx' ),
'dome': path.resolve( DOME , 'renderer' ),
'react-dom': '@hot-loader/react-dom'
}
}
......
......@@ -45,11 +45,11 @@
"paths": { /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
"frama-c/api/*": [ "api/generated/*" ],
"frama-c/*": [ "src/frama-c/*" ],
"dome": [ "src/dome/src/renderer/dome.tsx" ],
"dome/system": [ "src/dome/src/misc/system.js" ],
"dome/devtools": [ "src/dome/src/misc/devtools.js" ],
"dome/misc/*": [ "src/dome/src/misc/*"],
"dome/*": [ "src/dome/src/renderer/*" ],
"dome": [ "src/dome/renderer/dome.tsx" ],
"dome/system": [ "src/dome/misc/system.js" ],
"dome/devtools": [ "src/dome/misc/devtools.js" ],
"dome/misc/*": [ "src/dome/misc/*"],
"dome/*": [ "src/dome/renderer/*" ],
"codemirror/lib/codemirror": ["node_modules/@types/codemirror/index.d.ts"],
},
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
......@@ -104,9 +104,9 @@
"src/frama-c/states.ts",
"src/frama-c/utils.ts",
"api/generated",
"src/dome/src/renderer",
"src/dome/src/misc/utils.ts",
"src/dome/src/misc/system.ts",
"src/dome/renderer",
"src/dome/misc/utils.ts",
"src/dome/misc/system.ts",
]
}
}
......@@ -21,7 +21,7 @@ function domeDevtools() {
case 'dev':
return 'electron-devtools-installer';
default:
return path.resolve( DOME , 'src/misc/devtools.js' );
return path.resolve( DOME , 'misc/devtools.js' );
}
}
......@@ -37,8 +37,8 @@ module.exports = {
resolve: {
extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
alias: {
'dome$': path.resolve( DOME , 'src/main/dome.ts' ),
'dome/system$': path.resolve( DOME , 'src/misc/system.ts' ),
'dome$': path.resolve( DOME , 'main/dome.ts' ),
'dome/system$': path.resolve( DOME , 'misc/system.ts' ),
'dome/devtools': domeDevtools()
}
}
......
// --------------------------------------------------------------------------
// --- Webpack configuration for packing plugins
// --------------------------------------------------------------------------
/*
Template of ./webpack.plugin.js from $(DOME)/template/webpack.plugin.js
This webpack definitions will be used to make plugin bundles.
You may extend it with your own additions.
*/
const path = require('path');
const DOME = process.env.DOME || path.resolve( __dirname , 'dome' );
const PLUGIN = process.env.DOME_PLUGIN ;
const ENTRY = path.resolve( __dirname , 'src/plugins' , PLUGIN );
const DIST = path.resolve( __dirname , 'dist/plugins' , PLUGIN );
module.exports = {
entry: ENTRY,
output: {
path: DIST,
filename: 'bundle.js',
libraryTarget: 'commonjs2'
},
module: {
rules: [
{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
{ test: /\.js$/, use: [ 'babel-loader' ], exclude: /(node_modules)/ }
]
},
externals: [
'lodash',
'react',
/^dome\/.+$/,
/^@plugins\/.+$/,
/^@\/.+$/
]
};
// --------------------------------------------------------------------------
......@@ -29,11 +29,10 @@ module.exports = {
alias: {
'frama-c/api': path.resolve( __dirname , 'api/generated' ),
'frama-c': path.resolve( __dirname , 'src/frama-c' ),
'@plugins': path.resolve( __dirname , 'src/plugins' ),
'dome/misc': path.resolve( DOME , 'src/misc' ),
'dome/system': path.resolve( DOME , 'src/misc/system.ts' ),
'dome$': path.resolve( DOME , 'src/renderer/dome.tsx' ),
'dome': path.resolve( DOME , 'src/renderer' ),
'dome/misc': path.resolve( DOME , 'misc' ),
'dome/system': path.resolve( DOME , 'misc/system.ts' ),
'dome$': path.resolve( DOME , 'renderer/dome.tsx' ),
'dome': path.resolve( DOME , 'renderer' ),
'react-dom': '@hot-loader/react-dom'
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment