Added logging, changed some directory structure

This commit is contained in:
2018-01-13 21:33:40 -05:00
parent f079a5f067
commit 8e72ffb917
73656 changed files with 35284 additions and 53718 deletions

View File

@@ -0,0 +1,73 @@
# Change Log
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased][unreleased]
### Changed
- Nothing yet.
## [0.0.11] - 2015-07-19
### Fixed
- Localisation of animation properties.
## [0.0.10] - 2015-06-17
### Added
- Localised at-rules.
## [0.0.9] - 2015-06-12
### Changed
- Using global selectors outside of a global context no longer triggers warnings. Instead, this functionality will be provided by a CSS Modules linter.
### Fixed
- Keyframe rules.
## [0.0.8] - 2015-06-11
### Added
- Pure mode where only local scope is allowed.
### Changed
- Using global selectors outside of a global context now triggers warnings.
## [0.0.7] - 2015-05-30
### Changed
- Migrated to `css-selector-tokenizer`.
## [0.0.6] - 2015-05-28
### Changed
- Renamed project to `postcss-modules-local-by-default`.
## [0.0.5] - 2015-05-22
### Added
- Support for css-loader [inheritance](https://github.com/webpack/css-loader#inheriting) and [local imports](https://github.com/webpack/css-loader#importing-local-class-names).
## [0.0.4] - 2015-05-22
### Changed
- Hide global leak detection behind undocumented `lint` option until it's more robust.
## [0.0.3] - 2015-05-22
### Changed
- Transformer output now uses the new `:local(.identifier)` syntax.
### Added
- Simple global leak detection. Non-local selectors like `input{}` and `[data-foobar]` now throw when not marked as global.
## [0.0.2] - 2015-05-14
### Added
- Support for global selectors appended directly to locals, e.g. `.foo:global(.bar)`
## 0.0.1 - 2015-05-12
### Added
- Automatic local classes
- Explicit global selectors with `:global`
[unreleased]: https://github.com/postcss-modules-local-by-default/compare/v0.0.10...HEAD
[0.0.2]: https://github.com/postcss-modules-local-by-default/compare/v0.0.1...v0.0.2
[0.0.3]: https://github.com/postcss-modules-local-by-default/compare/v0.0.2...v0.0.3
[0.0.4]: https://github.com/postcss-modules-local-by-default/compare/v0.0.3...v0.0.4
[0.0.5]: https://github.com/postcss-modules-local-by-default/compare/v0.0.4...v0.0.5
[0.0.6]: https://github.com/postcss-modules-local-by-default/compare/v0.0.5...v0.0.6
[0.0.7]: https://github.com/postcss-modules-local-by-default/compare/v0.0.6...v0.0.7
[0.0.8]: https://github.com/postcss-modules-local-by-default/compare/v0.0.7...v0.0.8
[0.0.9]: https://github.com/postcss-modules-local-by-default/compare/v0.0.8...v0.0.9
[0.0.10]: https://github.com/postcss-modules-local-by-default/compare/v0.0.9...v0.0.10
[0.0.11]: https://github.com/postcss-modules-local-by-default/compare/v0.0.10...v0.0.11

View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright 2015 Mark Dalgleish <mark.john.dalgleish@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,65 @@
[![Build Status][ci-img]][ci] [![codecov][codecov-img]][codecov] [![npm][npm-img]][npm]
# CSS Modules: Local by Default
Transformation examples:
```css
.foo { ... } /* => */ :local(.foo) { ... }
.foo .bar { ... } /* => */ :local(.foo) :local(.bar) { ... }
/* Shorthand global selector */
:global .foo .bar { ... } /* => */ .foo .bar { ... }
.foo :global .bar { ... } /* => */ :local(.foo) .bar { ... }
/* Targeted global selector */
:global(.foo) .bar { ... } /* => */ .foo :local(.bar) { ... }
.foo:global(.bar) { ... } /* => */ :local(.foo).bar { ... }
.foo :global(.bar) .baz { ... } /* => */ :local(.foo) .bar :local(.baz) { ... }
.foo:global(.bar) .baz { ... } /* => */ :local(.foo).bar :local(.baz) { ... }
```
## Building
```bash
$ npm install
$ npm test
```
- Build: [![Build Status][ci-img]][ci]
- Lines: [![coveralls][coveralls-img]][coveralls]
- Statements: [![codecov][codecov-img]][codecov]
## Development
```bash
$ npm run autotest
```
## License
MIT
## With thanks
- [Tobias Koppers](https://github.com/sokra)
- [Glen Maddern](https://github.com/geelen)
---
Mark Dalgleish, 2015.
[ci-img]: https://img.shields.io/travis/css-modules/postcss-modules-local-by-default/master.svg?style=flat-square
[ci]: https://travis-ci.org/css-modules/postcss-modules-local-by-default
[npm-img]: https://img.shields.io/npm/v/postcss-modules-local-by-default.svg?style=flat-square
[npm]: https://www.npmjs.com/package/postcss-modules-local-by-default
[coveralls-img]: https://img.shields.io/coveralls/css-modules/postcss-modules-local-by-default/master.svg?style=flat-square
[coveralls]: https://coveralls.io/r/css-modules/postcss-modules-local-by-default?branch=master
[codecov-img]: https://img.shields.io/codecov/c/github/css-modules/postcss-modules-local-by-default/master.svg?style=flat-square
[codecov]: https://codecov.io/github/css-modules/postcss-modules-local-by-default?branch=master

View File

@@ -0,0 +1,364 @@
var postcss = require('postcss');
var Tokenizer = require('css-selector-tokenizer');
function normalizeNodeArray(nodes) {
var array = [];
nodes.forEach(function(x) {
if(Array.isArray(x)) {
normalizeNodeArray(x).forEach(function(item) {
array.push(item);
});
} else if(x) {
array.push(x);
}
});
if(array.length > 0 && array[array.length - 1].type === 'spacing') {
array.pop();
}
return array;
}
function localizeNode(node, context) {
if(context.ignoreNextSpacing && node.type !== 'spacing') {
throw new Error('Missing whitespace after :' + context.ignoreNextSpacing);
}
if(context.enforceNoSpacing && node.type === 'spacing') {
throw new Error('Missing whitespace before :' + context.enforceNoSpacing);
}
var newNodes;
switch(node.type) {
case 'selectors':
var resultingGlobal;
context.hasPureGlobals = false;
newNodes = node.nodes.map(function(n) {
var nContext = {
global: context.global,
lastWasSpacing: true,
hasLocals: false,
explicit: false
};
n = localizeNode(n, nContext);
if(typeof resultingGlobal === 'undefined') {
resultingGlobal = nContext.global;
} else if(resultingGlobal !== nContext.global) {
throw new Error('Inconsistent rule global/local result in rule "' +
Tokenizer.stringify(node) + '" (multiple selectors must result in the same mode for the rule)');
}
if(!nContext.hasLocals) {
context.hasPureGlobals = true;
}
return n;
});
context.global = resultingGlobal;
node = Object.create(node);
node.nodes = normalizeNodeArray(newNodes);
break;
case 'selector':
newNodes = node.nodes.map(function(n) {
return localizeNode(n, context);
});
node = Object.create(node);
node.nodes = normalizeNodeArray(newNodes);
break;
case 'spacing':
if(context.ignoreNextSpacing) {
context.ignoreNextSpacing = false;
context.lastWasSpacing = false;
context.enforceNoSpacing = false;
return null;
}
context.lastWasSpacing = true;
return node;
case 'pseudo-class':
if(node.name === 'local' || node.name === 'global') {
if(context.inside) {
throw new Error('A :' + node.name + ' is not allowed inside of a :' + context.inside + '(...)');
}
context.ignoreNextSpacing = context.lastWasSpacing ? node.name : false;
context.enforceNoSpacing = context.lastWasSpacing ? false : node.name;
context.global = (node.name === 'global');
context.explicit = true;
return null;
}
break;
case 'nested-pseudo-class':
var subContext;
if(node.name === 'local' || node.name === 'global') {
if(context.inside) {
throw new Error('A :' + node.name + '(...) is not allowed inside of a :' + context.inside + '(...)');
}
subContext = {
global: (node.name === 'global'),
inside: node.name,
hasLocals: false,
explicit: true
};
node = node.nodes.map(function(n) {
return localizeNode(n, subContext);
});
// don't leak spacing
node[0].before = undefined;
node[node.length - 1].after = undefined;
} else {
subContext = {
global: context.global,
inside: context.inside,
lastWasSpacing: true,
hasLocals: false,
explicit: context.explicit
};
newNodes = node.nodes.map(function(n) {
return localizeNode(n, subContext);
});
node = Object.create(node);
node.nodes = normalizeNodeArray(newNodes);
}
if(subContext.hasLocals) {
context.hasLocals = true;
}
break;
case 'id':
case 'class':
if(!context.global) {
node = {
type: 'nested-pseudo-class',
name: 'local',
nodes: [node]
};
context.hasLocals = true;
}
break;
}
// reset context
context.lastWasSpacing = false;
context.ignoreNextSpacing = false;
context.enforceNoSpacing = false;
return node;
}
function localizeDeclNode(node, context) {
var newNode;
switch(node.type) {
case 'item':
if(context.localizeNextItem) {
newNode = Object.create(node);
newNode.name = ':local(' + newNode.name + ')';
context.localizeNextItem = false;
return newNode;
}
break;
case 'nested-item':
var newNodes = node.nodes.map(function(n) {
return localizeDeclValue(n, context);
});
node = Object.create(node);
node.nodes = newNodes;
break;
case 'url':
if(context.options && context.options.rewriteUrl) {
newNode = Object.create(node);
newNode.url = context.options.rewriteUrl(context.global, node.url);
return newNode;
}
break;
}
return node;
}
function localizeDeclValue(valueNode, context) {
var newValueNode = Object.create(valueNode);
newValueNode.nodes = valueNode.nodes.map(function(node) {
return localizeDeclNode(node, context);
});
return newValueNode;
}
function localizeAnimationShorthandDeclValueNodes(nodes, context) {
var validIdent = validIdent = /^-?[_a-z][_a-z0-9-]*$/i;
/*
The spec defines some keywords that you can use to describe properties such as the timing
function. These are still valid animation names, so as long as there is a property that accepts
a keyword, it is given priority. Only when all the properties that can take a keyword are
exhausted can the animation name be set to the keyword. I.e.
animation: infinite infinite;
The animation will repeat an infinite number of times from the first argument, and will have an
animation name of infinite from the second.
*/
var animationKeywords = {
'$alternate': 1,
'$alternate-reverse': 1,
'$backwards': 1,
'$both': 1,
'$ease': 1,
'$ease-in': 1,
'$ease-in-out': 1,
'$ease-out': 1,
'$forwards': 1,
'$infinite': 1,
'$linear': 1,
'$none': Infinity, // No matter how many times you write none, it will never be an animation name
'$normal': 1,
'$paused': 1,
'$reverse': 1,
'$running': 1,
'$step-end': 1,
'$step-start': 1,
'$initial': Infinity,
'$inherit': Infinity,
'$unset': Infinity,
};
var didParseAnimationName = false;
var parsedAnimationKeywords = {};
return nodes.map(function(valueNode) {
var value = valueNode.type === 'item'
? valueNode.name.toLowerCase()
: null;
var shouldParseAnimationName = false;
if (!didParseAnimationName && value && validIdent.test(value)) {
if ('$' + value in animationKeywords) {
parsedAnimationKeywords['$' + value] = ('$' + value in parsedAnimationKeywords)
? (parsedAnimationKeywords['$' + value] + 1)
: 0;
shouldParseAnimationName = (parsedAnimationKeywords['$' + value] >= animationKeywords['$' + value]);
} else {
shouldParseAnimationName = true;
}
}
var subContext = {
options: context.options,
global: context.global,
localizeNextItem: shouldParseAnimationName && !context.global
};
return localizeDeclNode(valueNode, subContext);
});
}
function localizeAnimationShorthandDeclValues(valuesNode, decl, context) {
var newValuesNode = Object.create(valuesNode);
newValuesNode.nodes = valuesNode.nodes.map(function(valueNode, index) {
var newValueNode = Object.create(valueNode);
newValueNode.nodes = localizeAnimationShorthandDeclValueNodes(valueNode.nodes, context);
return newValueNode;
});
decl.value = Tokenizer.stringifyValues(newValuesNode);
}
function localizeDeclValues(localize, valuesNode, decl, context) {
var newValuesNode = Object.create(valuesNode);
newValuesNode.nodes = valuesNode.nodes.map(function(valueNode) {
var subContext = {
options: context.options,
global: context.global,
localizeNextItem: localize && !context.global
};
return localizeDeclValue(valueNode, subContext);
});
decl.value = Tokenizer.stringifyValues(newValuesNode);
}
function localizeDecl(decl, context) {
var valuesNode = Tokenizer.parseValues(decl.value);
var isAnimation = /animation?$/.test(decl.prop);
if (isAnimation) return localizeAnimationShorthandDeclValues(valuesNode, decl, context);
var isAnimationName = /animation(-name)?$/.test(decl.prop);
if (isAnimationName) return localizeDeclValues(true, valuesNode, decl, context);
return localizeDeclValues(false, valuesNode, decl, context);
}
module.exports = postcss.plugin('postcss-modules-local-by-default', function (options) {
if (typeof options !== 'object') {
options = {}; // If options is undefined or not an object the plugin fails
}
if(options && options.mode) {
if(options.mode !== 'global' && options.mode !== 'local' && options.mode !== 'pure') {
throw new Error('options.mode must be either "global", "local" or "pure" (default "local")');
}
}
var pureMode = options && options.mode === 'pure';
var globalMode = options && options.mode === 'global';
return function(css) {
css.walkAtRules(function(atrule) {
if(/keyframes$/.test(atrule.name)) {
var globalMatch = /^\s*:global\s*\((.+)\)\s*$/.exec(atrule.params);
var localMatch = /^\s*:local\s*\((.+)\)\s*$/.exec(atrule.params);
var globalKeyframes = globalMode;
if(globalMatch) {
if(pureMode) {
throw atrule.error('@keyframes :global(...) is not allowed in pure mode');
}
atrule.params = globalMatch[1];
globalKeyframes = true;
} else if(localMatch) {
atrule.params = localMatch[0];
globalKeyframes = false;
} else if(!globalMode) {
atrule.params = ':local(' + atrule.params + ')';
}
atrule.walkDecls(function(decl) {
localizeDecl(decl, {
options: options,
global: globalKeyframes
});
});
} else if(atrule.nodes) {
atrule.nodes.forEach(function(decl) {
if(decl.type === 'decl') {
localizeDecl(decl, {
options: options,
global: globalMode
});
}
});
}
});
css.walkRules(function(rule) {
if(rule.parent.type === 'atrule' && /keyframes$/.test(rule.parent.name)) {
// ignore keyframe rules
return;
}
var selector = Tokenizer.parse(rule.selector);
var context = {
options: options,
global: globalMode,
hasPureGlobals: false
};
var newSelector;
try {
newSelector = localizeNode(selector, context);
} catch(e) {
throw rule.error(e.message);
}
if(pureMode && context.hasPureGlobals) {
throw rule.error('Selector "' + Tokenizer.stringify(selector) + '" is not pure ' +
'(pure selectors must contain at least one local class or id)');
}
// Less-syntax mixins parse as rules with no nodes
if (rule.nodes) {
rule.nodes.forEach(function(decl) {
localizeDecl(decl, context);
});
}
rule.selector = Tokenizer.stringify(newSelector);
});
};
});

View File

@@ -0,0 +1,77 @@
{
"_args": [
[
"postcss-modules-local-by-default@1.2.0",
"C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project"
]
],
"_from": "postcss-modules-local-by-default@1.2.0",
"_id": "postcss-modules-local-by-default@1.2.0",
"_inBundle": false,
"_integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
"_location": "/react-scripts/postcss-modules-local-by-default",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "postcss-modules-local-by-default@1.2.0",
"name": "postcss-modules-local-by-default",
"escapedName": "postcss-modules-local-by-default",
"rawSpec": "1.2.0",
"saveSpec": null,
"fetchSpec": "1.2.0"
},
"_requiredBy": [
"/react-scripts/css-loader"
],
"_resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
"_spec": "1.2.0",
"_where": "C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project",
"author": {
"name": "Mark Dalgleish"
},
"bugs": {
"url": "https://github.com/css-modules/postcss-modules-local-by-default/issues"
},
"dependencies": {
"css-selector-tokenizer": "^0.7.0",
"postcss": "^6.0.1"
},
"description": "A CSS Modules transform to make local scope the default",
"devDependencies": {
"chokidar-cli": "^1.0.1",
"codecov.io": "^0.1.2",
"coveralls": "^2.11.2",
"eslint": "^3.19.0",
"istanbul": "^0.4.5",
"tape": "^4.0.0"
},
"files": [
"index.js"
],
"homepage": "https://github.com/css-modules/postcss-modules-local-by-default#readme",
"keywords": [
"css-modules",
"postcss",
"css",
"postcss-plugin"
],
"license": "MIT",
"name": "postcss-modules-local-by-default",
"repository": {
"type": "git",
"url": "git+https://github.com/css-modules/postcss-modules-local-by-default.git"
},
"scripts": {
"autotest": "chokidar index.js test.js -c 'npm test'",
"cover": "istanbul cover test.js",
"lint": "eslint index.js test.js",
"precover": "npm run lint",
"prepublish": "npm prune && npm test",
"pretest": "npm run lint",
"publish-patch": "npm prune && npm test && npm version patch && git push && git push --tags && npm publish",
"test": "tape test.js",
"travis": "npm run cover -- --report lcovonly"
},
"version": "1.2.0"
}