obix-adapter-oop 0.2.1
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 +32 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# obix-adapter-oop
|
|
2
|
+
|
|
3
|
+
**The OOP projection — a generated class.**
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install obix-adapter-oop
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## API
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
const Timer = toOOP(artifact);
|
|
13
|
+
const t = new Timer({ props: { limitSeconds: 5 } });
|
|
14
|
+
t.Start(); // generated method -> dispatch("Start") -> applyAction(...)
|
|
15
|
+
t.Tick();
|
|
16
|
+
t.state; // read-only; assigning throws
|
|
17
|
+
t.props; // frozen
|
|
18
|
+
t.finished; // generated derived getter
|
|
19
|
+
t.render(); t.validate();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`state` and `props` are `#private`. `props` is frozen. Assigning `state` throws.
|
|
23
|
+
Every generated `Start` / `Tick` / … method delegates to `dispatch`, which calls
|
|
24
|
+
`obix-ir.applyAction`. There is never a second implementation of an action.
|
|
25
|
+
|
|
26
|
+
## Dependency role
|
|
27
|
+
|
|
28
|
+
`obix-spec` + `obix-ir`. Consumed by `obix-equivalence` and `obix-timer`.
|
|
29
|
+
|
|
30
|
+
## Level 0 status
|
|
31
|
+
|
|
32
|
+
✅ Complete.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DOPArtifact, State, Props, Payload, ActionTrace, ValidationResult } from "obix-spec";
|
|
2
|
+
export interface OOPInstance<S extends object, P extends object> {
|
|
3
|
+
readonly state: S;
|
|
4
|
+
readonly props: P;
|
|
5
|
+
dispatch(actionName: string, payload?: Payload): S;
|
|
6
|
+
replay(trace: ActionTrace): S;
|
|
7
|
+
render(): string;
|
|
8
|
+
validate(): ValidationResult;
|
|
9
|
+
[action: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface OOPConstructor<S extends object, P extends object> {
|
|
12
|
+
new (opts?: {
|
|
13
|
+
state?: S;
|
|
14
|
+
props?: Partial<P>;
|
|
15
|
+
}): OOPInstance<S, P>;
|
|
16
|
+
}
|
|
17
|
+
export declare function toOOP<S extends object = State, P extends object = Props>(artifact: DOPArtifact<S, P>): OOPConstructor<S, P>;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,WAAW,EACX,KAAK,EACL,KAAK,EACL,OAAO,EACP,WAAW,EACX,gBAAgB,EACjB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC7D,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,MAAM,CAAC;IACjB,QAAQ,IAAI,gBAAgB,CAAC;IAC7B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAChE,KAAK,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACnE;AAED,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,EAAE,CAAC,SAAS,MAAM,GAAG,KAAK,EACtE,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CA6DtB"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { applyAction } from "obix-ir";
|
|
2
|
+
export function toOOP(artifact) {
|
|
3
|
+
class Component {
|
|
4
|
+
#state;
|
|
5
|
+
#props;
|
|
6
|
+
constructor(opts = {}) {
|
|
7
|
+
this.#state = opts.state ?? artifact.initialState;
|
|
8
|
+
this.#props = Object.freeze({ ...artifact.props, ...(opts.props ?? {}) });
|
|
9
|
+
}
|
|
10
|
+
get state() {
|
|
11
|
+
return this.#state;
|
|
12
|
+
}
|
|
13
|
+
set state(_v) {
|
|
14
|
+
throw new TypeError(`[OBIX] ${artifact.name}.state is read-only`);
|
|
15
|
+
}
|
|
16
|
+
get props() {
|
|
17
|
+
return this.#props;
|
|
18
|
+
}
|
|
19
|
+
dispatch(actionName, payload) {
|
|
20
|
+
this.#state = applyAction(artifact, this.#state, actionName, payload, this.#props);
|
|
21
|
+
return this.#state;
|
|
22
|
+
}
|
|
23
|
+
replay(trace) {
|
|
24
|
+
for (const [name, payload] of trace)
|
|
25
|
+
this.dispatch(name, payload);
|
|
26
|
+
return this.#state;
|
|
27
|
+
}
|
|
28
|
+
render() {
|
|
29
|
+
return artifact.render ? artifact.render(this.#state, this.#props) : "";
|
|
30
|
+
}
|
|
31
|
+
validate() {
|
|
32
|
+
return artifact.validate ? artifact.validate(this.#state, this.#props) : { valid: true, violations: [] };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const name of Object.keys(artifact.actions)) {
|
|
36
|
+
Object.defineProperty(Component.prototype, name, {
|
|
37
|
+
value(payload) {
|
|
38
|
+
return this.dispatch(name, payload);
|
|
39
|
+
},
|
|
40
|
+
writable: false,
|
|
41
|
+
enumerable: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
for (const name of Object.keys(artifact.derived)) {
|
|
45
|
+
Object.defineProperty(Component.prototype, name, {
|
|
46
|
+
get() {
|
|
47
|
+
return artifact.derived[name](this.state, this.props);
|
|
48
|
+
},
|
|
49
|
+
enumerable: false,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return Component;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwBtC,MAAM,UAAU,KAAK,CACnB,QAA2B;IAE3B,MAAM,SAAS;QACb,MAAM,CAAI;QACV,MAAM,CAAI;QAEV,YAAY,OAA0C,EAAE;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,YAAY,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAM,CAAC;QACjF,CAAC;QAED,IAAI,KAAK;YACP,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,EAAK;YACb,MAAM,IAAI,SAAS,CAAC,UAAU,QAAQ,CAAC,IAAI,qBAAqB,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,KAAK;YACP,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,QAAQ,CAAC,UAAkB,EAAE,OAAiB;YAC5C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,KAAkB;YACvB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM;YACJ,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,QAAQ;YACN,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC3G,CAAC;KACF;IAGD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE;YAC/C,KAAK,CAAkB,OAAiB;gBACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAGD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE;YAC/C,GAAG;gBACD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAA4C,CAAC;AACtD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "obix-adapter-oop",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "OBIX OOP projection — a generated class with private state/props, frozen props, read-only external state, and generated action methods that all delegate to obix-ir.applyAction. Depends on obix-spec and obix-ir.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"private": false,
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.json"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"obix-spec": "0.2.1",
|
|
24
|
+
"obix-ir": "0.2.1"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.11.0"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/obinexusmk2/obix-monorepo-2026.git",
|
|
35
|
+
"directory": "packages/obix-adapter-oop"
|
|
36
|
+
}
|
|
37
|
+
}
|