@nexo-alpha/core 0.1.2 → 0.2.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 CHANGED
@@ -57,8 +57,10 @@ app.getDependents("orders"); // -> ["payments"]
57
57
  - **Module model** — `purpose`, `status`, `dependencies`, `apis`, `services`, `events`, `jobs`
58
58
  - **Dependency graph** — `getDependencies(name)` / `getDependents(name)`
59
59
  - **Events** — a plain `NexoEventBus` (wraps `node:events`) via `app.events`
60
- - **Configuration** — `getConfig(key)` / `getAllConfig()`
60
+ - **Configuration** — `getConfig(key)` / `getAllConfig()` / `updateConfig(patch)`
61
61
  - **Knowledge records** — `addDecision`/`getDecisions`, `addConstraint`/`getConstraints`, `setDevelopmentState`/`getDevelopmentState`
62
+ - **Structural mutators** — `addApiToModule`/`updateApi`, `addServiceToModule`/`updateService`, `addModuleDependency` (raw, unguarded operations; permissions/validation/audit live in `@nexo-alpha/tools`'s write interface, not here)
63
+ - **Audit trail** — `addHistoryEntry`/`getHistory` — an append-only, timestamped log of operations (`success`/`denied`/`failed`)
62
64
 
63
65
  ## Related packages
64
66
 
@@ -67,7 +69,7 @@ app.getDependents("orders"); // -> ["payments"]
67
69
 
68
70
  ## Status
69
71
 
70
- **v0.1-alpha.** No CLI, no HTTP adapter, and no write/mutation AI operations yetread-only, declarative model first.
72
+ **v0.1-alpha.** No CLI, no HTTP adapter yet. Write/mutation AI operations exist as raw core mutators (`addApiToModule`, `updateApi`, `addModuleDependency`, etc.) the permission/validation/audit pipeline that makes them safe for an AI tool to call lives in `@nexo-alpha/tools`'s `createWriteInterface`.
71
73
 
72
74
  ## License
73
75
 
package/dist/api.d.ts CHANGED
@@ -6,13 +6,31 @@ export interface NexoRequestContext {
6
6
  readonly headers: Readonly<Record<string, string>>;
7
7
  }
8
8
  export type NexoApiHandler = (context: NexoRequestContext) => unknown | Promise<unknown>;
9
+ export interface NexoValidationOutcome {
10
+ readonly valid: boolean;
11
+ readonly errors?: readonly string[];
12
+ }
13
+ export type NexoRequestValidator = (context: NexoRequestContext) => NexoValidationOutcome | Promise<NexoValidationOutcome>;
14
+ export interface NexoApiAuth {
15
+ readonly required: boolean;
16
+ readonly scopes?: readonly string[];
17
+ }
18
+ export interface NexoAuthResult {
19
+ readonly authenticated: boolean;
20
+ readonly scopes?: readonly string[];
21
+ readonly identity?: unknown;
22
+ }
23
+ export type NexoAuthenticator = (context: NexoRequestContext) => NexoAuthResult | Promise<NexoAuthResult>;
9
24
  export interface NexoApi {
10
25
  readonly name: string;
11
26
  readonly method: HttpMethod;
12
27
  readonly path: string;
13
28
  readonly description?: string;
14
29
  readonly purpose?: string;
30
+ readonly service?: string;
15
31
  readonly dependencies?: readonly string[];
32
+ readonly auth?: NexoApiAuth;
33
+ readonly validate?: NexoRequestValidator;
16
34
  readonly handler?: NexoApiHandler;
17
35
  }
18
36
  //# sourceMappingURL=api.d.ts.map
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,kBAAkB,KACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,kBAAkB,KACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,OAAO,EAAE,kBAAkB,KACxB,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,kBAAkB,KACxB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC"}
@@ -1,9 +1,7 @@
1
1
  import type { NexoModule } from "./module.js";
2
2
  import type { NexoApi } from "./api.js";
3
3
  import type { NexoService } from "./service.js";
4
- import type { NexoDecision } from "./decision.js";
5
- import type { NexoConstraint } from "./constraint.js";
6
- import type { DevelopmentState } from "./development-state.js";
4
+ import type { NexoJob } from "./job.js";
7
5
  import { NexoEventBus } from "./events.js";
8
6
  export interface ApplicationOptions {
9
7
  readonly name: string;
@@ -11,20 +9,18 @@ export interface ApplicationOptions {
11
9
  readonly description?: string;
12
10
  readonly config?: Record<string, unknown>;
13
11
  }
14
- export type ApplicationState = "created" | "initializing" | "running" | "stopping" | "stopped";
12
+ export type ApplicationState = "created" | "initializing" | "running" | "stopping" | "stopped" | "failed";
15
13
  export declare class NexoApplication {
16
14
  readonly name: string;
17
15
  readonly version: string;
18
16
  readonly description?: string | undefined;
19
17
  readonly events: NexoEventBus;
20
18
  private readonly modules;
21
- private readonly config;
22
- private readonly decisions;
23
- private readonly constraints;
24
- private developmentState;
19
+ private config;
25
20
  private _state;
26
21
  constructor(options: ApplicationOptions);
27
22
  get state(): ApplicationState;
23
+ private assertModifiable;
28
24
  module(module: NexoModule): this;
29
25
  getModule(name: string): NexoModule | undefined;
30
26
  getModules(): readonly NexoModule[];
@@ -34,14 +30,32 @@ export declare class NexoApplication {
34
30
  getDependents(moduleName: string): readonly string[];
35
31
  getApis(): readonly NexoApi[];
36
32
  getServices(): readonly NexoService[];
37
- addDecision(decision: NexoDecision): this;
38
- getDecisions(): readonly NexoDecision[];
39
- addConstraint(constraint: NexoConstraint): this;
40
- getConstraints(): readonly NexoConstraint[];
41
- setDevelopmentState(patch: Partial<DevelopmentState>): this;
42
- getDevelopmentState(): DevelopmentState;
33
+ getJobs(): readonly NexoJob[];
34
+ private requireModule;
35
+ addApiToModule(moduleName: string, api: NexoApi): this;
36
+ updateApi(moduleName: string, apiName: string, patch: Partial<NexoApi>): NexoApi;
37
+ addServiceToModule(moduleName: string, service: NexoService): this;
38
+ updateService(moduleName: string, serviceName: string, patch: Partial<NexoService>): NexoService;
39
+ addJobToModule(moduleName: string, job: NexoJob): this;
40
+ updateJob(moduleName: string, jobName: string, patch: Partial<NexoJob>): NexoJob;
41
+ updateConfig(patch: Record<string, unknown>): Readonly<Record<string, unknown>>;
42
+ addModuleDependency(moduleName: string, dependencyName: string): readonly string[];
43
43
  start(): Promise<void>;
44
44
  stop(): Promise<void>;
45
+ /**
46
+ * Recovers a "failed" application back to "stopped" so it can be
47
+ * started again. Only valid from the "failed" state.
48
+ *
49
+ * This is a best-effort cleanup, not a rollback: reset() does not know
50
+ * which modules successfully completed initialize()/start() before the
51
+ * failure, so it calls stop() on every registered module (in reverse
52
+ * registration order, same as a normal stop()) and tolerates each one
53
+ * failing or being a no-op for a module that never started. Errors are
54
+ * collected and returned rather than thrown, since a caller recovering
55
+ * from a failure needs to see every cleanup problem, not just the
56
+ * first one.
57
+ */
58
+ reset(): Promise<readonly Error[]>;
45
59
  }
46
60
  export declare function createApplication(options: ApplicationOptions): NexoApplication;
47
61
  //# sourceMappingURL=application.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,cAAc,GACd,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEd,qBAAa,eAAe;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAsB;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,gBAAgB,CAKtB;IAEF,OAAO,CAAC,MAAM,CAA+B;gBAEjC,OAAO,EAAE,kBAAkB;IAOvC,IAAI,KAAK,IAAI,gBAAgB,CAE5B;IAED,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAYhC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C,UAAU,IAAI,SAAS,UAAU,EAAE;IAInC,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIlD,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIjD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAItD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAMpD,OAAO,IAAI,SAAS,OAAO,EAAE;IAI7B,WAAW,IAAI,SAAS,WAAW,EAAE;IAMrC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAKzC,YAAY,IAAI,SAAS,YAAY,EAAE;IAIvC,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAK/C,cAAc,IAAI,SAAS,cAAc,EAAE;IAI3C,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAK3D,mBAAmB,IAAI,gBAAgB;IAIjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB5B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,eAAe,CAEjB"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { NexoConfigurationError, NexoLifecycleError } from "./errors.js";
2
- import { NexoEventBus } from "./events.js";
2
+ import { NexoEvent, NexoEventBus } from "./events.js";
3
3
  export class NexoApplication {
4
4
  name;
5
5
  version;
@@ -7,14 +7,6 @@ export class NexoApplication {
7
7
  events = new NexoEventBus();
8
8
  modules = new Map();
9
9
  config;
10
- decisions = [];
11
- constraints = [];
12
- developmentState = {
13
- completed: [],
14
- inProgress: [],
15
- blocked: [],
16
- knownIssues: []
17
- };
18
10
  _state = "created";
19
11
  constructor(options) {
20
12
  this.name = options.name;
@@ -25,7 +17,13 @@ export class NexoApplication {
25
17
  get state() {
26
18
  return this._state;
27
19
  }
20
+ assertModifiable() {
21
+ if (this._state !== "created" && this._state !== "stopped") {
22
+ throw new NexoLifecycleError(`Cannot modify application structure or configuration while in state "${this._state}".`);
23
+ }
24
+ }
28
25
  module(module) {
26
+ this.assertModifiable();
29
27
  if (this.modules.has(module.name)) {
30
28
  throw new NexoConfigurationError(`Nexo module "${module.name}" is already registered.`);
31
29
  }
@@ -58,26 +56,114 @@ export class NexoApplication {
58
56
  getServices() {
59
57
  return [...this.modules.values()].flatMap((module) => module.services ?? []);
60
58
  }
61
- addDecision(decision) {
62
- this.decisions.push(decision);
59
+ getJobs() {
60
+ return [...this.modules.values()].flatMap((module) => module.jobs ?? []);
61
+ }
62
+ requireModule(moduleName) {
63
+ const module = this.modules.get(moduleName);
64
+ if (!module) {
65
+ throw new NexoConfigurationError(`Nexo module "${moduleName}" is not registered.`);
66
+ }
67
+ return module;
68
+ }
69
+ addApiToModule(moduleName, api) {
70
+ this.assertModifiable();
71
+ const module = this.requireModule(moduleName);
72
+ if (module.apis?.some((existing) => existing.name === api.name)) {
73
+ throw new NexoConfigurationError(`API "${api.name}" is already registered on module "${moduleName}".`);
74
+ }
75
+ this.modules.set(moduleName, {
76
+ ...module,
77
+ apis: [...(module.apis ?? []), api]
78
+ });
63
79
  return this;
64
80
  }
65
- getDecisions() {
66
- return [...this.decisions];
81
+ updateApi(moduleName, apiName, patch) {
82
+ this.assertModifiable();
83
+ const module = this.requireModule(moduleName);
84
+ const existing = module.apis?.find((api) => api.name === apiName);
85
+ if (!existing) {
86
+ throw new NexoConfigurationError(`API "${apiName}" is not registered on module "${moduleName}".`);
87
+ }
88
+ const updated = { ...existing, ...patch };
89
+ this.modules.set(moduleName, {
90
+ ...module,
91
+ apis: (module.apis ?? []).map((api) => api.name === apiName ? updated : api)
92
+ });
93
+ return updated;
67
94
  }
68
- addConstraint(constraint) {
69
- this.constraints.push(constraint);
95
+ addServiceToModule(moduleName, service) {
96
+ this.assertModifiable();
97
+ const module = this.requireModule(moduleName);
98
+ if (module.services?.some((existing) => existing.name === service.name)) {
99
+ throw new NexoConfigurationError(`Service "${service.name}" is already registered on module "${moduleName}".`);
100
+ }
101
+ this.modules.set(moduleName, {
102
+ ...module,
103
+ services: [...(module.services ?? []), service]
104
+ });
70
105
  return this;
71
106
  }
72
- getConstraints() {
73
- return [...this.constraints];
107
+ updateService(moduleName, serviceName, patch) {
108
+ this.assertModifiable();
109
+ const module = this.requireModule(moduleName);
110
+ const existing = module.services?.find((service) => service.name === serviceName);
111
+ if (!existing) {
112
+ throw new NexoConfigurationError(`Service "${serviceName}" is not registered on module "${moduleName}".`);
113
+ }
114
+ const updated = { ...existing, ...patch };
115
+ this.modules.set(moduleName, {
116
+ ...module,
117
+ services: (module.services ?? []).map((service) => service.name === serviceName ? updated : service)
118
+ });
119
+ return updated;
74
120
  }
75
- setDevelopmentState(patch) {
76
- this.developmentState = { ...this.developmentState, ...patch };
121
+ addJobToModule(moduleName, job) {
122
+ this.assertModifiable();
123
+ const module = this.requireModule(moduleName);
124
+ if (module.jobs?.some((existing) => existing.name === job.name)) {
125
+ throw new NexoConfigurationError(`Job "${job.name}" is already registered on module "${moduleName}".`);
126
+ }
127
+ this.modules.set(moduleName, {
128
+ ...module,
129
+ jobs: [...(module.jobs ?? []), job]
130
+ });
77
131
  return this;
78
132
  }
79
- getDevelopmentState() {
80
- return this.developmentState;
133
+ updateJob(moduleName, jobName, patch) {
134
+ this.assertModifiable();
135
+ const module = this.requireModule(moduleName);
136
+ const existing = module.jobs?.find((job) => job.name === jobName);
137
+ if (!existing) {
138
+ throw new NexoConfigurationError(`Job "${jobName}" is not registered on module "${moduleName}".`);
139
+ }
140
+ const updated = { ...existing, ...patch };
141
+ this.modules.set(moduleName, {
142
+ ...module,
143
+ jobs: (module.jobs ?? []).map((job) => (job.name === jobName ? updated : job))
144
+ });
145
+ return updated;
146
+ }
147
+ updateConfig(patch) {
148
+ this.assertModifiable();
149
+ this.config = { ...this.config, ...patch };
150
+ return this.config;
151
+ }
152
+ addModuleDependency(moduleName, dependencyName) {
153
+ this.assertModifiable();
154
+ const module = this.requireModule(moduleName);
155
+ if (dependencyName === moduleName) {
156
+ throw new NexoConfigurationError(`Module "${moduleName}" cannot depend on itself.`);
157
+ }
158
+ if (!this.modules.has(dependencyName)) {
159
+ throw new NexoConfigurationError(`Nexo module "${dependencyName}" is not registered.`);
160
+ }
161
+ if (module.dependencies?.includes(dependencyName)) {
162
+ throw new NexoConfigurationError(`Module "${moduleName}" already depends on "${dependencyName}".`);
163
+ }
164
+ const dependencies = [...(module.dependencies ?? []), dependencyName];
165
+ this.modules.set(moduleName, { ...module, dependencies });
166
+ return dependencies;
81
167
  }
82
168
  async start() {
83
169
  if (this._state === "running") {
@@ -87,13 +173,25 @@ export class NexoApplication {
87
173
  throw new NexoLifecycleError(`Cannot start application while in "${this._state}" state.`);
88
174
  }
89
175
  this._state = "initializing";
90
- for (const module of this.modules.values()) {
91
- await module.initialize?.();
176
+ this.events.emit(NexoEvent.APPLICATION_INITIALIZING, { state: this._state });
177
+ try {
178
+ for (const module of this.modules.values()) {
179
+ await module.initialize?.();
180
+ }
181
+ for (const module of this.modules.values()) {
182
+ await module.start?.();
183
+ }
92
184
  }
93
- for (const module of this.modules.values()) {
94
- await module.start?.();
185
+ catch (error) {
186
+ this._state = "failed";
187
+ this.events.emit(NexoEvent.APPLICATION_FAILED, {
188
+ state: this._state,
189
+ error: error instanceof Error ? error.message : String(error)
190
+ });
191
+ throw error;
95
192
  }
96
193
  this._state = "running";
194
+ this.events.emit(NexoEvent.APPLICATION_STARTED, { state: this._state });
97
195
  }
98
196
  async stop() {
99
197
  if (this._state === "stopped") {
@@ -103,11 +201,54 @@ export class NexoApplication {
103
201
  throw new NexoLifecycleError(`Cannot stop application while in "${this._state}" state.`);
104
202
  }
105
203
  this._state = "stopping";
204
+ this.events.emit(NexoEvent.APPLICATION_STOPPING, { state: this._state });
205
+ const modules = [...this.modules.values()].reverse();
206
+ try {
207
+ for (const module of modules) {
208
+ await module.stop?.();
209
+ }
210
+ }
211
+ catch (error) {
212
+ this._state = "failed";
213
+ this.events.emit(NexoEvent.APPLICATION_FAILED, {
214
+ state: this._state,
215
+ error: error instanceof Error ? error.message : String(error)
216
+ });
217
+ throw error;
218
+ }
219
+ this._state = "stopped";
220
+ this.events.emit(NexoEvent.APPLICATION_STOPPED, { state: this._state });
221
+ }
222
+ /**
223
+ * Recovers a "failed" application back to "stopped" so it can be
224
+ * started again. Only valid from the "failed" state.
225
+ *
226
+ * This is a best-effort cleanup, not a rollback: reset() does not know
227
+ * which modules successfully completed initialize()/start() before the
228
+ * failure, so it calls stop() on every registered module (in reverse
229
+ * registration order, same as a normal stop()) and tolerates each one
230
+ * failing or being a no-op for a module that never started. Errors are
231
+ * collected and returned rather than thrown, since a caller recovering
232
+ * from a failure needs to see every cleanup problem, not just the
233
+ * first one.
234
+ */
235
+ async reset() {
236
+ if (this._state !== "failed") {
237
+ throw new NexoLifecycleError(`Cannot reset application while in "${this._state}" state.`);
238
+ }
106
239
  const modules = [...this.modules.values()].reverse();
240
+ const errors = [];
107
241
  for (const module of modules) {
108
- await module.stop?.();
242
+ try {
243
+ await module.stop?.();
244
+ }
245
+ catch (error) {
246
+ errors.push(error instanceof Error ? error : new Error(String(error)));
247
+ }
109
248
  }
110
249
  this._state = "stopped";
250
+ this.events.emit(NexoEvent.APPLICATION_RESET, { state: this._state, errors });
251
+ return errors;
111
252
  }
112
253
  }
113
254
  export function createApplication(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface EnvConfigOptions {
2
+ readonly prefix?: string;
3
+ readonly env?: Record<string, string | undefined>;
4
+ }
5
+ export declare function loadEnvConfig(options?: EnvConfigOptions): Record<string, unknown>;
6
+ export declare function defineConfig<T extends Record<string, unknown>>(config: T): T;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmCzB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAE5E"}
package/dist/config.js ADDED
@@ -0,0 +1,39 @@
1
+ export function loadEnvConfig(options = {}) {
2
+ const prefix = options.prefix ?? "NEXO_";
3
+ const source = options.env ?? process.env;
4
+ const result = {};
5
+ for (const [key, value] of Object.entries(source)) {
6
+ if (value === undefined || !key.startsWith(prefix)) {
7
+ continue;
8
+ }
9
+ const stripped = key.slice(prefix.length);
10
+ if (!stripped) {
11
+ continue;
12
+ }
13
+ const camelKey = stripped
14
+ .toLowerCase()
15
+ .replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());
16
+ if (value === "true") {
17
+ result[camelKey] = true;
18
+ }
19
+ else if (value === "false") {
20
+ result[camelKey] = false;
21
+ }
22
+ else if (/^-?\d+(\.\d+)?$/.test(value) && !isNaN(Number(value))) {
23
+ result[camelKey] = Number(value);
24
+ }
25
+ else {
26
+ try {
27
+ result[camelKey] = JSON.parse(value);
28
+ }
29
+ catch {
30
+ result[camelKey] = value;
31
+ }
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ export function defineConfig(config) {
37
+ return config;
38
+ }
39
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,aAAa,CAC3B,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC1C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ;aACtB,WAAW,EAAE;aACb,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAEhE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAoC,MAAS;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/events.d.ts CHANGED
@@ -4,4 +4,39 @@ export declare class NexoEventBus {
4
4
  off(event: string, listener: (...args: unknown[]) => void): this;
5
5
  emit(event: string, ...args: unknown[]): boolean;
6
6
  }
7
+ export declare const NexoEvent: {
8
+ readonly API_CALLED: "api.called";
9
+ readonly API_ERROR: "api.error";
10
+ readonly JOB_RAN: "job.ran";
11
+ readonly JOB_FAILED: "job.failed";
12
+ readonly APPLICATION_INITIALIZING: "application.initializing";
13
+ readonly APPLICATION_STARTED: "application.started";
14
+ readonly APPLICATION_STOPPING: "application.stopping";
15
+ readonly APPLICATION_STOPPED: "application.stopped";
16
+ readonly APPLICATION_FAILED: "application.failed";
17
+ readonly APPLICATION_RESET: "application.reset";
18
+ };
19
+ export interface ApiCalledEvent {
20
+ readonly api: string;
21
+ readonly method: string;
22
+ readonly path: string;
23
+ readonly statusCode: number;
24
+ readonly durationMs: number;
25
+ }
26
+ export interface ApiErrorEvent {
27
+ readonly api: string;
28
+ readonly method: string;
29
+ readonly path: string;
30
+ readonly durationMs: number;
31
+ readonly error: string;
32
+ }
33
+ export interface JobRanEvent {
34
+ readonly job: string;
35
+ readonly durationMs: number;
36
+ }
37
+ export interface JobFailedEvent {
38
+ readonly job: string;
39
+ readonly durationMs: number;
40
+ readonly error: string;
41
+ }
7
42
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAK/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAKhE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;CAGjD"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAK/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAKhE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;CAGjD;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;CAWZ,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB"}
package/dist/events.js CHANGED
@@ -13,4 +13,16 @@ export class NexoEventBus {
13
13
  return this.emitter.emit(event, ...args);
14
14
  }
15
15
  }
16
+ export const NexoEvent = {
17
+ API_CALLED: "api.called",
18
+ API_ERROR: "api.error",
19
+ JOB_RAN: "job.ran",
20
+ JOB_FAILED: "job.failed",
21
+ APPLICATION_INITIALIZING: "application.initializing",
22
+ APPLICATION_STARTED: "application.started",
23
+ APPLICATION_STOPPING: "application.stopping",
24
+ APPLICATION_STOPPED: "application.stopped",
25
+ APPLICATION_FAILED: "application.failed",
26
+ APPLICATION_RESET: "application.reset"
27
+ };
16
28
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAE9C,EAAE,CAAC,KAAa,EAAE,QAAsC;QACtD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAAsC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,GAAG,IAAe;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAE9C,EAAE,CAAC,KAAa,EAAE,QAAsC;QACtD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAAsC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,GAAG,IAAe;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,wBAAwB,EAAE,0BAA0B;IACpD,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface NexoHistoryEntry {
2
+ readonly timestamp: string;
3
+ readonly operation: string;
4
+ readonly target?: string;
5
+ readonly actor?: string;
6
+ readonly result: "success" | "denied" | "failed";
7
+ readonly detail?: string;
8
+ }
9
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -2,11 +2,11 @@ export { createApplication, NexoApplication } from "./application.js";
2
2
  export type { ApplicationOptions, ApplicationState } from "./application.js";
3
3
  export type { NexoModule } from "./module.js";
4
4
  export type { NexoService } from "./service.js";
5
- export type { NexoApi, HttpMethod, NexoRequestContext, NexoApiHandler } from "./api.js";
6
- export type { NexoJob } from "./job.js";
7
- export type { NexoDecision } from "./decision.js";
8
- export type { NexoConstraint } from "./constraint.js";
9
- export type { DevelopmentState } from "./development-state.js";
10
- export { NexoEventBus } from "./events.js";
5
+ export type { NexoApi, HttpMethod, NexoRequestContext, NexoApiHandler, NexoValidationOutcome, NexoRequestValidator, NexoApiAuth, NexoAuthResult, NexoAuthenticator } from "./api.js";
6
+ export type { NexoJob, NexoJobRunner } from "./job.js";
7
+ export { NexoEventBus, NexoEvent } from "./events.js";
8
+ export type { ApiCalledEvent, ApiErrorEvent, JobRanEvent, JobFailedEvent } from "./events.js";
11
9
  export { NexoError, NexoConfigurationError, NexoLifecycleError } from "./errors.js";
10
+ export { loadEnvConfig, defineConfig } from "./config.js";
11
+ export type { EnvConfigOptions } from "./config.js";
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,WAAW,EACZ,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,OAAO,EACR,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,YAAY,EACb,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,WAAW,EACZ,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,OAAO,EACP,aAAa,EACd,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EACZ,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,gBAAgB,EACjB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { createApplication, NexoApplication } from "./application.js";
2
- export { NexoEventBus } from "./events.js";
2
+ export { NexoEventBus, NexoEvent } from "./events.js";
3
3
  export { NexoError, NexoConfigurationError, NexoLifecycleError } from "./errors.js";
4
+ export { loadEnvConfig, defineConfig } from "./config.js";
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAsC1B,OAAO,EACL,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAgC1B,OAAO,EACL,YAAY,EACZ,SAAS,EACV,MAAM,aAAa,CAAC;AASrB,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC"}
package/dist/job.d.ts CHANGED
@@ -1,6 +1,8 @@
1
+ export type NexoJobRunner = () => unknown | Promise<unknown>;
1
2
  export interface NexoJob {
2
3
  readonly name: string;
3
4
  readonly description?: string;
4
5
  readonly schedule?: string;
6
+ readonly run?: NexoJobRunner;
5
7
  }
6
8
  //# sourceMappingURL=job.d.ts.map
package/dist/job.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../src/job.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../src/job.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;CAC9B"}
package/dist/module.d.ts CHANGED
@@ -7,6 +7,7 @@ export interface NexoModule {
7
7
  readonly purpose?: string;
8
8
  readonly status?: string;
9
9
  readonly dependencies?: readonly string[];
10
+ readonly externalDependencies?: readonly string[];
10
11
  readonly apis?: readonly NexoApi[];
11
12
  readonly services?: readonly NexoService[];
12
13
  readonly events?: readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAEnC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAEnC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexo-alpha/core",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Core runtime for the Nexo application framework",
5
5
  "keywords": [
6
6
  "nexo",
@@ -21,6 +21,9 @@
21
21
  "import": "./dist/index.js"
22
22
  }
23
23
  },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
24
27
  "files": [
25
28
  "dist"
26
29
  ],