pmcf 4.19.2 → 4.20.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.
Files changed (81) hide show
  1. package/README.md +93 -72
  2. package/package.json +19 -19
  3. package/src/base.mjs +23 -241
  4. package/src/cli.mjs +4 -4
  5. package/src/cluster.mjs +13 -11
  6. package/src/extra-source-service.mjs +7 -10
  7. package/src/host.mjs +30 -44
  8. package/src/initialization-context.mjs +324 -0
  9. package/src/location.mjs +4 -14
  10. package/src/module.mjs +1 -0
  11. package/src/network-interfaces/ethernet.mjs +3 -5
  12. package/src/network-interfaces/loopback.mjs +2 -4
  13. package/src/network-interfaces/network-interface.mjs +3 -5
  14. package/src/network-interfaces/skeleton.mjs +9 -3
  15. package/src/network-interfaces/tun.mjs +2 -4
  16. package/src/network-interfaces/wireguard.mjs +3 -5
  17. package/src/network-interfaces/wlan.mjs +4 -7
  18. package/src/network.mjs +10 -8
  19. package/src/owner.mjs +7 -31
  20. package/src/root.mjs +4 -73
  21. package/src/service-owner.mjs +19 -18
  22. package/src/service.mjs +13 -18
  23. package/src/services/alpm.mjs +4 -9
  24. package/src/services/bind.mjs +424 -388
  25. package/src/services/chrony.mjs +3 -5
  26. package/src/services/headscale.mjs +2 -4
  27. package/src/services/influxdb.mjs +2 -4
  28. package/src/services/kea.mjs +6 -10
  29. package/src/services/mosquitto.mjs +2 -4
  30. package/src/services/openldap.mjs +2 -4
  31. package/src/services/postfix.mjs +2 -4
  32. package/src/services/systemd-journal-remote.mjs +2 -4
  33. package/src/services/systemd-journal-upload.mjs +9 -10
  34. package/src/services/systemd-journald.mjs +2 -4
  35. package/src/services/systemd-resolved.mjs +42 -42
  36. package/src/services/systemd-timesyncd.mjs +9 -13
  37. package/src/services/tailscale.mjs +5 -2
  38. package/src/subnet.mjs +9 -5
  39. package/types/base.d.mts +0 -180
  40. package/types/cli.d.mts +0 -10
  41. package/types/cluster.d.mts +0 -507
  42. package/types/dns-utils.d.mts +0 -14
  43. package/types/endpoint.d.mts +0 -79
  44. package/types/extra-source-service.d.mts +0 -1033
  45. package/types/hooks.d.mts +0 -2
  46. package/types/host-utils.d.mts +0 -1
  47. package/types/host.d.mts +0 -285
  48. package/types/location.d.mts +0 -379
  49. package/types/module.d.mts +0 -36
  50. package/types/network-address.d.mts +0 -41
  51. package/types/network-interfaces/ethernet.d.mts +0 -1189
  52. package/types/network-interfaces/loopback.d.mts +0 -1140
  53. package/types/network-interfaces/network-interface.d.mts +0 -1158
  54. package/types/network-interfaces/skeleton.d.mts +0 -30
  55. package/types/network-interfaces/tun.d.mts +0 -1131
  56. package/types/network-interfaces/wireguard.d.mts +0 -1131
  57. package/types/network-interfaces/wlan.d.mts +0 -1734
  58. package/types/network-support.d.mts +0 -193
  59. package/types/network.d.mts +0 -702
  60. package/types/owner.d.mts +0 -235
  61. package/types/root.d.mts +0 -10
  62. package/types/service-owner.d.mts +0 -14
  63. package/types/service-types.d.mts +0 -246
  64. package/types/service.d.mts +0 -689
  65. package/types/services/alpm.d.mts +0 -805
  66. package/types/services/bind.d.mts +0 -1574
  67. package/types/services/chrony.d.mts +0 -1310
  68. package/types/services/headscale.d.mts +0 -801
  69. package/types/services/influxdb.d.mts +0 -812
  70. package/types/services/kea.d.mts +0 -945
  71. package/types/services/mosquitto.d.mts +0 -876
  72. package/types/services/openldap.d.mts +0 -793
  73. package/types/services/postfix.d.mts +0 -784
  74. package/types/services/systemd-journal-remote.d.mts +0 -1030
  75. package/types/services/systemd-journal-upload.d.mts +0 -932
  76. package/types/services/systemd-journald.d.mts +0 -1317
  77. package/types/services/systemd-resolved.d.mts +0 -1644
  78. package/types/services/systemd-timesyncd.d.mts +0 -1459
  79. package/types/services/tailscale.d.mts +0 -781
  80. package/types/subnet.d.mts +0 -57
  81. package/types/utils.d.mts +0 -37
