@ts-ioc-container/bundler 5.1.0 → 7.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/AGENTS.md +31 -17
- package/README.md +96 -58
- package/cjm/app.js +2 -2
- package/cjm/cli/usage.js +6 -4
- package/cjm/features/build/BuildConfig.js +56 -35
- package/cjm/features/build/BuildController.js +11 -6
- package/cjm/features/build/domain/emit.js +2 -2
- package/cjm/features/build/domain/tokenCollisions.js +1 -1
- package/cjm/features/build/services/BundleBuilder.js +5 -5
- package/cjm/features/build/services/TicConfigService.js +16 -5
- package/cjm/index.js +4 -2
- package/cjm/schema/ticConfigSchema.js +2 -2
- package/package.json +2 -2
- package/tic.schema.json +46 -70
- package/tpl/index.cjs +11 -20
- package/typings/app.d.ts +5 -4
- package/typings/cli/usage.d.ts.map +1 -1
- package/typings/features/build/BuildConfig.d.ts +65 -22
- package/typings/features/build/BuildConfig.d.ts.map +1 -1
- package/typings/features/build/BuildController.d.ts +14 -9
- package/typings/features/build/BuildController.d.ts.map +1 -1
- package/typings/features/build/domain/emit.d.ts +1 -1
- package/typings/features/build/domain/emit.d.ts.map +1 -1
- package/typings/features/build/services/BundleBuilder.d.ts +9 -6
- package/typings/features/build/services/BundleBuilder.d.ts.map +1 -1
- package/typings/features/build/services/TicConfigService.d.ts +11 -5
- package/typings/features/build/services/TicConfigService.d.ts.map +1 -1
- package/typings/index.d.ts +1 -1
- package/typings/schema/ticConfigSchema.d.ts.map +1 -1
|
@@ -23,11 +23,15 @@ const OutputService_1 = require("../../services/OutputService");
|
|
|
23
23
|
const BuildConfig_1 = require("./BuildConfig");
|
|
24
24
|
const BundleBuilder_1 = require("./services/BundleBuilder");
|
|
25
25
|
exports.BUILD_OPTIONS = zod_1.z.object({ positionals: zod_1.z.array(zod_1.z.string().min(1)) }).transform(({ positionals }, ctx) => {
|
|
26
|
-
if (positionals.length > 1) {
|
|
27
|
-
ctx.addIssue({
|
|
26
|
+
if (positionals.length > 1 && positionals.includes(BuildConfig_1.STDIN)) {
|
|
27
|
+
ctx.addIssue({
|
|
28
|
+
code: 'custom',
|
|
29
|
+
path: ['config'],
|
|
30
|
+
message: `${BuildConfig_1.STDIN} reads one config from stdin and cannot be merged with config files`,
|
|
31
|
+
});
|
|
28
32
|
return zod_1.z.NEVER;
|
|
29
33
|
}
|
|
30
|
-
return {
|
|
34
|
+
return { configs: positionals.length > 0 ? positionals : [BuildConfig_1.STDIN] };
|
|
31
35
|
});
|
|
32
36
|
const buildArgs = (0, cli_1.parseOptions)({}, { positionals: true });
|
|
33
37
|
let BuildController = class BuildController {
|
|
@@ -41,10 +45,11 @@ let BuildController = class BuildController {
|
|
|
41
45
|
this.output = output;
|
|
42
46
|
this.logger = logger;
|
|
43
47
|
}
|
|
44
|
-
build({
|
|
45
|
-
const
|
|
48
|
+
build({ configs }) {
|
|
49
|
+
const stdin = configs[0] === BuildConfig_1.STDIN;
|
|
50
|
+
const label = stdin ? '<stdin>' : configs.join(' + ');
|
|
46
51
|
try {
|
|
47
|
-
const { content, warnings } = this.builder.build(
|
|
52
|
+
const { content, warnings } = this.builder.build(stdin ? { text: this.stdin() } : { config: configs });
|
|
48
53
|
for (const warning of warnings)
|
|
49
54
|
this.logger.warn(`${label}: ${warning}`);
|
|
50
55
|
this.output.write(content.replace(/\n$/, ''));
|
|
@@ -6,9 +6,9 @@ exports.emitBundle = emitBundle;
|
|
|
6
6
|
const HandlebarsRenderService_1 = require("../../../services/HandlebarsRenderService");
|
|
7
7
|
exports.GENERATED_HEADER = '// Generated by `tic build`';
|
|
8
8
|
exports.BUNDLE_PROTOCOL = 'Bundle.ts.hbs';
|
|
9
|
-
const RUNTIME_IMPORTS = ['IContainer', 'IContainerModule', '
|
|
9
|
+
const RUNTIME_IMPORTS = ['IContainer', 'IContainerModule', 'Registration'];
|
|
10
10
|
function bundleView({ name, paths, classes }) {
|
|
11
|
-
const taken = new Set([...RUNTIME_IMPORTS, '
|
|
11
|
+
const taken = new Set([...RUNTIME_IMPORTS, 'container', name]);
|
|
12
12
|
const uniqueName = (wanted) => {
|
|
13
13
|
let candidate = wanted;
|
|
14
14
|
for (let n = 2; taken.has(candidate); n++)
|
|
@@ -17,7 +17,7 @@ function tokenCollisions(classes) {
|
|
|
17
17
|
.map(([token, group]) => {
|
|
18
18
|
const names = group.map((cls) => cls.className);
|
|
19
19
|
return (`decorator token "${token}" is passed by ${names.join(', ')}; ` +
|
|
20
|
-
`registration is last-wins, exclude one with
|
|
20
|
+
`registration is last-wins, exclude one with match.exclude`);
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
function scopeDisjoint(group) {
|
|
@@ -43,7 +43,7 @@ let BundleBuilder = class BundleBuilder {
|
|
|
43
43
|
build(request) {
|
|
44
44
|
const resolved = 'text' in request
|
|
45
45
|
? this.configs.parse(request.text, this.cwd)
|
|
46
|
-
: this.configs.load(node_path_1.default.resolve(this.cwd,
|
|
46
|
+
: this.configs.load([request.config].flat().map((file) => node_path_1.default.resolve(this.cwd, file)));
|
|
47
47
|
const { content, registrations, warnings } = this.generate(resolved);
|
|
48
48
|
return {
|
|
49
49
|
config: 'text' in request ? undefined : resolved.file,
|
|
@@ -56,13 +56,13 @@ let BundleBuilder = class BundleBuilder {
|
|
|
56
56
|
generate(config) {
|
|
57
57
|
const paths = (0, tsconfig_1.loadImportPaths)(config.tsconfig, config.importExtension);
|
|
58
58
|
const relative = (file) => (0, glob_1.toPosix)(node_path_1.default.relative(config.dir, file));
|
|
59
|
-
const exclude = config.
|
|
59
|
+
const exclude = config.paths.exclude.flatMap((glob) => paths.resolveGlob(glob, config.dir)).map(glob_1.globToRegExp);
|
|
60
60
|
const isExcluded = (file) => {
|
|
61
61
|
const filename = relative(file);
|
|
62
62
|
return exclude.some((glob) => glob.test(filename));
|
|
63
63
|
};
|
|
64
64
|
const files = new Set();
|
|
65
|
-
for (const folder of config.
|
|
65
|
+
for (const folder of config.paths.include) {
|
|
66
66
|
const dir = paths.resolveNamespace(folder, config.dir);
|
|
67
67
|
for (const file of (0, scan_1.listSourceFiles)(dir, isExcluded))
|
|
68
68
|
files.add(file);
|
|
@@ -71,7 +71,7 @@ let BundleBuilder = class BundleBuilder {
|
|
|
71
71
|
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
|
|
72
72
|
.flatMap((file) => {
|
|
73
73
|
const text = this.fs.readFile(file);
|
|
74
|
-
return text.startsWith(emit_1.GENERATED_HEADER) ? [] : (0, scan_1.findClasses)(file, config.
|
|
74
|
+
return text.startsWith(emit_1.GENERATED_HEADER) ? [] : (0, scan_1.findClasses)(file, config.match, text);
|
|
75
75
|
})
|
|
76
76
|
.map((cls) => ({ ...cls, specifier: paths.specifier(cls.file) }));
|
|
77
77
|
const uncovered = [...new Set(classes.filter((cls) => cls.specifier === undefined).map((cls) => cls.file))];
|
|
@@ -81,7 +81,7 @@ let BundleBuilder = class BundleBuilder {
|
|
|
81
81
|
}
|
|
82
82
|
const content = this.renderer.render(emit_1.BUNDLE_PROTOCOL, (0, emit_1.bundleView)({
|
|
83
83
|
name: config.bundleClassName,
|
|
84
|
-
paths: config.
|
|
84
|
+
paths: config.paths.include,
|
|
85
85
|
classes: classes.map((cls) => ({ ...cls, specifier: cls.specifier })),
|
|
86
86
|
}));
|
|
87
87
|
return { content, registrations: classes.length, warnings: (0, tokenCollisions_1.tokenCollisions)(classes) };
|
|
@@ -27,16 +27,27 @@ let TicConfigService = class TicConfigService {
|
|
|
27
27
|
constructor(fs) {
|
|
28
28
|
this.fs = fs;
|
|
29
29
|
}
|
|
30
|
-
load(
|
|
30
|
+
load(files) {
|
|
31
|
+
if (typeof files === 'string' || files.length === 1) {
|
|
32
|
+
const [file] = [files].flat();
|
|
33
|
+
return (0, BuildConfig_1.resolveConfig)(this.read(file), file);
|
|
34
|
+
}
|
|
35
|
+
const folders = [...new Set(files.map((file) => node_path_1.default.dirname(file)))];
|
|
36
|
+
if (folders.length > 1) {
|
|
37
|
+
throw new DomainException_1.TicConfigError(`configs merged into one bundle must sit in one folder, since their relative paths resolve against it: ${folders.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
return (0, BuildConfig_1.resolveConfig)((0, BuildConfig_1.mergeConfigs)(files.map((file) => ({ file, content: this.read(file) }))), files[files.length - 1]);
|
|
40
|
+
}
|
|
41
|
+
parse(text, dir) {
|
|
42
|
+
return (0, BuildConfig_1.resolveConfig)((0, BuildConfig_1.parseConfig)(text, 'yaml'), node_path_1.default.join(dir, BuildConfig_1.STDIN));
|
|
43
|
+
}
|
|
44
|
+
read(file) {
|
|
31
45
|
const format = (0, BuildConfig_1.configFormat)(file);
|
|
32
46
|
if (format === undefined)
|
|
33
47
|
throw new DomainException_1.TicConfigError(`expected a .json, .yaml or .yml config file: ${file}`);
|
|
34
48
|
if (!this.fs.fileExists(file))
|
|
35
49
|
throw new DomainException_1.TicConfigError(`config file not found: ${file}`);
|
|
36
|
-
return (0, BuildConfig_1.
|
|
37
|
-
}
|
|
38
|
-
parse(text, dir) {
|
|
39
|
-
return (0, BuildConfig_1.resolveConfig)((0, BuildConfig_1.parseConfig)(text, 'yaml'), node_path_1.default.join(dir, BuildConfig_1.STDIN));
|
|
50
|
+
return (0, BuildConfig_1.parseConfig)(this.fs.readFile(file), format);
|
|
40
51
|
}
|
|
41
52
|
};
|
|
42
53
|
exports.TicConfigService = TicConfigService;
|
package/cjm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.ExceptionHandler = exports.UsageError = exports.UnknownActionError = exports.UnknownCommandError = exports.MissingCommandError = exports.NamespaceNotFoundError = exports.TicConfigError = exports.TicError = exports.renderProtocol = exports.HandlebarsRenderService = exports.IRenderServiceKey = exports.NodeFileSystemService = exports.IFileSystemServiceKey = exports.ConsoleLogger = void 0;
|
|
3
|
+
exports.IOutputServiceKey = exports.CommonModule = exports.HelpModule = exports.globToRegExp = exports.tokenCollisions = exports.GENERATED_HEADER = exports.BUNDLE_PROTOCOL = exports.bundleView = exports.emitBundle = exports.listSourceFiles = exports.isSourceFile = exports.findClasses = exports.loadImportPaths = exports.ImportPaths = exports.ticConfigJsonSchema = exports.toClassName = exports.DEFAULT_DECORATORS = exports.DEFAULT_EXCLUDE = exports.DEFAULT_TSCONFIG = exports.configFormat = exports.STDIN = exports.CONFIG_FILE_SUFFIXES = exports.parseConfig = exports.mergeConfigs = exports.BUNDLE_CONFIG_FILE_SCHEMA = exports.BUNDLE_CONFIG_SCHEMA = exports.resolveConfig = exports.ITicConfigServiceKey = exports.TicConfigService = exports.IBundleBuilderKey = exports.BundleBuilder = exports.BUILD_OPTIONS = exports.BuildController = exports.BuildModule = exports.USAGE = exports.IErrorHandlerKey = exports.validate = exports.parseOptions = exports.commandArgs = exports.DEFAULT_ACTION = exports.onDefault = exports.action = exports.Application = exports.globalConfig = exports.GlobalConfigKey = exports.CliIoKey = exports.createContainer = exports.loadConfig = exports.run = exports.build = void 0;
|
|
4
|
+
exports.ExceptionHandler = exports.UsageError = exports.UnknownActionError = exports.UnknownCommandError = exports.MissingCommandError = exports.NamespaceNotFoundError = exports.TicConfigError = exports.TicError = exports.renderProtocol = exports.HandlebarsRenderService = exports.IRenderServiceKey = exports.NodeFileSystemService = exports.IFileSystemServiceKey = exports.ConsoleLogger = exports.ILoggerKey = exports.StdOutputService = void 0;
|
|
5
5
|
var app_1 = require("./app");
|
|
6
6
|
Object.defineProperty(exports, "build", { enumerable: true, get: function () { return app_1.build; } });
|
|
7
7
|
Object.defineProperty(exports, "run", { enumerable: true, get: function () { return app_1.run; } });
|
|
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "ITicConfigServiceKey", { enumerable: true, get:
|
|
|
36
36
|
var BuildConfig_1 = require("./features/build/BuildConfig");
|
|
37
37
|
Object.defineProperty(exports, "resolveConfig", { enumerable: true, get: function () { return BuildConfig_1.resolveConfig; } });
|
|
38
38
|
Object.defineProperty(exports, "BUNDLE_CONFIG_SCHEMA", { enumerable: true, get: function () { return BuildConfig_1.BUNDLE_CONFIG_SCHEMA; } });
|
|
39
|
+
Object.defineProperty(exports, "BUNDLE_CONFIG_FILE_SCHEMA", { enumerable: true, get: function () { return BuildConfig_1.BUNDLE_CONFIG_FILE_SCHEMA; } });
|
|
40
|
+
Object.defineProperty(exports, "mergeConfigs", { enumerable: true, get: function () { return BuildConfig_1.mergeConfigs; } });
|
|
39
41
|
Object.defineProperty(exports, "parseConfig", { enumerable: true, get: function () { return BuildConfig_1.parseConfig; } });
|
|
40
42
|
Object.defineProperty(exports, "CONFIG_FILE_SUFFIXES", { enumerable: true, get: function () { return BuildConfig_1.CONFIG_FILE_SUFFIXES; } });
|
|
41
43
|
Object.defineProperty(exports, "STDIN", { enumerable: true, get: function () { return BuildConfig_1.STDIN; } });
|
|
@@ -4,7 +4,7 @@ exports.ticConfigJsonSchema = ticConfigJsonSchema;
|
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const BuildConfig_1 = require("../features/build/BuildConfig");
|
|
6
6
|
function ticConfigJsonSchema() {
|
|
7
|
-
const schema = zod_1.z.toJSONSchema(BuildConfig_1.
|
|
7
|
+
const schema = zod_1.z.toJSONSchema(BuildConfig_1.BUNDLE_CONFIG_FILE_SCHEMA, {
|
|
8
8
|
io: 'input',
|
|
9
9
|
target: 'draft-7',
|
|
10
10
|
unrepresentable: 'any',
|
|
@@ -18,7 +18,7 @@ function ticConfigJsonSchema() {
|
|
|
18
18
|
$schema,
|
|
19
19
|
$id: 'https://github.com/IgorBabkin/ts-ioc-container/tree/main/packages/bundler/tic.schema.json',
|
|
20
20
|
title: '*.bundle.json / *.bundle.yaml',
|
|
21
|
-
description: "One bundle generated by `tic build` (@ts-ioc-container/bundler). `tic build app.bundle.json` prints the bundle to stdout, and `cat app.bundle.json | tic build` reads the config from stdin. Relative paths resolve against this file's directory (for piped text, the working directory).",
|
|
21
|
+
description: "One bundle generated by `tic build` (@ts-ioc-container/bundler). `tic build app.bundle.json` prints the bundle to stdout, `tic build common.bundle.json prod.bundle.json` merges several configs left to right, and `cat app.bundle.json | tic build` reads the config from stdin. Relative paths resolve against this file's directory (for piped text, the working directory).",
|
|
22
22
|
...rest,
|
|
23
23
|
};
|
|
24
24
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ts-ioc-container/bundler",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "Bundles your dependencies into a single container module for ts-ioc-container: the `tic` CLI scans folders (by path or tsconfig alias) and generates one typed bundle that registers every class — `container.useModule(new AppBundle())`.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"reflect-metadata": "^0.2.2",
|
|
53
53
|
"yaml": "^2.8.3",
|
|
54
54
|
"zod": "^4.6.5",
|
|
55
|
-
"ts-ioc-container": "76.0.
|
|
55
|
+
"ts-ioc-container": "76.0.2"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"typescript": ">=5"
|
package/tic.schema.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://github.com/IgorBabkin/ts-ioc-container/tree/main/packages/bundler/tic.schema.json",
|
|
4
4
|
"title": "*.bundle.json / *.bundle.yaml",
|
|
5
|
-
"description": "One bundle generated by `tic build` (@ts-ioc-container/bundler). `tic build app.bundle.json` prints the bundle to stdout, and `cat app.bundle.json | tic build` reads the config from stdin. Relative paths resolve against this file's directory (for piped text, the working directory).",
|
|
5
|
+
"description": "One bundle generated by `tic build` (@ts-ioc-container/bundler). `tic build app.bundle.json` prints the bundle to stdout, `tic build common.bundle.json prod.bundle.json` merges several configs left to right, and `cat app.bundle.json | tic build` reads the config from stdin. Relative paths resolve against this file's directory (for piped text, the working directory).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
8
|
"$schema": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"tsconfig": {
|
|
17
17
|
"default": "./tsconfig.json",
|
|
18
|
-
"description": "The tsconfig whose `paths` aliases
|
|
18
|
+
"description": "The tsconfig whose `paths` aliases paths.include may name and generated imports are written in, and whose module resolution sets the import extension. It adds no files: the bundle scans paths.include alone. Relative to the config file. The default may be absent; a tsconfig named here must exist.",
|
|
19
19
|
"type": "string",
|
|
20
20
|
"minLength": 1
|
|
21
21
|
},
|
|
@@ -23,76 +23,55 @@
|
|
|
23
23
|
"description": "Extension of generated imports, e.g. \".js\". Inferred from the tsconfig: \".js\" under node16/nodenext resolution, none otherwise.",
|
|
24
24
|
"type": "string"
|
|
25
25
|
},
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"type": "array",
|
|
36
|
-
"items": {
|
|
37
|
-
"type": "string",
|
|
38
|
-
"minLength": 1
|
|
39
|
-
},
|
|
40
|
-
"description": "Folders to scan, with the default exclude: shorthand for { \"glob\": [...] }."
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"type": "object",
|
|
44
|
-
"properties": {
|
|
45
|
-
"glob": {
|
|
46
|
-
"anyOf": [
|
|
47
|
-
{
|
|
48
|
-
"type": "string",
|
|
49
|
-
"minLength": 1
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"minItems": 1,
|
|
53
|
-
"type": "array",
|
|
54
|
-
"items": {
|
|
55
|
-
"type": "string",
|
|
56
|
-
"minLength": 1
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
],
|
|
60
|
-
"description": "Folder, or folders, to scan, sub-folders included: paths relative to the config file (./src/services) or tsconfig paths aliases (@app/services)."
|
|
26
|
+
"paths": {
|
|
27
|
+
"description": "Which files this bundle reads and parses — decided by path alone, before parsing. `include` names the folders the files come from; within them a file is parsed unless it matches one of `exclude`. Globs are relative to the config file. Required in the merged config.",
|
|
28
|
+
"type": "object",
|
|
29
|
+
"properties": {
|
|
30
|
+
"include": {
|
|
31
|
+
"anyOf": [
|
|
32
|
+
{
|
|
33
|
+
"type": "string",
|
|
34
|
+
"minLength": 1
|
|
61
35
|
},
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
"**/node_modules/**"
|
|
70
|
-
],
|
|
71
|
-
"description": "Glob, or globs, of files never read, relative to the config file or starting with a tsconfig paths alias (@generated/**, or @generated for the whole folder). Replaces the default when given. A non-empty value that omits a default glob makes `tic build` warn.",
|
|
72
|
-
"anyOf": [
|
|
73
|
-
{
|
|
74
|
-
"type": "string",
|
|
75
|
-
"minLength": 1
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"type": "array",
|
|
79
|
-
"items": {
|
|
80
|
-
"type": "string",
|
|
81
|
-
"minLength": 1
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
]
|
|
36
|
+
{
|
|
37
|
+
"minItems": 1,
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"minLength": 1
|
|
42
|
+
}
|
|
85
43
|
}
|
|
86
|
-
},
|
|
87
|
-
"required": [
|
|
88
|
-
"glob"
|
|
89
44
|
],
|
|
90
|
-
"
|
|
45
|
+
"description": "Folder, or folders, to scan, sub-folders included: paths relative to the config file (./src/services) or tsconfig paths aliases (@app/services)."
|
|
46
|
+
},
|
|
47
|
+
"exclude": {
|
|
48
|
+
"default": [
|
|
49
|
+
"**/*.spec.ts",
|
|
50
|
+
"**/*.test.ts",
|
|
51
|
+
"**/*.spec.tsx",
|
|
52
|
+
"**/*.test.tsx",
|
|
53
|
+
"**/__tests__/**",
|
|
54
|
+
"**/node_modules/**"
|
|
55
|
+
],
|
|
56
|
+
"description": "Glob, or globs, of files never read, relative to the config file or starting with a tsconfig paths alias (@generated/**, or @generated for the whole folder). Replaces the default when given. A non-empty value that omits a default glob makes `tic build` warn.",
|
|
57
|
+
"anyOf": [
|
|
58
|
+
{
|
|
59
|
+
"type": "string",
|
|
60
|
+
"minLength": 1
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"minLength": 1
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
]
|
|
91
70
|
}
|
|
92
|
-
|
|
93
|
-
"
|
|
71
|
+
},
|
|
72
|
+
"additionalProperties": false
|
|
94
73
|
},
|
|
95
|
-
"
|
|
74
|
+
"match": {
|
|
96
75
|
"anyOf": [
|
|
97
76
|
{
|
|
98
77
|
"type": "string",
|
|
@@ -173,8 +152,5 @@
|
|
|
173
152
|
"description": "Which classes of a parsed file are registered. A class is selected when it is exported, not abstract, and meets every criterion set here; by default that is every exported class decorated with @register. A glob, or a list of globs, is shorthand for { \"glob\": ... }."
|
|
174
153
|
}
|
|
175
154
|
},
|
|
176
|
-
"required": [
|
|
177
|
-
"glob"
|
|
178
|
-
],
|
|
179
155
|
"additionalProperties": false
|
|
180
156
|
}
|
package/tpl/index.cjs
CHANGED
|
@@ -39,24 +39,13 @@ templates["Bundle.ts.hbs"] = template({"0":function(container,depth0,helpers,par
|
|
|
39
39
|
+ ((stack1 = (lookupProperty(helpers,"join")||(depth0 && lookupProperty(depth0,"join"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"named") : depth0),", ",{"name":"join","hash":{},"data":data,"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":122}}})) != null ? stack1 : "")
|
|
40
40
|
+ " }";
|
|
41
41
|
},"5":function(container,depth0,helpers,partials,data) {
|
|
42
|
-
|
|
43
|
-
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
|
44
|
-
return parent[propertyName];
|
|
45
|
-
}
|
|
46
|
-
return undefined
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return "export const registrations: IRegistration[] = [\n"
|
|
50
|
-
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"registrations") : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":10,"column":0},"end":{"line":12,"column":9}}})) != null ? stack1 : "")
|
|
51
|
-
+ "];\n";
|
|
42
|
+
return "_";
|
|
52
43
|
},"6":function(container,depth0,helpers,partials,data) {
|
|
53
44
|
var stack1;
|
|
54
45
|
|
|
55
|
-
return "
|
|
46
|
+
return " container.addRegistration(Registration.fromClass("
|
|
56
47
|
+ ((stack1 = container.lambda(depth0, depth0)) != null ? stack1 : "")
|
|
57
|
-
+ ")
|
|
58
|
-
},"7":function(container,depth0,helpers,partials,data) {
|
|
59
|
-
return "export const registrations: IRegistration[] = [];\n";
|
|
48
|
+
+ "));\n";
|
|
60
49
|
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
|
|
61
50
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
|
62
51
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
|
@@ -67,13 +56,15 @@ templates["Bundle.ts.hbs"] = template({"0":function(container,depth0,helpers,par
|
|
|
67
56
|
|
|
68
57
|
return "// Generated by `tic build`. Do not edit by hand.\n// Paths: "
|
|
69
58
|
+ ((stack1 = (lookupProperty(helpers,"join")||(depth0 && lookupProperty(depth0,"join"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"paths") : depth0),", ",{"name":"join","hash":{},"data":data,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":31}}})) != null ? stack1 : "")
|
|
70
|
-
+ "\nimport { type IContainer, type IContainerModule
|
|
71
|
-
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"registrations") : depth0)) != null ? lookupProperty(stack1,"length") : stack1),{"name":"if","hash":{},"fn":container.program(0, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":
|
|
59
|
+
+ "\nimport { type IContainer, type IContainerModule"
|
|
60
|
+
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"registrations") : depth0)) != null ? lookupProperty(stack1,"length") : stack1),{"name":"if","hash":{},"fn":container.program(0, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":47},"end":{"line":3,"column":96}}})) != null ? stack1 : "")
|
|
72
61
|
+ " } from 'ts-ioc-container';\n"
|
|
73
62
|
+ ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"imports") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":0},"end":{"line":6,"column":9}}})) != null ? stack1 : "")
|
|
74
|
-
+ "\n"
|
|
75
|
-
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"registrations") : depth0)) != null ? lookupProperty(stack1,"length") : stack1),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.program(7, data, 0),"data":data,"loc":{"start":{"line":8,"column":0},"end":{"line":16,"column":7}}})) != null ? stack1 : "")
|
|
76
63
|
+ "\nexport class "
|
|
77
|
-
+ ((stack1 = ((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === "function" ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":
|
|
78
|
-
+ " implements IContainerModule {\n applyTo(
|
|
64
|
+
+ ((stack1 = ((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === "function" ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":8,"column":13},"end":{"line":8,"column":23}}}) : helper))) != null ? stack1 : "")
|
|
65
|
+
+ " implements IContainerModule {\n applyTo("
|
|
66
|
+
+ ((stack1 = lookupProperty(helpers,"unless").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"registrations") : depth0)) != null ? lookupProperty(stack1,"length") : stack1),{"name":"unless","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":9,"column":10},"end":{"line":9,"column":54}}})) != null ? stack1 : "")
|
|
67
|
+
+ "container: IContainer): void {\n"
|
|
68
|
+
+ ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"registrations") : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":10,"column":0},"end":{"line":12,"column":9}}})) != null ? stack1 : "")
|
|
69
|
+
+ " }\n}\n";
|
|
79
70
|
},"useData":true});
|
package/typings/app.d.ts
CHANGED
|
@@ -11,14 +11,15 @@ export declare function run(argv: string[], io?: CliIo): number;
|
|
|
11
11
|
* Generates the bundle a config file describes — `tic build` as a function — and returns
|
|
12
12
|
* it; nothing is written.
|
|
13
13
|
*
|
|
14
|
-
* @throws {TicConfigError} when
|
|
14
|
+
* @throws {TicConfigError} when a config file is missing or unreadable, several are in different folders, the config or its tsconfig is invalid, the bundle has no name, or no tsconfig paths alias covers a selected class's file.
|
|
15
15
|
* @throws {NamespaceNotFoundError} when a path is neither a folder nor a tsconfig paths alias of one.
|
|
16
16
|
*/
|
|
17
17
|
export declare function build({ cwd, ...request }: BuildOptions): BuildResult;
|
|
18
18
|
/**
|
|
19
|
-
* Reads and validates a config file: JSON for `.json`, YAML for `.yaml` / `.yml`.
|
|
19
|
+
* Reads and validates a config file: JSON for `.json`, YAML for `.yaml` / `.yml`. Given several
|
|
20
|
+
* in one folder, it merges them left to right, as `tic build a.bundle.yml b.bundle.yml` does.
|
|
20
21
|
*
|
|
21
|
-
* @throws {TicConfigError} when
|
|
22
|
+
* @throws {TicConfigError} when a file is missing, has another extension, cannot be parsed, or does not match the config shape; when several files are in different folders.
|
|
22
23
|
*/
|
|
23
|
-
export declare function loadConfig(
|
|
24
|
+
export declare function loadConfig(files: string | string[]): ResolvedConfig;
|
|
24
25
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../lib/cli/usage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../lib/cli/usage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,QAoBN,CAAC"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
/**
|
|
3
3
|
* Which files a bundle reads and parses: the first, cheap stage of selection,
|
|
4
|
-
* decided by path alone. `
|
|
4
|
+
* decided by path alone. `include` names the folders the files come from; within them
|
|
5
5
|
* a file is parsed unless it matches one of `exclude`. Globs are relative to the
|
|
6
6
|
* config file and `/`-separated.
|
|
7
7
|
*/
|
|
8
|
-
export interface
|
|
8
|
+
export interface PathSelector {
|
|
9
9
|
/**
|
|
10
10
|
* Folder, or folders, to scan recursively: relative to the config file (`./src/services`),
|
|
11
11
|
* or tsconfig `paths` aliases (`@app/services`).
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
include: string | string[];
|
|
14
14
|
/**
|
|
15
15
|
* Glob, or globs, of files never read; one may start with a tsconfig `paths` alias
|
|
16
16
|
* (`@generated/**`, or `@generated` for the whole folder). Replaces {@link DEFAULT_EXCLUDE} when given.
|
|
17
17
|
*/
|
|
18
18
|
exclude?: string | string[];
|
|
19
19
|
}
|
|
20
|
-
/** A {@link
|
|
21
|
-
export interface
|
|
20
|
+
/** A {@link PathSelector} with its defaults filled in. */
|
|
21
|
+
export interface ResolvedPathSelector {
|
|
22
22
|
/** The folders to scan, as written in the config. */
|
|
23
|
-
|
|
23
|
+
include: string[];
|
|
24
24
|
/** As written in the config: an alias in one is resolved, and the glob compiled, once the tsconfig is loaded. */
|
|
25
25
|
exclude: string[];
|
|
26
26
|
}
|
|
@@ -28,7 +28,7 @@ export interface ResolvedGlobSelector {
|
|
|
28
28
|
export type ExportKind = 'any' | 'named' | 'default';
|
|
29
29
|
/**
|
|
30
30
|
* Which classes of a parsed file are registered: the second stage of selection,
|
|
31
|
-
* run on the files {@link
|
|
31
|
+
* run on the files {@link PathSelector} let through. A class is selected when
|
|
32
32
|
* it is exported, not abstract, and meets every criterion set here; an empty
|
|
33
33
|
* rule selects every exported class.
|
|
34
34
|
*/
|
|
@@ -63,6 +63,8 @@ export interface ResolvedClassSelector {
|
|
|
63
63
|
* A bundle config file: one bundle, described explicitly — the folders it scans and the
|
|
64
64
|
* classes it registers. `tic build <config>` prints the bundle to stdout; where it is
|
|
65
65
|
* saved is the caller's choice (`tic build app.bundle.json > src/di/app.bundle.ts`).
|
|
66
|
+
* `tic build common.bundle.yml prod.bundle.yml` merges several into one, left to right
|
|
67
|
+
* (see {@link mergeConfigs}).
|
|
66
68
|
*/
|
|
67
69
|
export interface BundleConfig {
|
|
68
70
|
$schema?: string;
|
|
@@ -74,27 +76,28 @@ export interface BundleConfig {
|
|
|
74
76
|
*/
|
|
75
77
|
name?: string;
|
|
76
78
|
/**
|
|
77
|
-
* The tsconfig whose `paths` aliases `
|
|
79
|
+
* The tsconfig whose `paths` aliases `paths.include` may name and generated imports are
|
|
78
80
|
* written in, and whose `moduleResolution` sets the import extension. It contributes
|
|
79
|
-
* nothing else: the files scanned are `
|
|
81
|
+
* nothing else: the files scanned are `paths.include` alone. Relative to the config file.
|
|
80
82
|
* Default `./tsconfig.json`, which may be absent; a tsconfig named here must exist.
|
|
81
83
|
*/
|
|
82
84
|
tsconfig?: string;
|
|
83
85
|
/** Extension of generated imports. Inferred from the tsconfig's `moduleResolution` when omitted. */
|
|
84
86
|
importExtension?: string;
|
|
85
87
|
/**
|
|
86
|
-
* Which files are parsed: the folders in `
|
|
87
|
-
* `exclude` says otherwise.
|
|
88
|
+
* Which files are parsed: the folders in `paths.include`, minus {@link DEFAULT_EXCLUDE} unless
|
|
89
|
+
* `exclude` says otherwise. Always an object: there is no folder or folder-list shorthand.
|
|
90
|
+
* Required — though in a config merged with others, only the merged config must have it.
|
|
88
91
|
*/
|
|
89
|
-
|
|
92
|
+
paths: PathSelector;
|
|
90
93
|
/**
|
|
91
94
|
* Which classes of a parsed file are registered. Default: every exported class decorated
|
|
92
|
-
* with `@register`. A glob or a list of globs is shorthand for `{ glob }
|
|
95
|
+
* with `@register`. A glob or a list of globs is shorthand for `{ glob }`.
|
|
93
96
|
*/
|
|
94
|
-
|
|
97
|
+
match?: string | string[] | ClassSelector;
|
|
95
98
|
}
|
|
96
99
|
export declare const DEFAULT_TSCONFIG = "./tsconfig.json";
|
|
97
|
-
/** What `
|
|
100
|
+
/** What `match.decorators` requires when omitted: the library's own `@register`. */
|
|
98
101
|
export declare const DEFAULT_DECORATORS: string[];
|
|
99
102
|
export declare const DEFAULT_EXCLUDE: string[];
|
|
100
103
|
/** A {@link BundleConfig} whose defaults are filled in and whose paths are absolute. */
|
|
@@ -113,9 +116,9 @@ export interface ResolvedConfig {
|
|
|
113
116
|
required: boolean;
|
|
114
117
|
};
|
|
115
118
|
importExtension?: string;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
/** Non-fatal problems found while resolving, e.g. a `
|
|
119
|
+
paths: ResolvedPathSelector;
|
|
120
|
+
match: ResolvedClassSelector;
|
|
121
|
+
/** Non-fatal problems found while resolving, e.g. a `paths.exclude` that drops a default test glob. */
|
|
119
122
|
warnings: string[];
|
|
120
123
|
}
|
|
121
124
|
/**
|
|
@@ -128,11 +131,11 @@ export declare const BUNDLE_CONFIG_SCHEMA: z.ZodObject<{
|
|
|
128
131
|
name: z.ZodOptional<z.ZodString>;
|
|
129
132
|
tsconfig: z.ZodOptional<z.ZodString>;
|
|
130
133
|
importExtension: z.ZodOptional<z.ZodString>;
|
|
131
|
-
|
|
132
|
-
|
|
134
|
+
paths: z.ZodObject<{
|
|
135
|
+
include: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
133
136
|
exclude: z.ZodDefault<z.ZodCustom<string | string[], string | string[]>>;
|
|
134
|
-
}, z.core.$strict
|
|
135
|
-
|
|
137
|
+
}, z.core.$strict>;
|
|
138
|
+
match: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodObject<{
|
|
136
139
|
export: z.ZodDefault<z.ZodEnum<{
|
|
137
140
|
default: "default";
|
|
138
141
|
any: "any";
|
|
@@ -143,6 +146,31 @@ export declare const BUNDLE_CONFIG_SCHEMA: z.ZodObject<{
|
|
|
143
146
|
exclude: z.ZodOptional<z.ZodCustom<string | string[], string | string[]>>;
|
|
144
147
|
}, z.core.$strict>]>>;
|
|
145
148
|
}, z.core.$strict>;
|
|
149
|
+
/**
|
|
150
|
+
* One config file among several merged into one bundle: it may leave `paths.include`, or
|
|
151
|
+
* `paths` altogether, to another — only the merged config must have it. The published
|
|
152
|
+
* `tic.schema.json` is generated from it, so editors accept a shared config.
|
|
153
|
+
*/
|
|
154
|
+
export declare const BUNDLE_CONFIG_FILE_SCHEMA: z.ZodObject<{
|
|
155
|
+
$schema: z.ZodOptional<z.ZodString>;
|
|
156
|
+
name: z.ZodOptional<z.ZodString>;
|
|
157
|
+
tsconfig: z.ZodOptional<z.ZodString>;
|
|
158
|
+
importExtension: z.ZodOptional<z.ZodString>;
|
|
159
|
+
match: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodObject<{
|
|
160
|
+
export: z.ZodDefault<z.ZodEnum<{
|
|
161
|
+
default: "default";
|
|
162
|
+
any: "any";
|
|
163
|
+
named: "named";
|
|
164
|
+
}>>;
|
|
165
|
+
decorators: z.ZodDefault<z.ZodCustom<string[], string[]>>;
|
|
166
|
+
glob: z.ZodOptional<z.ZodCustom<string | string[], string | string[]>>;
|
|
167
|
+
exclude: z.ZodOptional<z.ZodCustom<string | string[], string | string[]>>;
|
|
168
|
+
}, z.core.$strict>]>>;
|
|
169
|
+
paths: z.ZodOptional<z.ZodObject<{
|
|
170
|
+
include: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
171
|
+
exclude: z.ZodOptional<z.ZodDefault<z.ZodCustom<string | string[], string | string[]>>>;
|
|
172
|
+
}, z.core.$strict>>;
|
|
173
|
+
}, z.core.$strict>;
|
|
146
174
|
/**
|
|
147
175
|
* A config file is named `<name>.bundle.json`, `<name>.bundle.yaml` or `<name>.bundle.yml`
|
|
148
176
|
* by convention, e.g. `app.bundle.json`; any `.json` / `.yaml` / `.yml` file works.
|
|
@@ -162,6 +190,21 @@ export type ConfigFormat = 'json' | 'yaml';
|
|
|
162
190
|
export declare function parseConfig(text: string, format: ConfigFormat): unknown;
|
|
163
191
|
/** The generated class for a bundle name: `production` -> `ProductionBundle`, `my-app_v2` -> `MyAppV2Bundle`. */
|
|
164
192
|
export declare function toClassName(name: string): string;
|
|
193
|
+
/**
|
|
194
|
+
* Merges the contents of several config files into one, left to right, as webpack-merge
|
|
195
|
+
* does: objects merge field by field, a list field — `paths.include`, `paths.exclude`,
|
|
196
|
+
* `match.glob`, `match.exclude`, `match.decorators` — concatenates without duplicates
|
|
197
|
+
* (one glob or folder counting as a list of one), and any other value set by a later file
|
|
198
|
+
* replaces an earlier one. The `match` shorthand merges as `match.glob`. Each file is
|
|
199
|
+
* validated alone first, so a shared file may leave out `paths`; defaults apply to the
|
|
200
|
+
* merged config only, so a `paths.exclude` in any file replaces {@link DEFAULT_EXCLUDE}.
|
|
201
|
+
*
|
|
202
|
+
* @throws {TicConfigError} when a file's content does not match the config file shape; the message names the file and the field.
|
|
203
|
+
*/
|
|
204
|
+
export declare function mergeConfigs(configs: {
|
|
205
|
+
file: string;
|
|
206
|
+
content: unknown;
|
|
207
|
+
}[]): unknown;
|
|
165
208
|
/**
|
|
166
209
|
* Validates parsed config content and resolves its paths against `file`'s directory.
|
|
167
210
|
* Without a `name` the bundle is named after the file: `production.bundle.json` -> `production`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildConfig.d.ts","sourceRoot":"","sources":["../../../lib/features/build/BuildConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"BuildConfig.d.ts","sourceRoot":"","sources":["../../../lib/features/build/BuildConfig.ts"],"names":[],"mappings":"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"}
|