mmir-tooling
Version:
Build tools for MMIR projects
1,104 lines (989 loc) • 40.6 kB
TypeScript
/* ********************************************* */
/* ** NOTE do not change directly: ** */
/* ** original source file is located at ** */
/* ** /assets/index.d.ts ** */
/* ********************************************* */
/**
* @packageDocumentation
* @module mmir-tooling
*/
/// <reference types="mmir-lib" />
import { MediaManagerPluginEntry, GrammarEngineType } from 'mmir-lib';//FIXME
export * from './index-webpack';
/**
* `mmir-tooling` generates/compiles/builds _mmir_ resources, e.g.
* grammars or state-models.
*
* @see [[apply]]
* @module mmir-tooling
*/
/**
* compiles the _mmir_ resources:
* configure/include/compile/generate _mmir_ resources (e.g. grammars, state-models)
*
* @param buildConfig the _mmir_ build configuration
*
* @returns a promise that is resolved when compilation has completed.
* If errors ocurred during compilation, the promise is resolved
* with a list of errors.
*/
export function apply(buildConfig: BuildAppConfig): Promise<Error[]>;
/**
* @example
* ```
* var appConfig = {
* //path to directory that contains classic mmir directory structure
* resourcesPath: 'src/mmir',
* resourcesPathOptions: {
* //for included models, controllers, helpers: convert old-style
* // implementations by adding an export statement
* addModuleExport: true,
* //exlude model implementations, and do not include JSON grammar resources
* exclude: ['models', 'settings/grammar']
* },
* //utilize jQuery in mmir instead of (less backwards compatible)
* // alternative implementations (npm package jquery needs to be installed!)
* jquery: true,
* //specify language for runtime configuration (== configuration.json)
* configuration: {language: 'en'},
* //do include controller implementation found within resourcesPath
* // (NOTE: this is the default behavior)
* controllers: true,
* //do NOT include helper implemenations found within resourcesPath
* helpers: false,
* //...
* }
* ```
*/
export interface AppConfig {
/** used for resolving non-absolute paths: the absolute path to the app's root/sources directory (if omitted the current working directory is used for resolving non-absolute paths) */
rootPath?: string;
/** specify the path to the MMIR resources directory with the default structure:
* ```bash
* config/
* /languages/
* /<lang>/
* /grammar.json
* /dictionary.json
* /speech.json
* /states/
* /input.xml
* /dialog.xml
* /configuration.json
* controllers/*
* helpers/*
* models/*
* views/*
* ```
*
* The path will be used to collect all available resources and create the correspondig
* options for including them.
*
* @default "www"
*/
resourcesPath?: string;
resourcesPathOptions?: ResourcesOptions;
/**
* Specify how (JSON) grammars should be parsed/included, and/or
* specify additional grammars that should be included.
*
* Compiled grammars will be available via the [[SemanticInterpreter]].
*
* If `false`, grammars will be excluded/ignored.
*/
grammars?: GrammarOptions | boolean;
/**
* Specify how (SCXML) state-machines/-models should be parsed/included, and/or
* specify additional state-models that should be included.
*
* If `false`, state-models will be excluded/ignored.
*
* By default, if no state-models are include, "minimal" state-models
* for the [[InputManager]] and the [[DialogManager]] will be included,
* see [mmir-tooling/defaultValues](https://github.com/mmig/mmir-tooling/tree/master/defaultValues).
*/
states?: StateOptions | boolean;
/**
* Specify how (mmir) views should be parsed/included, and/or
* specify additional views that should be included.
*
* If `false`, views will be excluded/ignored.
*/
views?: ViewOptions | boolean;
/**
* Specify how (mmir) configuration and settings should be parsed/included,
* and/or specify additional settings that should be included.
*
* The `mmir` configuration/settings are the resources that are by default
* located in the mmir `config/` directory
* (with exception of the `states` sub-directory; for those instead use [[WebpackAppConfig.states]]):
* ```bash
* config/
* /languages/
* /<lang>/
* /grammar.json
* /dictionary.json
* /speech.json
* /states/
* /input.xml
* /dialog.xml
* /configuration.json
* ```
* (NOTE the `config/states/` sub-directory is handled/configured via the the [[states]] option)
*/
settings?: SettingsOptions | boolean;
/**
* Specify additional (mmir) runtime configuration values,
* e.g. in addition to `config/configuration.json`.
*
* In case of conflicts, these settings will override settings in
* `config/configuration.json`,
*/
configuration?: RuntimeConfiguration;
// //TODO support plugin-integration via options? would need to create/update configuration.json and settings/speech/<lang>
// includePlugins?: Array<PluginOptions>;
// //TODO? support "modularizing" impl files?
// controllers?: ControllerOptions | boolean;
// helpers?: HelperOptions | boolean;
// models?: ModelOptions | boolean;
}
export type ModuleId = string;//TODO explicitly specify MMIR module IDs
/**
* maps module IDs to file paths:
* if the path is not absolute, it will be resolved against the mmir-lib path, if it starts with "mmirf/",
* otherwise against the rootPath.
*/
export type ModulePaths = {[moduleId: string]: string};
/**
* specifies a package that contains modules ()
* if the path is not absolute, it will be resolved against the mmir-lib path, if it starts with "mmirf/",
* otherwise against the rootPath.
*/
export type ModulePackage = {name: string, location: string};
/**
* @example
* ```
* var grammarOptions = {
* path: './grammars',
* engine: 'pegjs',
* asyncCompile: false,
* grammars: {
* ja: {ignore: true},
* de: {exclude: true},
* en: {engine: 'jscc', asyncCompile: true},
*
* //specifying JSON grammar files directly
* testing: {engine: 'jscc', file: path.resolve('./grammar-test/en/grammar.json')},
* testing2: {id: '!id warning!', engine: 'jison', file: path.resolve('./grammar-test/de/grammar.json_large-example')}
* }
* };
* ```
*/
export interface GrammarOptions extends GrammarOption {
/** file path for searching (recursively) JSON grammars within languages-subdirectory:
* `path/.../<grammar ID>/grammar.json`
*/
path?: string;
/** options for handling found or specified JSON grammars */
grammars?: {[grammarId: string]: GrammarEntry};
}
export type ResourceType = 'grammar' | 'view' | 'state';
export interface BuildOptions {
/**
* directory to which the compiled resources like grammars (and checksum files) will be stored
*
* by default, the relative paths are resolved against the app's root directory;
* if the target directory is missing it will be newly created.
*
* @default [[BuildAppConfig.targetDir]] + [[ResourceType]]
*/
targetDir?: string;
/**
* if TRUE the targets will be newly created and written to the targetDir,
* even if the existence or up-to-date check returns `true`
*/
force?: boolean;
}
export interface BuildAppConfig extends AppConfig {
/**
* directory to which the compiled resources (and checksum files) will be stored:
* for each resource type (e.g. grammar, view) a subdirectory will be created into
* which the resources will be stored.
*
* By default, the relative paths are resolved against the app's root directory;
* if the target directory is missing it will be newly created.
*
* @default "www"
* @see [[ResourceType]]
*/
targetDir?: string;
/**
* if `directories.json` should include the view template files (`*.ehtml`)
* e.g. for up-to-date test & runtime-compilation of view templates
*
* @default true
*/
includeViewTemplates?: boolean;
/**
* if `directories.json` should include the SCXML files (`*.xml`)
* e.g. for up-to-date test & runtime-compilation of state models
*
* @default true
*/
includeStateModelXmls?: boolean;
/**
* directory to which the generated `directories.json` file should be written:
* `directories.json` contains the listing of available mmir resources.
*
* NOTE if this file is not in the expected location, initialization of
* `mmir` may fail during runtime, i.e. use this option with care!
*
* @default targetDir + "/gen"
*/
directoriesTargetDir?: string;
grammars?: GrammarBuildOptions | boolean;
states?: StateBuildOptions | boolean;
views?: ViewBuildOptions | boolean;
/** NOTE settings files may be written to the (settings) targetDir if
* (1) the [[SettingsBuildOptions.include]] option is set to 'file'
* (2) if the file already exists in the targetDir it is overwritten if the [[SettingsBuildOptions.force]] option is enabled
*
* The `include` and `force` option can be set either in the SettingsBuildOptions, or in the specific SettingsBuildEntry/ies.
*/
settings?: SettingsBuildOptions | boolean;
/**
* `mmir` runtime configuration:
* instead of, or modifying/overwriting configuration settings in `configuration.json`
*
* NOTE only takes effect, if settings options `inlcude` (or in its sub-option) is set 'file'
* (and possibly force, to enable overwriting existing files), so that settings files will be written
*/
configuration?: RuntimeConfiguration;
}
export interface GrammarBuildOptions extends GrammarOptions, BuildOptions {
/** @override */
grammars?: {[grammarId: string]: GrammarBuildEntry};
}
export interface GrammarBuildEntry extends GrammarEntry, BuildOptions {
fileType?: 'json' | 'js';
}
export interface ViewBuildOptions extends ViewOptions, BuildOptions {}
export interface ViewBuildEntry extends ViewEntry, BuildOptions {}
export interface ImplementationBuildEntry extends ImplementationEntry {
id?: string;
}
export interface SettingsBuildOptions extends SettingsOptions, BuildOptions {
/** @override */
configuration?: boolean | SettingsBuildEntry;
/** @override */
dictionary?: boolean | {[id: string]: SettingsBuildEntry};
/** @override */
grammar?: boolean | {[id: string]: SettingsBuildEntry};
/** @override */
speech?: boolean | {[id: string]: SettingsBuildEntry};
}
export interface SettingsBuildEntry extends SettingsEntryOptions, BuildOptions {
value?: any;
}
export interface SettingsBuildEntryMultiple extends SettingsEntryOptionsMultiple, BuildOptions {
value?: any;
}
export interface StateBuildOptions extends StateOptions, BuildOptions {
/**
* the module type of the generated/compiled state machine
* @default "amd"
*/
moduleType?: "amd" | "commonjs";
models?: StateModelsBuildOption;
/**
* if default models for 'input' and 'dialog' are created, specifies their
* mode
* (defaults will be created, if no definition for the models is specified
* or can be found the the resources path(s))
*/
defaultType?: StateModelMode | 'minimal';
}
export interface StateModelBuildEntry extends StateModelEntry, BuildOptions {
/**
* The ID for state model
*
* NOTE: should not be set manually:
* ID will be derived from entry key of models property of the containing StateOptions
*/
id?: string;
/**
* the module type of the generated/compiled state machine
* @default "amd"
*/
moduleType?: "amd" | "commonjs";
}
export interface StateModelsBuildOption extends StateModelsOption {
dialog?: StateModelBuildEntry;
input?: StateModelBuildEntry;
[]: StateModelBuildEntry;
}
export interface GrammarOption {
/** the Grammar engine that will be used to compile the executable grammar.
* @default "jscc"
*/
engine?: GrammarEngineType;
/**
* if `true`, and thread-webworker is available, grammar will be compiled paralelized / in a separate thread
* @default true
*/
asyncCompile?: boolean;
/**
* if `true`, the corresponding grammar will be completely excluded, i.e. no executable grammar will be compiled
* from the corresponding JSON grammar
*/
exclude?: boolean;
/**
* if `true`, the grammar will not be loaded (and registered) when the the app is initialized, i.e. needs to be
* "manually" loaded/initialized by app implementation and/or other mechanisms.
* If omitted or `false`, the grammar will be loaded on start-up of the app,
* and then will be available e.g. via `mmir.semantic.interprest(<input phrase string>, <grammar-id>)`
*/
ignore?: boolean;
/**
* grammar-execution (during runtime) will be asynchronous in a WebWorker/thread
*
* NOTE: invocations must always provide a callback, for async-exec grammars
* @example
* mmir.semantic.interpret('this is my test phrase', function(result){
* // do something with grammar execution result
* })
*/
async?: boolean;
/**
* set or disable strict-mode for generated JavaScript code
* @default true
*/
strict?: boolean;
/**
* An "initialization phrase" for the grammar, in case of async-exection:
* this phrase will be immediately interpreted, after grammar has been loaded for async-execution in the WebWorkers
* (for large grammars, this may reduce delays for subsequent calls, by fully initializing the grammar)
*
* NOTE will have no effect, if option [[async]] is not `true`
*/
initPhrase?: string;
}
export interface GrammarEntry extends GrammarOption {
/**
* the grammar ID
*
* WARNING will be automatically set -- if it is manully set, it may get overwritten!
*/
id?: string;
/**
* for specifying the JSON grammar directly (e.g. instead or in addition of parsing `path` for grammar files):
* the (absolute) path to the JSON grammar (from which the executable grammar will be created)
*/
file?: string;
}
/**
* @example
* ```
* var settingOptions = {
* path: path.resolve('./config'),
* configuration: false,
* grammar: {
* ja: {exclude: true}
* },
* speech: {
* de: {exclude: true},
* en: {include: 'file'}
* },
* dictionary: {
* ja: {include: 'file'}
* }
* };
* ```
*/
export interface SettingsOptions {
/** file path for searching settings:
* ```bash
* path/.../<language ID>/grammar.[json | js]
* /dictionary.[json | js]
* /speech.[json | js]
* configuration.[json | js]
* ```
*/
path?: string;
/**
* pattern for excluding settings:
* if pattern matches SettingsEntryOptions.type, the settings will be excluded
*/
excludeTypePattern?: RegExp | Array<SettingsType>;
/**can be used to include the resource as separate file, instead of bundeling via webpack
* @default "inline" if webpack build, otherwise "file"
*/
include?: 'inline' | 'file';
/** options for the configuration.json (or .js) entry; if FALSE, the resource will be ignored */
configuration?: boolean | SettingsEntryOptionsMultiple;
/** options-map for the dictionary.json (or .js) entries where id is (usually) the language code; if `false`, these resources will be ignored */
dictionary?: boolean | {[id: string]: SettingsEntryOptions};
/** options-map for the grammar.json (or .js) entries where id is (usually) the language code; if `false`, these resources will be ignored */
grammar?: boolean | {[id: string]: SettingsEntryOptions};
/** options-map for the speech.json (or .js) entries where id is (usually) the language code; if `false`, these resources will be ignored */
speech?: boolean | {[id: string]: SettingsEntryOptions};
}
export interface SettingsEntryOptions extends SettingsEntryOptionsBase {
/** for explicitly specifying the settings-resource directly (e.g. instead or in addition of parsing `path` for settings resource files) */
file?: string;
}
export interface SettingsEntryOptionsMultiple extends SettingsEntryOptionsBase {
/** for explicitly specifying the settings-resource directly (e.g. instead or in addition of parsing `path` for settings resource files) */
file?: string | string[];
}
export interface SettingsEntryOptionsBase {
/** if `true`, the corresponding resource will be excluded (when parsing `path`) */
exclude?: boolean;
/**can be used to include the resource as separate file, instead of bundeling via webpack
* @default "inline"
*/
include?: 'inline' | 'file';
/** the settings-type _(should not be set manually)_ */
type?: SettingsType;
/** the ID for the settings-resources _(should not be set manually)_ */
id?: string;
/** the settings-file-type _(should not be set manually)_:\
* derived from the file-extension, either "json" or "js".
*
* If .js file, it MUST be a CommonJS module that exports the settings object as its only/default export, i.e.\
* ```javascript
* module.exports = settingsObject;
* ```
* any dynamic code is evaluated at compile-time, i.e. the exported settings-object must not contain dynamic content
*/
fileType?: 'js' | 'json';
}
export type SettingsType = 'configuration' | 'dictionary' | 'grammar' | 'speech' | 'speech-all';
/**
* @example
* ```
* var stateOptions = {
* path: 'www/config/states',
* ignoreErrors: true,
* models: {
* input: {
* mode: 'simple',
* file: './alt_config/states_minimal/input.xml',
* strict: false
* },
* dialog: {
* ignoreErrors: false,
* mode: 'extended'
* }
* }
* };
* ```
*/
export interface StateOptions extends StateModelOption {
/** file path for searching (recursively) for SCXML files (state-models):
* ```bash
* path/.../dialog.xml -> type "dialog"
* /input.xml -> type "input"
* ```
*
* NOTE: for backwards compatibility, the following file names are also accepted
* and mapped to their corresponding type
* ```bash
* "dialogDescriptionSCXML.xml" -> "dialog"
* "inputDescriptionSCXML.xml" -> "input"
* ```
*
* Or custom state models (SCXML definitions) with file extension `.xml`.
*
*/
path?: string;
/**
* optionally specify options for found resource, or specifying resources/locations directly
*
* If `input` or `dialog` are missing (e.g. no resources matching them could be found),
* default "minimal" state-models will be used for `inputManager` and `dialogManager`.
*
* NOTE: for custom state-models whichs' files are determined by parsing [[StateOptions.path]],
* the `id` will be the file name (case sensitive, without extension).
*/
models?: StateModelsOption;
}
export interface StateModelsOption {
/** default state model for dialog states */
dialog?: StateModelEntry;
/** default state model for input states */
input?: StateModelEntry;
[]: StateModelEntry;
}
export interface StateModelOption {
/**
* the module ID for state interpreter:
* if the interpreter is registered, it can be `require`'d using the `moduleId`, e.g.
* ```
* var stateManager = mmir.require(<moduleId>);
* ```
*
* (the `moduleId` will be automatically set for `inputManager` and `dialogManager`)
*
*/
moduleId?: string;
/** if `true`, the corresponding resource will be excluded (when parsing `path`) */
exclude?: boolean;
/**
* run SCXML model in "simple" or "extended" mode
* @default "extended"
*/
mode?: StateModelMode;
/** if `true`, runtime errors will be ignored.
* if `false` (or omitted) the compilation will fail with an error message
* when encountering SCXML runtime errors.
*
* NOTE: if ignored, the runtime errors will be triggered when the state-machine
* enters the corresponing state during runtime!
*
* @default false
*/
ignoreErrors?: boolean;
/**
* set or disable strict-mode for generated JavaScript code
* @default true
*/
strict?: boolean;
}
export type StateModelMode = "extended" | "simple";
export interface StateModelEntry extends StateModelOption {
/** for explicitly specifying the state-machine directly (e.g. instead or in addition of parsing `path`) */
file?: string;
}
/** runtime configuration: same as config/configuration.json */
export interface RuntimeConfiguration {
/**
* The language (code) that will be used by `mmir`, e.g.
* for speech synthesis (TTS) or recognition (ASR).
*
* Can be changed during runime with [[LanguageManager.setLanguage]]
*
* @default "en"
*/
language?: string;
/** grammar-compiler/-engine for compiling new grammars */
grammarCompiler?: GrammarEngineType;
/** if selected language only has JSON grammar, prevents automatic compilation */
usePrecompiledGrammarsOnly?: boolean;
/** if JSON grammar is compiled during runtime, use async (i.e. web worker) compilation */
grammarAsyncCompileMode?: boolean;
/** when compiling JSON grammar: disable setting JavaScript strict mode for compiled grammar */
grammarDisableStrictCompileMode?: boolean;
/**
* list of grammars (IDs) which should not be automatically loaded on startup, even if compiled/JSON grammar is available for the language
*
* If `true`, no file compiled grammars will be loaded on start-up (i.e. all IDs will be ignored for start-up)
*/
ignoreGrammarFiles?: Array<string> | true;
/**
* list of (compiled) grammars (IDs) which should be initialized for asynchronous execution, i.e. should be exectuted in WebWorker/thread
*
* If `true`, all (compiled) grammar will be initialized for asynchronous execution.
*
* If list, an additional "initialization-phrase" may be specified by using `{id: string, phrase: string}`:
* a phrase that should be immediately interpreted, after grammar has been loaded in the WebWorkers
* (for large grammars, this may reduce delays for subsequent calls, by fully initializing the grammar)
*/
grammarAsyncExecMode?: Array<string | AsyncGramarExecEntry> | true;
/**
* detect if compiled state-models (i.e. JS-compiled SCXML files) are present & should be used
* instead of loading & compiling SCXML files at runtime.
*
* NOTE this is ignored in `webpack` build (since state-models will always be pre-compiled in `webpack` builds).
*
* @default true
*/
detectCompiledStateModels?: boolean;
/**
* name of the default layout definition when rendering mmir view templates: if `null`, no default layout will be used.
*
* @default "Default"
*/
defaultLayoutName?: 'Default' | string | null;
/**
* if `false`, (mmir) view templates will be (re-)compiled upon app startup
*
* NOTE will be ignored in `webpack` build
*/
usePrecompiledViews?: boolean;
/** configuration for media plugins, e.g. for speech recognition (ASR) and synthesis (TTS) */
mediaManager?: MediaManagerPluginsConfig;
/**
* dot-separated namespace for accessing the controller implementation's constructors
* (within global namespace, e.g. `"app.ctrl" -> [window | self | global].app.ctrl`)
* @deprecated use module format (AMD / UMD / CommonJS (only in webpack-build) / ...) instead
*/
controllerContext?: string;
/**
* dot-separated namespace for accessing the model implementation's constructors
* (within global namespace, e.g. `"app.ctrl" -> [window | self | global].app.ctrl`)
* @deprecated use module format (AMD / UMD / CommonJS (only in webpack-build) / ...) instead
*/
modelContext?: string;
/**
* custom/additional configuration/settings:
*
* E.g. mmir-plugins may support additional settings (see corresponding documentation of the plugin),
* or app-specific settings my be specified and used.
*/
[]: any;
}
// export type MediaPluginEnvType = 'browser' | 'cordova' | 'android' | 'ios';
export type MediaManagerPluginsConfig = {
plugins?: {
browser?: Array<mmir.MediaManagerPluginEntry>;
cordova?: Array<mmir.MediaManagerPluginEntry>;
android?: Array<mmir.MediaManagerPluginEntry>;
ios?: Array<mmir.MediaManagerPluginEntry>;
[]: Array<mmir.MediaManagerPluginEntry>
};
};
export type AsyncGramarExecEntry = {id: string, phrase: string};
/** module configuration: analogous to config-entry in requirejs configuration */
export type ModuleConfigOptions = {[moduleId: string]: ModuleConfig};
/** module configuration: analogous to config-entry in requirejs config-entries */
export type ModuleConfig = {[configName: string]: any} & {logLevel?: mmir.LogLevelNum | mmir.LogLevel};
/** options for handling found resources when parsing the resourcesPath */
export interface ResourcesOptions {
/** for automatically converting old-style implementations that are no CommonJS or AMD modules:
* if `true`, explicitly exports the implementation resource (i.e. as module.exports)
* @see ImplementationEntry
*/
addModuleExport?: boolean;
/** excludes the specified resources types when parsing the `resourcesPath` */
exclude?: Array<ResourceTypeName>;
/** exclude mmir resource directory `config` from parsing for settings */
config?: false;
/** exclude mmir resource directory `controllers` from parsing for settings */
controllers?: false;
/** exclude mmir resource directory `helpers` from parsing for settings */
helpers?: false;
/** exclude mmir resource directory `models` from parsing for settings */
models?: false;
/** exclude mmir resource directory `views` from parsing for settings */
views?: false;
}
/** a resource type; corresponds to field names in AppConfig */
export type ResourceTypeName = string;
export interface ViewOptions {
/** file path for searching view files:
* ```bash
* path/views/<controller ID>/*.ehtml
* path/layouts/<controller ID>.ehtml
* ```
*/
path?: string;
/**
* set or disable strict-mode for generated JavaScript code
* @default true
*/
strict?: boolean;
}
export interface ViewEntry {
id: string;
ctrlName: string;
viewName: string;
file: string;
viewImpl: 'mmirf/layout' | 'mmirf/partial' | 'mmirf/view';
isLayout: boolean;
isPartial: boolean;
strict: boolean;
}
/**
* @example
* ```
* var ctrlOptions = {
* path: './implementations_all/controllers',
* controllers: {
* application: {
* addModuleExport: true
* },
* calendar: {
* file: path.resolve('./implementations/controllers/calendar.js')
* },
* application2: false,
* application3: {exclude: true},
* }
* };
* ```
*/
export interface ControllerOptions extends ImplementationOption {
/** file path for (recursively) searching controller implementation files:
* `path/<controller ID>.js`
*/
path?: string;
controllers?: boolean | {[id: string]: ImplementationEntry | boolean};
}
/**
* @example
* ```
* var helperOptions = {
* path: './implementations_all/helpers',
* addModuleExport: true,
* helpers: {
* calendarHelper: {exclude: false}
* }
* };
* ```
*/
export interface HelperOptions extends ImplementationOption {
/** file path for (recursively) searching helper implementation files:
* `path/.../<controller ID>Helper.js`
*/
path?: string;
helpers?: boolean | {[id: string]: ImplementationEntry | boolean};
}
/**
* @example
* ```
* var modelOptions = {
* path: './implementations_all/models',
* models: {
* user: {addModuleExport: 'mmir.User'},
* calendarModel: {addModuleExport: 'mmir.CalendarModel'}
* }
* };
* ```
*/
export interface ModelOptions extends ImplementationOption {
/** file path for searching (data) model implementation files:
* `path/<model ID>.js`
*/
path?: string;
models?: boolean | {[id: string]: ImplementationEntry | boolean};
}
export type AnyImplementationOptions = ModelOptions | HelperOptions | ControllerOptions;
export interface ImplementationOption {
/** if `true`, the corresponding implementation will be excluded (when parsing `path`) */
exclude?: boolean;
/** for automatically converting old-style implementations that are no CommonJS or AMD modules:
* if true, explicitly exports the implementation resource, i.e. adds something like
* <pre>
* module.exports.<resource name> = <resource constructor>;
* </pre>
* to the implementation source/module.
*
* If string, the specified string will be used for the export.
*/
addModuleExport?: boolean | string;
}
export interface ImplementationEntry extends ImplementationOption {
/** for explicitly specifying the implementation-file directly (e.g. instead or in addition of parsing `path`) */
file?: string;
/** the implementation's name (usually the ID with capitalized first letter) */
name?: string;
/** the implementation's type (should not be explicitly specified) */
type?: ImplementationType;
}
export type ImplementationType = "controller" | "helper" | "model";
export interface VirtualImplementationEntry {
/** module identifier (for use in `require(<moduleName>)`) */
moduleName: string;
/** (javascript) module code */
contents: string;
}
/**
* @example
* ```
* var includePlugins = [
* {id: 'mmir-plugin-asr-nuance-xhr', config: {
* // ctx: 'nuance',//OPTIONAL install into sub-context "nuance"
* appKey: "9...",
* appId: "NMDPTRIAL....",
* }},
* {id: 'mmir-plugin-asr-google-xhr',
* mode: 'wasm',
* config: {
* appKey: 'A....',
* results: 5
* }},
* {id: 'mmir-plugin-tts-nuance-xhr', config: {
* appKey: "9....",
* appId: "NMDPTRIAL_...",
* voice: {fr: 'Samantha'},
* language: {ja: 'jpn-JPN'}
* }},
* {id: 'mmir-plugin-tts-speakjs', config: {
* env: 'browser',
* ctx: 'local' //OPTIONAL install into sub-context "local"
* }},
* {id: 'mmir-plugin-speech-android', config: {
* // ctx: 'android',//OPTIONAL install into sub-context "android"
* voice: {de: 'male'},
* language: {en: 'eng-IND'}
* }},
* ];
* ```
*/
export interface PluginOptions {
/**
* the (package) ID of the plugin
* NOTE: the plugin needs to be installed, i.e. "npm install ..."
*/
id: string;
/** mode for including the plugin: if the plugin does not support the specified mode, will automatically use "default" mode */
mode?: PluginModeOption;
/**
* configuration for the plugin: specific fields/values depending on the plugin
* NOTE some plugins require credentials, e.g. "appId" and "appKey"
*/
config?: PluginConfig | TTSPluginSpeechConfig;
/**
* if supported by plugin:
* custom build options.
*
* NOTE if the plugin does not support custom build configuration, this
* will be ignored.
*/
build?: Array<PluginExportConfigInfo | PluginExportConfigInfoMultiple>;
}
export type PluginModeOption = 'wasm' | 'min' | 'default';
export type PluginConfig = MediaManagerPluginEntry & {[config: string]: any};
export type PluginExportInfo = {
id: string;
paths: {[moduleId: string]: string};
workers: string[];
modules: string[];
files: string[];
dependencies: string[];
modes?: {[pluginModeOption: string]: PluginExportModeEntry};
/** the (relative) module / file in the package that contains the build config */
buildConfig?: string;
/**
* HELPER returns all entries for field <code>type</code>, (recursively) including the
* corresponding field from dependencies
* @param {"paths" | "workers" | "modules" | "dependencies" | "files"} type the field for which to gather entries
* @param {"min" | String} [mode] OPTIONAL if the type should be modified according to a mode
* @param {Boolean} [isResolve] OPTIONAL for type "paths" will make the paths absolute w.r.t. the corresponding module/dependency
* (NOTE the absolute path may not be normalized, i.e. contain mixed path separators);
* @return {Object|Array} the "collected" entries for the requested type
*/
getAll(type: PluginExportType, mode?: PluginModeOption | string, isResolve?: boolean): string[] | {[moduleId: string]: string} | {[pluginModeOption: string]: PluginExportModeEntry};
/**
* HELPER returns list of (mmir) build configurations (to be merged into the main mmir build configuration)
*
* @param {String} [pluginName] OPTIONAL if specified and multiple plugin-definitions are specified, only the build-configs for the specified plugin are include (note: filter does not apply recursively to dependencies)
* @param {Object} [buildConfigsMap] OPTIONAL a set or "duplicate map" for already included buildConfigs: {[buildConfig: BuildConfig]: Boolean}
* @return {Array<BuildConfig>} a list of (mmir) build configurations; may be empty
*/
getBuildConfig(buildConfigsMap?: Set<any> | {[buildConfig: string]: boolean} | Array<any>): PluginExportBuildConfig[];
getBuildConfig(pluginName?: string): PluginExportBuildConfig[];
getBuildConfig(pluginName?: string, buildConfigsMap?: Set<any> | {[buildConfig: string]: boolean} | Array<any>): PluginExportBuildConfig[];
};
export type PluginExportType = 'paths' | 'workers' | 'modules' | 'dependencies' | 'files';
export type PluginExportModeEntry = {[modulePathOverrideId: string]: string} & {files?: string[]};
export type SpeechConfigField = 'language' | 'voice';
export interface PluginExportConfigInfoMultiple {
pluginName: string [];
plugins: {[pluginId: string]: PluginExportConfigInfo};
}
export interface PluginExportConfigInfo {
pluginName: string;
config?: string[];
/** may (or may not) contain a default value for entry of field config */
defaultValues?: {[configField: string]: any};
speechConfig?: Array<SpeechConfigField>;
/** may (or may not) contain a default value for entry of field speechConfig */
defaultSpeechValues?: {[speechConfigField: string]: any};
/** optional configuration for the AppConfig / BuildAppConfig / WebpackAppConfig */
buildConfigs?: (PluginExportBuildConfig | PluginExportBuildConfigCreator)[];
}
/** configuration fields of AppConfig / BuildAppConfig / WebpackAppConfig that a plugin can use to specify additional build configurations */
export type PluginExportBuildConfig = {[appBuildConfigField: string]: any};
/** creator-function for configuration fields of AppConfig / BuildAppConfig / WebpackAppConfig that a plugin can use to specify additional build configurations */
export type PluginExportBuildConfigCreator = (pluginConfig: PluginConfig & TTSPluginSpeechConfig, runtimeConfig: RuntimeConfiguration, pluginBuildConfigs: PluginExportBuildConfig[]) => PluginExportBuildConfig | (PluginExportBuildConfig | PluginExportBuildConfigCreator)[];
/**
* Additional configuration for speech output (TTS: Text To Speech) for mmir plugins:
* extend configuration specified in (language specific) `speech.json`.
*
* NOTE for applying a value to all speech configurations (i.e. for language codes):
* use a simple string
* <pre>
* {voice: 'female'}
* </pre>
* or, if combined with specific settings, use "__apply-to-all-configs__" as language code
* <pre>
* {voice: {
* en: 'Hedda',
* '__apply-to-all-configs__': 'male'
* }}
* </pre>
* which would set "Hedda" as voice for "en", and voice "male" for all other language codes
*
* @see [[SimpleSpeechConfig]]
*/
export interface TTSPluginSpeechConfig {
/** local with 2-letter language- and country-code, separated with "-", e.g. "de-DE" or "en-US" */
language?: string | {[languageCode: string]: string};
/** local with 3-letter language- and country-code, separated with "-", e.g. "deu-DEU" or "eng-USA" */
long?: string | {[languageCode: string]: string};
/** voice name or feature (may not be supported by selected TTS plugin) */
voice?: 'male' | 'female' | string | {[languageCode: string]: 'male' | 'female' | string};
}
export interface ResourceConfig {
paths: ModulePaths;
packages?: ModulePackage[];
// paths for web worker entry points (i.e. new Worker(<path>)):
workers: string[];
//paths for "raw" files that will be included as-is (i.e. copied)
fileResources: string[];
//path for text resources
textResources: string[];
//path mappings for copied files etc (i.e. will be included/copied to the specified relative file path/name)
resourcesPaths: {[moduleIdAndSubPath: string]: string};
}
export interface DirectoriesInfo {
"/controllers": string[];
"/views": string[];
"/models": string[];
"/config": string[];
"/config/languages": string[];
"/config/states": string[];
"/helpers": string[];
"/gen": string[];
"/gen/grammar"?: string[];
"/gen/view"?: string[];
[]: string[];
}
export interface ViewCompilerOptions {
mapping: ViewBuildEntry[];
config: ViewBuildOptions;
}
export interface StateCompilerOptions {
mapping: StateModelBuildEntry[];
config: StateBuildOptions;
}
export interface ImplementationCompilerOptions {
mapping: ImplementationBuildEntry[];
config: ImplementationOption;
}
export interface GrammarCompilerOptions {
mapping: GrammarBuildEntry[];
config: GrammarBuildOptions;
}
// export type CompilerCallback = (error: null | string | Error | any, code: string, map: any, meta: any) => void;
export interface CompilerCallback {
(error: null | string | Error | any, code: string, map: any, meta: any): void;
(error: string | Error | any, code?: string, map?: any, meta?: any): void;
}
export type BuildConfig = {
grammars: GrammarBuildEntry[];
grammarOptions: GrammarBuildOptions;
views: ViewBuildEntry[];
viewOptions: ViewBuildOptions;
states: StateModelBuildEntry[];
stateOptions: StateBuildOptions;
implList: ImplementationBuildEntry[];
ctrlOptions: ControllerOptions;
helperOptions: HelperOptions;
modelOptions: ModelOptions;
settings: SettingsBuildEntry[];
settingsOptions: SettingsBuildOptions;
directories: DirectoriesInfo;
directoriesTargetDir?: string;
}