@syncbridge/common 0.4.7 → 0.5.2

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/registry.js DELETED
@@ -1,205 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import path from 'node:path';
3
- import process from 'node:process';
4
- import { fileURLToPath, pathToFileURL } from 'node:url';
5
- import { deepClone, isPlainObject } from '@jsopen/objects';
6
- import { COMPONENT_OPTIONS, PROCESSOR_OPTIONS } from './constants.js';
7
- import { isExtensionPackage } from './utils/make-extension-package.js';
8
- export var ExtensionRegistry;
9
- (function (ExtensionRegistry) {
10
- let _resolver = import.meta.resolve;
11
- ExtensionRegistry.packages = new Map();
12
- ExtensionRegistry.components = new Map();
13
- ExtensionRegistry.processors = new Map();
14
- function setResolver(resolver) {
15
- _resolver = resolver;
16
- }
17
- ExtensionRegistry.setResolver = setResolver;
18
- function getProcessor(className) {
19
- const rec = ExtensionRegistry.processors.get(className);
20
- if (!rec) {
21
- throw new Error(`Processor "${className}" not found in registry`);
22
- }
23
- return rec;
24
- }
25
- ExtensionRegistry.getProcessor = getProcessor;
26
- function getComponent(className) {
27
- const rec = ExtensionRegistry.components.get(className);
28
- if (!rec) {
29
- throw new Error(`Component "${className}" not found in registry`);
30
- }
31
- return rec;
32
- }
33
- ExtensionRegistry.getComponent = getComponent;
34
- async function registerPackage(...specifiers) {
35
- const errors = [];
36
- await Promise.all(specifiers.map(specifier => _registerPackage(specifier).catch(err => {
37
- errors.push(`\n ${specifier}: ${err.message}`);
38
- })));
39
- if (errors.length) {
40
- console.error(`Failed to register extensions:${errors}`);
41
- }
42
- }
43
- ExtensionRegistry.registerPackage = registerPackage;
44
- async function _registerPackage(specifier, options) {
45
- let packagePath = fileURLToPath(_resolver(specifier));
46
- const json = locatePkgJson(path.dirname(packagePath));
47
- if (!json) {
48
- if (options?.ignoreInvalid)
49
- return;
50
- throw new TypeError(`Can't locate package.json file for "${specifier}"`);
51
- }
52
- if (path.isAbsolute(packagePath) && process.platform === 'win32') {
53
- packagePath = pathToFileURL(packagePath).href;
54
- }
55
- const pkg = (await import(packagePath)).default;
56
- if (!isExtensionPackage(pkg)) {
57
- if (options?.ignoreInvalid)
58
- return;
59
- throw new TypeError(`"${specifier}" do not export ExtensionPackage interface`);
60
- }
61
- // ignore if already registered
62
- if (ExtensionRegistry.packages.get(json.name))
63
- return;
64
- // Register dependencies
65
- if (pkg.dependencies) {
66
- for (const dep of pkg.dependencies)
67
- await _registerPackage(dep, { ignoreInvalid: true });
68
- }
69
- const packageRec = Object.freeze({
70
- name: json.name,
71
- version: json.version,
72
- description: json.description,
73
- });
74
- ExtensionRegistry.packages.set(packageRec.name, packageRec);
75
- if (Array.isArray(pkg.components)) {
76
- for (const ctor of pkg.components) {
77
- await registerComponent(ctor, packageRec.name);
78
- }
79
- }
80
- if (Array.isArray(pkg.processors)) {
81
- for (const ctor of pkg.processors) {
82
- await registerProcessor(ctor, packageRec.name);
83
- }
84
- }
85
- }
86
- async function registerComponent(ctor, packageName) {
87
- const _metadata = Reflect.getMetadata(COMPONENT_OPTIONS, ctor);
88
- if (!_metadata)
89
- throw new TypeError(`Class "${ctor.name}" has no component metadata.`);
90
- if (_metadata.abstract)
91
- return;
92
- let componentRec = ExtensionRegistry.components.get(_metadata.className);
93
- if (componentRec)
94
- throw new TypeError(`Component "${_metadata.className}" already registered by "${componentRec.package}" package`);
95
- let metadata = await resolvePromisesDeep(_metadata);
96
- metadata = deepClone({
97
- className: metadata.className,
98
- displayName: metadata.displayName,
99
- description: metadata.description,
100
- iconUrl: metadata.iconUrl,
101
- author: metadata.author,
102
- interfaces: metadata.interfaces,
103
- tags: metadata.tags,
104
- abstract: metadata.abstract,
105
- variables: metadata.variables,
106
- components: metadata.components,
107
- ...metadata,
108
- });
109
- if (metadata.variables) {
110
- /** Convert object enumValues to arrays */
111
- for (const v of Object.values(metadata.variables)) {
112
- if (v.enumValues &&
113
- typeof v.enumValues === 'object' &&
114
- !Array.isArray(v.enumValues)) {
115
- let values = v.enumValues;
116
- const keys = Object.keys(values).filter(k => !/^\d+$/.test(k));
117
- values = keys.reduce((a, k) => {
118
- if (values[k] != null)
119
- a.push(values[k]);
120
- return a;
121
- // v => !(typeof v === 'number' && !keys.includes(String(v))),
122
- }, []);
123
- v.enumValues = values;
124
- }
125
- }
126
- }
127
- componentRec = {
128
- package: packageName,
129
- ctor,
130
- metadata,
131
- };
132
- ExtensionRegistry.components.set(metadata.className, componentRec);
133
- }
134
- ExtensionRegistry.registerComponent = registerComponent;
135
- async function registerProcessor(ctor, packageName) {
136
- const _metadata = Reflect.getMetadata(PROCESSOR_OPTIONS, ctor);
137
- if (!_metadata)
138
- throw new TypeError(`Class "${ctor.name}" has no processor metadata.`);
139
- if (_metadata.abstract)
140
- return;
141
- let processorRec = ExtensionRegistry.processors.get(_metadata.className);
142
- if (processorRec)
143
- throw new TypeError(`Processor "${_metadata.className}" already registered by "${processorRec.package}" package`);
144
- let metadata = await resolvePromisesDeep(_metadata);
145
- metadata = deepClone({
146
- className: metadata.className,
147
- displayName: metadata.displayName,
148
- description: metadata.description,
149
- iconUrl: metadata.iconUrl,
150
- author: metadata.author,
151
- tags: metadata.tags,
152
- abstract: metadata.abstract,
153
- variables: metadata.variables,
154
- components: metadata.components,
155
- ...metadata,
156
- });
157
- if (metadata.variables) {
158
- /** Convert object enumValues to arrays */
159
- for (const v of Object.values(metadata.variables)) {
160
- if (v.enumValues &&
161
- typeof v.enumValues === 'object' &&
162
- !Array.isArray(v.enumValues)) {
163
- let values = v.enumValues;
164
- const keys = Object.keys(values).filter(k => !/^\d+$/.test(k));
165
- values = keys.reduce((a, k) => {
166
- if (values[k] != null)
167
- a.push(values[k]);
168
- return a;
169
- // v => !(typeof v === 'number' && !keys.includes(String(v))),
170
- }, []);
171
- v.enumValues = values;
172
- }
173
- }
174
- }
175
- processorRec = {
176
- package: packageName,
177
- ctor,
178
- metadata,
179
- };
180
- ExtensionRegistry.processors.set(metadata.className, processorRec);
181
- }
182
- ExtensionRegistry.registerProcessor = registerProcessor;
183
- })(ExtensionRegistry || (ExtensionRegistry = {}));
184
- function locatePkgJson(directory) {
185
- if (directory.startsWith('file:'))
186
- directory = fileURLToPath(directory);
187
- for (let i = 0; i < 3; i++) {
188
- const f = path.resolve(directory, 'package.json');
189
- if (fs.existsSync(f)) {
190
- const json = JSON.parse(fs.readFileSync(f, 'utf8'));
191
- if (json.name && json.version)
192
- return json;
193
- }
194
- directory = path.dirname(directory);
195
- }
196
- }
197
- async function resolvePromisesDeep(obj) {
198
- obj = await obj;
199
- if (obj && isPlainObject(obj)) {
200
- for (const k of Object.keys(obj)) {
201
- obj[k] = await resolvePromisesDeep(obj[k]);
202
- }
203
- }
204
- return obj;
205
- }
@@ -1,3 +0,0 @@
1
- import { IExtensionPackage } from '../interfaces/index.js';
2
- export declare function makeExtensionPackage(pkg: IExtensionPackage): IExtensionPackage;
3
- export declare function isExtensionPackage(pkg: IExtensionPackage): pkg is IExtensionPackage;
@@ -1,13 +0,0 @@
1
- const marker = Symbol('marker');
2
- export function makeExtensionPackage(pkg) {
3
- Object.defineProperty(pkg, marker, {
4
- configurable: false,
5
- writable: false,
6
- enumerable: false,
7
- value: 1,
8
- });
9
- return pkg;
10
- }
11
- export function isExtensionPackage(pkg) {
12
- return pkg && typeof pkg === 'object' && pkg[marker] === 1;
13
- }