@portel/photon-core 2.3.0 → 2.5.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/dist/asset-discovery.d.ts +25 -0
- package/dist/asset-discovery.d.ts.map +1 -0
- package/dist/asset-discovery.js +145 -0
- package/dist/asset-discovery.js.map +1 -0
- package/dist/base.d.ts +6 -0
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +11 -1
- package/dist/base.js.map +1 -1
- package/dist/class-detection.d.ts +32 -0
- package/dist/class-detection.d.ts.map +1 -0
- package/dist/class-detection.js +86 -0
- package/dist/class-detection.js.map +1 -0
- package/dist/collections/ReactiveArray.d.ts +97 -0
- package/dist/collections/ReactiveArray.d.ts.map +1 -0
- package/dist/collections/ReactiveArray.js +158 -0
- package/dist/collections/ReactiveArray.js.map +1 -0
- package/dist/collections/ReactiveMap.d.ts +50 -0
- package/dist/collections/ReactiveMap.d.ts.map +1 -0
- package/dist/collections/ReactiveMap.js +71 -0
- package/dist/collections/ReactiveMap.js.map +1 -0
- package/dist/collections/ReactiveSet.d.ts +50 -0
- package/dist/collections/ReactiveSet.d.ts.map +1 -0
- package/dist/collections/ReactiveSet.js +71 -0
- package/dist/collections/ReactiveSet.js.map +1 -0
- package/dist/collections/index.d.ts +44 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +44 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/compiler.d.ts +22 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +48 -0
- package/dist/compiler.js.map +1 -0
- package/dist/env-utils.d.ts +61 -0
- package/dist/env-utils.d.ts.map +1 -0
- package/dist/env-utils.js +171 -0
- package/dist/env-utils.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -1
- package/dist/mime-types.d.ts +13 -0
- package/dist/mime-types.d.ts.map +1 -0
- package/dist/mime-types.js +47 -0
- package/dist/mime-types.js.map +1 -0
- package/dist/rendering/index.d.ts +49 -0
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +153 -0
- package/dist/rendering/index.js.map +1 -1
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +3 -0
- package/dist/schema-extractor.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui-types/Cards.d.ts +139 -0
- package/dist/ui-types/Cards.d.ts.map +1 -0
- package/dist/ui-types/Cards.js +235 -0
- package/dist/ui-types/Cards.js.map +1 -0
- package/dist/ui-types/Chart.d.ts +136 -0
- package/dist/ui-types/Chart.d.ts.map +1 -0
- package/dist/ui-types/Chart.js +188 -0
- package/dist/ui-types/Chart.js.map +1 -0
- package/dist/ui-types/Field.d.ts +342 -0
- package/dist/ui-types/Field.d.ts.map +1 -0
- package/dist/ui-types/Field.js +200 -0
- package/dist/ui-types/Field.js.map +1 -0
- package/dist/ui-types/FieldRenderer.d.ts +32 -0
- package/dist/ui-types/FieldRenderer.d.ts.map +1 -0
- package/dist/ui-types/FieldRenderer.js +277 -0
- package/dist/ui-types/FieldRenderer.js.map +1 -0
- package/dist/ui-types/Form.d.ts +212 -0
- package/dist/ui-types/Form.d.ts.map +1 -0
- package/dist/ui-types/Form.js +278 -0
- package/dist/ui-types/Form.js.map +1 -0
- package/dist/ui-types/Progress.d.ts +130 -0
- package/dist/ui-types/Progress.d.ts.map +1 -0
- package/dist/ui-types/Progress.js +191 -0
- package/dist/ui-types/Progress.js.map +1 -0
- package/dist/ui-types/Stats.d.ts +108 -0
- package/dist/ui-types/Stats.d.ts.map +1 -0
- package/dist/ui-types/Stats.js +162 -0
- package/dist/ui-types/Stats.js.map +1 -0
- package/dist/ui-types/Table.d.ts +206 -0
- package/dist/ui-types/Table.d.ts.map +1 -0
- package/dist/ui-types/Table.js +367 -0
- package/dist/ui-types/Table.js.map +1 -0
- package/dist/ui-types/base.d.ts +17 -0
- package/dist/ui-types/base.d.ts.map +1 -0
- package/dist/ui-types/base.js +18 -0
- package/dist/ui-types/base.js.map +1 -0
- package/dist/ui-types/index.d.ts +42 -0
- package/dist/ui-types/index.d.ts.map +1 -0
- package/dist/ui-types/index.js +50 -0
- package/dist/ui-types/index.js.map +1 -0
- package/dist/validation.d.ts +51 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +249 -0
- package/dist/validation.js.map +1 -0
- package/dist/version-check.d.ts +22 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +91 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +2 -2
- package/src/asset-discovery.ts +161 -0
- package/src/base.ts +13 -1
- package/src/class-detection.ts +94 -0
- package/src/collections/ReactiveArray.ts +179 -0
- package/src/collections/ReactiveMap.ts +81 -0
- package/src/collections/ReactiveSet.ts +81 -0
- package/src/collections/index.ts +44 -0
- package/src/compiler.ts +57 -0
- package/src/env-utils.ts +216 -0
- package/src/index.ts +155 -0
- package/src/mime-types.ts +49 -0
- package/src/rendering/index.ts +197 -0
- package/src/schema-extractor.ts +4 -0
- package/src/types.ts +4 -0
- package/src/ui-types/Cards.ts +286 -0
- package/src/ui-types/Chart.ts +239 -0
- package/src/ui-types/Field.ts +594 -0
- package/src/ui-types/FieldRenderer.ts +364 -0
- package/src/ui-types/Form.ts +363 -0
- package/src/ui-types/Progress.ts +237 -0
- package/src/ui-types/Stats.ts +204 -0
- package/src/ui-types/Table.ts +438 -0
- package/src/ui-types/base.ts +25 -0
- package/src/ui-types/index.ts +96 -0
- package/src/ui-types/ui-types.test.ts +444 -0
- package/src/validation.ts +363 -0
- package/src/version-check.ts +92 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Discovery Utilities
|
|
3
|
+
*
|
|
4
|
+
* Discover and extract UI, prompt, and resource assets from Photon files.
|
|
5
|
+
* Extracted from photon's loader.ts.
|
|
6
|
+
*
|
|
7
|
+
* Depends on: getMimeType (from ./mime-types), SchemaExtractor (from ./schema-extractor)
|
|
8
|
+
*/
|
|
9
|
+
import type { PhotonAssets } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Discover and extract assets from a Photon file
|
|
12
|
+
*
|
|
13
|
+
* Convention:
|
|
14
|
+
* - Asset folder: {photon-name}/ next to {photon-name}.photon.ts
|
|
15
|
+
* - Subfolder: ui/, prompts/, resources/
|
|
16
|
+
*
|
|
17
|
+
* @param photonPath - Absolute path to the .photon.ts file
|
|
18
|
+
* @param source - Source code content of the Photon file
|
|
19
|
+
*/
|
|
20
|
+
export declare function discoverAssets(photonPath: string, source: string): Promise<PhotonAssets | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* Auto-discover assets from the ui/, prompts/, resources/ subdirectories
|
|
23
|
+
*/
|
|
24
|
+
export declare function autoDiscoverAssets(assetFolder: string, assets: PhotonAssets): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=asset-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-discovery.d.ts","sourceRoot":"","sources":["../src/asset-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA+CnC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAiEf"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Discovery Utilities
|
|
3
|
+
*
|
|
4
|
+
* Discover and extract UI, prompt, and resource assets from Photon files.
|
|
5
|
+
* Extracted from photon's loader.ts.
|
|
6
|
+
*
|
|
7
|
+
* Depends on: getMimeType (from ./mime-types), SchemaExtractor (from ./schema-extractor)
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { getMimeType } from './mime-types.js';
|
|
12
|
+
import { SchemaExtractor } from './schema-extractor.js';
|
|
13
|
+
/**
|
|
14
|
+
* Check if a file or directory exists
|
|
15
|
+
*/
|
|
16
|
+
async function fileExists(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
await fs.access(filePath);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Discover and extract assets from a Photon file
|
|
27
|
+
*
|
|
28
|
+
* Convention:
|
|
29
|
+
* - Asset folder: {photon-name}/ next to {photon-name}.photon.ts
|
|
30
|
+
* - Subfolder: ui/, prompts/, resources/
|
|
31
|
+
*
|
|
32
|
+
* @param photonPath - Absolute path to the .photon.ts file
|
|
33
|
+
* @param source - Source code content of the Photon file
|
|
34
|
+
*/
|
|
35
|
+
export async function discoverAssets(photonPath, source) {
|
|
36
|
+
const extractor = new SchemaExtractor();
|
|
37
|
+
const dir = path.dirname(photonPath);
|
|
38
|
+
const basename = path.basename(photonPath, '.photon.ts');
|
|
39
|
+
// Convention: asset folder has same name as photon (without .photon.ts)
|
|
40
|
+
const assetFolder = path.join(dir, basename);
|
|
41
|
+
// Check if asset folder exists
|
|
42
|
+
let folderExists = false;
|
|
43
|
+
try {
|
|
44
|
+
const stat = await fs.stat(assetFolder);
|
|
45
|
+
folderExists = stat.isDirectory();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Folder doesn't exist
|
|
49
|
+
}
|
|
50
|
+
// Extract explicit asset declarations from source annotations
|
|
51
|
+
const assets = extractor.extractAssets(source, folderExists ? assetFolder : undefined);
|
|
52
|
+
// If no folder exists and no explicit declarations, skip
|
|
53
|
+
if (!folderExists &&
|
|
54
|
+
assets.ui.length === 0 &&
|
|
55
|
+
assets.prompts.length === 0 &&
|
|
56
|
+
assets.resources.length === 0) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (folderExists) {
|
|
60
|
+
// Resolve paths for explicitly declared assets
|
|
61
|
+
for (const ui of assets.ui) {
|
|
62
|
+
ui.resolvedPath = path.resolve(assetFolder, ui.path.replace(/^\.\//, ''));
|
|
63
|
+
}
|
|
64
|
+
for (const prompt of assets.prompts) {
|
|
65
|
+
prompt.resolvedPath = path.resolve(assetFolder, prompt.path.replace(/^\.\//, ''));
|
|
66
|
+
}
|
|
67
|
+
for (const resource of assets.resources) {
|
|
68
|
+
resource.resolvedPath = path.resolve(assetFolder, resource.path.replace(/^\.\//, ''));
|
|
69
|
+
}
|
|
70
|
+
// Auto-discover assets from folder structure
|
|
71
|
+
await autoDiscoverAssets(assetFolder, assets);
|
|
72
|
+
}
|
|
73
|
+
return assets;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Auto-discover assets from the ui/, prompts/, resources/ subdirectories
|
|
77
|
+
*/
|
|
78
|
+
export async function autoDiscoverAssets(assetFolder, assets) {
|
|
79
|
+
// Auto-discover UI files
|
|
80
|
+
const uiDir = path.join(assetFolder, 'ui');
|
|
81
|
+
if (await fileExists(uiDir)) {
|
|
82
|
+
try {
|
|
83
|
+
const files = await fs.readdir(uiDir);
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
const id = path.basename(file, path.extname(file));
|
|
86
|
+
if (!assets.ui.find((u) => u.id === id)) {
|
|
87
|
+
assets.ui.push({
|
|
88
|
+
id,
|
|
89
|
+
path: `./ui/${file}`,
|
|
90
|
+
resolvedPath: path.join(uiDir, file),
|
|
91
|
+
// Don't set mimeType for UI assets - let server decide based on client capabilities
|
|
92
|
+
// Server will use getUIMimeType() to return text/html;profile=mcp-app for MCP Apps clients
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Ignore errors
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Auto-discover prompt files
|
|
102
|
+
const promptsDir = path.join(assetFolder, 'prompts');
|
|
103
|
+
if (await fileExists(promptsDir)) {
|
|
104
|
+
try {
|
|
105
|
+
const files = await fs.readdir(promptsDir);
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
if (file.endsWith('.md') || file.endsWith('.txt')) {
|
|
108
|
+
const id = path.basename(file, path.extname(file));
|
|
109
|
+
if (!assets.prompts.find((p) => p.id === id)) {
|
|
110
|
+
assets.prompts.push({
|
|
111
|
+
id,
|
|
112
|
+
path: `./prompts/${file}`,
|
|
113
|
+
resolvedPath: path.join(promptsDir, file),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Ignore errors
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Auto-discover resource files
|
|
124
|
+
const resourcesDir = path.join(assetFolder, 'resources');
|
|
125
|
+
if (await fileExists(resourcesDir)) {
|
|
126
|
+
try {
|
|
127
|
+
const files = await fs.readdir(resourcesDir);
|
|
128
|
+
for (const file of files) {
|
|
129
|
+
const id = path.basename(file, path.extname(file));
|
|
130
|
+
if (!assets.resources.find((r) => r.id === id)) {
|
|
131
|
+
assets.resources.push({
|
|
132
|
+
id,
|
|
133
|
+
path: `./resources/${file}`,
|
|
134
|
+
resolvedPath: path.join(resourcesDir, file),
|
|
135
|
+
mimeType: getMimeType(file),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore errors
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=asset-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-discovery.js","sourceRoot":"","sources":["../src/asset-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/base.d.ts
CHANGED
|
@@ -47,6 +47,12 @@ import { MCPClient, MCPClientFactory } from '@portel/mcp';
|
|
|
47
47
|
* - Return value = Tool result
|
|
48
48
|
*/
|
|
49
49
|
export declare class PhotonMCP {
|
|
50
|
+
/**
|
|
51
|
+
* Photon name (MCP name) - set by runtime loader
|
|
52
|
+
* Used to identify the source of emitted events for injected photon routing
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
_photonName?: string;
|
|
50
56
|
/**
|
|
51
57
|
* Emit an event/progress update
|
|
52
58
|
*
|
package/dist/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAK1E;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAK1E;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IA+B/B;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAEzC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAsF;IAEzG;;;OAGG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,EAAE;IAiCjC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBrH;;OAEG;IACG,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAoBhF;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAM9C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOzC;;;;;;;;;;;;;;;;;;;;;OAqBG;cACa,QAAQ,CAAC,CAAC,EACxB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC;CAGd"}
|
package/dist/base.js
CHANGED
|
@@ -50,6 +50,12 @@ import { withLock as withLockHelper } from './decorators.js';
|
|
|
50
50
|
* - Return value = Tool result
|
|
51
51
|
*/
|
|
52
52
|
export class PhotonMCP {
|
|
53
|
+
/**
|
|
54
|
+
* Photon name (MCP name) - set by runtime loader
|
|
55
|
+
* Used to identify the source of emitted events for injected photon routing
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
_photonName;
|
|
53
59
|
/**
|
|
54
60
|
* Emit an event/progress update
|
|
55
61
|
*
|
|
@@ -73,9 +79,13 @@ export class PhotonMCP {
|
|
|
73
79
|
*/
|
|
74
80
|
emit(data) {
|
|
75
81
|
const store = executionContext.getStore();
|
|
82
|
+
// Include source photon name for injected photon event routing
|
|
83
|
+
const emitData = this._photonName && typeof data === 'object' && data !== null
|
|
84
|
+
? { ...data, _source: this._photonName }
|
|
85
|
+
: data;
|
|
76
86
|
// Send to local output handler (current caller)
|
|
77
87
|
if (store?.outputHandler) {
|
|
78
|
-
store.outputHandler(
|
|
88
|
+
store.outputHandler(emitData);
|
|
79
89
|
}
|
|
80
90
|
// If channel is specified, also publish to broker for cross-process notification
|
|
81
91
|
if (data && typeof data.channel === 'string') {
|
package/dist/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAA+B,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IACpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACO,IAAI,CAAC,IAAS;QACtB,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAE1C,gDAAgD;QAChD,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;YACzB,KAAK,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for detecting Photon classes in ES modules.
|
|
5
|
+
* Extracted from photon, ncp, and lumina loaders.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a value is a class constructor
|
|
9
|
+
*/
|
|
10
|
+
export declare function isClass(fn: unknown): fn is new (...args: unknown[]) => unknown;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a class has async methods (instance or static)
|
|
13
|
+
*
|
|
14
|
+
* Checks for AsyncFunction, AsyncGeneratorFunction, and GeneratorFunction
|
|
15
|
+
* on both prototype (instance methods) and the class itself (static methods).
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasAsyncMethods(ClassConstructor: new (...args: unknown[]) => unknown): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Find a single Photon class in a module
|
|
20
|
+
*
|
|
21
|
+
* Priority: default export first, then named exports.
|
|
22
|
+
* Returns the first class with async methods, or null.
|
|
23
|
+
*/
|
|
24
|
+
export declare function findPhotonClass(module: Record<string, unknown>): (new (...args: unknown[]) => unknown) | null;
|
|
25
|
+
/**
|
|
26
|
+
* Find all Photon classes in a module
|
|
27
|
+
*
|
|
28
|
+
* Returns every exported class that has async methods.
|
|
29
|
+
* Used by NCP which may load multiple classes from one file.
|
|
30
|
+
*/
|
|
31
|
+
export declare function findPhotonClasses(module: Record<string, unknown>): Array<new (...args: unknown[]) => unknown>;
|
|
32
|
+
//# sourceMappingURL=class-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-detection.d.ts","sourceRoot":"","sources":["../src/class-detection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAE9E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CA+B9F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,IAAI,CAgB7G;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAU7G"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for detecting Photon classes in ES modules.
|
|
5
|
+
* Extracted from photon, ncp, and lumina loaders.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a value is a class constructor
|
|
9
|
+
*/
|
|
10
|
+
export function isClass(fn) {
|
|
11
|
+
return typeof fn === 'function' && /^\s*class\s+/.test(fn.toString());
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if a class has async methods (instance or static)
|
|
15
|
+
*
|
|
16
|
+
* Checks for AsyncFunction, AsyncGeneratorFunction, and GeneratorFunction
|
|
17
|
+
* on both prototype (instance methods) and the class itself (static methods).
|
|
18
|
+
*/
|
|
19
|
+
export function hasAsyncMethods(ClassConstructor) {
|
|
20
|
+
const asyncCtorNames = new Set([
|
|
21
|
+
'AsyncFunction',
|
|
22
|
+
'AsyncGeneratorFunction',
|
|
23
|
+
'GeneratorFunction',
|
|
24
|
+
]);
|
|
25
|
+
// Check instance methods on prototype
|
|
26
|
+
const prototype = ClassConstructor.prototype;
|
|
27
|
+
for (const key of Object.getOwnPropertyNames(prototype)) {
|
|
28
|
+
if (key === 'constructor')
|
|
29
|
+
continue;
|
|
30
|
+
const descriptor = Object.getOwnPropertyDescriptor(prototype, key);
|
|
31
|
+
if (descriptor && typeof descriptor.value === 'function') {
|
|
32
|
+
if (asyncCtorNames.has(descriptor.value.constructor.name)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Check static methods on the class itself
|
|
38
|
+
for (const key of Object.getOwnPropertyNames(ClassConstructor)) {
|
|
39
|
+
if (['length', 'name', 'prototype'].includes(key))
|
|
40
|
+
continue;
|
|
41
|
+
const descriptor = Object.getOwnPropertyDescriptor(ClassConstructor, key);
|
|
42
|
+
if (descriptor && typeof descriptor.value === 'function') {
|
|
43
|
+
if (asyncCtorNames.has(descriptor.value.constructor.name)) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find a single Photon class in a module
|
|
52
|
+
*
|
|
53
|
+
* Priority: default export first, then named exports.
|
|
54
|
+
* Returns the first class with async methods, or null.
|
|
55
|
+
*/
|
|
56
|
+
export function findPhotonClass(module) {
|
|
57
|
+
// Try default export first
|
|
58
|
+
if (module.default && isClass(module.default)) {
|
|
59
|
+
if (hasAsyncMethods(module.default)) {
|
|
60
|
+
return module.default;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Try named exports
|
|
64
|
+
for (const exportedItem of Object.values(module)) {
|
|
65
|
+
if (isClass(exportedItem) && hasAsyncMethods(exportedItem)) {
|
|
66
|
+
return exportedItem;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find all Photon classes in a module
|
|
73
|
+
*
|
|
74
|
+
* Returns every exported class that has async methods.
|
|
75
|
+
* Used by NCP which may load multiple classes from one file.
|
|
76
|
+
*/
|
|
77
|
+
export function findPhotonClasses(module) {
|
|
78
|
+
const classes = [];
|
|
79
|
+
for (const exportedItem of Object.values(module)) {
|
|
80
|
+
if (isClass(exportedItem) && hasAsyncMethods(exportedItem)) {
|
|
81
|
+
classes.push(exportedItem);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return classes;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=class-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-detection.js","sourceRoot":"","sources":["../src/class-detection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,EAAW;IACjC,OAAO,OAAO,EAAE,KAAK,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAqD;IACnF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC7B,eAAe;QACf,wBAAwB;QACxB,mBAAmB;KACpB,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,IAAI,GAAG,KAAK,aAAa;YAAE,SAAS;QACpC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACnE,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACzD,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC1E,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACzD,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAA+B;IAC7D,2BAA2B;IAC3B,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,MAAM,OAAO,GAA+C,EAAE,CAAC;IAE/D,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReactiveArray - A managed array that auto-emits events on mutations
|
|
3
|
+
*
|
|
4
|
+
* When used as a class property, automatically emits events when items are
|
|
5
|
+
* added, removed, or updated.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { ReactiveArray } from '@portel/photon-core';
|
|
10
|
+
*
|
|
11
|
+
* export default class TodoList {
|
|
12
|
+
* items = ReactiveArray.create<Task>('items', (event, data) => this.emit(event, data));
|
|
13
|
+
*
|
|
14
|
+
* add(text: string) {
|
|
15
|
+
* this.items.push({ id: crypto.randomUUID(), text });
|
|
16
|
+
* // Auto-emits 'items:added' with the new item
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Event naming convention (inspired by Firebase):
|
|
22
|
+
* - `{prop}:added` - Item pushed/inserted
|
|
23
|
+
* - `{prop}:removed` - Item popped/spliced out
|
|
24
|
+
* - `{prop}:updated` - Item at index changed
|
|
25
|
+
* - `{prop}:changed` - Full array replaced
|
|
26
|
+
*/
|
|
27
|
+
export type Emitter = (event: string, data: unknown) => void;
|
|
28
|
+
export declare class ReactiveArray<T> extends Array<T> {
|
|
29
|
+
private _propertyName;
|
|
30
|
+
private _emitter;
|
|
31
|
+
/**
|
|
32
|
+
* Create a new ReactiveArray bound to a property name and emitter function.
|
|
33
|
+
* The emitter is called with event names like 'items:added', 'items:removed', etc.
|
|
34
|
+
*/
|
|
35
|
+
static create<T>(propertyName: string, emitter: Emitter, initialItems?: T[]): ReactiveArray<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Add one or more elements to the end of the array.
|
|
38
|
+
* Emits `{prop}:added` for each item.
|
|
39
|
+
*/
|
|
40
|
+
push(...items: T[]): number;
|
|
41
|
+
/**
|
|
42
|
+
* Remove the last element from the array.
|
|
43
|
+
* Emits `{prop}:removed` with the removed item.
|
|
44
|
+
*/
|
|
45
|
+
pop(): T | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Remove the first element from the array.
|
|
48
|
+
* Emits `{prop}:removed` with the removed item.
|
|
49
|
+
*/
|
|
50
|
+
shift(): T | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Add one or more elements to the beginning of the array.
|
|
53
|
+
* Emits `{prop}:added` for each item.
|
|
54
|
+
*/
|
|
55
|
+
unshift(...items: T[]): number;
|
|
56
|
+
/**
|
|
57
|
+
* Remove/replace elements from the array.
|
|
58
|
+
* Emits `{prop}:removed` for deleted items and `{prop}:added` for inserted items.
|
|
59
|
+
*/
|
|
60
|
+
splice(start: number, deleteCount?: number, ...items: T[]): T[];
|
|
61
|
+
/**
|
|
62
|
+
* Set an element at a specific index.
|
|
63
|
+
* Emits `{prop}:updated` with `{ index, value, previous }`.
|
|
64
|
+
*/
|
|
65
|
+
set(index: number, value: T): void;
|
|
66
|
+
/**
|
|
67
|
+
* Replace all items in the array.
|
|
68
|
+
* Emits `{prop}:changed` with the full new array.
|
|
69
|
+
*/
|
|
70
|
+
replaceAll(items: T[]): void;
|
|
71
|
+
/**
|
|
72
|
+
* Clear all items from the array.
|
|
73
|
+
* Emits `{prop}:changed` with an empty array.
|
|
74
|
+
*/
|
|
75
|
+
clear(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Sort the array in place.
|
|
78
|
+
* Emits `{prop}:changed` with the sorted array.
|
|
79
|
+
*/
|
|
80
|
+
sort(compareFn?: (a: T, b: T) => number): this;
|
|
81
|
+
/**
|
|
82
|
+
* Reverse the array in place.
|
|
83
|
+
* Emits `{prop}:changed` with the reversed array.
|
|
84
|
+
*/
|
|
85
|
+
reverse(): this;
|
|
86
|
+
/**
|
|
87
|
+
* Fill the array with a value.
|
|
88
|
+
* Emits `{prop}:changed` with the filled array.
|
|
89
|
+
*/
|
|
90
|
+
fill(value: T, start?: number, end?: number): this;
|
|
91
|
+
/**
|
|
92
|
+
* Copy items within the array.
|
|
93
|
+
* Emits `{prop}:changed` with the modified array.
|
|
94
|
+
*/
|
|
95
|
+
copyWithin(target: number, start: number, end?: number): this;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ReactiveArray.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactiveArray.d.ts","sourceRoot":"","sources":["../../src/collections/ReactiveArray.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAE7D,qBAAa,aAAa,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAqB;IAErC;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,CAAC,EAAE,GACjB,aAAa,CAAC,CAAC,CAAC;IAWnB;;;OAGG;IACH,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM3B;;;OAGG;IACH,GAAG,IAAI,CAAC,GAAG,SAAS;IAQpB;;;OAGG;IACH,KAAK,IAAI,CAAC,GAAG,SAAS;IAQtB;;;OAGG;IACH,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM9B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAS/D;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAMlC;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI;IAO5B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI;IAM9C;;;OAGG;IACH,OAAO,IAAI,IAAI;IAMf;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlD;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;CAK9D"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReactiveArray - A managed array that auto-emits events on mutations
|
|
3
|
+
*
|
|
4
|
+
* When used as a class property, automatically emits events when items are
|
|
5
|
+
* added, removed, or updated.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { ReactiveArray } from '@portel/photon-core';
|
|
10
|
+
*
|
|
11
|
+
* export default class TodoList {
|
|
12
|
+
* items = ReactiveArray.create<Task>('items', (event, data) => this.emit(event, data));
|
|
13
|
+
*
|
|
14
|
+
* add(text: string) {
|
|
15
|
+
* this.items.push({ id: crypto.randomUUID(), text });
|
|
16
|
+
* // Auto-emits 'items:added' with the new item
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Event naming convention (inspired by Firebase):
|
|
22
|
+
* - `{prop}:added` - Item pushed/inserted
|
|
23
|
+
* - `{prop}:removed` - Item popped/spliced out
|
|
24
|
+
* - `{prop}:updated` - Item at index changed
|
|
25
|
+
* - `{prop}:changed` - Full array replaced
|
|
26
|
+
*/
|
|
27
|
+
export class ReactiveArray extends Array {
|
|
28
|
+
_propertyName = '';
|
|
29
|
+
_emitter = () => { };
|
|
30
|
+
/**
|
|
31
|
+
* Create a new ReactiveArray bound to a property name and emitter function.
|
|
32
|
+
* The emitter is called with event names like 'items:added', 'items:removed', etc.
|
|
33
|
+
*/
|
|
34
|
+
static create(propertyName, emitter, initialItems) {
|
|
35
|
+
const arr = new ReactiveArray();
|
|
36
|
+
arr._propertyName = propertyName;
|
|
37
|
+
arr._emitter = emitter;
|
|
38
|
+
if (initialItems) {
|
|
39
|
+
// Use super.push to avoid triggering events during init
|
|
40
|
+
globalThis.Array.prototype.push.apply(arr, initialItems);
|
|
41
|
+
}
|
|
42
|
+
return arr;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Add one or more elements to the end of the array.
|
|
46
|
+
* Emits `{prop}:added` for each item.
|
|
47
|
+
*/
|
|
48
|
+
push(...items) {
|
|
49
|
+
const result = super.push(...items);
|
|
50
|
+
items.forEach((item) => this._emitter(`${this._propertyName}:added`, item));
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Remove the last element from the array.
|
|
55
|
+
* Emits `{prop}:removed` with the removed item.
|
|
56
|
+
*/
|
|
57
|
+
pop() {
|
|
58
|
+
const item = super.pop();
|
|
59
|
+
if (item !== undefined) {
|
|
60
|
+
this._emitter(`${this._propertyName}:removed`, item);
|
|
61
|
+
}
|
|
62
|
+
return item;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Remove the first element from the array.
|
|
66
|
+
* Emits `{prop}:removed` with the removed item.
|
|
67
|
+
*/
|
|
68
|
+
shift() {
|
|
69
|
+
const item = super.shift();
|
|
70
|
+
if (item !== undefined) {
|
|
71
|
+
this._emitter(`${this._propertyName}:removed`, item);
|
|
72
|
+
}
|
|
73
|
+
return item;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Add one or more elements to the beginning of the array.
|
|
77
|
+
* Emits `{prop}:added` for each item.
|
|
78
|
+
*/
|
|
79
|
+
unshift(...items) {
|
|
80
|
+
const result = super.unshift(...items);
|
|
81
|
+
items.forEach((item) => this._emitter(`${this._propertyName}:added`, item));
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Remove/replace elements from the array.
|
|
86
|
+
* Emits `{prop}:removed` for deleted items and `{prop}:added` for inserted items.
|
|
87
|
+
*/
|
|
88
|
+
splice(start, deleteCount, ...items) {
|
|
89
|
+
const removed = super.splice(start, deleteCount ?? 0, ...items);
|
|
90
|
+
removed.forEach((item) => this._emitter(`${this._propertyName}:removed`, item));
|
|
91
|
+
items.forEach((item) => this._emitter(`${this._propertyName}:added`, item));
|
|
92
|
+
return removed;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set an element at a specific index.
|
|
96
|
+
* Emits `{prop}:updated` with `{ index, value, previous }`.
|
|
97
|
+
*/
|
|
98
|
+
set(index, value) {
|
|
99
|
+
const previous = this[index];
|
|
100
|
+
this[index] = value;
|
|
101
|
+
this._emitter(`${this._propertyName}:updated`, { index, value, previous });
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Replace all items in the array.
|
|
105
|
+
* Emits `{prop}:changed` with the full new array.
|
|
106
|
+
*/
|
|
107
|
+
replaceAll(items) {
|
|
108
|
+
// Clear and replace
|
|
109
|
+
this.length = 0;
|
|
110
|
+
globalThis.Array.prototype.push.apply(this, items);
|
|
111
|
+
this._emitter(`${this._propertyName}:changed`, [...items]);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Clear all items from the array.
|
|
115
|
+
* Emits `{prop}:changed` with an empty array.
|
|
116
|
+
*/
|
|
117
|
+
clear() {
|
|
118
|
+
this.length = 0;
|
|
119
|
+
this._emitter(`${this._propertyName}:changed`, []);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Sort the array in place.
|
|
123
|
+
* Emits `{prop}:changed` with the sorted array.
|
|
124
|
+
*/
|
|
125
|
+
sort(compareFn) {
|
|
126
|
+
super.sort(compareFn);
|
|
127
|
+
this._emitter(`${this._propertyName}:changed`, [...this]);
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Reverse the array in place.
|
|
132
|
+
* Emits `{prop}:changed` with the reversed array.
|
|
133
|
+
*/
|
|
134
|
+
reverse() {
|
|
135
|
+
super.reverse();
|
|
136
|
+
this._emitter(`${this._propertyName}:changed`, [...this]);
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Fill the array with a value.
|
|
141
|
+
* Emits `{prop}:changed` with the filled array.
|
|
142
|
+
*/
|
|
143
|
+
fill(value, start, end) {
|
|
144
|
+
super.fill(value, start, end);
|
|
145
|
+
this._emitter(`${this._propertyName}:changed`, [...this]);
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Copy items within the array.
|
|
150
|
+
* Emits `{prop}:changed` with the modified array.
|
|
151
|
+
*/
|
|
152
|
+
copyWithin(target, start, end) {
|
|
153
|
+
super.copyWithin(target, start, end);
|
|
154
|
+
this._emitter(`${this._propertyName}:changed`, [...this]);
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=ReactiveArray.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactiveArray.js","sourceRoot":"","sources":["../../src/collections/ReactiveArray.ts"],"names":[],"mappings":"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"}
|