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 snippet
const 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"); // true
An 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 onlyvalue
andchildren
properties. - 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 intargetText
should 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 theminifier
function. Has effect only whendelimeter
is a string. Default:false
-
overwrite:
boolean
- Whether only the definitions found intargetText
should 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 theminifier
function. Default:false
-
overwrite:
boolean
- Whether only the definitions found intargetText
should be set as active. Deactivates all other definitions. -
reference:
boolean
- Whether the definition keywords found intargetText
can be used as references. E.g. iftargetText
contains definition'foo.bar'
, which defines a functionbar
, then settingreference
totrue
allows to usefoo.bar
in-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
activeDefinitions
object. - Removed
activeDefinitions
option 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
overwriteActiveDefinitions
tooverwrite
. - Renamed options property
includeDefinitionsObjects
toreference
. - 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.