Transform all defines

This commit is contained in:
Tim Schaub
2016-12-26 10:47:26 -07:00
parent b73ab8914a
commit b2a4b69d13
6 changed files with 54 additions and 19 deletions

View File

@@ -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 %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 > $@ @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 .PHONY: package
package: build/timestamps/node-modules-timestamp package: build/defines.json
@rm -rf build/package @rm -rf build/package
@mkdir -p build @node tasks/generate-defines.js
@node tasks/generate-info.js
@cp -r package build @cp -r package build
@cd ./src && cp -r ol/* ../build/package @cd ./src && cp -r ol/* ../build/package
@rm build/package/typedefs.js @rm build/package/typedefs.js

View File

@@ -56,6 +56,7 @@
"eslint": "3.14.1", "eslint": "3.14.1",
"eslint-config-openlayers": "7.0.0", "eslint-config-openlayers": "7.0.0",
"eslint-plugin-openlayers-internal": "^3.1.0", "eslint-plugin-openlayers-internal": "^3.1.0",
"esprima": "2.x",
"expect.js": "0.3.1", "expect.js": "0.3.1",
"gaze": "^1.0.0", "gaze": "^1.0.0",
"istanbul": "0.4.5", "istanbul": "0.4.5",

View File

@@ -1,6 +1,6 @@
{ {
"name": "ol", "name": "ol",
"version": "3.21.0-beta.6", "version": "3.21.0-beta.8",
"description": "OpenLayers", "description": "OpenLayers",
"main": "index.js", "main": "index.js",
"module": "index.js", "module": "index.js",

View File

@@ -10,13 +10,13 @@ Add the `ol` package as a dependency to your project.
npm install ol@beta --save npm install ol@beta --save
Require just what you need for your application: Import just what you need for your application:
```js ```js
var OLMap = require('ol/Map'); import Map from 'ol/Map';
var View = require('ol/View'); import View from 'ol/View';
var TileLayer = require('ol/layer/Tile'); import TileLayer from 'ol/layer/Tile';
var OSM = require('ol/source/OSM'); import OSM from 'ol/source/OSM';
var map = new OLMap({ var map = new OLMap({
target: 'map', target: 'map',

31
tasks/generate-defines.js Normal file
View File

@@ -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));

View File

@@ -1,8 +1,5 @@
const pkg = require('../package.json'); const pkg = require('../package.json');
const defines = require('../build/info.json').defines; const defineLookup = require('../build/defines.json');
const defineLookup = {};
defines.forEach(define => defineLookup[define.name] = define);
function rename(name) { function rename(name) {
const parts = name.split('.'); const parts = name.split('.');
@@ -134,7 +131,7 @@ module.exports = function(info, api) {
const replacements = {}; 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) root.find(j.ExpressionStatement, defineStatement)
.filter(path => { .filter(path => {
const expression = path.value.expression; const expression = path.value.expression;
@@ -145,14 +142,17 @@ module.exports = function(info, api) {
const expression = path.value.expression; const expression = path.value.expression;
const defineName = `${expression.left.object.name}.${expression.left.property.name}`; const defineName = `${expression.left.object.name}.${expression.left.property.name}`;
const comments = path.value.comments; const comments = path.value.comments;
const statement = j.variableDeclaration('var', [ const statement = j.expressionStatement(
j.variableDeclarator(j.identifier(renameDefine(defineName)), j.literal(expression.right.value)) j.assignmentExpression('=',
]); j.memberExpression(j.identifier('window'), j.identifier(renameDefine(defineName))),
j.literal(expression.right.value)
)
);
statement.comments = comments; statement.comments = comments;
return statement; return statement;
}); });
// replace all uses of boolean defines with renamed define // replace all uses of defines with renamed define
root.find(j.MemberExpression, defineMemberExpression) root.find(j.MemberExpression, defineMemberExpression)
.filter(path => { .filter(path => {
const node = path.value; const node = path.value;
@@ -160,7 +160,8 @@ module.exports = function(info, api) {
return defineName in defineLookup; return defineName in defineLookup;
}) })
.replaceWith(path => { .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() // replace goog.provide()