diff --git a/Makefile b/Makefile index 79e6c90f71..730b781666 100644 --- a/Makefile +++ b/Makefile @@ -302,11 +302,13 @@ build/test_rendering_requires.js: $(SPEC_RENDERING_JS) %shader.js: %shader.glsl src/ol/webgl/shader.mustache bin/pyglslunit.py build/timestamps/node-modules-timestamp @python bin/pyglslunit.py --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shader.mustache > $@ +build/defines.json: src/ol/index.js build/timestamps/node-modules-timestamp + @node tasks/generate-defines.js + .PHONY: package -package: build/timestamps/node-modules-timestamp +package: build/defines.json @rm -rf build/package - @mkdir -p build - @node tasks/generate-info.js + @node tasks/generate-defines.js @cp -r package build @cd ./src && cp -r ol/* ../build/package @rm build/package/typedefs.js diff --git a/package.json b/package.json index e17a60c5ce..5e6022e939 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "eslint": "3.14.1", "eslint-config-openlayers": "7.0.0", "eslint-plugin-openlayers-internal": "^3.1.0", + "esprima": "2.x", "expect.js": "0.3.1", "gaze": "^1.0.0", "istanbul": "0.4.5", diff --git a/package/package.json b/package/package.json index 2185469324..5575d9a321 100644 --- a/package/package.json +++ b/package/package.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "3.21.0-beta.6", + "version": "3.21.0-beta.8", "description": "OpenLayers", "main": "index.js", "module": "index.js", diff --git a/package/readme.md b/package/readme.md index eaec0eb92b..cba32e5f66 100644 --- a/package/readme.md +++ b/package/readme.md @@ -10,13 +10,13 @@ Add the `ol` package as a dependency to your project. npm install ol@beta --save -Require just what you need for your application: +Import just what you need for your application: ```js -var OLMap = require('ol/Map'); -var View = require('ol/View'); -var TileLayer = require('ol/layer/Tile'); -var OSM = require('ol/source/OSM'); +import Map from 'ol/Map'; +import View from 'ol/View'; +import TileLayer from 'ol/layer/Tile'; +import OSM from 'ol/source/OSM'; var map = new OLMap({ target: 'map', diff --git a/tasks/generate-defines.js b/tasks/generate-defines.js new file mode 100644 index 0000000000..3b1bd8af6b --- /dev/null +++ b/tasks/generate-defines.js @@ -0,0 +1,31 @@ +var fs = require('fs'); +var path = require('path'); +var esprima = require('esprima'); + +var mainPath = path.join(__dirname, '..', 'src', 'ol', 'index.js'); +var mainSource = fs.readFileSync(mainPath, 'utf8'); +var definesPath = path.join(__dirname, '..', 'build', 'defines.json'); + +function isDefineLikeStatement(statement) { + return statement.type === 'ExpressionStatement' && + statement.expression && statement.expression.type === 'AssignmentExpression' && + statement.expression.left.type === 'MemberExpression' && + statement.expression.right.type === 'Literal' && + statement.leadingComments; +} + +var ast = esprima.parse(mainSource, {attachComment: true}); +var defines = {}; +ast.body.forEach(function(statement) { + if (isDefineLikeStatement(statement)) { + var comment = statement.leadingComments[statement.leadingComments.length - 1].value; + if (comment.indexOf('* @define {') >= 0) { + var expression = statement.expression; + var name = expression.left.object.name + '.' + expression.left.property.name; + var value = expression.right.value; + defines[name] = value; + } + } +}); + +fs.writeFileSync(definesPath, JSON.stringify(defines, null, 2)); diff --git a/transforms/module.js b/transforms/module.js index 3383c9e299..5acf4d396d 100644 --- a/transforms/module.js +++ b/transforms/module.js @@ -1,8 +1,5 @@ const pkg = require('../package.json'); -const defines = require('../build/info.json').defines; - -const defineLookup = {}; -defines.forEach(define => defineLookup[define.name] = define); +const defineLookup = require('../build/defines.json'); function rename(name) { const parts = name.split('.'); @@ -134,7 +131,7 @@ module.exports = function(info, api) { const replacements = {}; - // replace assignments for boolean defines (e.g. ol.FOO = true -> window.OL_FOO = true) + // replace assignments defines (e.g. ol.FOO = true -> window.OL_FOO = true) root.find(j.ExpressionStatement, defineStatement) .filter(path => { const expression = path.value.expression; @@ -145,14 +142,17 @@ module.exports = function(info, api) { const expression = path.value.expression; const defineName = `${expression.left.object.name}.${expression.left.property.name}`; const comments = path.value.comments; - const statement = j.variableDeclaration('var', [ - j.variableDeclarator(j.identifier(renameDefine(defineName)), j.literal(expression.right.value)) - ]); + const statement = j.expressionStatement( + j.assignmentExpression('=', + j.memberExpression(j.identifier('window'), j.identifier(renameDefine(defineName))), + j.literal(expression.right.value) + ) + ); statement.comments = comments; return statement; }); - // replace all uses of boolean defines with renamed define + // replace all uses of defines with renamed define root.find(j.MemberExpression, defineMemberExpression) .filter(path => { const node = path.value; @@ -160,7 +160,8 @@ module.exports = function(info, api) { return defineName in defineLookup; }) .replaceWith(path => { - return j.identifier(renameDefine(`${path.value.object.name}.${path.value.property.name}`)); + const defineName = `${path.value.object.name}.${path.value.property.name}`; + return j.memberExpression(j.identifier('window'), j.identifier(renameDefine(defineName))); }); // replace goog.provide()