package/README.md CHANGED
@@ -1,6 +1,5 @@
1
1
  [![npm](https://img.shields.io/npm/v/pmcf.svg)](https://www.npmjs.com/package/pmcf)
2
2
  [![License](https://img.shields.io/badge/License-0BSD-blue.svg)](https://spdx.org/licenses/0BSD.html)
3
- [![Typed with TypeScript](https://flat.badgen.net/badge/icon/Typed?icon=typescript\&label\&labelColor=blue\&color=555555)](https://typescriptlang.org)
4
3
  [![bundlejs](https://deno.bundlejs.com/?q=pmcf\&badge=detailed)](https://bundlejs.com/?q=pmcf)
5
4
  [![downloads](http://img.shields.io/npm/dm/pmcf.svg?style=flat-square)](https://npmjs.org/package/pmcf)
6
5
  [![GitHub Issues](https://img.shields.io/github/issues/arlac77/pmcf.svg?style=flat-square)](https://github.com/arlac77/pmcf/issues)
@@ -27,12 +26,14 @@ generates config packages for:
27
26
  * networkd
28
27
  * timesyncd
29
28
  * resolverd
29
+ * journald
30
30
  * kea
31
31
  * bind
32
32
  * mosquitto
33
33
  * influxdb
34
34
  * iwd
35
35
  * chrony
36
+ * openldap
36
37
 
37
38
  # API
38
39
 
@@ -40,69 +41,77 @@ generates config packages for:
40
41
 
41
42
  ### Table of Contents
42
43
 
43
- * [Base](#base)
44
- * [Parameters](#parameters)
45
- * [walkDirections](#walkdirections)
46
- * [Parameters](#parameters-1)
47
- * [extendedAttribute](#extendedattribute)
48
- * [Parameters](#parameters-2)
49
- * [propertyIterator](#propertyiterator)
50
- * [Parameters](#parameters-3)
51
- * [getProperties](#getproperties)
52
- * [Parameters](#parameters-4)
53
- * [priority](#priority)
54
- * [expression](#expression)
55
- * [Parameters](#parameters-5)
56
- * [findService](#findservice)
57
- * [Parameters](#parameters-6)
58
- * [templateContent](#templatecontent)
59
- * [Parameters](#parameters-7)
60
- * [property](#property)
61
- * [Parameters](#parameters-8)
62
- * [expand](#expand)
63
- * [Parameters](#parameters-9)
64
- * [PortEndpoint](#portendpoint)
65
- * [Parameters](#parameters-10)
66
- * [port](#port)
67
- * [socketAddress](#socketaddress)
68
- * [HTTPEndpoint](#httpendpoint)
69
- * [Parameters](#parameters-11)
70
- * [port](#port-1)
71
- * [SkeletonNetworkInterface](#skeletonnetworkinterface)
72
- * [networkAddresses](#networkaddresses)
73
- * [Parameters](#parameters-12)
74
- * [SystemdJournalRemoteService](#systemdjournalremoteservice)
75
- * [Properties](#properties)
76
- * [systemdConfigs](#systemdconfigs)
77
- * [Parameters](#parameters-13)
78
- * [SystemdJournalUploadService](#systemdjournaluploadservice)
79
- * [Properties](#properties-1)
80
- * [systemdConfigs](#systemdconfigs-1)
81
- * [Parameters](#parameters-14)
82
- * [NetworkAddress](#networkaddress)
83
- * [Parameters](#parameters-15)
84
- * [subnet](#subnet)
85
- * [networkInterface](#networkinterface)
86
- * [address](#address)
87
- * [addresses](#addresses)
88
- * [Parameters](#parameters-16)
89
- * [cidrAddresses](#cidraddresses)
90
- * [Parameters](#parameters-17)
91
- * [isTemplate](#istemplate)
92
- * [named](#named)
93
- * [Parameters](#parameters-18)
94
- * [serviceEndpoints](#serviceendpoints)
95
- * [Parameters](#parameters-19)
96
- * [domainName](#domainname)
97
- * [Parameters](#parameters-20)
98
- * [domainFromDominName](#domainfromdominname)
99
- * [Parameters](#parameters-21)
100
- * [sectionLines](#sectionlines)
101
- * [Parameters](#parameters-22)
102
- * [asArray](#asarray)
103
- * [Parameters](#parameters-23)
104
- * [asIterator](#asiterator)
105
- * [Parameters](#parameters-24)
44
+ - [pmcf](#pmcf)
45
+ - [Poor mans configuration management](#poor-mans-configuration-management)
46
+ - [API](#api)
47
+ - [Table of Contents](#table-of-contents)
48
+ - [Base](#base)
49
+ - [Parameters](#parameters)
50
+ - [walkDirections](#walkdirections)
51
+ - [Parameters](#parameters-1)
52
+ - [extendedAttribute](#extendedattribute)
53
+ - [Parameters](#parameters-2)
54
+ - [propertyIterator](#propertyiterator)
55
+ - [Parameters](#parameters-3)
56
+ - [getProperties](#getproperties)
57
+ - [Parameters](#parameters-4)
58
+ - [priority](#priority)
59
+ - [expression](#expression)
60
+ - [Parameters](#parameters-5)
61
+ - [templateContent](#templatecontent)
62
+ - [Parameters](#parameters-6)
63
+ - [isTemplate](#istemplate)
64
+ - [property](#property)
65
+ - [Parameters](#parameters-7)
66
+ - [expand](#expand)
67
+ - [Parameters](#parameters-8)
68
+ - [PortEndpoint](#portendpoint)
69
+ - [Parameters](#parameters-9)
70
+ - [port](#port)
71
+ - [socketAddress](#socketaddress)
72
+ - [HTTPEndpoint](#httpendpoint)
73
+ - [Parameters](#parameters-10)
74
+ - [port](#port-1)
75
+ - [id](#id)
76
+ - [SkeletonNetworkInterface](#skeletonnetworkinterface)
77
+ - [networkAddresses](#networkaddresses)
78
+ - [Parameters](#parameters-11)
79
+ - [InitializationContext](#initializationcontext)
80
+ - [Parameters](#parameters-12)
81
+ - [SystemdJournalRemoteService](#systemdjournalremoteservice)
82
+ - [Properties](#properties)
83
+ - [systemdConfigs](#systemdconfigs)
84
+ - [Parameters](#parameters-13)
85
+ - [SystemdJournalUploadService](#systemdjournaluploadservice)
86
+ - [Properties](#properties-1)
87
+ - [systemdConfigs](#systemdconfigs-1)
88
+ - [Parameters](#parameters-14)
89
+ - [NetworkAddress](#networkaddress)
90
+ - [Parameters](#parameters-15)
91
+ - [subnet](#subnet)
92
+ - [networkInterface](#networkinterface)
93
+ - [address](#address)
94
+ - [addresses](#addresses)
95
+ - [Parameters](#parameters-16)
96
+ - [cidrAddresses](#cidraddresses)
97
+ - [Parameters](#parameters-17)
98
+ - [secretName](#secretname)
99
+ - [isTemplate](#istemplate-1)
100
+ - [named](#named)
101
+ - [Parameters](#parameters-18)
102
+ - [serviceEndpoints](#serviceendpoints)
103
+ - [Parameters](#parameters-19)
104
+ - [domainName](#domainname)
105
+ - [Parameters](#parameters-20)
106
+ - [domainFromDominName](#domainfromdominname)
107
+ - [Parameters](#parameters-21)
108
+ - [sectionLines](#sectionlines)
109
+ - [Parameters](#parameters-22)
110
+ - [asArray](#asarray)
111
+ - [Parameters](#parameters-23)
112
+ - [asIterator](#asiterator)
113
+ - [Parameters](#parameters-24)
114
+ - [install](#install)
106
115
 
107
116
  ## Base
108
117
 
@@ -165,14 +174,6 @@ Returns **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/G
165
174
 
166
175
  Returns **any** 
167
176
 
168
- ### findService
169
-
170
- #### Parameters
171
-
172
- * `filter` **any** 
173
-
174
- Returns **any** service with the highest priority
175
-
176
177
  ### templateContent
177
178
 
178
179
  #### Parameters
@@ -182,6 +183,10 @@ Returns **any** service with the highest priority
182
183
 
183
184
  Returns **AsyncIterable\<ContentProvider>**&#x20;
184
185
 
186
+ ### isTemplate
187
+
188
+ Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**&#x20;
189
+
185
190
  ### property
186
191
 
187
192
  #### Parameters
@@ -233,6 +238,10 @@ Endpoint based on http
233
238
 
234
239
  Returns **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)**&#x20;
235
240
 
241
+ ## id
242
+
243
+ Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**&#x20;
244
+
236
245
  ## SkeletonNetworkInterface
237
246
 
238
247
  **Extends ServiceOwner**
@@ -245,6 +254,14 @@ Returns **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/G
245
254
 
246
255
  Returns **Iterable<[NetworkAddress](#networkaddress)>**&#x20;
247
256
 
257
+ ## InitializationContext
258
+
259
+ Keeps track of all in flight object creations and loose ends during config initialization.
260
+
261
+ ### Parameters
262
+
263
+ * `directory` (optional, default `"/"`)
264
+
248
265
  ## SystemdJournalRemoteService
249
266
 
250
267
  **Extends Service**
@@ -320,6 +337,10 @@ Returns **Iterable<[string](https://developer.mozilla.org/docs/Web/JavaScript/Re
320
337
 
321
338
  Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**&#x20;
322
339
 
340
+ ## secretName
341
+
342
+ Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**&#x20;
343
+
323
344
  ## isTemplate
324
345
 
325
346
  Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**&#x20;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "4.19.2",
3
+ "version": "4.20.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "packageManager": "npm@11.10.0+sha512.8bc844e37892200305b98562f13c6c10849d10b3387c8cdaeb4d1a2e32746a79063cba9dd284cf28c26a01c3bf4169b7d3b31b4a5586cc970d6749463108073c",
7
+ "packageManager": "npm@11.13.0",
8
8
  "exports": {
9
9
  ".": {
10
10
  "default": "./src/module.mjs"
@@ -42,33 +42,34 @@
42
42
  "pmcf-package": "./bin/pmcf-package"
43
43
  },
44
44
  "scripts": {
45
- "prepare": "node --run prepare:typescript",
46
- "prepare:typescript": "tsc --allowJs --declaration --emitDeclarationOnly --declarationDir types --resolveJsonModule --target esnext -m esnext --module nodenext --moduleResolution nodenext --rootDir src ./src**/*.mjs",
47
45
  "test": "node --run test:ava",
48
46
  "test:ava": "ava --timeout 4m tests/*-ava.mjs tests/*-ava-node.mjs",
49
47
  "cover": "c8 -x 'tests/**/*' --temp-directory build/tmp ava --timeout 4m tests/*-ava.mjs tests/*-ava-node.mjs && c8 report -r lcov -o build/coverage --temp-directory build/tmp",
50
48
  "docs": "documentation readme --section=API ./src**/*.mjs",
51
- "lint": "node --run lint:docs && node --run lint:typescript",
52
- "lint:docs": "documentation lint ./src**/*.mjs",
53
- "lint:typescript": "tsc --allowJs --checkJs --noEmit --resolveJsonModule --target esnext -m esnext --module nodenext --moduleResolution nodenext ./src**/*.mjs"
49
+ "lint": "node --run lint:docs",
50
+ "lint:docs": "documentation lint ./src**/*.mjs"
54
51
  },
55
52
  "dependencies": {
56
- "content-entry-transform": "^1.6.4",
57
- "ip-utilties": "^3.0.0",
58
- "npm-pkgbuild": "^20.6.3",
59
- "pacc": "^9.0.0",
53
+ "content-entry-transform": "^1.6.9",
54
+ "ip-utilties": "^3.0.4",
55
+ "npm-pkgbuild": "^20.6.4",
56
+ "pacc": "^9.2.9",
60
57
  "package-directory": "^8.2.0"
61
58
  },
62
59
  "devDependencies": {
63
- "@types/node": "^25.2.3",
64
- "ava": "^6.4.1",
65
- "c8": "^10.1.3",
60
+ "@types/node": "^25.9.1",
61
+ "ava": "^8.0.1",
62
+ "c8": "^11.0.0",
66
63
  "documentation": "^14.0.3",
67
- "semantic-release": "^25.0.3",
68
- "typescript": "^5.9.3"
64
+ "semantic-release": "^25.0.3"
65
+ },
66
+ "overrides": {
67
+ "c8": {
68
+ "yargs": "^18.0.0"
69
+ }
69
70
  },
70
71
  "engines": {
71
- "node": ">=24.13.1"
72
+ "node": ">=26.2.0"
72
73
  },
73
74
  "repository": {
74
75
  "type": "git",
@@ -81,8 +82,7 @@
81
82
  "template": {
82
83
  "inheritFrom": [
83
84
  "arlac77/template-arlac77-github",
84
- "arlac77/template-node-app",
85
- "arlac77/template-typescript"
85
+ "arlac77/template-node-app"
86
86
  ]
87
87
  }
88
88
  }
package/src/base.mjs CHANGED
@@ -8,8 +8,6 @@ import {
8
8
  import { FileContentProvider } from "npm-pkgbuild";
9
9
  import {
10
10
  getAttribute,
11
- toInternal,
12
- typeFactory,
13
11
  addType,
14
12
  parse,
15
13
  globals,
@@ -26,7 +24,7 @@ import {
26
24
  description_attribute_writable,
27
25
  boolean_attribute_writable
28
26
  } from "pacc";
29
- import { asArray, union } from "./utils.mjs";
27
+ import { union } from "./utils.mjs";
30
28
 
31
29
  /**
32
30
  *
@@ -36,6 +34,7 @@ import { asArray, union } from "./utils.mjs";
36
34
  export class Base {
37
35
  static name = "base";
38
36
  static key = "name";
37
+ static priority = 0;
39
38
  static attributes = {
40
39
  owner: { ...default_attribute, type: "base" },
41
40
  type: string_attribute,
@@ -48,15 +47,7 @@ export class Base {
48
47
  tags: string_set_attribute_writable
49
48
  };
50
49
 
51
- owner;
52
- description;
53
- name;
54
- extends = [];
55
- _tags = new Set();
56
- _packaging = new Set();
57
- _directory;
58
- _finalize;
59
- _properties;
50
+ static typeDefinition = this;
60
51
 
61
52
  static {
62
53
  addType(this);
@@ -66,14 +57,20 @@ export class Base {
66
57
  return this.typeDefinition.name;
67
58
  }
68
59
 
69
- static get typeDefinition() {
70
- return this;
71
- }
72
-
73
60
  static get typeFileName() {
74
61
  return this.typeName + ".json";
75
62
  }
76
63
 
64
+ owner;
65
+ description;
66
+ name;
67
+ extends = [];
68
+ _tags = new Set();
69
+ _packaging = new Set();
70
+ _directory;
71
+ _finalize;
72
+ _properties = {};
73
+
77
74
  /**
78
75
  *
79
76
  * @param {Base} owner
@@ -86,8 +83,6 @@ export class Base {
86
83
  case "string":
87
84
  this.name = data;
88
85
  break;
89
- case "object":
90
- this.read(data, this.constructor);
91
86
  }
92
87
  }
93
88
 
@@ -110,207 +105,7 @@ export class Base {
110
105
  return this;
111
106
  }
112
107
 
113
- read(data, type = this.constructor.typeDefinition) {
114
- if (type.extends) {
115
- this.read(data, type.extends);
116
- }
117
-
118
- const assign = (name, attribute, value) => {
119
- value = toInternal(value, attribute);
120
- value ??= attribute.default;
121
-
122
- if (value !== undefined) {
123
- if (attribute.values) {
124
- if (attribute.values.indexOf(value) < 0) {
125
- this.error(name, "unknown value", value, attribute.values);
126
- }
127
- }
128
-
129
- if (attribute.collection) {
130
- const current = this[name];
131
-
132
- switch (typeof current) {
133
- case "undefined":
134
- if (attribute.constructor === value.constructor) {
135
- this[name] = value;
136
- } else {
137
- this[name] = asArray(value);
138
- }
139
- break;
140
- case "object":
141
- if (Array.isArray(current)) {
142
- if (Array.isArray(value)) {
143
- current.push(...value);
144
- } else {
145
- current.push(value);
146
- }
147
- } else {
148
- if (current instanceof Set) {
149
- if (value instanceof Set) {
150
- this[name] = current.union(value);
151
- } else {
152
- this[name].add(value);
153
- }
154
- } else if (current instanceof Map) {
155
- const keyName = attribute.type.key;
156
- if (keyName) {
157
- current.set(value[keyName], value);
158
- } else {
159
- // TODO
160
- this[name] = value;
161
- }
162
- } else {
163
- const keyName = attribute.type.key;
164
- this[name][value[keyName]] = value;
165
- }
166
- }
167
- break;
168
- case "function":
169
- if (value instanceof Base) {
170
- this.addObject(value);
171
- } else {
172
- this.error("Unknown collection type", name, current);
173
- }
174
- break;
175
- }
176
- } else {
177
- this[name] = value;
178
- }
179
- }
180
- };
181
-
182
- const instantiateAndAssign = (name, attribute, value) => {
183
- if (attribute.type.primitive) {
184
- assign(name, attribute, value);
185
- return;
186
- }
187
-
188
- switch (typeof value) {
189
- case "undefined":
190
- return;
191
- case "function":
192
- this.error("Invalid value", name, value);
193
- break;
194
-
195
- case "boolean":
196
- case "bigint":
197
- case "number":
198
- case "string":
199
- {
200
- let object;
201
-
202
- for (const type of attribute.type.members || [attribute.type]) {
203
- object = this.typeNamed(type.name, value);
204
- if (object) {
205
- break;
206
- }
207
- }
208
-
209
- if (object) {
210
- assign(name, attribute, object);
211
- } else {
212
- if (attribute.type.constructWithIdentifierOnly) {
213
- object = new attribute.type.clazz(
214
- this.ownerFor(attribute, value),
215
- value
216
- );
217
- object.read(value);
218
- this.addObject(object);
219
- } else {
220
- this.finalize(() => {
221
- value = this.expand(value);
222
-
223
- for (const type of attribute.type.members || [
224
- attribute.type
225
- ]) {
226
- const object =
227
- this.typeNamed(type.name, value) ||
228
- this.owner.typeNamed(type.name, value) ||
229
- this.root.typeNamed(type.name, value); // TODO
230
-
231
- if (object) {
232
- assign(name, attribute, object);
233
- return;
234
- }
235
- }
236
-
237
- this.error(
238
- `No such object "${value}" (${attribute.type.name}) for attribute ${name}`,
239
- this.root.named(value)?.toString()
240
- );
241
- });
242
- }
243
- }
244
- }
245
- break;
246
- case "object":
247
- if (attribute.type.clazz && value instanceof attribute.type.clazz) {
248
- assign(name, attribute, value);
249
- } else {
250
- assign(
251
- name,
252
- attribute,
253
- typeFactory(
254
- attribute.type,
255
- this.ownerFor(attribute, value),
256
- value
257
- )
258
- );
259
- }
260
- break;
261
- }
262
- };
263
-
264
- if (data?.properties) {
265
- this._properties = data.properties;
266
- }
267
-
268
- for (const [path, attribute] of attributeIterator(type.attributes)) {
269
- if (attribute.writable) {
270
- const name = path.join(".");
271
- const value = this.expand(data[name]);
272
-
273
- if (attribute.collection) {
274
- if (typeof value === "object") {
275
- if (Array.isArray(value)) {
276
- for (const v of value) {
277
- instantiateAndAssign(name, attribute, v);
278
- }
279
- } else {
280
- if (value instanceof Base) {
281
- assign(name, attribute, value);
282
- } else {
283
- for (const [objectName, objectData] of Object.entries(value)) {
284
- if (typeof objectData === "object") {
285
- //console.log("KEY", objectName, type.name, type.key);
286
- objectData[attribute.type.key] = objectName;
287
- }
288
- instantiateAndAssign(name, attribute, objectData);
289
- }
290
- }
291
- }
292
- continue;
293
- }
294
- }
295
- instantiateAndAssign(name, attribute, value);
296
- }
297
- }
298
-
299
- if (data?.extends) {
300
- this.finalize(() => {
301
- for (const object of this.extends) {
302
- object.execFinalize();
303
- this._applyExtends(object);
304
- }
305
- });
306
- }
307
-
308
- /*if(this.type) {
309
- console.log(this.toString(),this.name,this.fullName);
310
- }*/
311
- }
312
-
313
- _applyExtends() {}
108
+ materializeExtends() {}
314
109
 
315
110
  named(name) {}
316
111
 
@@ -498,7 +293,7 @@ export class Base {
498
293
  }
499
294
 
500
295
  get smtp() {
501
- return this.findService('in("smtp",types)');
296
+ return this.expression("services[types[smtp]][0]");
502
297
  }
503
298
 
504
299
  /**
@@ -515,29 +310,13 @@ export class Base {
515
310
  });
516
311
  }
517
312
 
518
- get services()
519
- {
520
- return this.owner?.services;
313
+ get services() {
314
+ return this.owner?.services || [];
521
315
  }
522
316
 
523
- /**
524
- *
525
- * @param {any} filter
526
- * @returns service with the highest priority
527
- */
528
- findService(filter) {
529
- let best;
530
- for (const service of this.findServices(filter)) {
531
- if (!best || service.priority > best.priority) {
532
- best = service;
533
- }
534
- }
535
-
536
- return best;
537
- }
538
-
539
- *findServices(filter) {
540
- yield* this.owner?.findServices(filter);
317
+ // TODO get rid of
318
+ get aggregatedServices() {
319
+ return this.services;
541
320
  }
542
321
 
543
322
  set directory(directory) {
@@ -642,6 +421,9 @@ export class Base {
642
421
  this._tags = union(value, this._tags);
643
422
  }
644
423
 
424
+ /**
425
+ * @return {boolean}
426
+ */
645
427
  get isTemplate() {
646
428
  return this.name?.indexOf("*") >= 0 || this.owner?.isTemplate || false;
647
429
  }
package/src/cli.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { parseArgs } from "node:util";
2
2
  import { argv, cwd, env } from "node:process";
3
- import { Root } from "./module.mjs";
3
+ import { InitializationContext } from "./module.mjs";
4
4
 
5
5
  export async function prepare(options = {}) {
6
6
  const { values, positionals } = parseArgs({
@@ -25,9 +25,9 @@ export async function prepare(options = {}) {
25
25
  allowPositionals: true
26
26
  });
27
27
 
28
- const root = new Root(values.root);
28
+ const ic = new InitializationContext(values.root);
29
29
 
30
- await root.loadAll();
30
+ await ic.loadAll();
31
31
 
32
- return { root, options: values, args: positionals };
32
+ return { ic, root: ic.root, options: values, args: positionals };
33
33
  }