@xpack/xpm-lib 3.1.2 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -212
- package/dist/classes/actions.d.ts +58 -0
- package/dist/classes/actions.d.ts.map +1 -0
- package/dist/classes/actions.js +250 -0
- package/dist/classes/actions.js.map +1 -0
- package/dist/classes/build-configurations.d.ts +78 -0
- package/dist/classes/build-configurations.d.ts.map +1 -0
- package/dist/classes/build-configurations.js +489 -0
- package/dist/classes/build-configurations.js.map +1 -0
- package/dist/classes/combinations-generator.d.ts +19 -0
- package/dist/classes/combinations-generator.d.ts.map +1 -0
- package/dist/classes/combinations-generator.js +48 -0
- package/dist/classes/combinations-generator.js.map +1 -0
- package/dist/classes/data-model.d.ts +21 -0
- package/dist/classes/data-model.d.ts.map +1 -0
- package/dist/classes/data-model.js +47 -0
- package/dist/classes/data-model.js.map +1 -0
- package/dist/classes/errors.d.ts +13 -0
- package/dist/classes/errors.d.ts.map +1 -0
- package/dist/classes/errors.js +13 -0
- package/dist/classes/errors.js.map +1 -0
- package/dist/classes/init-template-base.d.ts +47 -0
- package/dist/classes/init-template-base.d.ts.map +1 -0
- package/dist/classes/init-template-base.js +358 -0
- package/dist/classes/init-template-base.js.map +1 -0
- package/dist/classes/liquid-drop.d.ts +28 -0
- package/dist/classes/liquid-drop.d.ts.map +1 -0
- package/dist/classes/liquid-drop.js +70 -0
- package/dist/classes/liquid-drop.js.map +1 -0
- package/dist/classes/liquid-engine.d.ts +7 -0
- package/dist/classes/liquid-engine.d.ts.map +1 -0
- package/dist/classes/liquid-engine.js +72 -0
- package/dist/classes/liquid-engine.js.map +1 -0
- package/dist/classes/package.d.ts +31 -0
- package/dist/classes/package.d.ts.map +1 -0
- package/dist/classes/package.js +268 -0
- package/dist/classes/package.js.map +1 -0
- package/dist/classes/platform-detector.d.ts +14 -0
- package/dist/classes/platform-detector.d.ts.map +1 -0
- package/dist/classes/platform-detector.js +26 -0
- package/dist/classes/platform-detector.js.map +1 -0
- package/dist/classes/policies.d.ts +14 -0
- package/dist/classes/policies.d.ts.map +1 -0
- package/dist/classes/policies.js +20 -0
- package/dist/classes/policies.js.map +1 -0
- package/dist/classes/template-expander.d.ts +29 -0
- package/dist/classes/template-expander.d.ts.map +1 -0
- package/dist/classes/template-expander.js +62 -0
- package/dist/classes/template-expander.js.map +1 -0
- package/dist/data/substitutions-variables.d.ts +43 -0
- package/dist/data/substitutions-variables.d.ts.map +1 -0
- package/dist/{lib → data}/substitutions-variables.js +1 -16
- package/dist/data/substitutions-variables.js.map +1 -0
- package/dist/functions/chmod-recursively.d.ts +9 -0
- package/dist/functions/chmod-recursively.d.ts.map +1 -0
- package/dist/functions/chmod-recursively.js +66 -0
- package/dist/functions/chmod-recursively.js.map +1 -0
- package/dist/functions/filter-paths.d.ts +5 -0
- package/dist/functions/filter-paths.d.ts.map +1 -0
- package/dist/functions/filter-paths.js +16 -0
- package/dist/functions/filter-paths.js.map +1 -0
- package/dist/functions/is-something.d.ts +9 -0
- package/dist/functions/is-something.d.ts.map +1 -0
- package/dist/functions/is-something.js +25 -0
- package/dist/functions/is-something.js.map +1 -0
- package/dist/functions/matrix-expander.d.ts +17 -0
- package/dist/functions/matrix-expander.d.ts.map +1 -0
- package/dist/functions/matrix-expander.js +52 -0
- package/dist/functions/matrix-expander.js.map +1 -0
- package/dist/functions/perform-substitutions.d.ts +12 -0
- package/dist/functions/perform-substitutions.d.ts.map +1 -0
- package/dist/functions/perform-substitutions.js +76 -0
- package/dist/functions/perform-substitutions.js.map +1 -0
- package/dist/functions/utils.d.ts +8 -0
- package/dist/functions/utils.d.ts.map +1 -0
- package/dist/functions/utils.js +16 -0
- package/dist/functions/utils.js.map +1 -0
- package/dist/index.d.ts +22 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -29
- package/dist/index.js.map +1 -1
- package/dist/{lib/types.d.ts → types/json.d.ts} +31 -22
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +2 -0
- package/dist/types/json.js.map +1 -0
- package/dist/types/xpm-init-template.d.ts +21 -0
- package/dist/types/xpm-init-template.d.ts.map +1 -0
- package/dist/types/xpm-init-template.js +2 -0
- package/dist/types/xpm-init-template.js.map +1 -0
- package/dist/types/xpm.d.ts +16 -0
- package/dist/types/xpm.d.ts.map +1 -0
- package/dist/types/xpm.js +2 -0
- package/dist/types/xpm.js.map +1 -0
- package/package.json +53 -44
- package/src/CODE-REVIEW.md +2167 -0
- package/src/README.md +393 -6
- package/src/classes/actions.ts +1157 -0
- package/src/classes/build-configurations.ts +2127 -0
- package/src/classes/combinations-generator.ts +331 -0
- package/src/classes/data-model.ts +337 -0
- package/src/classes/errors.ts +105 -0
- package/src/classes/init-template-base.ts +1028 -0
- package/src/classes/liquid-drop.ts +376 -0
- package/src/classes/liquid-engine.ts +249 -0
- package/src/classes/package.ts +765 -0
- package/src/classes/platform-detector.ts +237 -0
- package/src/classes/policies.ts +200 -0
- package/src/classes/template-expander.ts +330 -0
- package/src/data/substitutions-variables.ts +390 -0
- package/src/functions/chmod-recursively.ts +195 -0
- package/src/functions/filter-paths.ts +126 -0
- package/src/functions/is-something.ts +223 -0
- package/src/functions/matrix-expander.ts +172 -0
- package/src/functions/perform-substitutions.ts +253 -0
- package/src/functions/utils.ts +151 -0
- package/src/index.ts +72 -19
- package/src/types/json.ts +519 -0
- package/src/types/xpm-init-template.ts +282 -0
- package/src/types/xpm.ts +162 -0
- package/dist/lib/chmod-recursive.d.ts +0 -7
- package/dist/lib/chmod-recursive.d.ts.map +0 -1
- package/dist/lib/chmod-recursive.js +0 -81
- package/dist/lib/chmod-recursive.js.map +0 -1
- package/dist/lib/errors.d.ts +0 -11
- package/dist/lib/errors.d.ts.map +0 -1
- package/dist/lib/errors.js +0 -26
- package/dist/lib/errors.js.map +0 -1
- package/dist/lib/functions/chmod-recursive.d.ts +0 -7
- package/dist/lib/functions/chmod-recursive.d.ts.map +0 -1
- package/dist/lib/functions/chmod-recursive.js +0 -81
- package/dist/lib/functions/chmod-recursive.js.map +0 -1
- package/dist/lib/functions/perform-substitutions.d.ts +0 -20
- package/dist/lib/functions/perform-substitutions.d.ts.map +0 -1
- package/dist/lib/functions/perform-substitutions.js +0 -85
- package/dist/lib/functions/perform-substitutions.js.map +0 -1
- package/dist/lib/functions/utils.d.ts +0 -30
- package/dist/lib/functions/utils.d.ts.map +0 -1
- package/dist/lib/functions/utils.js +0 -70
- package/dist/lib/functions/utils.js.map +0 -1
- package/dist/lib/init-template-base.d.ts +0 -46
- package/dist/lib/init-template-base.d.ts.map +0 -1
- package/dist/lib/init-template-base.js +0 -281
- package/dist/lib/init-template-base.js.map +0 -1
- package/dist/lib/liquid-actions.d.ts +0 -37
- package/dist/lib/liquid-actions.d.ts.map +0 -1
- package/dist/lib/liquid-actions.js +0 -148
- package/dist/lib/liquid-actions.js.map +0 -1
- package/dist/lib/liquid-build-configurations.d.ts +0 -47
- package/dist/lib/liquid-build-configurations.d.ts.map +0 -1
- package/dist/lib/liquid-build-configurations.js +0 -282
- package/dist/lib/liquid-build-configurations.js.map +0 -1
- package/dist/lib/liquid-drop.d.ts +0 -13
- package/dist/lib/liquid-drop.d.ts.map +0 -1
- package/dist/lib/liquid-drop.js +0 -56
- package/dist/lib/liquid-drop.js.map +0 -1
- package/dist/lib/liquid-engine.d.ts +0 -5
- package/dist/lib/liquid-engine.d.ts.map +0 -1
- package/dist/lib/liquid-engine.js +0 -85
- package/dist/lib/liquid-engine.js.map +0 -1
- package/dist/lib/liquid-package.d.ts +0 -17
- package/dist/lib/liquid-package.d.ts.map +0 -1
- package/dist/lib/liquid-package.js +0 -70
- package/dist/lib/liquid-package.js.map +0 -1
- package/dist/lib/package.d.ts +0 -66
- package/dist/lib/package.d.ts.map +0 -1
- package/dist/lib/package.js +0 -700
- package/dist/lib/package.js.map +0 -1
- package/dist/lib/perform-substitutions.d.ts +0 -20
- package/dist/lib/perform-substitutions.d.ts.map +0 -1
- package/dist/lib/perform-substitutions.js +0 -85
- package/dist/lib/perform-substitutions.js.map +0 -1
- package/dist/lib/policies.d.ts +0 -14
- package/dist/lib/policies.d.ts.map +0 -1
- package/dist/lib/policies.js +0 -33
- package/dist/lib/policies.js.map +0 -1
- package/dist/lib/substitutions-variables.d.ts +0 -117
- package/dist/lib/substitutions-variables.d.ts.map +0 -1
- package/dist/lib/substitutions-variables.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -13
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -30
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/utils.js +0 -70
- package/dist/lib/utils.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/lib/errors.ts +0 -29
- package/src/lib/functions/chmod-recursive.ts +0 -103
- package/src/lib/functions/perform-substitutions.ts +0 -116
- package/src/lib/functions/utils.ts +0 -88
- package/src/lib/init-template-base.ts +0 -408
- package/src/lib/liquid-actions.ts +0 -223
- package/src/lib/liquid-build-configurations.ts +0 -433
- package/src/lib/liquid-drop.ts +0 -99
- package/src/lib/liquid-engine.ts +0 -135
- package/src/lib/liquid-package.ts +0 -108
- package/src/lib/package.ts +0 -947
- package/src/lib/policies.ts +0 -51
- package/src/lib/substitutions-variables.ts +0 -177
- package/src/lib/types.ts +0 -109
- package/src/package.json +0 -3
- package/src/tsconfig.json +0 -10
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import { liquidSubstitutionsVariablesBase, } from '../data/substitutions-variables.js';
|
|
4
|
+
import { isJsonObject } from '../functions/is-something.js';
|
|
5
|
+
import { Actions } from './actions.js';
|
|
6
|
+
import { BuildConfigurations } from './build-configurations.js';
|
|
7
|
+
import { LiquidEngine } from './liquid-engine.js';
|
|
8
|
+
export const buildFolderRelativePathPropertyName = 'buildFolderRelativePath';
|
|
9
|
+
export class DataModel {
|
|
10
|
+
substitutionsVariables;
|
|
11
|
+
actions;
|
|
12
|
+
buildConfigurations;
|
|
13
|
+
_log;
|
|
14
|
+
_engine;
|
|
15
|
+
_jsonPackage;
|
|
16
|
+
constructor({ jsonPackage, log }) {
|
|
17
|
+
log.trace(`${DataModel.name}()`);
|
|
18
|
+
this._log = log;
|
|
19
|
+
this._engine = new LiquidEngine();
|
|
20
|
+
assert(isJsonObject(jsonPackage.xpack), 'xpack section missing in package.json');
|
|
21
|
+
this._jsonPackage = jsonPackage;
|
|
22
|
+
assert(typeof os.version === 'function', 'Mandatory os.version available only since 12.x');
|
|
23
|
+
this.substitutionsVariables = {
|
|
24
|
+
...liquidSubstitutionsVariablesBase,
|
|
25
|
+
package: jsonPackage,
|
|
26
|
+
};
|
|
27
|
+
if (isJsonObject(jsonPackage.xpack.properties)) {
|
|
28
|
+
this.substitutionsVariables.properties = {
|
|
29
|
+
...jsonPackage.xpack.properties,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
Object.seal(this.substitutionsVariables);
|
|
33
|
+
this.actions = new Actions({
|
|
34
|
+
log: this._log,
|
|
35
|
+
engine: this._engine,
|
|
36
|
+
substitutionsVariables: this.substitutionsVariables,
|
|
37
|
+
jsonActions: this._jsonPackage.xpack.actions,
|
|
38
|
+
});
|
|
39
|
+
this.buildConfigurations = new BuildConfigurations({
|
|
40
|
+
log: this._log,
|
|
41
|
+
engine: this._engine,
|
|
42
|
+
substitutionsVariables: this.substitutionsVariables,
|
|
43
|
+
jsonBuildConfigurations: this._jsonPackage.xpack.buildConfigurations,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-model.js","sourceRoot":"","sources":["../../src/classes/data-model.ts"],"names":[],"mappings":"AAaA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7B,OAAO,EAEL,gCAAgC,GACjC,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQjD,MAAM,CAAC,MAAM,mCAAmC,GAAG,yBAAyB,CAAA;AAuD5E,MAAM,OAAO,SAAS;IA0CX,sBAAsB,CAA8B;IAwBpD,OAAO,CAAS;IA0BhB,mBAAmB,CAAqB;IAa9B,IAAI,CAAQ;IA2BZ,OAAO,CAAc;IA0BrB,YAAY,CAAgB;IAsC/C,YAAY,EAAE,WAAW,EAAE,GAAG,EAAkC;QAC9D,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,CAAA;QAEhC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QAEjC,MAAM,CACJ,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,EAC/B,uCAAuC,CACxC,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAG/B,MAAM,CACJ,OAAO,EAAE,CAAC,OAAO,KAAK,UAAU,EAChC,gDAAgD,CACjD,CAAA;QAED,IAAI,CAAC,sBAAsB,GAAG;YAC5B,GAAG,gCAAgC;YACnC,OAAO,EAAE,WAAW;SACrB,CAAA;QAED,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,sBAAsB,CAAC,UAAU,GAAG;gBACvC,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU;aAChC,CAAA;QACH,CAAC;QAGD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QAGxC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC;YACzB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO;SAC7C,CAAC,CAAA;QAGF,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAmB,CAAC;YACjD,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,uBAAuB,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB;SACrE,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class JsonSyntaxError extends Error {
|
|
2
|
+
}
|
|
3
|
+
export declare class PrerequisitesError extends Error {
|
|
4
|
+
}
|
|
5
|
+
export declare class ConfigurationError extends Error {
|
|
6
|
+
}
|
|
7
|
+
export declare class TemplateError extends Error {
|
|
8
|
+
}
|
|
9
|
+
export declare class InputError extends Error {
|
|
10
|
+
}
|
|
11
|
+
export declare class OutputError extends Error {
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/classes/errors.ts"],"names":[],"mappings":"AAqCA,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAa7C,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAYhD,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAchD,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAc3C,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAYxC,qBAAa,WAAY,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class JsonSyntaxError extends Error {
|
|
2
|
+
}
|
|
3
|
+
export class PrerequisitesError extends Error {
|
|
4
|
+
}
|
|
5
|
+
export class ConfigurationError extends Error {
|
|
6
|
+
}
|
|
7
|
+
export class TemplateError extends Error {
|
|
8
|
+
}
|
|
9
|
+
export class InputError extends Error {
|
|
10
|
+
}
|
|
11
|
+
export class OutputError extends Error {
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/classes/errors.ts"],"names":[],"mappings":"AAqCA,MAAM,OAAO,eAAgB,SAAQ,KAAK;CAAG;AAa7C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAYhD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAchD,MAAM,OAAO,aAAc,SAAQ,KAAK;CAAG;AAc3C,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG;AAYxC,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Liquid } from 'liquidjs';
|
|
2
|
+
import { Logger } from '@xpack/logger';
|
|
3
|
+
import { InitTemplatePropertiesDefinitions, InitTemplateSubstitutionsVariables } from '../types/xpm-init-template.js';
|
|
4
|
+
import { Context } from '../types/xpm.js';
|
|
5
|
+
export interface InitTemplateConstructorParameters {
|
|
6
|
+
context: Context;
|
|
7
|
+
__dirname: string;
|
|
8
|
+
templatesPath: string;
|
|
9
|
+
propertiesDefinitions: InitTemplatePropertiesDefinitions;
|
|
10
|
+
process?: NodeJS.Process;
|
|
11
|
+
}
|
|
12
|
+
export declare abstract class InitTemplateBase {
|
|
13
|
+
protected readonly _context: Context;
|
|
14
|
+
protected readonly _log: Logger;
|
|
15
|
+
protected readonly _propertiesDefinitions: InitTemplatePropertiesDefinitions;
|
|
16
|
+
protected readonly __dirname: string;
|
|
17
|
+
protected readonly _templatesPath: string;
|
|
18
|
+
protected readonly _engine: Liquid;
|
|
19
|
+
protected _substitutionsVariables?: InitTemplateSubstitutionsVariables;
|
|
20
|
+
protected _isInteractive: boolean;
|
|
21
|
+
protected readonly _process: NodeJS.Process;
|
|
22
|
+
constructor({ context, __dirname, templatesPath, propertiesDefinitions, process: _process, }: InitTemplateConstructorParameters);
|
|
23
|
+
run(): Promise<number>;
|
|
24
|
+
abstract generate(): Promise<void>;
|
|
25
|
+
isPlatformSupported(platforms: string[] | undefined): boolean;
|
|
26
|
+
copyFile({ sourceFileRelativePath, destinationFilePath, }: {
|
|
27
|
+
sourceFileRelativePath: string;
|
|
28
|
+
destinationFilePath?: string;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
copyFolder({ sourceFolderRelativePath, destinationFolderPath, }: {
|
|
31
|
+
sourceFolderRelativePath: string;
|
|
32
|
+
destinationFolderPath?: string;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
render({ sourceFilePath, destinationFilePath, substitutionsVariables, }: {
|
|
35
|
+
sourceFilePath: string;
|
|
36
|
+
destinationFilePath: string;
|
|
37
|
+
substitutionsVariables?: InitTemplateSubstitutionsVariables;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
protected _validatePropertyValue(name: string, value: string): string | boolean | number;
|
|
40
|
+
protected _askForMoreValues(): Promise<void>;
|
|
41
|
+
protected _copyFolderRecursively({ sourceFolderPath, destinationFolderPath, }: {
|
|
42
|
+
sourceFolderPath: string;
|
|
43
|
+
destinationFolderPath: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
protected _validatePropertiesDefinitions(): void;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=init-template-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-template-base.d.ts","sourceRoot":"","sources":["../../src/classes/init-template-base.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAItC,OAAO,EAEL,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AA8BzC,MAAM,WAAW,iCAAiC;IAIhD,OAAO,EAAE,OAAO,CAAA;IAKhB,SAAS,EAAE,MAAM,CAAA;IAKjB,aAAa,EAAE,MAAM,CAAA;IAKrB,qBAAqB,EAAE,iCAAiC,CAAA;IAOxD,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;CACzB;AAwBD,8BAAsB,gBAAgB;IAUpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAKpC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAK/B,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,iCAAiC,CACxE;IAKJ,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAKpC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAKzC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAKlC,SAAS,CAAC,uBAAuB,CAAC,EAAE,kCAAkC,CAAA;IAyBtE,SAAS,CAAC,cAAc,UAAQ;IA6BhC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAA;gBAc/B,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,OAAO,EAAE,QAAkB,GAC5B,EAAE,iCAAiC;IAyD9B,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IA0G5B,QAAQ,CAAa,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9C,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO;IA+BvD,QAAQ,CAAC,EACb,sBAAsB,EACtB,mBAA4C,GAC7C,EAAE;QACD,sBAAsB,EAAE,MAAM,CAAA;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAC7B,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCX,UAAU,CAAC,EACf,wBAAwB,EACxB,qBAAgD,GACjD,EAAE;QACD,wBAAwB,EAAE,MAAM,CAAA;QAChC,qBAAqB,CAAC,EAAE,MAAM,CAAA;KAC/B,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CX,MAAM,CAAC,EACX,cAAc,EACd,mBAAmB,EACnB,sBAAqD,GACtD,EAAE;QACD,cAAc,EAAE,MAAM,CAAA;QACtB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,sBAAsB,CAAC,EAAE,kCAAkC,CAAA;KAC5D,GAAG,OAAO,CAAC,IAAI,CAAC;IAwEjB,SAAS,CAAC,sBAAsB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,OAAO,GAAG,MAAM;cAkFZ,iBAAiB;cAmHjB,sBAAsB,CAAC,EACrC,gBAAgB,EAChB,qBAAqB,GACtB,EAAE;QACD,gBAAgB,EAAE,MAAM,CAAA;QACxB,qBAAqB,EAAE,MAAM,CAAA;KAC9B,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFjB,SAAS,CAAC,8BAA8B,IAAI,IAAI;CAmIjD"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import * as util from 'node:util';
|
|
3
|
+
import * as readline from 'node:readline/promises';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import { Liquid } from 'liquidjs';
|
|
7
|
+
import { isString, isObject, isBoolean, isNumber, } from '../functions/is-something.js';
|
|
8
|
+
import { JsonSyntaxError, InputError, OutputError, ConfigurationError, } from './errors.js';
|
|
9
|
+
export class InitTemplateBase {
|
|
10
|
+
_context;
|
|
11
|
+
_log;
|
|
12
|
+
_propertiesDefinitions = {};
|
|
13
|
+
__dirname;
|
|
14
|
+
_templatesPath;
|
|
15
|
+
_engine;
|
|
16
|
+
_substitutionsVariables;
|
|
17
|
+
_isInteractive = false;
|
|
18
|
+
_process;
|
|
19
|
+
constructor({ context, __dirname, templatesPath, propertiesDefinitions, process: _process = process, }) {
|
|
20
|
+
assert(context, 'context is required');
|
|
21
|
+
assert(context.log, 'context.log is required');
|
|
22
|
+
assert(context.config, 'context.context is required');
|
|
23
|
+
assert(context.config.projectName, 'context.config.projectName is required');
|
|
24
|
+
assert(context.config.properties, 'context.config.properties is required');
|
|
25
|
+
assert(__dirname, '__dirname is required');
|
|
26
|
+
assert(templatesPath, 'templatesPath is required');
|
|
27
|
+
assert(propertiesDefinitions, 'propertiesDefinitions is required');
|
|
28
|
+
this._context = context;
|
|
29
|
+
this._log = context.log;
|
|
30
|
+
this._propertiesDefinitions = propertiesDefinitions;
|
|
31
|
+
this.__dirname = __dirname;
|
|
32
|
+
this._templatesPath = templatesPath;
|
|
33
|
+
this._process = _process;
|
|
34
|
+
this._validatePropertiesDefinitions();
|
|
35
|
+
this._engine = new Liquid({
|
|
36
|
+
root: this._templatesPath,
|
|
37
|
+
cache: false,
|
|
38
|
+
strictFilters: true,
|
|
39
|
+
strictVariables: true,
|
|
40
|
+
trimTagRight: false,
|
|
41
|
+
trimTagLeft: false,
|
|
42
|
+
greedy: false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async run() {
|
|
46
|
+
const log = this._log;
|
|
47
|
+
log.trace(`${this.constructor.name}.run()`);
|
|
48
|
+
log.info();
|
|
49
|
+
const context = this._context;
|
|
50
|
+
const config = context.config;
|
|
51
|
+
assert(config.properties, 'config.properties is required');
|
|
52
|
+
const validationErrors = [];
|
|
53
|
+
for (const [key, val] of Object.entries(config.properties)) {
|
|
54
|
+
try {
|
|
55
|
+
config.properties[key] = this._validatePropertyValue(key, val);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof Error) {
|
|
59
|
+
const errorMessage = `${key}: ${error.message}`;
|
|
60
|
+
log.error(errorMessage);
|
|
61
|
+
validationErrors.push(errorMessage);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (validationErrors.length > 0) {
|
|
66
|
+
throw new JsonSyntaxError(validationErrors.length === 1
|
|
67
|
+
? '1 invalid property'
|
|
68
|
+
: `${String(validationErrors.length)} invalid properties`);
|
|
69
|
+
}
|
|
70
|
+
const mustAsk = Object.keys(this._propertiesDefinitions).some((key) => {
|
|
71
|
+
return (this._propertiesDefinitions[key].isMandatory &&
|
|
72
|
+
!config.properties?.[key]);
|
|
73
|
+
});
|
|
74
|
+
let isInteractive;
|
|
75
|
+
if (mustAsk) {
|
|
76
|
+
if (!(this._process.stdin.isTTY && this._process.stdout.isTTY)) {
|
|
77
|
+
throw new JsonSyntaxError('Interactive mode not possible without a TTY.');
|
|
78
|
+
}
|
|
79
|
+
await this._askForMoreValues();
|
|
80
|
+
log.trace(util.inspect(config.properties));
|
|
81
|
+
context.startTime = Date.now();
|
|
82
|
+
isInteractive = true;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
Object.entries(this._propertiesDefinitions).forEach(([key, val]) => {
|
|
86
|
+
assert(config.properties, 'config.properties is required');
|
|
87
|
+
if (!config.properties[key] && val.default !== undefined) {
|
|
88
|
+
config.properties[key] = val.default;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
isInteractive = false;
|
|
92
|
+
}
|
|
93
|
+
this._isInteractive = isInteractive;
|
|
94
|
+
const currentTime = new Date();
|
|
95
|
+
const substitutionsVariables = {
|
|
96
|
+
...config.properties,
|
|
97
|
+
properties: config.properties,
|
|
98
|
+
propertiesNames: Object.keys(config.properties),
|
|
99
|
+
projectName: config.projectName,
|
|
100
|
+
year: currentTime.getFullYear().toString(),
|
|
101
|
+
};
|
|
102
|
+
this._substitutionsVariables = substitutionsVariables;
|
|
103
|
+
await this.generate();
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
isPlatformSupported(platforms) {
|
|
107
|
+
assert(platforms && platforms.length !== 0, 'platforms array is required');
|
|
108
|
+
if (platforms.includes(`${this._process.platform}-${this._process.arch}`)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (platforms.includes(this._process.platform)) {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
async copyFile({ sourceFileRelativePath, destinationFilePath = sourceFileRelativePath, }) {
|
|
117
|
+
const log = this._log;
|
|
118
|
+
await fs.mkdir(path.dirname(destinationFilePath), { recursive: true });
|
|
119
|
+
const sourceFileAbsolutePath = path.resolve(this._templatesPath, sourceFileRelativePath);
|
|
120
|
+
await fs.copyFile(sourceFileAbsolutePath, destinationFilePath);
|
|
121
|
+
const destinationFileRelativePath = path.relative(this._context.config.cwd, destinationFilePath);
|
|
122
|
+
log.info(`File '${destinationFileRelativePath}' copied.`);
|
|
123
|
+
}
|
|
124
|
+
async copyFolder({ sourceFolderRelativePath, destinationFolderPath = sourceFolderRelativePath, }) {
|
|
125
|
+
const log = this._log;
|
|
126
|
+
const sourceFolderAbsolutePath = path.resolve(this._templatesPath, sourceFolderRelativePath);
|
|
127
|
+
await this._copyFolderRecursively({
|
|
128
|
+
sourceFolderPath: sourceFolderAbsolutePath,
|
|
129
|
+
destinationFolderPath: path.resolve(destinationFolderPath),
|
|
130
|
+
});
|
|
131
|
+
log.info(`Folder '${destinationFolderPath}' copied.`);
|
|
132
|
+
}
|
|
133
|
+
async render({ sourceFilePath, destinationFilePath, substitutionsVariables = this._substitutionsVariables, }) {
|
|
134
|
+
assert(substitutionsVariables !== undefined, 'substitutionsVariables is required for rendering templates. ' +
|
|
135
|
+
'Ensure that run() has been called to prepare the variables.');
|
|
136
|
+
const log = this._log;
|
|
137
|
+
const context = this._context;
|
|
138
|
+
const config = context.config;
|
|
139
|
+
const cwd = config.cwd;
|
|
140
|
+
const sourceFileRelativePath = path.relative(cwd, sourceFilePath);
|
|
141
|
+
const destinationFileRelativePath = path.relative(cwd, destinationFilePath);
|
|
142
|
+
log.info(`Rendering template '${sourceFileRelativePath}' to ` +
|
|
143
|
+
`'${destinationFileRelativePath}'`);
|
|
144
|
+
log.trace(`render(${sourceFilePath}, ${destinationFilePath})`);
|
|
145
|
+
try {
|
|
146
|
+
const fileContent = (await this._engine.renderFile(sourceFilePath, substitutionsVariables));
|
|
147
|
+
await fs.mkdir(path.dirname(destinationFilePath), { recursive: true });
|
|
148
|
+
await fs.writeFile(destinationFilePath, fileContent, 'utf8');
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error instanceof Error) {
|
|
152
|
+
throw new OutputError(error.message);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
log.info(`File '${destinationFileRelativePath}' generated.`);
|
|
156
|
+
}
|
|
157
|
+
_validatePropertyValue(name, value) {
|
|
158
|
+
const propDef = this._propertiesDefinitions[name];
|
|
159
|
+
if (propDef === undefined) {
|
|
160
|
+
throw new ConfigurationError(`Unsupported property '${name}'`);
|
|
161
|
+
}
|
|
162
|
+
const trimmedValue = value.trim();
|
|
163
|
+
if (trimmedValue === '') {
|
|
164
|
+
if (propDef.default !== undefined) {
|
|
165
|
+
return propDef.default;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
switch (propDef.type) {
|
|
170
|
+
case 'select':
|
|
171
|
+
assert(propDef.items, `Property '${name}' of type 'select' has no items.`);
|
|
172
|
+
if (propDef.items[value]) {
|
|
173
|
+
if (typeof propDef.items[value] === 'string') {
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
else if (typeof propDef.items[value] === 'object' &&
|
|
177
|
+
this.isPlatformSupported(propDef.items[value].platforms)) {
|
|
178
|
+
return value;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
case 'boolean':
|
|
183
|
+
if (trimmedValue === 'true') {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
else if (trimmedValue === 'false') {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
case 'number': {
|
|
191
|
+
const num = Number(trimmedValue);
|
|
192
|
+
if (isFinite(num)) {
|
|
193
|
+
return num;
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case 'string':
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
throw new ConfigurationError(`Unsupported value '${value}' for property '${name}'`);
|
|
202
|
+
}
|
|
203
|
+
async _askForMoreValues() {
|
|
204
|
+
const context = this._context;
|
|
205
|
+
const config = context.config;
|
|
206
|
+
assert(config.properties, 'config.properties is required');
|
|
207
|
+
const rl = readline.createInterface({
|
|
208
|
+
input: this._process.stdin,
|
|
209
|
+
output: this._process.stdout,
|
|
210
|
+
});
|
|
211
|
+
for (const name of Object.keys(this._propertiesDefinitions)) {
|
|
212
|
+
if (config.properties[name]) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const definition = this._propertiesDefinitions[name];
|
|
216
|
+
let prompt = `${definition.label}?`;
|
|
217
|
+
switch (definition.type) {
|
|
218
|
+
case 'select': {
|
|
219
|
+
prompt += ' (';
|
|
220
|
+
const validItems = [];
|
|
221
|
+
assert(definition.items, 'definition.items is required');
|
|
222
|
+
for (const [ikey, ival] of Object.entries(definition.items)) {
|
|
223
|
+
if (isString(ival)) {
|
|
224
|
+
validItems.push(ikey);
|
|
225
|
+
}
|
|
226
|
+
else if (isObject(ival) &&
|
|
227
|
+
this.isPlatformSupported(ival.platforms)) {
|
|
228
|
+
validItems.push(ikey);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
prompt += validItems.join(', ');
|
|
232
|
+
prompt += ', ?)';
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case 'string':
|
|
236
|
+
prompt += ' (string, ?)';
|
|
237
|
+
break;
|
|
238
|
+
case 'number':
|
|
239
|
+
prompt += ' (number, ?)';
|
|
240
|
+
break;
|
|
241
|
+
case 'boolean':
|
|
242
|
+
prompt += ' (true, false, ?)';
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
if (definition.default !== undefined) {
|
|
246
|
+
prompt += ` [${String(definition.default)}]`;
|
|
247
|
+
}
|
|
248
|
+
prompt += ': ';
|
|
249
|
+
const MAX_RETRIES = 42;
|
|
250
|
+
let retryCount = 0;
|
|
251
|
+
while (true) {
|
|
252
|
+
if (++retryCount > MAX_RETRIES) {
|
|
253
|
+
throw new InputError(`Too many invalid attempts for property '${name}' ` +
|
|
254
|
+
`(limit: ${String(MAX_RETRIES)})`);
|
|
255
|
+
}
|
|
256
|
+
const answer = (await rl.question(prompt)).trim();
|
|
257
|
+
try {
|
|
258
|
+
const value = this._validatePropertyValue(name, answer);
|
|
259
|
+
config.properties[name] = value;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
if (error instanceof Error) {
|
|
264
|
+
this._log.trace(error.message);
|
|
265
|
+
}
|
|
266
|
+
this._process.stdout.write(`${definition.description}\n`);
|
|
267
|
+
if (definition.type === 'select') {
|
|
268
|
+
assert(definition.items, 'definition.items is required');
|
|
269
|
+
for (const [ikey, ival] of Object.entries(definition.items)) {
|
|
270
|
+
if (isString(ival)) {
|
|
271
|
+
this._process.stdout.write(`- ${ikey}: ${ival}\n`);
|
|
272
|
+
}
|
|
273
|
+
else if (isObject(ival) &&
|
|
274
|
+
this.isPlatformSupported(ival.platforms)) {
|
|
275
|
+
this._process.stdout.write(`- ${ikey}: ${ival.message}\n`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async _copyFolderRecursively({ sourceFolderPath, destinationFolderPath, }) {
|
|
284
|
+
await fs.mkdir(destinationFolderPath, { recursive: true });
|
|
285
|
+
const dirents = await fs.readdir(sourceFolderPath, {
|
|
286
|
+
withFileTypes: true,
|
|
287
|
+
});
|
|
288
|
+
for (const dirent of dirents) {
|
|
289
|
+
if (dirent.isDirectory()) {
|
|
290
|
+
await this._copyFolderRecursively({
|
|
291
|
+
sourceFolderPath: path.join(sourceFolderPath, dirent.name),
|
|
292
|
+
destinationFolderPath: path.join(destinationFolderPath, dirent.name),
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
await fs.copyFile(path.join(sourceFolderPath, dirent.name), path.join(destinationFolderPath, dirent.name));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
_validatePropertiesDefinitions() {
|
|
301
|
+
assert(isObject(this._propertiesDefinitions), 'propertiesDefinitions is not an object.');
|
|
302
|
+
assert(Object.keys(this._propertiesDefinitions).length > 0, 'propertiesDefinitions is an empty object.');
|
|
303
|
+
for (const [key, val] of Object.entries(this._propertiesDefinitions)) {
|
|
304
|
+
assert(isString(val.label), `Property '${key}' must have a string label`);
|
|
305
|
+
assert(val.label.trim() !== '', `Property '${key}' has an empty label`);
|
|
306
|
+
assert(isString(val.description), `Property '${key}' must have a string description`);
|
|
307
|
+
assert(val.description.trim() !== '', `Property '${key}' has an empty description`);
|
|
308
|
+
if (val.isMandatory !== undefined) {
|
|
309
|
+
assert(isBoolean(val.isMandatory), `Property '${key}' has a non boolean isMandatory value.`);
|
|
310
|
+
}
|
|
311
|
+
assert(val.type !== undefined, `Property '${key}' has no type defined.`);
|
|
312
|
+
switch (val.type) {
|
|
313
|
+
case 'select':
|
|
314
|
+
assert(val.items !== undefined, `Property '${key}' of type 'select' has no items.`);
|
|
315
|
+
assert(isObject(val.items), `Property '${key}' of type 'select' has invalid items.`);
|
|
316
|
+
assert(Object.keys(val.items).length !== 0, `Property '${key}' of type 'select' has no items.`);
|
|
317
|
+
for (const [ikey, ival] of Object.entries(val.items)) {
|
|
318
|
+
assert(isString(ival) ||
|
|
319
|
+
(isObject(ival) &&
|
|
320
|
+
Array.isArray(ival.platforms) &&
|
|
321
|
+
isString(ival.message)), `Property '${key}' has invalid item '${ikey}'.`);
|
|
322
|
+
}
|
|
323
|
+
if (!val.isMandatory) {
|
|
324
|
+
assert(val.default !== undefined, `Property '${key}' of type 'select' ` +
|
|
325
|
+
`must have a default value if not mandatory.`);
|
|
326
|
+
}
|
|
327
|
+
if (val.default !== undefined) {
|
|
328
|
+
assert(isString(val.default), `Property '${key}' has a non string default value.`);
|
|
329
|
+
assert(val.default.trim() !== '', `Property '${key}' has an empty default value.`);
|
|
330
|
+
}
|
|
331
|
+
if (val.default !== undefined) {
|
|
332
|
+
assert(Object.keys(val.items).includes(String(val.default)), `Property '${key}' has a default value not in items list.`);
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
case 'string':
|
|
336
|
+
if (val.default !== undefined) {
|
|
337
|
+
assert(isString(val.default), `Property '${key}' has a non string default value.`);
|
|
338
|
+
assert(val.default.trim() !== '', `Property '${key}' has an empty default value.`);
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
case 'number':
|
|
342
|
+
if (val.default !== undefined) {
|
|
343
|
+
assert(isNumber(val.default), `Property '${key}' has a non number default value.`);
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
case 'boolean':
|
|
347
|
+
if (val.default !== undefined) {
|
|
348
|
+
assert(isBoolean(val.default), `Property '${key}' has a non boolean default value.`);
|
|
349
|
+
}
|
|
350
|
+
break;
|
|
351
|
+
default:
|
|
352
|
+
assert(false, `Property '${key}' has unsupported type '${String(val.type)}'.`);
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=init-template-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-template-base.js","sourceRoot":"","sources":["../../src/classes/init-template-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as liquidjs from 'liquidjs';
|
|
2
|
+
import { Logger } from '@xpack/logger';
|
|
3
|
+
import { LiquidSubstitutionsStrings } from '../data/substitutions-variables.js';
|
|
4
|
+
export interface LiquidPropertiesDropConstructorParameters {
|
|
5
|
+
engine: liquidjs.Liquid;
|
|
6
|
+
properties: LiquidSubstitutionsStrings;
|
|
7
|
+
log: Logger;
|
|
8
|
+
}
|
|
9
|
+
export declare class LiquidPropertiesDrop extends liquidjs.Drop {
|
|
10
|
+
protected readonly _log: Logger;
|
|
11
|
+
protected readonly _properties: LiquidSubstitutionsStrings;
|
|
12
|
+
protected readonly _engine: liquidjs.Liquid;
|
|
13
|
+
constructor({ engine, properties, log, }: LiquidPropertiesDropConstructorParameters);
|
|
14
|
+
liquidMethodMissing(key: string, context: liquidjs.Context): Promise<any>;
|
|
15
|
+
}
|
|
16
|
+
export interface LiquidMatrixDropConstructorParameters {
|
|
17
|
+
engine: liquidjs.Liquid;
|
|
18
|
+
matrix: LiquidSubstitutionsStrings;
|
|
19
|
+
log: Logger;
|
|
20
|
+
}
|
|
21
|
+
export declare class LiquidMatrixDrop extends liquidjs.Drop {
|
|
22
|
+
protected readonly _log: Logger;
|
|
23
|
+
protected readonly _matrix: LiquidSubstitutionsStrings;
|
|
24
|
+
protected readonly _engine: liquidjs.Liquid;
|
|
25
|
+
constructor({ engine, matrix, log }: LiquidMatrixDropConstructorParameters);
|
|
26
|
+
liquidMethodMissing(key: string, context: liquidjs.Context): Promise<any>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=liquid-drop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquid-drop.d.ts","sourceRoot":"","sources":["../../src/classes/liquid-drop.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAItC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AAmB/E,MAAM,WAAW,yCAAyC;IAIxD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAA;IAKvB,UAAU,EAAE,0BAA0B,CAAA;IAKtC,GAAG,EAAE,MAAM,CAAA;CACZ;AA0BD,qBAAa,oBAAqB,SAAQ,QAAQ,CAAC,IAAI;IAUrD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAK/B,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAA;IAK1D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAA;gBAY/B,EACV,MAAM,EACN,UAAU,EACV,GAAG,GACJ,EAAE,yCAAyC;IA4C7B,mBAAmB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,QAAQ,CAAC,OAAO,GAExB,OAAO,CAAC,GAAG,CAAC;CAuChB;AAeD,MAAM,WAAW,qCAAqC;IAIpD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAA;IAKvB,MAAM,EAAE,0BAA0B,CAAA;IAKlC,GAAG,EAAE,MAAM,CAAA;CACZ;AAsBD,qBAAa,gBAAiB,SAAQ,QAAQ,CAAC,IAAI;IAOjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAK/B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAA;IAKtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAA;gBAY/B,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,qCAAqC;IA6C3D,mBAAmB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,QAAQ,CAAC,OAAO,GAExB,OAAO,CAAC,GAAG,CAAC;CAuChB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as liquidjs from 'liquidjs';
|
|
2
|
+
import { isJsonObject } from '../functions/is-something.js';
|
|
3
|
+
import { TemplateError } from './errors.js';
|
|
4
|
+
export class LiquidPropertiesDrop extends liquidjs.Drop {
|
|
5
|
+
_log;
|
|
6
|
+
_properties;
|
|
7
|
+
_engine;
|
|
8
|
+
constructor({ engine, properties, log, }) {
|
|
9
|
+
super();
|
|
10
|
+
log.trace(`${LiquidPropertiesDrop.name}()`);
|
|
11
|
+
this._log = log;
|
|
12
|
+
this._engine = engine;
|
|
13
|
+
this._properties = properties;
|
|
14
|
+
}
|
|
15
|
+
async liquidMethodMissing(key, context) {
|
|
16
|
+
if (this._properties[key] === undefined) {
|
|
17
|
+
throw new TemplateError(`"properties.${key}" not defined`);
|
|
18
|
+
}
|
|
19
|
+
const log = this._log;
|
|
20
|
+
const value = this._properties[key];
|
|
21
|
+
log.trace(`${LiquidPropertiesDrop.name}.liquidMethodMissing('${key}') in (`, value, ')');
|
|
22
|
+
let result;
|
|
23
|
+
if (isJsonObject(value)) {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
const valueString = Array.isArray(value) ? value.join('') : value;
|
|
27
|
+
if (valueString.includes('{{') || valueString.includes('{%')) {
|
|
28
|
+
result = (await this._engine.parseAndRender(valueString, context));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
result = value;
|
|
32
|
+
}
|
|
33
|
+
log.trace(`${LiquidPropertiesDrop.name}.liquidMethodMissing('${key}')` + ` => (`, result, ')');
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class LiquidMatrixDrop extends liquidjs.Drop {
|
|
38
|
+
_log;
|
|
39
|
+
_matrix;
|
|
40
|
+
_engine;
|
|
41
|
+
constructor({ engine, matrix, log }) {
|
|
42
|
+
super();
|
|
43
|
+
log.trace(`${LiquidMatrixDrop.name}()`);
|
|
44
|
+
this._log = log;
|
|
45
|
+
this._engine = engine;
|
|
46
|
+
this._matrix = matrix;
|
|
47
|
+
}
|
|
48
|
+
async liquidMethodMissing(key, context) {
|
|
49
|
+
if (this._matrix[key] === undefined) {
|
|
50
|
+
throw new TemplateError(`"matrix.${key}" not defined`);
|
|
51
|
+
}
|
|
52
|
+
const log = this._log;
|
|
53
|
+
const value = this._matrix[key];
|
|
54
|
+
log.trace(`${LiquidMatrixDrop.name}.liquidMethodMissing('${key}') in (`, value, ')');
|
|
55
|
+
let result;
|
|
56
|
+
if (isJsonObject(value)) {
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
const valueString = Array.isArray(value) ? value.join('') : value;
|
|
60
|
+
if (valueString.includes('{{') || valueString.includes('{%')) {
|
|
61
|
+
result = (await this._engine.parseAndRender(valueString, context));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
result = value;
|
|
65
|
+
}
|
|
66
|
+
log.trace(`${LiquidMatrixDrop.name}.liquidMethodMissing('${key}')` + ` => (`, result, ')');
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=liquid-drop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquid-drop.js","sourceRoot":"","sources":["../../src/classes/liquid-drop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as liquidjs from 'liquidjs';
|
|
2
|
+
import { PlatformDetector } from './platform-detector.js';
|
|
3
|
+
export declare class LiquidEngine extends liquidjs.Liquid {
|
|
4
|
+
private readonly platformDetector;
|
|
5
|
+
constructor(platformDetector?: PlatformDetector);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=liquid-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquid-engine.d.ts","sourceRoot":"","sources":["../../src/classes/liquid-engine.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAKpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAkCzD,qBAAa,YAAa,SAAQ,QAAQ,CAAC,MAAM;IAO/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;gBA+CvC,gBAAgB,GAAE,gBAAyC;CAuIxE"}
|