From 810a1e59fb255f679ffdb7c370c4fe1fdf874ddf Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 2 Sep 2016 15:36:11 -0400 Subject: [PATCH] Remove more of the Makefile --- Makefile | 31 +------ build.js | 211 ++++++++++++++++++++++-------------------- development_server.js | 83 +++++++++++------ package.json | 8 +- 4 files changed, 172 insertions(+), 161 deletions(-) diff --git a/Makefile b/Makefile index 91f1fdf81..034dbc637 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/build.js b/build.js index 67758e066..41edf67d2 100644 --- a/build.js +++ b/build.js @@ -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 = ""; + preset.terms = ''; }); - 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, '#'); +} diff --git a/development_server.js b/development_server.js index 635584553..bb2b9220b 100644 --- a/development_server.js +++ b/development_server.js @@ -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); + }); +} + diff --git a/package.json b/package.json index 1ee030571..d5d59c125 100644 --- a/package.json +++ b/package.json @@ -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",