Remove more of the Makefile

This commit is contained in:
Bryan Housel
2016-09-02 15:36:11 -04:00
parent 1727e9355b
commit 810a1e59fb
4 changed files with 172 additions and 161 deletions

View File

@@ -1,10 +1,5 @@
# See the README for installation instructions.
all: \
$(BUILDJS_TARGETS) \
dist/iD.css \
dist/iD.js \
dist/iD.min.js \
dist/img/iD-sprite.svg \
dist/img/maki-sprite.svg
@@ -16,30 +11,6 @@ dist/img/maki-sprite.svg: $(MAKI_SOURCES) Makefile
dist/img/iD-sprite.svg: svg/iD-sprite.src.svg svg/iD-sprite.json
node svg/spriteify.js --svg svg/iD-sprite.src.svg --json svg/iD-sprite.json > $@
BUILDJS_TARGETS = \
data/presets/categories.json \
data/presets/fields.json \
data/presets/presets.json \
data/presets.yaml \
data/taginfo.json \
data/data.js \
dist/locales/en.js \
dist/presets.js \
dist/imagery.js \
BUILDJS_SOURCES = \
data/core.yaml
$(BUILDJS_TARGETS): $(BUILDJS_SOURCES) build.js
node build.js
dist/iD.js: $(BUILDJS_TARGETS)
npm run build
dist/iD.min.js: dist/iD.js Makefile
@rm -f $@
node_modules/.bin/uglifyjs $< -c -m -o $@
dist/iD.css: css/*.css
cat css/reset.css css/map.css css/app.css > $@
@@ -50,4 +21,4 @@ imagery:
node data/update_imagery
clean:
rm -f $(BUILDJS_TARGETS) data/feature-icons.json dist/iD*.js dist/iD.css dist/img/*.svg
rm -f dist/*.js dist/*.map dist/*.css dist/img/*.svg

211
build.js
View File

@@ -1,29 +1,69 @@
var fs = require('fs'),
path = require('path'),
glob = require('glob'),
YAML = require('js-yaml'),
_ = require('lodash'),
jsonschema = require('jsonschema'),
fieldSchema = require('./data/presets/schema/field.json'),
presetSchema = require('./data/presets/schema/preset.json'),
suggestions = require('name-suggestion-index/name-suggestions.json');
/* eslint-disable no-console */
function readtxt(f) {
return fs.readFileSync(f, 'utf8');
var _ = require('lodash');
var fs = require('fs');
var path = require('path');
var glob = require('glob');
var YAML = require('js-yaml');
var jsonschema = require('jsonschema');
var fieldSchema = require('./data/presets/schema/field.json');
var presetSchema = require('./data/presets/schema/preset.json');
var suggestions = require('name-suggestion-index/name-suggestions.json');
// Translation strings
var tstrings = {
categories: {},
fields: {},
presets: {}
};
// Start clean
unlink('data/presets/categories.json');
unlink('data/presets/fields.json');
unlink('data/presets/presets.json');
unlink('data/presets.yaml');
unlink('data/taginfo.json');
unlink('dist/locales/en.json');
var categories = generateCategories();
var fields = generateFields();
var presets = generatePresets();
var translations = generateTranslations(fields, presets);
var taginfo = generateTaginfo(presets);
// Additional consistency checks
validateCategoryPresets(categories, presets);
validatePresetFields(presets, fields);
// Save individual data files
fs.writeFileSync('data/presets/categories.json', JSON.stringify(categories, null, 4));
fs.writeFileSync('data/presets/fields.json', JSON.stringify(fields, null, 4));
fs.writeFileSync('data/presets/presets.json', JSON.stringify(presets, null, 4));
fs.writeFileSync('data/presets.yaml', translationsToYAML(translations));
fs.writeFileSync('data/taginfo.json', JSON.stringify(taginfo, null, 4));
// Push changes from data/core.yaml into en.json
var core = YAML.load(fs.readFileSync('data/core.yaml', 'utf8'));
var en = _.merge(core, { en: { presets: tstrings }});
fs.writeFileSync('dist/locales/en.json', JSON.stringify(en.en, null, 4));
process.exit();
function unlink(f) {
try { fs.unlinkSync(f); } catch (e) { /* noop */ }
}
function read(f) {
return JSON.parse(readtxt(f));
}
function r(f) {
return read(__dirname + '/data/' + f);
return JSON.parse(fs.readFileSync(f, 'utf8'));
}
function validate(file, instance, schema) {
var validationErrors = jsonschema.validate(instance, schema).errors;
if (validationErrors.length) {
console.error(file + ": ");
console.error(file + ': ');
validationErrors.forEach(function(error) {
if (error.property) {
console.error(error.property + ' ' + error.message);
@@ -35,19 +75,13 @@ function validate(file, instance, schema) {
}
}
var translations = {
categories: {},
fields: {},
presets: {}
};
function generateCategories() {
var categories = {};
glob.sync(__dirname + '/data/presets/categories/*.json').forEach(function(file) {
var field = read(file),
id = 'category-' + path.basename(file, '.json');
translations.categories[id] = {name: field.name};
tstrings.categories[id] = {name: field.name};
categories[id] = field;
});
@@ -62,7 +96,7 @@ function generateFields() {
validate(file, field, fieldSchema);
var t = translations.fields[id] = {
var t = tstrings.fields[id] = {
label: field.label
};
@@ -143,7 +177,7 @@ function generatePresets() {
validate(file, preset, presetSchema);
translations.presets[id] = {
tstrings.presets[id] = {
name: preset.name,
terms: (preset.terms || []).join(',')
};
@@ -155,10 +189,10 @@ function generatePresets() {
}
function generateTranslate(fields, presets) {
var translate = _.cloneDeep(translations);
function generateTranslations(fields, presets) {
var translations = _.cloneDeep(tstrings);
_.forEach(translate.fields, function(field, id) {
_.forEach(translations.fields, function(field, id) {
var f = fields[id];
if (f.keys) {
field['label#'] = _.each(f.keys).map(function(key) { return key + '=*'; }).join(', ');
@@ -185,16 +219,54 @@ function generateTranslate(fields, presets) {
}
});
_.forEach(translate.presets, function(preset, id) {
_.forEach(translations.presets, function(preset, id) {
var p = presets[id];
if (!_.isEmpty(p.tags))
preset['name#'] = _.toPairs(p.tags).map(function(pair) { return pair[0] + '=' + pair[1]; }).join(', ');
if (p.terms && p.terms.length)
preset['terms#'] = 'terms: ' + p.terms.join();
preset.terms = "<translate with synonyms or related terms for '" + preset.name + "', separated by commas>";
preset.terms = '<translate with synonyms or related terms for \'' + preset.name + '\', separated by commas>';
});
return translate;
return translations;
}
function generateTaginfo(presets) {
var taginfo = {
'data_format': 1,
'data_url': 'https://raw.githubusercontent.com/openstreetmap/iD/master/data/taginfo.json',
'project': {
'name': 'iD Editor',
'description': 'Online editor for OSM data.',
'project_url': 'https://github.com/openstreetmap/iD',
'doc_url': 'https://github.com/openstreetmap/iD/blob/master/data/presets/README.md',
'icon_url': 'https://raw.githubusercontent.com/openstreetmap/iD/master/dist/img/logo.png',
'keywords': [
'editor'
]
},
'tags': []
};
_.forEach(presets, function(preset) {
if (preset.suggestion)
return;
var keys = Object.keys(preset.tags),
last = keys[keys.length - 1],
tag = { key: last };
if (!last)
return;
if (preset.tags[last] !== '*') {
tag.value = preset.tags[last];
}
taginfo.tags.push(tag);
});
return taginfo;
}
function validateCategoryPresets(categories, presets) {
@@ -223,71 +295,14 @@ function validatePresetFields(presets, fields) {
});
}
// comment keys end with '#' and should sort immediately before their related key.
function sortKeys(a, b) {
return (a === b + '#') ? -1
: (b === a + '#') ? 1
: (a > b ? 1 : a < b ? -1 : 0);
}
var categories = generateCategories(),
fields = generateFields(),
presets = generatePresets(),
translate = generateTranslate(fields, presets);
// additional consistency checks
validateCategoryPresets(categories, presets);
validatePresetFields(presets, fields);
// Save individual data files
fs.writeFileSync('data/presets/categories.json', JSON.stringify(categories, null, 4));
fs.writeFileSync('data/presets/fields.json', JSON.stringify(fields, null, 4));
fs.writeFileSync('data/presets/presets.json', JSON.stringify(presets, null, 4));
fs.writeFileSync('data/presets.yaml',
YAML.safeDump({en: {presets: translate}}, {sortKeys: sortKeys, lineWidth: -1})
.replace(/\'.*#\':/g, '#')
);
// Write taginfo data
var taginfo = {
"data_format": 1,
"data_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/data/taginfo.json",
"project": {
"name": "iD Editor",
"description": "Online editor for OSM data.",
"project_url": "https://github.com/openstreetmap/iD",
"doc_url": "https://github.com/openstreetmap/iD/blob/master/data/presets/README.md",
"icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/dist/img/logo.png",
"keywords": [
"editor"
]
},
"tags": []
};
_.forEach(presets, function(preset) {
if (preset.suggestion)
return;
var keys = Object.keys(preset.tags),
last = keys[keys.length - 1],
tag = {key: last};
if (!last)
return;
if (preset.tags[last] !== '*') {
tag.value = preset.tags[last];
function translationsToYAML(translations) {
// comment keys end with '#' and should sort immediately before their related key.
function commentFirst(a, b) {
return (a === b + '#') ? -1
: (b === a + '#') ? 1
: (a > b ? 1 : a < b ? -1 : 0);
}
taginfo.tags.push(tag);
});
fs.writeFileSync('data/taginfo.json', JSON.stringify(taginfo, null, 4));
// Push changes from data/core.yaml into en.json
var core = YAML.load(fs.readFileSync('data/core.yaml', 'utf8'));
var presets = {en: {presets: translations}};
var en = _.merge(core, presets);
fs.writeFileSync('dist/locales/en.json', JSON.stringify(en.en, null, 4));
return YAML.safeDump({ en: { presets: translations }}, { sortKeys: commentFirst, lineWidth: -1 })
.replace(/\'.*#\':/g, '#');
}

View File

@@ -1,4 +1,7 @@
var rollup = require( 'rollup' );
/* eslint-disable no-console */
var fs = require('fs');
var rollup = require('rollup');
var nodeResolve = require('rollup-plugin-node-resolve');
var commonjs = require('rollup-plugin-commonjs');
var json = require('rollup-plugin-json');
@@ -9,45 +12,67 @@ var ecstatic = require('ecstatic');
var cache;
var building = false;
function build() {
if (building) return;
building = true;
console.log('Rebuilding');
console.time('Rebuilt');
rollup.rollup({
entry: './modules/id.js',
cache: cache,
plugins: [
nodeResolve({ jsnext: true, main: true, browser: false }),
commonjs(),
json()
]
}).then(function (bundle) {
console.timeEnd('Rebuilt');
cache = bundle;
bundle.write({
format: 'iife',
dest: 'dist/iD.js',
sourceMap: true
});
building = false;
}, function(err) {
building = false;
console.error(err);
});
}
if (process.argv[2] === 'develop') {
build();
gaze('modules/**/**.js', function(err, watcher) {
watcher.on('all', function() {
build();
});
});
http.createServer(
ecstatic({ root: __dirname })
ecstatic({ root: __dirname })
).listen(8080);
console.log('Listening on :8080');
} else {
build();
}
function unlink(f) {
try { fs.unlinkSync(f); } catch (e) { /* noop */ }
}
function build() {
if (building) return;
// Start clean
unlink('dist/iD.js');
unlink('dist/iD.js.map');
building = true;
console.log('Rebuilding');
console.time('Rebuilt');
rollup.rollup({
entry: './modules/id.js',
cache: cache,
plugins: [
nodeResolve({
jsnext: true, main: true, browser: false
}),
commonjs(),
json()
]
}).then(function (bundle) {
console.timeEnd('Rebuilt');
cache = bundle;
bundle.write({
format: 'iife',
dest: 'dist/iD.js',
sourceMap: true
});
building = false;
}, function(err) {
building = false;
console.error(err);
});
}

View File

@@ -8,11 +8,11 @@
"test": "test"
},
"scripts": {
"test": "npm run lint && make && phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/index.html spec",
"start": "node development_server.js develop",
"build": "node build.js && node development_server.js",
"build-min": "npm run build && uglifyjs dist/iD.js -c -m -o dist/iD.min.js",
"build": "node development_server.js",
"lint": "eslint js/id test/spec modules"
"lint": "eslint *.js js/id test/spec modules",
"start": "node development_server.js develop",
"test": "npm run lint && make && phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/index.html spec"
},
"repository": {
"type": "git",