iocraft 0.2.5 → 0.2.7
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 +45 -1
- package/dist/{chunk-NJJ6QKII.cjs → chunk-4PDVPTG3.cjs} +126 -167
- package/dist/chunk-4PDVPTG3.cjs.map +1 -0
- package/dist/{chunk-OLY3RJCX.js → chunk-FIK2HLL7.js} +129 -170
- package/dist/chunk-FIK2HLL7.js.map +1 -0
- package/dist/common.cjs +229 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.d.cts +84 -0
- package/dist/common.d.ts +84 -0
- package/dist/common.js +229 -0
- package/dist/common.js.map +1 -0
- package/dist/core.cjs +2 -16
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +11 -76
- package/dist/core.d.ts +11 -76
- package/dist/core.js +11 -25
- package/package.json +7 -5
- package/dist/chunk-NJJ6QKII.cjs.map +0 -1
- package/dist/chunk-OLY3RJCX.js.map +0 -1
- package/dist/helpers.cjs +0 -10
- package/dist/helpers.cjs.map +0 -1
- package/dist/helpers.d.cts +0 -23
- package/dist/helpers.d.ts +0 -23
- package/dist/helpers.js +0 -10
- package/dist/helpers.js.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1,45 @@
|
|
|
1
|
-
|
|
1
|
+
# iocraft
|
|
2
|
+
|
|
3
|
+
Dependency Injection for Vue 3.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install iocraft
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Create a Service
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { attach } from "iocraft";
|
|
17
|
+
import { ref } from "vue";
|
|
18
|
+
|
|
19
|
+
@attach()
|
|
20
|
+
export class CounterService {
|
|
21
|
+
count = ref(0);
|
|
22
|
+
|
|
23
|
+
increment() {
|
|
24
|
+
this.count.value++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Use in Components
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<script setup>
|
|
33
|
+
import { obtain } from "iocraft";
|
|
34
|
+
|
|
35
|
+
const { count, increment } = obtain(CounterService);
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<template>
|
|
39
|
+
<button @click="increment">{{ count }}</button>
|
|
40
|
+
</template>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
MIT
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use strict";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -10,6 +10,9 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
10
10
|
return result;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
// src/core/obtainers.ts
|
|
14
|
+
var _vue = require('vue');
|
|
15
|
+
|
|
13
16
|
// src/core/facade.ts
|
|
14
17
|
function hasKey(obj, key) {
|
|
15
18
|
if (typeof key === "symbol") {
|
|
@@ -77,59 +80,6 @@ function createFacadeObj(serviceInstance) {
|
|
|
77
80
|
addPrototypeProperties(serviceInstance, targetObj);
|
|
78
81
|
return targetObj;
|
|
79
82
|
}
|
|
80
|
-
function generateRouterFacade(router) {
|
|
81
|
-
return {
|
|
82
|
-
get path() {
|
|
83
|
-
return router.currentRoute.value.path;
|
|
84
|
-
},
|
|
85
|
-
get name() {
|
|
86
|
-
return router.currentRoute.value.name;
|
|
87
|
-
},
|
|
88
|
-
get params() {
|
|
89
|
-
return router.currentRoute.value.params;
|
|
90
|
-
},
|
|
91
|
-
get query() {
|
|
92
|
-
return router.currentRoute.value.query;
|
|
93
|
-
},
|
|
94
|
-
get hash() {
|
|
95
|
-
return router.currentRoute.value.hash;
|
|
96
|
-
},
|
|
97
|
-
get fullPath() {
|
|
98
|
-
return router.currentRoute.value.fullPath;
|
|
99
|
-
},
|
|
100
|
-
get matched() {
|
|
101
|
-
return router.currentRoute.value.matched;
|
|
102
|
-
},
|
|
103
|
-
get meta() {
|
|
104
|
-
return router.currentRoute.value.meta;
|
|
105
|
-
},
|
|
106
|
-
push: router.push.bind(router),
|
|
107
|
-
replace: router.replace.bind(router),
|
|
108
|
-
go: router.go.bind(router),
|
|
109
|
-
back: router.back.bind(router),
|
|
110
|
-
forward: router.forward.bind(router),
|
|
111
|
-
resolve: router.resolve.bind(router),
|
|
112
|
-
getRoutes: router.getRoutes.bind(router),
|
|
113
|
-
hasRoute: router.hasRoute.bind(router),
|
|
114
|
-
// Router guards
|
|
115
|
-
beforeEach: router.beforeEach.bind(router),
|
|
116
|
-
beforeResolve: router.beforeResolve.bind(router),
|
|
117
|
-
afterEach: router.afterEach.bind(router),
|
|
118
|
-
onError: router.onError.bind(router),
|
|
119
|
-
// Dynamic routing
|
|
120
|
-
addRoute: router.addRoute.bind(router),
|
|
121
|
-
removeRoute: router.removeRoute.bind(router),
|
|
122
|
-
clearRoutes: router.clearRoutes.bind(router),
|
|
123
|
-
// State
|
|
124
|
-
isReady: router.isReady.bind(router),
|
|
125
|
-
get currentRoute() {
|
|
126
|
-
return router.currentRoute;
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// src/core/obtainers.ts
|
|
132
|
-
var _vue = require('vue');
|
|
133
83
|
|
|
134
84
|
// src/core/internals.ts
|
|
135
85
|
|
|
@@ -177,7 +127,7 @@ function bindLifecycleHooks(instance) {
|
|
|
177
127
|
}
|
|
178
128
|
|
|
179
129
|
// src/core/utils.ts
|
|
180
|
-
function
|
|
130
|
+
function getServiceMeta(target) {
|
|
181
131
|
const ctor = typeof target === "function" ? target : target.constructor;
|
|
182
132
|
const meta = ctor[SERVICE_METADATA];
|
|
183
133
|
if (!_optionalChain([meta, 'optionalAccess', _ => _.token])) {
|
|
@@ -185,26 +135,10 @@ function getServiceMetadata(target) {
|
|
|
185
135
|
}
|
|
186
136
|
return meta;
|
|
187
137
|
}
|
|
188
|
-
function hasService(serviceClass) {
|
|
189
|
-
const meta = getServiceMetadata(serviceClass);
|
|
190
|
-
return RootRegistry.has(meta.token);
|
|
191
|
-
}
|
|
192
|
-
function unRegister(serviceInstance) {
|
|
193
|
-
const meta = getServiceMetadata(serviceInstance);
|
|
194
|
-
const exist = RootRegistry.has(meta.token);
|
|
195
|
-
if (!exist) return false;
|
|
196
|
-
if (typeof serviceInstance === "object" && serviceInstance !== null && "onUnRegister" in serviceInstance && typeof serviceInstance.onUnRegister === "function") {
|
|
197
|
-
serviceInstance.onUnRegister();
|
|
198
|
-
}
|
|
199
|
-
return RootRegistry.delete(meta.token);
|
|
200
|
-
}
|
|
201
|
-
function clearRegistry() {
|
|
202
|
-
RootRegistry.clear();
|
|
203
|
-
}
|
|
204
138
|
|
|
205
139
|
// src/core/obtainers.ts
|
|
206
140
|
function obtain(serviceClass) {
|
|
207
|
-
const serviceMeta =
|
|
141
|
+
const serviceMeta = getServiceMeta(serviceClass);
|
|
208
142
|
if (RootRegistry.has(serviceMeta.token)) {
|
|
209
143
|
const instance = RootRegistry.get(serviceMeta.token);
|
|
210
144
|
return createFacadeObj(instance);
|
|
@@ -222,26 +156,8 @@ function obtain(serviceClass) {
|
|
|
222
156
|
creationStack.delete(serviceMeta.token);
|
|
223
157
|
}
|
|
224
158
|
}
|
|
225
|
-
function
|
|
226
|
-
const serviceMeta =
|
|
227
|
-
if (RootRegistry.has(serviceMeta.token)) {
|
|
228
|
-
return RootRegistry.get(serviceMeta.token);
|
|
229
|
-
}
|
|
230
|
-
if (creationStack.has(serviceMeta.token)) {
|
|
231
|
-
throw new Error(`[IocRaft] Circular dependency detected on: ${serviceClass.name}
|
|
232
|
-
`);
|
|
233
|
-
}
|
|
234
|
-
creationStack.add(serviceMeta.token);
|
|
235
|
-
try {
|
|
236
|
-
const instance = new serviceClass();
|
|
237
|
-
RootRegistry.set(serviceMeta.token, instance);
|
|
238
|
-
return instance;
|
|
239
|
-
} finally {
|
|
240
|
-
creationStack.delete(serviceMeta.token);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function obtainInstance(serviceClass) {
|
|
244
|
-
const serviceMeta = getServiceMetadata(serviceClass);
|
|
159
|
+
function obtainNew(serviceClass) {
|
|
160
|
+
const serviceMeta = getServiceMeta(serviceClass);
|
|
245
161
|
if (creationStack.has(serviceMeta.token)) {
|
|
246
162
|
throw new Error(`[IocRaft] Circular dependency detected on: ${serviceClass.name}
|
|
247
163
|
`);
|
|
@@ -258,42 +174,132 @@ function obtainInstance(serviceClass) {
|
|
|
258
174
|
creationStack.delete(serviceMeta.token);
|
|
259
175
|
}
|
|
260
176
|
}
|
|
261
|
-
function
|
|
262
|
-
const serviceMeta =
|
|
263
|
-
if (creationStack.has(serviceMeta.token)) {
|
|
264
|
-
throw new Error(`[IocRaft] Circular dependency detected on: ${serviceClass.name}
|
|
265
|
-
`);
|
|
266
|
-
}
|
|
267
|
-
creationStack.add(serviceMeta.token);
|
|
268
|
-
try {
|
|
269
|
-
const componentInstance = _vue.getCurrentInstance.call(void 0, );
|
|
270
|
-
const instance = new serviceClass();
|
|
271
|
-
if (componentInstance) {
|
|
272
|
-
bindLifecycleHooks(instance);
|
|
273
|
-
}
|
|
274
|
-
return instance;
|
|
275
|
-
} finally {
|
|
276
|
-
creationStack.delete(serviceMeta.token);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
function exposeToContext(serviceInstance) {
|
|
280
|
-
const serviceMeta = getServiceMetadata(serviceInstance);
|
|
177
|
+
function exposeCtx(serviceInstance) {
|
|
178
|
+
const serviceMeta = getServiceMeta(serviceInstance);
|
|
281
179
|
_vue.provide.call(void 0, serviceMeta.token, serviceInstance);
|
|
282
180
|
}
|
|
283
|
-
function
|
|
284
|
-
const serviceMeta =
|
|
181
|
+
function obtainCtx(serviceClass) {
|
|
182
|
+
const serviceMeta = getServiceMeta(serviceClass);
|
|
285
183
|
return _vue.inject.call(void 0, serviceMeta.token);
|
|
286
184
|
}
|
|
287
185
|
|
|
288
186
|
// src/core/plugin.ts
|
|
289
187
|
|
|
188
|
+
|
|
189
|
+
// src/common/nav.ts
|
|
190
|
+
var Nav = class {
|
|
191
|
+
};
|
|
192
|
+
Nav = exports.Nav = __decorateClass([
|
|
193
|
+
attach()
|
|
194
|
+
], Nav);
|
|
195
|
+
var RouterFacade = class {
|
|
196
|
+
constructor(router) {
|
|
197
|
+
this.router = router;
|
|
198
|
+
}
|
|
199
|
+
// ─── Flattened current route getters
|
|
200
|
+
get path() {
|
|
201
|
+
return this.router.currentRoute.value.path;
|
|
202
|
+
}
|
|
203
|
+
get name() {
|
|
204
|
+
return this.router.currentRoute.value.name;
|
|
205
|
+
}
|
|
206
|
+
get params() {
|
|
207
|
+
return this.router.currentRoute.value.params;
|
|
208
|
+
}
|
|
209
|
+
get query() {
|
|
210
|
+
return this.router.currentRoute.value.query;
|
|
211
|
+
}
|
|
212
|
+
get hash() {
|
|
213
|
+
return this.router.currentRoute.value.hash;
|
|
214
|
+
}
|
|
215
|
+
get fullPath() {
|
|
216
|
+
return this.router.currentRoute.value.fullPath;
|
|
217
|
+
}
|
|
218
|
+
get matched() {
|
|
219
|
+
return this.router.currentRoute.value.matched;
|
|
220
|
+
}
|
|
221
|
+
get meta() {
|
|
222
|
+
return this.router.currentRoute.value.meta;
|
|
223
|
+
}
|
|
224
|
+
get redirectedFrom() {
|
|
225
|
+
return this.router.currentRoute.value.redirectedFrom;
|
|
226
|
+
}
|
|
227
|
+
// ─── Router state
|
|
228
|
+
get currentRoute() {
|
|
229
|
+
return this.router.currentRoute;
|
|
230
|
+
}
|
|
231
|
+
get options() {
|
|
232
|
+
return this.router.options;
|
|
233
|
+
}
|
|
234
|
+
get listening() {
|
|
235
|
+
return this.router.listening;
|
|
236
|
+
}
|
|
237
|
+
set listening(value) {
|
|
238
|
+
this.router.listening = value;
|
|
239
|
+
}
|
|
240
|
+
// ─── Navigation
|
|
241
|
+
push(...args) {
|
|
242
|
+
return this.router.push(...args);
|
|
243
|
+
}
|
|
244
|
+
replace(...args) {
|
|
245
|
+
return this.router.replace(...args);
|
|
246
|
+
}
|
|
247
|
+
go(delta) {
|
|
248
|
+
return this.router.go(delta);
|
|
249
|
+
}
|
|
250
|
+
back() {
|
|
251
|
+
return this.router.back();
|
|
252
|
+
}
|
|
253
|
+
forward() {
|
|
254
|
+
return this.router.forward();
|
|
255
|
+
}
|
|
256
|
+
// ─── Route resolution
|
|
257
|
+
resolve(...args) {
|
|
258
|
+
return this.router.resolve(...args);
|
|
259
|
+
}
|
|
260
|
+
// ─── Route registry
|
|
261
|
+
getRoutes() {
|
|
262
|
+
return this.router.getRoutes();
|
|
263
|
+
}
|
|
264
|
+
hasRoute(...args) {
|
|
265
|
+
return this.router.hasRoute(...args);
|
|
266
|
+
}
|
|
267
|
+
addRoute(...args) {
|
|
268
|
+
return this.router.addRoute(...args);
|
|
269
|
+
}
|
|
270
|
+
removeRoute(...args) {
|
|
271
|
+
return this.router.removeRoute(...args);
|
|
272
|
+
}
|
|
273
|
+
clearRoutes() {
|
|
274
|
+
return this.router.clearRoutes();
|
|
275
|
+
}
|
|
276
|
+
// ─── Navigation guards
|
|
277
|
+
beforeEach(...args) {
|
|
278
|
+
return this.router.beforeEach(...args);
|
|
279
|
+
}
|
|
280
|
+
beforeResolve(...args) {
|
|
281
|
+
return this.router.beforeResolve(...args);
|
|
282
|
+
}
|
|
283
|
+
afterEach(...args) {
|
|
284
|
+
return this.router.afterEach(...args);
|
|
285
|
+
}
|
|
286
|
+
onError(...args) {
|
|
287
|
+
return this.router.onError(...args);
|
|
288
|
+
}
|
|
289
|
+
// ─── Lifecycle
|
|
290
|
+
isReady() {
|
|
291
|
+
return this.router.isReady();
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
// src/core/plugin.ts
|
|
290
296
|
var iocraft = (_app, options) => {
|
|
291
297
|
if (_optionalChain([options, 'optionalAccess', _3 => _3.router])) {
|
|
292
|
-
RootRegistry.set(
|
|
298
|
+
RootRegistry.set(getServiceMeta(Nav).token, new RouterFacade(options.router));
|
|
293
299
|
}
|
|
294
300
|
if (_optionalChain([options, 'optionalAccess', _4 => _4.eagerLoad])) {
|
|
295
301
|
options.eagerLoad.forEach((service) => {
|
|
296
|
-
const serviceMeta =
|
|
302
|
+
const serviceMeta = getServiceMeta(service);
|
|
297
303
|
if (!RootRegistry.has(serviceMeta.token)) {
|
|
298
304
|
RootRegistry.set(serviceMeta.token, new service());
|
|
299
305
|
}
|
|
@@ -301,8 +307,8 @@ var iocraft = (_app, options) => {
|
|
|
301
307
|
}
|
|
302
308
|
};
|
|
303
309
|
|
|
304
|
-
// src/core/
|
|
305
|
-
function
|
|
310
|
+
// src/core/attach.ts
|
|
311
|
+
function attach() {
|
|
306
312
|
return function(constructor) {
|
|
307
313
|
if (_optionalChain([constructor, 'access', _5 => _5[SERVICE_METADATA], 'optionalAccess', _6 => _6.token])) {
|
|
308
314
|
return constructor;
|
|
@@ -314,53 +320,6 @@ function Register() {
|
|
|
314
320
|
};
|
|
315
321
|
}
|
|
316
322
|
|
|
317
|
-
// src/helpers/Nav.service.ts
|
|
318
|
-
var Nav = class {
|
|
319
|
-
};
|
|
320
|
-
Nav = exports.Nav = __decorateClass([
|
|
321
|
-
Register()
|
|
322
|
-
], Nav);
|
|
323
|
-
|
|
324
|
-
// src/helpers/store.ts
|
|
325
|
-
|
|
326
|
-
function Store(initialState) {
|
|
327
|
-
const state = _vue.reactive.call(void 0, initialState);
|
|
328
|
-
const initial = structuredClone(initialState);
|
|
329
|
-
return (_class = class {constructor() { _class.prototype.__init.call(this); }
|
|
330
|
-
__init() {this.state = state}
|
|
331
|
-
get snapshot() {
|
|
332
|
-
return structuredClone(_vue.toRaw.call(void 0, state));
|
|
333
|
-
}
|
|
334
|
-
update(changes) {
|
|
335
|
-
Object.assign(state, changes);
|
|
336
|
-
}
|
|
337
|
-
pick(key) {
|
|
338
|
-
return state[key];
|
|
339
|
-
}
|
|
340
|
-
compute(fn) {
|
|
341
|
-
return _vue.computed.call(void 0, () => fn(state));
|
|
342
|
-
}
|
|
343
|
-
observe(source, callback) {
|
|
344
|
-
const getter = typeof source === "function" ? () => source(state) : () => state[source];
|
|
345
|
-
return _vue.watch.call(void 0, getter, callback);
|
|
346
|
-
}
|
|
347
|
-
effect(fn) {
|
|
348
|
-
return _vue.watchEffect.call(void 0, () => fn(state));
|
|
349
|
-
}
|
|
350
|
-
reset() {
|
|
351
|
-
Object.assign(state, structuredClone(initial));
|
|
352
|
-
}
|
|
353
|
-
}, _class);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
323
|
|
|
365
324
|
|
|
366
325
|
|
|
@@ -370,5 +329,5 @@ function Store(initialState) {
|
|
|
370
329
|
|
|
371
330
|
|
|
372
331
|
|
|
373
|
-
exports.
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
332
|
+
exports.getServiceMeta = getServiceMeta; exports.obtain = obtain; exports.obtainNew = obtainNew; exports.exposeCtx = exposeCtx; exports.obtainCtx = obtainCtx; exports.Nav = Nav; exports.iocraft = iocraft; exports.attach = attach;
|
|
333
|
+
//# sourceMappingURL=chunk-4PDVPTG3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/iocraft/iocraft/packages/iocraft/dist/chunk-4PDVPTG3.cjs","../src/core/obtainers.ts","../src/core/facade.ts","../src/core/internals.ts","../src/core/utils.ts","../src/core/plugin.ts","../src/common/nav.ts","../src/core/attach.ts"],"names":[],"mappings":"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","file":"/home/runner/work/iocraft/iocraft/packages/iocraft/dist/chunk-4PDVPTG3.cjs","sourcesContent":[null,"import { getCurrentInstance, inject, provide } from \"vue\";\nimport { createFacadeObj } from \"./facade\";\nimport { bindLifecycleHooks, creationStack, RootRegistry } from \"./internals\";\nimport type { ServiceConstructor } from \"./types\";\nimport { getServiceMeta } from \"./utils\";\n\n/**\n * obtain Facade of a global singleton service From Root Registry\n *\n * @export\n * @template {ServiceConstructor} T\n * @param {T} serviceClass\n */\nexport function obtain<T extends ServiceConstructor>(serviceClass: T) {\n const serviceMeta = getServiceMeta(serviceClass);\n\n if (RootRegistry.has(serviceMeta.token)) {\n const instance = RootRegistry.get(serviceMeta.token)!;\n return createFacadeObj<InstanceType<T>>(instance);\n }\n\n if (creationStack.has(serviceMeta.token)) {\n throw new Error(`[IocRaft] Circular dependency detected on: ${serviceClass.name}\\n`);\n }\n\n creationStack.add(serviceMeta.token);\n\n try {\n const instance = new serviceClass();\n RootRegistry.set(serviceMeta.token, instance);\n return createFacadeObj<InstanceType<T>>(instance);\n } finally {\n creationStack.delete(serviceMeta.token);\n }\n}\n\n/**\n * obtain a facade of a new Service Instance\n *\n * @export\n * @template {ServiceConstructor} T\n * @param {T} serviceClass\n */\nexport function obtainNew<T extends ServiceConstructor>(serviceClass: T) {\n const serviceMeta = getServiceMeta(serviceClass);\n\n if (creationStack.has(serviceMeta.token)) {\n throw new Error(`[IocRaft] Circular dependency detected on: ${serviceClass.name}\\n`);\n }\n\n creationStack.add(serviceMeta.token);\n\n try {\n const componentInstance = getCurrentInstance();\n const instance = new serviceClass();\n\n if (componentInstance) {\n bindLifecycleHooks(instance);\n }\n\n return createFacadeObj<InstanceType<T>>(instance);\n } finally {\n creationStack.delete(serviceMeta.token);\n }\n}\n\n/**\n * Expose a service to context\n *\n * @export\n * @template {ServiceConstructor} T\n * @param {InstanceType<T>} serviceInstance\n */\nexport function exposeCtx<T extends ServiceConstructor>(serviceInstance: InstanceType<T>) {\n const serviceMeta = getServiceMeta(serviceInstance);\n provide(serviceMeta.token, serviceInstance);\n}\n\n/**\n * obtain A Service From Context\n *\n * @export\n * @template {ServiceConstructor} T\n * @param {T} serviceClass\n */\nexport function obtainCtx<T extends ServiceConstructor>(serviceClass: T) {\n const serviceMeta = getServiceMeta(serviceClass);\n return inject<InstanceType<T>>(serviceMeta.token);\n}\n","import type { ServiceConstructor } from './types';\n\nfunction hasKey(obj: Record<PropertyKey, unknown>, key: PropertyKey): boolean {\n if (typeof key === 'symbol') {\n return Object.getOwnPropertySymbols(obj).includes(key);\n }\n return Object.hasOwn(obj, key);\n}\n\nconst NativeKeys = new Set([\n ...Object.getOwnPropertyNames(Object.prototype),\n ...Object.getOwnPropertySymbols(Object.prototype),\n ...Object.getOwnPropertyNames(Function.prototype),\n ...Object.getOwnPropertySymbols(Function.prototype),\n ...Object.getOwnPropertyNames(Array.prototype),\n ...Object.getOwnPropertySymbols(Array.prototype),\n]);\n\nfunction addInstanceProperties<T extends object>(\n serviceInstance: InstanceType<ServiceConstructor<T>>,\n targetObj: Record<PropertyKey, unknown>\n) {\n const ownKeys = [...Object.getOwnPropertyNames(serviceInstance), ...Object.getOwnPropertySymbols(serviceInstance)];\n\n for (const key of ownKeys) {\n if (hasKey(targetObj, key)) continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(serviceInstance, key)!;\n\n if (typeof descriptor.value === 'function') {\n console.warn(`[IOCRAFT]: Instance method \"${String(key)}\" found as own property. Consider moving to prototype.`);\n continue;\n }\n\n if (descriptor.get || descriptor.set) {\n continue;\n }\n\n Object.defineProperty(targetObj, key, {\n get() {\n return serviceInstance[key as keyof typeof serviceInstance];\n },\n set(v) {\n serviceInstance[key as keyof typeof serviceInstance] = v;\n },\n enumerable: true,\n configurable: true,\n });\n }\n}\n\nfunction addPrototypeProperties<T extends object>(\n serviceInstance: InstanceType<ServiceConstructor<T>>,\n targetObj: Record<PropertyKey, unknown>\n) {\n let currentProto = Object.getPrototypeOf(serviceInstance);\n\n while (currentProto && currentProto !== Object.prototype) {\n const protoKeys = [...Object.getOwnPropertyNames(currentProto), ...Object.getOwnPropertySymbols(currentProto)];\n\n for (const key of protoKeys) {\n if (hasKey(targetObj, key)) continue;\n\n if (NativeKeys.has(key)) continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(currentProto, key)!;\n\n if (descriptor.get || descriptor.set) {\n Object.defineProperty(targetObj, key, {\n get: descriptor.get ? () => descriptor.get!.call(serviceInstance) : undefined,\n set: descriptor.set ? (v: any) => descriptor.set!.call(serviceInstance, v) : undefined,\n enumerable: true,\n configurable: true,\n });\n } else if (typeof descriptor.value === 'function') {\n targetObj[key] = descriptor.value.bind(serviceInstance);\n }\n }\n\n currentProto = Object.getPrototypeOf(currentProto);\n }\n}\n\n/**\n * CREATES A FACADE OBJECT\n *\n * @export\n * @template {object} T\n * @param {ServiceConstructor<T>} serviceClass\n * @param {InstanceType<ServiceConstructor<T>>} serviceInstance\n * @returns {{}}\n */\nexport function createFacadeObj<T extends object>(serviceInstance: object) {\n const targetObj = {};\n\n addInstanceProperties(serviceInstance, targetObj);\n addPrototypeProperties(serviceInstance, targetObj);\n return targetObj as T;\n}","import {\n onMounted,\n onUpdated,\n onUnmounted,\n onBeforeMount,\n onBeforeUpdate,\n onBeforeUnmount,\n onErrorCaptured,\n onRenderTracked,\n onRenderTriggered,\n onActivated,\n onDeactivated,\n onServerPrefetch,\n onScopeDispose,\n} from 'vue';\n\nexport const SERVICE_METADATA = Symbol('IOCRAFT_SERVICE_METADATA');\nexport const RootRegistry = new Map<symbol, object>();\nexport const creationStack = new Set<symbol>();\nconst lifecycleHookMap = {\n onMounted,\n onUpdated,\n onUnmounted,\n onBeforeMount,\n onBeforeUpdate,\n onBeforeUnmount,\n onErrorCaptured,\n onRenderTracked,\n onRenderTriggered,\n onActivated,\n onDeactivated,\n onServerPrefetch,\n onScopeDispose,\n} as const;\n\nexport function bindLifecycleHooks(instance: any) {\n for (const key in lifecycleHookMap) {\n const hookName = key as keyof typeof lifecycleHookMap;\n const vueHook = lifecycleHookMap[hookName];\n\n const handler = instance[hookName];\n\n if (typeof handler === 'function') {\n vueHook(handler.bind(instance));\n }\n }\n}\n","import { SERVICE_METADATA } from \"./internals\";\nimport type { ServiceConstructor, ServiceMetadata } from \"./types\";\n\nexport function getServiceMeta(target: ServiceConstructor | object) {\n const ctor = typeof target === \"function\" ? target : target.constructor;\n\n const meta = (ctor as any)[SERVICE_METADATA] as ServiceMetadata;\n if (!meta?.token) {\n throw new Error(`[IOCRAFT]: ${ctor?.name || \"Unknown\"} is not decorated with @Register()`);\n }\n return meta;\n}\n","import { type FunctionPlugin } from \"vue\";\nimport { Nav, RouterFacade } from \"../common/nav\";\nimport { RootRegistry } from \"./internals\";\nimport type { PluginOptions } from \"./types\";\nimport { getServiceMeta } from \"./utils\";\n\nexport const iocraft: FunctionPlugin<[Partial<PluginOptions>?]> = (_app, options?: Partial<PluginOptions>) => {\n if (options?.router) {\n RootRegistry.set(getServiceMeta(Nav).token, new RouterFacade(options.router));\n }\n\n // Eagerly create Service instances\n if (options?.eagerLoad) {\n options.eagerLoad.forEach((service) => {\n const serviceMeta = getServiceMeta(service);\n\n if (!RootRegistry.has(serviceMeta.token)) {\n RootRegistry.set(serviceMeta.token, new service());\n }\n });\n }\n};\n","import type { RouteLocationNormalizedGeneric, Router } from \"vue-router\";\nimport { attach } from \"../core\";\n\nexport interface Nav\n extends\n Omit<Router, \"install\" | \"options\" | \"currentRoute\">,\n Pick<RouteLocationNormalizedGeneric, \"path\" | \"name\" | \"params\" | \"query\" | \"hash\" | \"fullPath\" | \"matched\" | \"meta\"> {}\n\n@attach()\nexport class Nav {}\n\nexport class RouterFacade {\n constructor(private router: Router) {}\n\n // ─── Flattened current route getters\n get path() {\n return this.router.currentRoute.value.path;\n }\n get name() {\n return this.router.currentRoute.value.name;\n }\n get params() {\n return this.router.currentRoute.value.params;\n }\n get query() {\n return this.router.currentRoute.value.query;\n }\n get hash() {\n return this.router.currentRoute.value.hash;\n }\n get fullPath() {\n return this.router.currentRoute.value.fullPath;\n }\n get matched() {\n return this.router.currentRoute.value.matched;\n }\n get meta() {\n return this.router.currentRoute.value.meta;\n }\n get redirectedFrom() {\n return this.router.currentRoute.value.redirectedFrom;\n }\n\n // ─── Router state\n get currentRoute() {\n return this.router.currentRoute;\n }\n get options() {\n return this.router.options;\n }\n\n get listening() {\n return this.router.listening;\n }\n set listening(value: boolean) {\n this.router.listening = value;\n }\n\n // ─── Navigation\n push(...args: Parameters<Router[\"push\"]>) {\n return this.router.push(...args);\n }\n replace(...args: Parameters<Router[\"replace\"]>) {\n return this.router.replace(...args);\n }\n go(delta: number) {\n return this.router.go(delta);\n }\n back() {\n return this.router.back();\n }\n forward() {\n return this.router.forward();\n }\n\n // ─── Route resolution\n resolve(...args: Parameters<Router[\"resolve\"]>) {\n return this.router.resolve(...args);\n }\n\n // ─── Route registry\n getRoutes() {\n return this.router.getRoutes();\n }\n hasRoute(...args: Parameters<Router[\"hasRoute\"]>) {\n return this.router.hasRoute(...args);\n }\n addRoute(...args: Parameters<Router[\"addRoute\"]>) {\n return this.router.addRoute(...args);\n }\n removeRoute(...args: Parameters<Router[\"removeRoute\"]>) {\n return this.router.removeRoute(...args);\n }\n clearRoutes() {\n return this.router.clearRoutes();\n }\n\n // ─── Navigation guards\n beforeEach(...args: Parameters<Router[\"beforeEach\"]>) {\n return this.router.beforeEach(...args);\n }\n beforeResolve(...args: Parameters<Router[\"beforeResolve\"]>) {\n return this.router.beforeResolve(...args);\n }\n afterEach(...args: Parameters<Router[\"afterEach\"]>) {\n return this.router.afterEach(...args);\n }\n onError(...args: Parameters<Router[\"onError\"]>) {\n return this.router.onError(...args);\n }\n\n // ─── Lifecycle\n isReady() {\n return this.router.isReady();\n }\n}\n","import { SERVICE_METADATA } from \"./internals\";\nimport type { ServiceConstructor, ServiceMetadata } from \"./types\";\n\n/**\n * Attaches some internal meta data to a class that is needed for di system\n *\n */\nexport function attach(){\n return function <C extends ServiceConstructor>(constructor: C) {\n if ((constructor as any)[SERVICE_METADATA]?.token) {\n return constructor;\n }\n\n // Add more metadata here if needed\n (constructor as any)[SERVICE_METADATA] = {\n token: Symbol(`[IOCRAFT]: Service - ${constructor.name || \"Anonymous\"}`),\n } satisfies ServiceMetadata;\n\n return constructor;\n };\n}\n"]}
|