pmcf 4.25.14 → 4.25.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "4.25.14",
3
+ "version": "4.25.16",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/cluster.mjs CHANGED
@@ -15,8 +15,8 @@ import { writeLines } from "./utils.mjs";
15
15
  export class Cluster extends Host {
16
16
  static name = "cluster";
17
17
  static priority = 1.5;
18
- static owners = [Owner.typeDefinition, "network", "location", "root"];
19
- static extends = Host.typeDefinition;
18
+ static owners = [Owner, "network", "location", "root"];
19
+ static extends = Host;
20
20
  static key = "name";
21
21
  static attributes = {
22
22
  routerId: { ...number_attribute_writable, default: 100 },
@@ -1,23 +1,22 @@
1
1
  import { default_attribute_writable, addType } from "pacc";
2
- import { Service, ServiceTypeDefinition } from "./service.mjs";
2
+ import { Service } from "./service.mjs";
3
3
  import { networkAddressType } from "pmcf";
4
4
 
5
- export const ExtraSourceServiceTypeDefinition = {
6
- name: "extra-source-service",
7
- extends: ServiceTypeDefinition,
8
- specializationOf: ServiceTypeDefinition,
9
- owners: ServiceTypeDefinition.owners,
10
- attributes: {
5
+
6
+ export class ExtraSourceService extends Service {
7
+ static name = "extra-source-service";
8
+ static extends = Service;
9
+ static specializationOf = Service;
10
+ static owners = Service.owners;
11
+ static attributes = {
11
12
  source: {
12
13
  ...default_attribute_writable,
13
14
  type: networkAddressType,
14
15
  collection: true
15
16
  }
16
- }
17
- };
17
+ };
18
18
 
19
- export class ExtraSourceService extends Service {
20
- static typeDefinition = ExtraSourceServiceTypeDefinition;
19
+ static typeDefinition = this;
21
20
 
22
21
  static {
23
22
  addType(this);
@@ -26,7 +25,7 @@ export class ExtraSourceService extends Service {
26
25
  source = [];
27
26
 
28
27
  get type() {
29
- return ExtraSourceServiceTypeDefinition.name;
28
+ return this.constructor.name;
30
29
  }
31
30
 
32
31
  get services() {
package/src/host.mjs CHANGED
@@ -10,7 +10,8 @@ import {
10
10
  boolean_attribute_false,
11
11
  addType
12
12
  } from "pacc";
13
- import { ServiceOwner, Base, addresses } from "pmcf";
13
+ import { Base, NetworkInterface, addresses } from "pmcf";
14
+ import { ServiceOwner } from "./service-owner.mjs";
14
15
  import { networkAddressAttributes } from "./network-support.mjs";
15
16
  import { addHook } from "./hooks.mjs";
16
17
  import {
@@ -22,13 +23,12 @@ import {
22
23
  } from "./utils.mjs";
23
24
  import { loadHooks } from "./hooks.mjs";
24
25
  import { generateKnownHosts } from "./host-utils.mjs";
25
- import { NetworkInterfaceTypeDefinition } from "./network-interfaces/network-interface.mjs";
26
26
 
27
27
  export class Host extends ServiceOwner {
28
28
  static name = "host";
29
29
  static priority = 1.9;
30
30
  static owners = ["owner", "network", "root"];
31
- static extends = Base.typeDefinition;
31
+ static extends = Base;
32
32
  static key = "name";
33
33
  static attributes = {
34
34
  ...networkAddressAttributes,
@@ -368,7 +368,7 @@ export class Host extends ServiceOwner {
368
368
  }
369
369
 
370
370
  typeNamed(typeName, name) {
371
- if (typeName === NetworkInterfaceTypeDefinition.name) {
371
+ if (typeName === NetworkInterface.name) {
372
372
  const ni = this._networkInterfaces.get(name);
373
373
  if (ni) {
374
374
  return ni;
package/src/location.mjs CHANGED
@@ -6,8 +6,8 @@ import { loadHooks } from "./hooks.mjs";
6
6
  export class Location extends Owner {
7
7
  static name = "location";
8
8
  static priority = 2;
9
- static owners = [Owner.typeDefinition, "location", "root"];
10
- static extends = Owner.typeDefinition;
9
+ static owners = [Owner, "location", "root"];
10
+ static extends = Owner;
11
11
  static key = "name";
12
12
  static attributes = {};
13
13
 
@@ -4,23 +4,21 @@ import {
4
4
  NetworkInterfaceTypeDefinition
5
5
  } from "./network-interface.mjs";
6
6
 
7
- export const EthernetNetworkInterfaceTypeDefinition = {
8
- name: "ethernet",
9
- extends: NetworkInterfaceTypeDefinition,
10
- specializationOf: NetworkInterfaceTypeDefinition,
11
- owners: NetworkInterfaceTypeDefinition.owners,
12
- key: "name",
13
- attributes: {
7
+ export class EthernetNetworkInterface extends NetworkInterface {
8
+ static name= "ethernet";
9
+ static extends= NetworkInterfaceTypeDefinition;
10
+ static specializationOf= NetworkInterfaceTypeDefinition;
11
+ static owners= NetworkInterfaceTypeDefinition.owners;
12
+ static key= "name";
13
+ static attributes= {
14
14
  arpbridge: {
15
15
  ...default_attribute_writable,
16
16
  type: "network_interface",
17
17
  collection: true
18
18
  }
19
- }
20
- };
19
+ };
21
20
 
22
- export class EthernetNetworkInterface extends NetworkInterface {
23
- static typeDefinition = EthernetNetworkInterfaceTypeDefinition;
21
+ static typeDefinition = this;
24
22
 
25
23
  static {
26
24
  addType(this);
@@ -33,6 +31,6 @@ export class EthernetNetworkInterface extends NetworkInterface {
33
31
  arpbridge;
34
32
 
35
33
  get kind() {
36
- return EthernetNetworkInterfaceTypeDefinition.name;
34
+ return this.constructor.name;
37
35
  }
38
36
  }
@@ -226,8 +226,8 @@ export class NetworkInterface extends SkeletonNetworkInterface {
226
226
  const routeSectionExtra = this.destination
227
227
  ? { Destination: this.destination }
228
228
  : this.gateway
229
- ? { Gateway: this.gatewayAddress }
230
- : {};
229
+ ? { Gateway: this.gatewayAddress }
230
+ : {};
231
231
 
232
232
  const networkSectionExtra = this.arpbridge
233
233
  ? {
@@ -8,15 +8,14 @@ import {
8
8
  import { writeLines, sectionLines } from "../utils.mjs";
9
9
  import { NetworkInterfaceTypeDefinition } from "./network-interface.mjs";
10
10
  import {
11
- EthernetNetworkInterface,
12
- EthernetNetworkInterfaceTypeDefinition
11
+ EthernetNetworkInterface
13
12
  } from "./ethernet.mjs";
14
13
 
15
14
  export class WLANNetworkInterface extends EthernetNetworkInterface {
16
15
  static name = "wlan";
17
- static extends = EthernetNetworkInterfaceTypeDefinition;
16
+ static extends = EthernetNetworkInterface;
18
17
  static specializationOf = NetworkInterfaceTypeDefinition;
19
- static owners = EthernetNetworkInterfaceTypeDefinition.owners;
18
+ static owners = EthernetNetworkInterface.owners;
20
19
  static key = "name";
21
20
  static attributes = {
22
21
  ssid: string_attribute_writable,
package/src/network.mjs CHANGED
@@ -7,7 +7,7 @@ export class Network extends Owner {
7
7
  static name = "network";
8
8
  static priority = 2;
9
9
  static owners = ["location", "owner", "root"];
10
- static extends = Owner.typeDefinition;
10
+ static extends = Owner;
11
11
  static key = "name";
12
12
  static attributes = {
13
13
  ...networkAttributes,
package/src/owner.mjs CHANGED
@@ -19,7 +19,7 @@ export class Owner extends Base {
19
19
  static name = "owner";
20
20
  static priority = 2;
21
21
  static owners = ["location", "owner", "root"];
22
- static extends = Base.typeDefinition;
22
+ static extends = Base;
23
23
  static key = "name";
24
24
  static attributes = {
25
25
  networks: networks_attribute,
@@ -31,7 +31,7 @@ export class Owner extends Base {
31
31
  },
32
32
  subnets: {
33
33
  ...default_attribute_writable,
34
- type: Subnet.typeDefinition,
34
+ type: Subnet,
35
35
  collection: true
36
36
  },
37
37
  country: string_attribute_writable,
package/src/service.mjs CHANGED
@@ -48,15 +48,15 @@ export const EndpointTypeDefinition = {
48
48
  attributes: endpointAttributes
49
49
  };
50
50
 
51
- export const ServiceTypeDefinition = {
52
- name: "service",
53
- priority: 1.1,
54
- owners: [Host.typeDefinition, "cluster", "network_interface"],
55
- extends: Base,
56
- specializations: {},
57
- factoryFor(owner, value) {
51
+ export class Service extends Base {
52
+ static name = "service";
53
+ static priority = 1.1;
54
+ static owners = [Host, "cluster", "network_interface"];
55
+ static extends = Base;
56
+ static specializations = {};
57
+ static factoryFor(owner, value) {
58
58
  const type = value.type ?? value.name;
59
- const t = ServiceTypeDefinition.specializations[type];
59
+ const t = this.specializations[type];
60
60
 
61
61
  if (t) {
62
62
  delete value.type;
@@ -64,19 +64,17 @@ export const ServiceTypeDefinition = {
64
64
  }
65
65
 
66
66
  return Service;
67
- },
68
- key: "name",
69
- attributes: {
67
+ }
68
+ static key = "name";
69
+ static attributes = {
70
70
  ...networkAddressAttributes,
71
71
  ...endpointAttributes,
72
72
  alias: string_attribute_writable,
73
73
  weight: { ...number_attribute_writable /*default: 1*/ },
74
74
  systemdService: string_attribute_writable
75
- }
76
- };
75
+ };
77
76
 
78
- export class Service extends Base {
79
- static typeDefinition = ServiceTypeDefinition;
77
+ static typeDefinition = this;
80
78
 
81
79
  static {
82
80
  addType(this);
@@ -221,7 +219,10 @@ export class Service extends Base {
221
219
  }
222
220
 
223
221
  get port() {
224
- return this.attribute("_port") ?? serviceTypeEndpoints(ServiceTypes[this.type])[0]?.port;
222
+ return (
223
+ this.attribute("_port") ??
224
+ serviceTypeEndpoints(ServiceTypes[this.type])[0]?.port
225
+ );
225
226
  }
226
227
 
227
228
  set weight(value) {
@@ -6,11 +6,11 @@ import {
6
6
  string_set_attribute_writable
7
7
  } from "pacc";
8
8
  import { addServiceType, Base } from "pmcf";
9
- import { ServiceTypeDefinition, Service } from "../service.mjs";
9
+ import { Service } from "../service.mjs";
10
10
 
11
11
  class ALPMRepository extends Base {
12
12
  static name = "alpm_repository";
13
- static extends = Base.typeDefinition;
13
+ static extends = Base;
14
14
  static key = "name";
15
15
  static attributes = {
16
16
  name: name_attribute_writable,
@@ -27,9 +27,9 @@ class ALPMRepository extends Base {
27
27
  export class ALPMService extends Service {
28
28
  static name = "alpm";
29
29
  static priority = 1;
30
- static extends = ServiceTypeDefinition;
31
- static specializationOf = ServiceTypeDefinition;
32
- static owners = ServiceTypeDefinition.owners;
30
+ static extends = Service;
31
+ static specializationOf = Service;
32
+ static owners = Service.owners;
33
33
  static attributes = {
34
34
  repositories: {
35
35
  ...default_attribute_writable,
@@ -27,8 +27,7 @@ import {
27
27
  dnsRecordTypeForAddressFamily,
28
28
  sortZoneRecords
29
29
  } from "../dns-utils.mjs";
30
- import { ServiceTypeDefinition } from "../service.mjs";
31
- import { ExtraSourceServiceTypeDefinition } from "../extra-source-service.mjs";
30
+ import { Service } from "../service.mjs";
32
31
  import { addHook } from "../hooks.mjs";
33
32
 
34
33
  const bindNetworkAddressTypes = networkAddressType + "|bind_group";
@@ -400,9 +399,9 @@ function addressesStatement(prefix, objects, generateEmpty = false) {
400
399
 
401
400
  export class BindService extends ExtraSourceService {
402
401
  static name = "bind";
403
- static extends = ExtraSourceServiceTypeDefinition;
404
- static specializationOf = ServiceTypeDefinition;
405
- static owners = ServiceTypeDefinition.owners;
402
+ static extends = ExtraSourceService;
403
+ static specializationOf = Service;
404
+ static owners = Service.owners;
406
405
  static key = "name";
407
406
  static attributes = {
408
407
  groups: {
@@ -2,20 +2,16 @@ import { join } from "node:path";
2
2
  import { FileContentProvider } from "npm-pkgbuild";
3
3
  import { isLinkLocal } from "ip-utilties";
4
4
  import { addType } from "pacc";
5
- import { addServiceType } from "pmcf";
6
- import { ServiceTypeDefinition, serviceEndpoints } from "../service.mjs";
7
- import {
8
- ExtraSourceService,
9
- ExtraSourceServiceTypeDefinition
10
- } from "../extra-source-service.mjs";
5
+ import { addServiceType, ExtraSourceService } from "pmcf";
6
+ import { Service, serviceEndpoints } from "../service.mjs";
11
7
  import { writeLines } from "../utils.mjs";
12
8
 
13
9
  export class ChronyService extends ExtraSourceService {
14
10
  static name = "chrony";
15
11
  static priority = 1;
16
- static extends = ExtraSourceServiceTypeDefinition;
17
- static specializationOf = ServiceTypeDefinition;
18
- static owners = ServiceTypeDefinition.owners;
12
+ static extends = ExtraSourceService;
13
+ static specializationOf = Service;
14
+ static owners = Service.owners;
19
15
  static key = "name";
20
16
  static service = {
21
17
  systemdService: "chronyd.service",
@@ -1,13 +1,13 @@
1
1
  import { addType } from "pacc";
2
2
  import { addServiceType } from "pmcf";
3
- import { ServiceTypeDefinition, Service } from "../service.mjs";
3
+ import { Service } from "../service.mjs";
4
4
 
5
5
  export class HeadscaleService extends Service {
6
6
  static name = "headscale";
7
7
  static priority = 1;
8
- static extends = ServiceTypeDefinition;
9
- static specializationOf = ServiceTypeDefinition;
10
- static owners = ServiceTypeDefinition.owners;
8
+ static extends = Service;
9
+ static specializationOf = Service;
10
+ static owners = Service.owners;
11
11
  static key = "name";
12
12
  static service = {
13
13
  endpoints: [
@@ -7,14 +7,14 @@ import {
7
7
  setionLinesFromPropertyIterator,
8
8
  filterConfigurable
9
9
  } from "../utils.mjs";
10
- import { Service, ServiceTypeDefinition } from "../service.mjs";
10
+ import { Service } from "../service.mjs";
11
11
 
12
12
  export class InfluxdbService extends Service {
13
13
  static name = "influxdb";
14
14
  static priority = 1;
15
- static extends = ServiceTypeDefinition;
16
- static specializationOf = ServiceTypeDefinition;
17
- static owners = ServiceTypeDefinition.owners;
15
+ static extends = Service;
16
+ static specializationOf = Service;
17
+ static owners = Service.owners;
18
18
  static key = "name";
19
19
  static attributes = {
20
20
  metricsDisabled: {
@@ -11,7 +11,6 @@ import {
11
11
  addServiceType,
12
12
  Service,
13
13
  sortDescendingByPriority,
14
- ServiceTypeDefinition,
15
14
  serviceEndpoints,
16
15
  SUBNET_LOCALHOST_IPV4,
17
16
  SUBNET_LOCALHOST_IPV6
@@ -23,9 +22,9 @@ const keaVersion = "3.0.1";
23
22
  export class KeaService extends Service {
24
23
  static name = "kea";
25
24
  static priority = 1;
26
- static extends = ServiceTypeDefinition;
27
- static specializationOf = ServiceTypeDefinition;
28
- static owners = ServiceTypeDefinition.owners;
25
+ static extends = Service;
26
+ static specializationOf = Service;
27
+ static owners = Service.owners;
29
28
  static key = "name";
30
29
  static attributes = {
31
30
  "ddns-send-updates": {
@@ -266,7 +265,7 @@ export class KeaService extends Service {
266
265
  };
267
266
 
268
267
  for (const [key] of Object.entries(
269
- KeaServiceTypeDefinition.attributes
268
+ KeaService.attributes
270
269
  ).filter(
271
270
  ([key, attribute]) => attribute.configurable && this[key] !== undefined
272
271
  )) {
@@ -1,13 +1,13 @@
1
1
  import { port_attribute, string_attribute_writable, addType } from "pacc";
2
2
  import { addServiceType } from "pmcf";
3
- import { Service, ServiceTypeDefinition } from "../service.mjs";
3
+ import { Service } from "../service.mjs";
4
4
 
5
5
  export class MosquittoService extends Service {
6
6
  static name = "mosquitto";
7
7
  static priority = 1;
8
- static extends = ServiceTypeDefinition;
9
- static specializationOf = ServiceTypeDefinition;
10
- static owners = ServiceTypeDefinition.owners;
8
+ static extends = Service;
9
+ static specializationOf = Service;
10
+ static owners = Service.owners;
11
11
  static key = "name";
12
12
  static attributes = {
13
13
  listener: {
@@ -1,13 +1,13 @@
1
1
  import { string_attribute_writable, addType } from "pacc";
2
2
  import { addServiceType } from "pmcf";
3
- import { ServiceTypeDefinition, Service } from "../service.mjs";
3
+ import { Service } from "../service.mjs";
4
4
 
5
5
  export class OpenLDAPService extends Service {
6
6
  static name = "openldap";
7
7
  static priority = 1;
8
- static extends = ServiceTypeDefinition;
9
- static specializationOf = ServiceTypeDefinition;
10
- static owners = ServiceTypeDefinition.owners;
8
+ static extends = Service;
9
+ static specializationOf = Service;
10
+ static owners = Service.owners;
11
11
  static key = "name";
12
12
  static attributes = {
13
13
  base: string_attribute_writable,
@@ -1,13 +1,13 @@
1
1
  import { addType } from "pacc";
2
2
  import { addServiceType } from "pmcf";
3
- import { ServiceTypeDefinition, Service } from "../service.mjs";
3
+ import { Service } from "../service.mjs";
4
4
 
5
5
  export class PostfixService extends Service {
6
6
  static name = "postfix";
7
7
  static priority = 1;
8
- static extends = ServiceTypeDefinition;
9
- static specializationOf = ServiceTypeDefinition;
10
- static owners = ServiceTypeDefinition.owners;
8
+ static extends = Service;
9
+ static specializationOf = Service;
10
+ static owners = Service.owners;
11
11
  static key = "name";
12
12
  static attributes = {};
13
13
  static service = {
@@ -5,7 +5,7 @@ import {
5
5
  boolean_attribute_writable,
6
6
  integer_attribute_writable
7
7
  } from "pacc";
8
- import { Service, ServiceTypeDefinition, addServiceType } from "pmcf";
8
+ import { Service, addServiceType } from "pmcf";
9
9
  import { filterConfigurable, sectionLines } from "../utils.mjs";
10
10
 
11
11
  /**
@@ -15,9 +15,9 @@ import { filterConfigurable, sectionLines } from "../utils.mjs";
15
15
  export class SystemdJournalRemoteService extends Service {
16
16
  static name = "systemd-journal-remote";
17
17
  static priority = 1;
18
- static extends = ServiceTypeDefinition;
19
- static specializationOf = ServiceTypeDefinition;
20
- static owners = ServiceTypeDefinition.owners;
18
+ static extends = Service;
19
+ static specializationOf = Service;
20
+ static owners = Service.owners;
21
21
  static key = "name";
22
22
  static attributes = {
23
23
  Seal: {
@@ -4,7 +4,7 @@ import {
4
4
  boolean_attribute_writable,
5
5
  addType
6
6
  } from "pacc";
7
- import { Service, ServiceTypeDefinition, addServiceType } from "pmcf";
7
+ import { Service, addServiceType } from "pmcf";
8
8
  import { filterConfigurable, sectionLines } from "../utils.mjs";
9
9
 
10
10
  /**
@@ -15,9 +15,9 @@ import { filterConfigurable, sectionLines } from "../utils.mjs";
15
15
  export class SystemdJournalUploadService extends Service {
16
16
  static name = "systemd-journal-upload";
17
17
  static priority = 1;
18
- static extends = ServiceTypeDefinition;
19
- static specializationOf = ServiceTypeDefinition;
20
- static owners = ServiceTypeDefinition.owners;
18
+ static extends = Service;
19
+ static specializationOf = Service;
20
+ static owners = Service.owners;
21
21
  static key = "name";
22
22
  static attributes = {
23
23
  URL: { ...string_attribute_writable, configurable: true },
@@ -3,15 +3,15 @@ import {
3
3
  string_attribute_writable,
4
4
  duration_attribute_writable
5
5
  } from "pacc";
6
- import { Service, ServiceTypeDefinition, addServiceType } from "pmcf";
6
+ import { Service, addServiceType } from "pmcf";
7
7
  import { filterConfigurable, sectionLines } from "../utils.mjs";
8
8
 
9
9
  export class SystemdJournaldService extends Service {
10
10
  static name = "systemd-journald";
11
11
  static priority = 1;
12
- static extends = ServiceTypeDefinition;
13
- static specializationOf = ServiceTypeDefinition;
14
- static owners = ServiceTypeDefinition.owners;
12
+ static extends = Service;
13
+ static specializationOf = Service;
14
+ static owners = Service.owners;
15
15
  static key = "name";
16
16
  static attributes = {
17
17
  Storage: {
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  addType,
3
- object_attribute,
4
3
  string_collection_attribute_writable,
5
4
  duration_attribute_writable,
6
5
  string_attribute_writable,
@@ -9,10 +8,9 @@ import {
9
8
  } from "pacc";
10
9
  import {
11
10
  ExtraSourceService,
12
- ExtraSourceServiceTypeDefinition,
13
- ServiceTypeDefinition,
14
11
  serviceEndpoints,
15
- addServiceType
12
+ addServiceType,
13
+ Service
16
14
  } from "pmcf";
17
15
  import {
18
16
  filterConfigurable,
@@ -24,9 +22,9 @@ import {
24
22
  export class SystemdResolvedService extends ExtraSourceService {
25
23
  static name = "systemd-resolved";
26
24
  static priority = 1;
27
- static extends = ExtraSourceServiceTypeDefinition;
28
- static specializationOf = ServiceTypeDefinition;
29
- static owners = ServiceTypeDefinition.owners;
25
+ static extends = ExtraSourceService;
26
+ static specializationOf = Service;
27
+ static owners = Service.owners;
30
28
  static key = "name";
31
29
  static attributes = {
32
30
  /* Resolve: {
@@ -5,8 +5,7 @@ import {
5
5
  } from "pacc";
6
6
  import {
7
7
  ExtraSourceService,
8
- ExtraSourceServiceTypeDefinition,
9
- ServiceTypeDefinition,
8
+ Service,
10
9
  serviceEndpoints,
11
10
  addServiceType
12
11
  } from "pmcf";
@@ -15,9 +14,9 @@ import { filterConfigurable, sectionLines } from "../utils.mjs";
15
14
  export class SystemdTimesyncdService extends ExtraSourceService {
16
15
  static name = "systemd-timesyncd";
17
16
  static priority = 1;
18
- static extends = ExtraSourceServiceTypeDefinition;
19
- static specializationOf = ServiceTypeDefinition;
20
- static owners = ServiceTypeDefinition.owners;
17
+ static extends = ExtraSourceService;
18
+ static specializationOf = Service;
19
+ static owners = Service.owners;
21
20
 
22
21
  static attributes = {
23
22
  NTP: { ...string_attribute_writable, configurable: true },
@@ -1,12 +1,12 @@
1
1
  import { addType } from "pacc";
2
- import { ServiceTypeDefinition, Service } from "../service.mjs";
2
+ import { Service } from "../service.mjs";
3
3
 
4
4
  export class TailscaleService extends Service {
5
5
  static name = "tailscale";
6
6
  static priority = 1;
7
- static extends = ServiceTypeDefinition;
8
- static specializationOf = ServiceTypeDefinition;
9
- static owners = ServiceTypeDefinition.owners;
7
+ static extends = Service;
8
+ static specializationOf = Service;
9
+ static owners = Service.owners;
10
10
  static key = "name";
11
11
  static service = {
12
12
  endpoints: [