Injection of user-defined code, definitions, macros, constants or other snippets to a text simply by defining the snippets and including the definiton keyword in the text. Insertion formatting is customizable for compatibility with other programming languages.
Install via npm
npm install inject-definition
Install via yarn
yarn add inject-definition -S
Import and initialize with .init()
const injectDefinition = require("inject-definition");
const mathDefinitions = injectDefinition.init();init() accepts an object of options with the following properties:
{
definitions: object,
// To customize the formatting of inserted definitions, override these:
declarationFormatter: function,
minifier: function,
variableNameReplacer: function,
variableNameRetriever: function
}See API > Properties for the descriptions of individual properties.
To inject definitions into a text, you need to:
- Create (define) new definitions with
define(). - Activate or deactivate those definitions that should/should not be used with
activate()anddeactivate(). Deactivated definitions will be ignored when processing a text with definitions. (Note: new definitions are active by default) - Inject the definitions into the text with
inject().
To get a list of names of definition found in text, use scan().
To get a list of values of definitions found in text, use generate().
inject-definition can be also used for injecting snippets that are formatted for other languages than JS. Consider definiting your own variableNameReplacer, variableNameRetriever, declarationFormatter methods if this is the goal.
Additionally, minifier function can be provided, which allows to minify the injected definitions of inject() or the output of generate().
// Define non-string types
mathDefinitions.define("multiply.double", function double(x) {
return 2 * x;
});
mathDefinitions.define(
"multiply.triple",
function triple(x) {
return 3 * x;
},
{ activate: false }
);
// Define strings that can be later interpreted as a variable
mathDefinitions.define("constants.number.e", "const e = 2.71828;");
mathDefinitions.define("constants.number.pi", "const pi = 3.1415;");
// Definitions can depend on each other. The dependency definitions will be
// automatically added along with the injected definitions.
mathDefinitions.define(
"constants.number.twoPi",
"const twoPi = 2 * constants.number.pi;"
);
// Specify if the definition should be inactive on defining.
mathDefinitions.define(
"constants.number.threePi",
"const threePi = 3 * constants.number.pi;",
{
activate: false
}
);// undefines `constants.number` and all its children definitions
mathDefinitions.undefine("constants.number");
mathDefinitions.has("constants.number.pi"); // false
mathDefinitions.has("constants.number.e"); // false
// alternatively use undefineAll to undefine all, all active or all inactive definitions.
mathDefinitions.undefineAll();mathDefinitions.deactivate("constants.number");
mathDefinitions.activate("multiply.double");
// alternatively use activateAll or deactivateAll to (de)activate all, all active or all inactive definitions.
mathDefinitions.activateAll();
mathDefinitions.deactivateAll();mathDefinitions.define("multiply.double", function double(x) {
return 2 * x;
});
mathDefinitions.define("constants.number.pi", "const pi = 3.1415;");
mathDefinitions.has("constants.number.pi"); // true
const snippet = "const x = multiply.double(32 + constants.number.pi);";
// `inject` injects the definitions into a string
mathDefinitions.inject(snippet, { reference: true });
// function _double0(x) { // injected function
// return 2 * x;
// }
// const _pi0 = 3.1415; // injected variable
// var multiply = { double: _double0} // injected definitions objects
// var constants = { number: { pi: _pi0 }}
// const x = multiply.double(32 + constants.number.pi); // original snippetconst snippet = "const x = multiply.double(32 + constants.number.pi);";
// `scan` returns a list of names found definitions.
mathDefinitions.scan(snippet); // ['multiply.double', 'constants.number.pi']
// `generate` returns a list values of found definitions.
mathDefinitions.generate(snippet); // [function double(x), "const pi = 3.1415;"]mathDefinitions.define("constants.number.e", "const e = 2.71828;");
mathDefinitions.define("constants.number.pi", "const pi = 3.1415;");
mathDefinitions.get("constants.number.e"); // 'const e = 2.71828;'
mathDefinitions.has("constants.number.pi"); // trueAn object of definitions stored as a tree of nested definition objects. Each definition object has following structure:
{
keyword: string; // Keyword thar recognises the definition.
value: any; // Any value stored as the definition
children: {
foo: definitionObject;
...
} // An object of children definition objects.
active: boolean // Boolean of whether the definition is active.
}A function that defines how definitions objects should be formatted when inject has option reference: true.
E.g. if given a definition object 'foo', which has structure {'bar': 42}, the declarationFormatter may format this as var foo = {'bar': 42} (Default).
declarationFormatter accepts a function of type (definitionsObjectName: string, definitionsObject: object) => string
A function that minifies a string of stringified definitions values of definitions found through generate() or inject(). There is no default minification.
minifier accepts a function of type (stringifiedDefinitions: string) => string
A function that returns the name of a variable (if there is one) that is being declared in a definition. Necessary for customizing the formatting of declared values. Default function handles simple JS declarations with const, let, var and function keywords (no unpacking).
variableNameRetriever accepts a function of type (definition: string) => string
A function that replaces a variable name (same as the one found with variableNameRetriever) with a new name. Necessary for customizing the formatting of declared values. Default function handles simple JS declarations with const, let, var and function keywords (no unpacking).
variableNameReplacer accepts a function of type (definition: string, oldVariableName: string, newVariableName: string) => string
Creates a new definition.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
definition:any - Value of the definition. This can be anything.
options:object - An object of options that can modify the behaviour of the process. Options are:
activate:boolean- Whether the definition should be automatically activated. Inactive definitions will be ignored when scanning / generating / injecting text. Default:true
Removes a definition.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
Removes all definitions of a certain type.
options:object - An object of options that can modify the behaviour of the process. Options are:
select:'all'|'active'|'inactive'- Type of definitions that should be removed. Either all definitions, only active definitions or only inactive definitions. Default:'all'
Activates a definition. Active definitions are included when scanning / generating / injecting text.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
Activates all definitions. Active definitions are included when scanning / generating / injecting text.
Deactivates a definition. Inactive definitions will be ignored when scanning / generating / injecting text.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
Deactivates all definitions. Inactive definitions will be ignored when scanning / generating / injecting text.
Retrieves value of a definition specified by path. Returns undefined if no definition can be found.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
options:object - An object of options that can modify the behaviour of the process. Options are:
select:'all'|'active'|'inactive'- Type of definitions that will be searched through. Either all, all active or all inactive definitons. Default:'all'
Retrieves the definitions tree.
options:object - An object of options that can modify the behaviour of the process. Options are:
-
select:'all'|'active'|'inactive'- Type of definitions that populate the tree. Either all, all active or all inactive definitons. Default:'all' -
type:'full|'partial'|'condensed'- Type of structure of each node in the tree. Default:'full'- With
'full', each node has all properties (value,keyword,active,children). - With
'partial', each node has onlyvalueandchildrenproperties. - With
'condensed', each node is either an object of children nodes, or a value. (Note: Definitions that are not on terminal nodes are omitted from the condensed structure).
- With
Checks if a definition specified by a path exists, and returns true if so. Returns false otherwise.
path:string | string[] - A string or array of strings specifying the path to a definition. If as string, path components are separated by dot '.' .
options:object - An object of options that can modify the behaviour of the process. Options are:
select:'all'|'active'|'inactive'- Type of definitions that will be searched through. Either all, all active or all inactive definitons. Default:'all'
Returns the keywords (names) of definitions that were found in targetText. Only active definitions are included.
targetText:string - A string to be scanned for definitions.
options:object - An object of options that can modify the behaviour of the process. Options are:
-
delimeter:string | false- A string that joins the found definition keywords into a string. If set tofalse, an array of definition keywords is returned instead. Default:false -
overwrite:boolean- Whether only the definitions found intargetTextshould be set as active. Deactivates all other definitions.
Returns the values of definitions that were found in targetText. Only active definitions are included.
targetText:string - A string to be scanned for definitions.
options:object - An object of options that can modify the behaviour of the process. Options are:
-
delimeter:string | false- A string that joins the found definition values into a string. If set tofalse, an array of definition values is returned instead. Default:false -
minify:boolean- Whether the resulting string should be minified according to theminifierfunction. Has effect only whendelimeteris a string. Default:false -
overwrite:boolean- Whether only the definitions found intargetTextshould be set as active. Deactivates all other definitions.
Returns targetText with definitions injected. Only active definitions are included.
targetText:string - A string to be scanned for definitions.
options:object - An object of options that can modify the behaviour of the process. Options are:
-
delimeter:string- A string that joins the found definitions. Default:'\n' -
insertLocation:string- A string specifying the location where the definitions should be inserted. Available values:'start','end','replace'. Default:'start' -
minify:boolean- Whether the injected definitions should be minified according to theminifierfunction. Default:false -
overwrite:boolean- Whether only the definitions found intargetTextshould be set as active. Deactivates all other definitions. -
reference:boolean- Whether the definition keywords found intargetTextcan be used as references. E.g. iftargetTextcontains definition'foo.bar', which defines a functionbar, then settingreferencetotrueallows to usefoo.barin-text as a function, e.g.foo.bar(x)To enable this, a tree of definition objects for each of the top-level keywords is inserted after the definitions, e.g.var foo = {bar: function(x){...}}. Useful if the definitions are nested (E.g.'a.b.c'), and the definition values are programmatically referenced. (Note: Only terminal nodes can be referenced, e.g.foo.bar, but notfoo). Default:false -
separator:string- A string that joins definitions with the original text. Default:'\n'
Run tests with
npm test
or
yarn test
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
- 2.0.0
- Reworked definition tree structure and removed
activeDefinitionsobject. - Removed
activeDefinitionsoption frominit()options. - Added
undefineAll() - Added
activateAll() - Added
deactivateAll() - Added
getAll() - Minifier affects only the string of joined definitions, not the original text
- Renamed options property
overwriteActiveDefinitionstooverwrite. - Renamed options property
includeDefinitionsObjectstoreference. - If definitions use other definitions these dependency definitions will be automatically included.
- Reworked definition tree structure and removed
- 1.0.0 - Initial release.
See also the list of contributors who participated in this project.
This project is licensed under the MIT License.