@unisphere/nx 3.22.0 → 3.23.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.
Files changed (55) hide show
  1. package/dist/generators/add-documentation/add-documentation.d.ts.map +1 -1
  2. package/dist/generators/add-documentation/add-documentation.js +7 -0
  3. package/dist/generators/add-documentation/discover-typedoc-plugins.d.ts +23 -0
  4. package/dist/generators/add-documentation/discover-typedoc-plugins.d.ts.map +1 -0
  5. package/dist/generators/add-documentation/discover-typedoc-plugins.js +128 -0
  6. package/dist/generators/add-documentation/templates/docusaurus.config.ts.template +2 -1
  7. package/dist/generators/add-documentation/templates/package.json.template +2 -1
  8. package/dist/generators/add-documentation/templates/plugins/discover-typedoc-plugins.mjs +156 -0
  9. package/dist/generators/add-documentation/templates/plugins/typedoc-plugins.ts.template +7 -0
  10. package/dist/generators/add-documentation/templates/src/theme/Navbar/Content/index.tsx +8 -0
  11. package/dist/migrations/3-23-0/update-documentation-typedoc-plugins.d.ts +12 -0
  12. package/dist/migrations/3-23-0/update-documentation-typedoc-plugins.d.ts.map +1 -0
  13. package/dist/migrations/3-23-0/update-documentation-typedoc-plugins.js +160 -0
  14. package/migrations.json +8 -0
  15. package/package.json +1 -1
  16. package/dist/generators/add-documentation/templates/static/docs/overview/unisphere-for-dummies-1.png +0 -0
  17. package/dist/generators/add-documentation/templates/static/docs/overview/unisphere-for-dummies-2.png +0 -0
  18. package/dist/generators/add-documentation/templates/static/docs/overview/unisphere-for-dummies-3.png +0 -0
  19. package/dist/generators/add-documentation/templates/static/docs/overview/unisphere-for-dummies-4.png +0 -0
  20. package/dist/generators/add-documentation/templates/static/homepage/divider.svg +0 -5
  21. package/dist/generators/add-documentation/templates/static/homepage/icons/Architecture.svg +0 -4
  22. package/dist/generators/add-documentation/templates/static/homepage/icons/Cost.svg +0 -4
  23. package/dist/generators/add-documentation/templates/static/homepage/icons/ExternalLink.svg +0 -3
  24. package/dist/generators/add-documentation/templates/static/homepage/icons/Infra.svg +0 -8
  25. package/dist/generators/add-documentation/templates/static/homepage/icons/Redundancies.svg +0 -6
  26. package/dist/generators/add-documentation/templates/static/homepage/icons/Speed.svg +0 -6
  27. package/dist/generators/add-documentation/templates/static/homepage/icons/Standards.svg +0 -4
  28. package/dist/generators/add-documentation/templates/static/homepage/icons/Unified.svg +0 -12
  29. package/dist/generators/add-documentation/templates/static/homepage/services/custo.jpg +0 -0
  30. package/dist/generators/add-documentation/templates/static/homepage/services/flame.jpg +0 -0
  31. package/dist/generators/add-documentation/templates/static/homepage/services/keepr.jpg +0 -0
  32. package/dist/generators/add-documentation/templates/static/homepage/services/loggi.jpg +0 -0
  33. package/dist/generators/add-documentation/templates/static/homepage/services/palleto.jpg +0 -0
  34. package/dist/generators/add-documentation/templates/static/homepage/services/publi.jpg +0 -0
  35. package/dist/generators/add-documentation/templates/static/homepage/services/tinker.jpg +0 -0
  36. package/dist/generators/add-documentation/templates/static/img/logo_big.svg +0 -12
  37. package/dist/generators/add-documentation/templates/static/img/logo_big_dark.svg +0 -12
  38. package/dist/generators/add-documentation/templates/static/img/unisphere-social-card.jpg +0 -0
  39. package/dist/generators/add-documentation/templates/static/llm/INTEGRATE.md +0 -497
  40. package/dist/generators/add-documentation/templates/static/team/amirc.jpeg +0 -0
  41. package/dist/generators/add-documentation/templates/static/team/erans.jpeg +0 -0
  42. package/dist/generators/add-documentation/templates/static/team/hadass.jpeg +0 -0
  43. package/dist/generators/add-documentation/templates/static/team/hillelc.jpeg +0 -0
  44. package/dist/generators/add-documentation/templates/static/team/idoz.jpeg +0 -0
  45. package/dist/generators/add-documentation/templates/static/team/lianb.jpeg +0 -0
  46. package/dist/generators/add-documentation/templates/static/team/nirb.jpeg +0 -0
  47. package/dist/generators/add-documentation/templates/static/team/nivs.jpeg +0 -0
  48. package/dist/generators/add-documentation/templates/static/team/omric.jpeg +0 -0
  49. package/dist/generators/add-documentation/templates/static/team/roeed.jpeg +0 -0
  50. package/dist/generators/add-documentation/templates/static/team/sivana.jpeg +0 -0
  51. package/dist/generators/add-documentation/templates/static/team/stask.png +0 -0
  52. package/dist/generators/add-documentation/templates/static/team/tanyal.jpeg +0 -0
  53. package/dist/generators/add-documentation/templates/static/team/tomere.jpeg +0 -0
  54. package/dist/generators/add-documentation/templates/static/team/tornikem.jpeg +0 -0
  55. package/dist/generators/add-documentation/templates/static/team/yairn.jpeg +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"add-documentation.d.ts","sourceRoot":"","sources":["../../../src/generators/add-documentation/add-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,IAAI,EAAiB,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,+BAA+B,EAAE,MAAM,UAAU,CAAC;AAY3D,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,+BAA+B,qCAwJzC;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"add-documentation.d.ts","sourceRoot":"","sources":["../../../src/generators/add-documentation/add-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,IAAI,EAAiB,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,+BAA+B,EAAE,MAAM,UAAU,CAAC;AAa3D,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,+BAA+B,qCA+JzC;AAED,eAAe,yBAAyB,CAAC"}
@@ -6,6 +6,7 @@ const devkit_1 = require("@nx/devkit");
6
6
  const child_process_1 = require("child_process");
7
7
  const path = tslib_1.__importStar(require("path"));
8
8
  const utils_1 = require("../utils");
9
+ const discover_typedoc_plugins_1 = require("./discover-typedoc-plugins");
9
10
  async function getEnquirerPrompt() {
10
11
  const enquirer = await import('enquirer');
11
12
  return enquirer.prompt || enquirer.default?.prompt || enquirer;
@@ -65,12 +66,18 @@ async function addDocumentationGenerator(tree, options) {
65
66
  throw new Error(`Documentation site "${fullDocumentationName}" already exists at ${projectRoot}.\n` +
66
67
  'Please choose a different name or remove the existing documentation site first.');
67
68
  }
69
+ // Discover publishable packages for typedoc plugin auto-configuration
70
+ const discoveredPlugins = (0, discover_typedoc_plugins_1.discoverTypedocPlugins)(tree, projectRoot);
71
+ if (discoveredPlugins.length > 0) {
72
+ devkit_1.logger.info(`📚 Auto-discovered ${discoveredPlugins.length} package(s) for TypeDoc API documentation`);
73
+ }
68
74
  // Generate files from template
69
75
  const templateVariables = {
70
76
  ...(0, utils_1.createNameTransforms)(fullDocumentationName, 'documentationName'),
71
77
  ...(0, utils_1.createNameTransforms)(documentationNameAsLowerDashCase, 'experienceName'),
72
78
  hasSubName: !!subNameAsLowerDashCase,
73
79
  subNameKebab: subNameAsLowerDashCase || '',
80
+ typedocPluginsConfig: (0, discover_typedoc_plugins_1.buildTypedocPluginsCode)(discoveredPlugins),
74
81
  tmpl: '',
75
82
  };
76
83
  (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'templates'), projectRoot, templateVariables);
@@ -0,0 +1,23 @@
1
+ import { Tree } from '@nx/devkit';
2
+ interface TypdocPluginConfig {
3
+ id: string;
4
+ packageName: string;
5
+ entryPointsRelative: string;
6
+ tsconfigRelative: string;
7
+ out: string;
8
+ }
9
+ /**
10
+ * Discovers publishable packages from .unisphere config and generates
11
+ * docusaurus-plugin-typedoc configuration entries.
12
+ *
13
+ * Excludes packages whose sourceRoot contains '/local/' (internal packages).
14
+ * The docsProjectRoot is used to compute relative paths (e.g. "unisphere/documentation/genie").
15
+ */
16
+ export declare function discoverTypedocPlugins(tree: Tree, docsProjectRoot: string): TypdocPluginConfig[];
17
+ /**
18
+ * Serialises the discovered plugin configs into a TypeScript source fragment
19
+ * suitable for injection into docusaurus.config.ts via EJS (<%- typedocPluginsConfig %>).
20
+ */
21
+ export declare function buildTypedocPluginsCode(plugins: TypdocPluginConfig[]): string;
22
+ export {};
23
+ //# sourceMappingURL=discover-typedoc-plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-typedoc-plugins.d.ts","sourceRoot":"","sources":["../../../src/generators/add-documentation/discover-typedoc-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoB,MAAM,YAAY,CAAC;AAepD,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAsCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,MAAM,GACtB,kBAAkB,EAAE,CAkDtB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAyB7E"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.discoverTypedocPlugins = discoverTypedocPlugins;
4
+ exports.buildTypedocPluginsCode = buildTypedocPluginsCode;
5
+ const tslib_1 = require("tslib");
6
+ const devkit_1 = require("@nx/devkit");
7
+ const path = tslib_1.__importStar(require("path"));
8
+ /**
9
+ * Non-local scopes whose packages should be documented.
10
+ * Packages under 'local' are internal-only and excluded.
11
+ */
12
+ const DOCUMENTED_SCOPES = [
13
+ 'kaltura-corp',
14
+ 'kaltura-apps',
15
+ 'kaltura-ui',
16
+ 'kaltura-sdk',
17
+ 'unisphere',
18
+ ];
19
+ /**
20
+ * Returns the npm package name for a given sourceRoot by looking up
21
+ * tsconfig.base.json paths.
22
+ * e.g. sourceRoot "unisphere/packages/kaltura-corp/shared-react"
23
+ * → "@kaltura-corp/unisphere-genie-shared-react"
24
+ */
25
+ function findPackageName(tree, sourceRoot) {
26
+ if (!tree.exists('tsconfig.base.json'))
27
+ return null;
28
+ try {
29
+ const tsconfig = (0, devkit_1.readJson)(tree, 'tsconfig.base.json');
30
+ const paths = tsconfig?.compilerOptions?.paths ?? {};
31
+ const expectedPath = `${sourceRoot}/src/index.ts`;
32
+ for (const [alias, pathList] of Object.entries(paths)) {
33
+ if (Array.isArray(pathList) && pathList.includes(expectedPath)) {
34
+ return alias;
35
+ }
36
+ }
37
+ }
38
+ catch {
39
+ // ignore
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * Derives a short plugin id from an npm package name.
45
+ * "@kaltura-corp/unisphere-genie-shared-react" → "unisphere-genie-shared-react"
46
+ * "@unisphere/genie-types" → "genie-types"
47
+ */
48
+ function shortName(packageName) {
49
+ const parts = packageName.split('/');
50
+ return parts[parts.length - 1];
51
+ }
52
+ /**
53
+ * Discovers publishable packages from .unisphere config and generates
54
+ * docusaurus-plugin-typedoc configuration entries.
55
+ *
56
+ * Excludes packages whose sourceRoot contains '/local/' (internal packages).
57
+ * The docsProjectRoot is used to compute relative paths (e.g. "unisphere/documentation/genie").
58
+ */
59
+ function discoverTypedocPlugins(tree, docsProjectRoot) {
60
+ if (!tree.exists('.unisphere'))
61
+ return [];
62
+ let config;
63
+ try {
64
+ config = (0, devkit_1.readJson)(tree, '.unisphere');
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ const packages = config?.elements?.packages ?? {};
70
+ const plugins = [];
71
+ for (const [, pkgConfig] of Object.entries(packages)) {
72
+ const sourceRoot = pkgConfig?.sourceRoot;
73
+ if (!sourceRoot)
74
+ continue;
75
+ // Determine the scope directory from the sourceRoot path
76
+ // Expected: unisphere/packages/<scope>/<name>
77
+ const parts = sourceRoot.split('/');
78
+ if (parts.length < 4)
79
+ continue;
80
+ const scope = parts[2]; // e.g. "local", "kaltura-corp", "unisphere"
81
+ if (!DOCUMENTED_SCOPES.includes(scope))
82
+ continue;
83
+ const packageName = findPackageName(tree, sourceRoot);
84
+ if (!packageName) {
85
+ devkit_1.logger.warn(`âš ī¸ Could not find npm package name for ${sourceRoot} — skipping in typedoc plugins`);
86
+ continue;
87
+ }
88
+ const short = shortName(packageName);
89
+ // Relative path from docs site root to the package
90
+ // docsProjectRoot: "unisphere/documentation/genie"
91
+ // sourceRoot: "unisphere/packages/kaltura-corp/shared-react"
92
+ const relativeBase = path.relative(docsProjectRoot, sourceRoot).replace(/\\/g, '/');
93
+ plugins.push({
94
+ id: `api-${short}`,
95
+ packageName,
96
+ entryPointsRelative: `${relativeBase}/src/index.ts`,
97
+ tsconfigRelative: `${relativeBase}/tsconfig.json`,
98
+ out: `docs/api/${short}/v1`,
99
+ });
100
+ }
101
+ return plugins;
102
+ }
103
+ /**
104
+ * Serialises the discovered plugin configs into a TypeScript source fragment
105
+ * suitable for injection into docusaurus.config.ts via EJS (<%- typedocPluginsConfig %>).
106
+ */
107
+ function buildTypedocPluginsCode(plugins) {
108
+ if (plugins.length === 0)
109
+ return '[]';
110
+ const entries = plugins
111
+ .map((p) => `\n // ${p.packageName}\n` +
112
+ ` [\n` +
113
+ ` 'docusaurus-plugin-typedoc',\n` +
114
+ ` {\n` +
115
+ ` id: '${p.id}',\n` +
116
+ ` entryPoints: ['${p.entryPointsRelative}'],\n` +
117
+ ` tsconfig: '${p.tsconfigRelative}',\n` +
118
+ ` out: '${p.out}',\n` +
119
+ ` readme: 'none',\n` +
120
+ ` excludePrivate: true,\n` +
121
+ ` excludeProtected: true,\n` +
122
+ ` excludeInternal: true,\n` +
123
+ ` disableSources: true,\n` +
124
+ ` },\n` +
125
+ ` ]`)
126
+ .join(',');
127
+ return `[${entries},\n ]`;
128
+ }
@@ -1,6 +1,7 @@
1
1
  import { themes as prismThemes } from 'prism-react-renderer';
2
2
  import type { Config } from '@docusaurus/types';
3
3
  import type * as Preset from '@docusaurus/preset-classic';
4
+ import typedocPlugins from './plugins/typedoc-plugins';
4
5
 
5
6
  const config: Config = {
6
7
  <% if (hasSubName) { -%>
@@ -47,7 +48,7 @@ const config: Config = {
47
48
  } satisfies Preset.Options,
48
49
  ],
49
50
  ],
50
- plugins: [],
51
+ plugins: typedocPlugins,
51
52
  themes: [
52
53
  '@docusaurus/theme-mermaid',
53
54
  [
@@ -12,7 +12,8 @@
12
12
  "serve": "docusaurus serve",
13
13
  "write-translations": "docusaurus write-translations",
14
14
  "write-heading-ids": "docusaurus write-heading-ids",
15
- "typecheck": "tsc"
15
+ "typecheck": "tsc",
16
+ "discover-plugins": "node plugins/discover-typedoc-plugins.mjs"
16
17
  },
17
18
  "dependencies": {
18
19
  "@docusaurus/core": "^3.8.1",
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Auto-discovers publishable packages from .unisphere config and regenerates
4
+ * plugins/typedoc-plugins.ts with updated docusaurus-plugin-typedoc entries.
5
+ *
6
+ * Run: npm run discover-plugins
7
+ *
8
+ * - Reads <workspace-root>/.unisphere for packages list
9
+ * - Reads <workspace-root>/tsconfig.base.json for npm package names
10
+ * - Writes plugins/typedoc-plugins.ts
11
+ *
12
+ * Packages under the "local" scope are excluded (internal-only packages).
13
+ */
14
+
15
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
16
+ import { join, relative, dirname } from 'path';
17
+ import { fileURLToPath } from 'url';
18
+
19
+ const DOCUMENTED_SCOPES = [
20
+ 'kaltura-corp',
21
+ 'kaltura-apps',
22
+ 'kaltura-ui',
23
+ 'kaltura-sdk',
24
+ 'unisphere',
25
+ ];
26
+
27
+ // This script lives at <docs-site>/plugins/discover-typedoc-plugins.mjs
28
+ const pluginsDir = dirname(fileURLToPath(import.meta.url));
29
+ const docsSiteRoot = join(pluginsDir, '..');
30
+
31
+ // Walk up from docs site to find workspace root (where .unisphere lives)
32
+ function findWorkspaceRoot(startDir) {
33
+ let dir = startDir;
34
+ while (true) {
35
+ if (existsSync(join(dir, '.unisphere'))) return dir;
36
+ const parent = dirname(dir);
37
+ if (parent === dir) {
38
+ throw new Error(
39
+ 'Could not find .unisphere — are you inside a Unisphere workspace?'
40
+ );
41
+ }
42
+ dir = parent;
43
+ }
44
+ }
45
+
46
+ const workspaceRoot = findWorkspaceRoot(docsSiteRoot);
47
+
48
+ // Parse workspace configs
49
+ const unisphere = JSON.parse(
50
+ readFileSync(join(workspaceRoot, '.unisphere'), 'utf-8')
51
+ );
52
+ const tsconfig = JSON.parse(
53
+ readFileSync(join(workspaceRoot, 'tsconfig.base.json'), 'utf-8')
54
+ );
55
+ const tsconfigPaths = tsconfig?.compilerOptions?.paths ?? {};
56
+ const packages = unisphere?.elements?.packages ?? {};
57
+
58
+ // Build reverse lookup: "sourceRoot/src/index.ts" → npm package name
59
+ const pathToPackageName = {};
60
+ for (const [pkgName, paths] of Object.entries(tsconfigPaths)) {
61
+ if (Array.isArray(paths)) {
62
+ for (const p of paths) {
63
+ pathToPackageName[p] = pkgName;
64
+ }
65
+ }
66
+ }
67
+
68
+ function findPackageName(sourceRoot) {
69
+ return pathToPackageName[`${sourceRoot}/src/index.ts`] ?? null;
70
+ }
71
+
72
+ function shortName(pkgName) {
73
+ return pkgName.split('/').pop();
74
+ }
75
+
76
+ // Discover plugins
77
+ const discovered = [];
78
+ for (const [, pkgConfig] of Object.entries(packages)) {
79
+ const sourceRoot = pkgConfig?.sourceRoot;
80
+ if (!sourceRoot) continue;
81
+
82
+ // Expected sourceRoot format: unisphere/packages/<scope>/<name>
83
+ const parts = sourceRoot.split('/');
84
+ if (parts.length < 4) continue;
85
+ const scope = parts[2];
86
+
87
+ if (!DOCUMENTED_SCOPES.includes(scope)) continue;
88
+
89
+ const pkgName = findPackageName(sourceRoot);
90
+ if (!pkgName) {
91
+ console.warn(`âš ī¸ No tsconfig path found for ${sourceRoot} — skipping`);
92
+ continue;
93
+ }
94
+
95
+ const short = shortName(pkgName);
96
+ // Relative path from docs site root to the package folder
97
+ const relBase = relative(
98
+ docsSiteRoot,
99
+ join(workspaceRoot, sourceRoot)
100
+ ).replace(/\\/g, '/');
101
+
102
+ discovered.push({
103
+ id: `api-${short}`,
104
+ packageName: pkgName,
105
+ entryPoints: `${relBase}/src/index.ts`,
106
+ tsconfig: `${relBase}/tsconfig.json`,
107
+ out: `docs/api/${short}/v1`,
108
+ });
109
+ }
110
+
111
+ // Serialise to TypeScript
112
+ function pluginsToTs(plugins) {
113
+ if (plugins.length === 0) return '[]';
114
+
115
+ const entries = plugins
116
+ .map(
117
+ (p) =>
118
+ ` // ${p.packageName}\n` +
119
+ ` [\n` +
120
+ ` 'docusaurus-plugin-typedoc',\n` +
121
+ ` {\n` +
122
+ ` id: '${p.id}',\n` +
123
+ ` entryPoints: ['${p.entryPoints}'],\n` +
124
+ ` tsconfig: '${p.tsconfig}',\n` +
125
+ ` out: '${p.out}',\n` +
126
+ ` readme: 'none',\n` +
127
+ ` excludePrivate: true,\n` +
128
+ ` excludeProtected: true,\n` +
129
+ ` excludeInternal: true,\n` +
130
+ ` disableSources: true,\n` +
131
+ ` },\n` +
132
+ ` ]`
133
+ )
134
+ .join(',\n');
135
+
136
+ return `[\n${entries},\n]`;
137
+ }
138
+
139
+ const content =
140
+ `// Auto-generated by plugins/discover-typedoc-plugins.mjs\n` +
141
+ `// Run "npm run discover-plugins" to regenerate\n` +
142
+ `\n` +
143
+ `// eslint-disable-next-line @typescript-eslint/no-explicit-any\n` +
144
+ `const typedocPlugins: any[] = ${pluginsToTs(discovered)};\n` +
145
+ `\n` +
146
+ `export default typedocPlugins;\n`;
147
+
148
+ const outPath = join(pluginsDir, 'typedoc-plugins.ts');
149
+ writeFileSync(outPath, content, 'utf-8');
150
+
151
+ console.log(
152
+ `✅ Discovered ${discovered.length} package(s) → plugins/typedoc-plugins.ts`
153
+ );
154
+ for (const p of discovered) {
155
+ console.log(` â€ĸ ${p.packageName} → ${p.out}`);
156
+ }
@@ -0,0 +1,7 @@
1
+ // Auto-generated by plugins/discover-typedoc-plugins.mjs
2
+ // Run "npm run discover-plugins" to regenerate
3
+
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ const typedocPlugins: any[] = <%- typedocPluginsConfig %>;
6
+
7
+ export default typedocPlugins;
@@ -67,6 +67,14 @@ const navIcons: Record<string, ReactNode> = {
67
67
  <circle cx="12" cy="12" r="10" />
68
68
  </svg>
69
69
  ),
70
+ 'Examples': (
71
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
72
+ <rect x="3" y="3" width="7" height="7" />
73
+ <rect x="14" y="3" width="7" height="7" />
74
+ <rect x="3" y="14" width="7" height="7" />
75
+ <rect x="14" y="14" width="7" height="7" />
76
+ </svg>
77
+ ),
70
78
  };
71
79
 
72
80
  function NavbarItemWithIcon({item, index}: {item: NavbarItemConfig; index: number}): ReactNode {
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Migration: Add TypeDoc plugin auto-discovery to documentation sites
3
+ *
4
+ * For each documentation site under unisphere/documentation/:
5
+ * - Creates plugins/discover-typedoc-plugins.mjs (re-discovery script)
6
+ * - Creates plugins/typedoc-plugins.ts (auto-discovered plugin config)
7
+ * - Updates docusaurus.config.ts to import from ./plugins/typedoc-plugins
8
+ * - Adds "discover-plugins" script to the site's package.json
9
+ */
10
+ import { Tree } from '@nx/devkit';
11
+ export default function update(tree: Tree): Promise<void>;
12
+ //# sourceMappingURL=update-documentation-typedoc-plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-documentation-typedoc-plugins.d.ts","sourceRoot":"","sources":["../../../src/migrations/3-23-0/update-documentation-typedoc-plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAA4C,MAAM,YAAY,CAAC;AA6D5E,wBAA8B,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA2H9D"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Migration: Add TypeDoc plugin auto-discovery to documentation sites
4
+ *
5
+ * For each documentation site under unisphere/documentation/:
6
+ * - Creates plugins/discover-typedoc-plugins.mjs (re-discovery script)
7
+ * - Creates plugins/typedoc-plugins.ts (auto-discovered plugin config)
8
+ * - Updates docusaurus.config.ts to import from ./plugins/typedoc-plugins
9
+ * - Adds "discover-plugins" script to the site's package.json
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.default = update;
13
+ const devkit_1 = require("@nx/devkit");
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const discover_typedoc_plugins_1 = require("../../generators/add-documentation/discover-typedoc-plugins");
17
+ const TYPEDOC_IMPORT = "import typedocPlugins from './plugins/typedoc-plugins';";
18
+ /**
19
+ * Inserts the typedocPlugins import after the last import statement.
20
+ */
21
+ function addTypedocImport(content) {
22
+ if (content.includes(TYPEDOC_IMPORT))
23
+ return content;
24
+ const lines = content.split('\n');
25
+ let lastImportIndex = -1;
26
+ for (let i = 0; i < lines.length; i++) {
27
+ if (lines[i].startsWith('import '))
28
+ lastImportIndex = i;
29
+ }
30
+ if (lastImportIndex === -1)
31
+ return content;
32
+ lines.splice(lastImportIndex + 1, 0, TYPEDOC_IMPORT);
33
+ return lines.join('\n');
34
+ }
35
+ /**
36
+ * Replaces the plugins: [...] array (possibly multi-line) with plugins: typedocPlugins,
37
+ * Uses bracket counting to handle nested arrays safely.
38
+ */
39
+ function replacePluginsSection(content) {
40
+ const pluginsMatch = content.match(/(\n[ \t]*plugins:\s*)\[/);
41
+ if (!pluginsMatch || pluginsMatch.index === undefined)
42
+ return content;
43
+ const bracketStart = pluginsMatch.index + pluginsMatch[0].length - 1;
44
+ // Count brackets to find closing ]
45
+ let depth = 0;
46
+ let i = bracketStart;
47
+ while (i < content.length) {
48
+ if (content[i] === '[')
49
+ depth++;
50
+ else if (content[i] === ']') {
51
+ depth--;
52
+ if (depth === 0)
53
+ break;
54
+ }
55
+ i++;
56
+ }
57
+ // i is at closing ], consume optional comma and rest of line
58
+ const lineEnd = content.indexOf('\n', i);
59
+ const fullSection = content.substring(pluginsMatch.index + 1, // skip leading \n
60
+ lineEnd + 1);
61
+ const indent = pluginsMatch[1].replace('\n', '');
62
+ return content.replace(fullSection, `${indent}typedocPlugins,\n`);
63
+ }
64
+ async function update(tree) {
65
+ devkit_1.logger.info('🔄 Adding TypeDoc plugin auto-discovery to documentation sites...');
66
+ // Read discover script from generator templates
67
+ const discoverScriptContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../generators/add-documentation/templates/plugins/discover-typedoc-plugins.mjs'), 'utf-8');
68
+ const docsBasePath = 'unisphere/documentation';
69
+ if (!tree.exists(docsBasePath)) {
70
+ devkit_1.logger.info('â„šī¸ No documentation sites found, skipping');
71
+ return;
72
+ }
73
+ const docsSites = tree.children(docsBasePath);
74
+ if (docsSites.length === 0) {
75
+ devkit_1.logger.info('â„šī¸ No documentation sites found, skipping');
76
+ return;
77
+ }
78
+ let createdCount = 0;
79
+ let updatedCount = 0;
80
+ let skippedCount = 0;
81
+ for (const site of docsSites) {
82
+ const sitePath = `${docsBasePath}/${site}`;
83
+ try {
84
+ // 1. Create plugins/discover-typedoc-plugins.mjs (idempotent)
85
+ const discoverScriptPath = `${sitePath}/plugins/discover-typedoc-plugins.mjs`;
86
+ const existingDiscoverScript = tree.exists(discoverScriptPath)
87
+ ? tree.read(discoverScriptPath, 'utf-8') || ''
88
+ : null;
89
+ if (existingDiscoverScript?.trim() === discoverScriptContent.trim()) {
90
+ devkit_1.logger.info(`â„šī¸ ${discoverScriptPath} already up to date`);
91
+ }
92
+ else {
93
+ tree.write(discoverScriptPath, discoverScriptContent);
94
+ devkit_1.logger.info(`✅ ${existingDiscoverScript === null ? 'Created' : 'Updated'} ${discoverScriptPath}`);
95
+ }
96
+ // 2. Create plugins/typedoc-plugins.ts with auto-discovered content (idempotent)
97
+ const typedocPluginsPath = `${sitePath}/plugins/typedoc-plugins.ts`;
98
+ const discovered = (0, discover_typedoc_plugins_1.discoverTypedocPlugins)(tree, sitePath);
99
+ const pluginsCode = (0, discover_typedoc_plugins_1.buildTypedocPluginsCode)(discovered);
100
+ const typedocPluginsContent = `// Auto-generated by plugins/discover-typedoc-plugins.mjs\n` +
101
+ `// Run "npm run discover-plugins" to regenerate\n` +
102
+ `\n` +
103
+ `// eslint-disable-next-line @typescript-eslint/no-explicit-any\n` +
104
+ `const typedocPlugins: any[] = ${pluginsCode};\n` +
105
+ `\n` +
106
+ `export default typedocPlugins;\n`;
107
+ const existingTypedocPlugins = tree.exists(typedocPluginsPath)
108
+ ? tree.read(typedocPluginsPath, 'utf-8') || ''
109
+ : null;
110
+ if (existingTypedocPlugins?.trim() === typedocPluginsContent.trim()) {
111
+ devkit_1.logger.info(`â„šī¸ ${typedocPluginsPath} already up to date`);
112
+ }
113
+ else {
114
+ tree.write(typedocPluginsPath, typedocPluginsContent);
115
+ devkit_1.logger.info(`✅ ${existingTypedocPlugins === null ? 'Created' : 'Updated'} ${typedocPluginsPath} (${discovered.length} package(s) discovered)`);
116
+ }
117
+ // 3. Update docusaurus.config.ts
118
+ const configPath = `${sitePath}/docusaurus.config.ts`;
119
+ if (tree.exists(configPath)) {
120
+ let configContent = tree.read(configPath, 'utf-8') || '';
121
+ if (configContent.includes(TYPEDOC_IMPORT)) {
122
+ devkit_1.logger.info(`â„šī¸ ${configPath} already migrated, skipping`);
123
+ skippedCount++;
124
+ }
125
+ else {
126
+ configContent = addTypedocImport(configContent);
127
+ configContent = replacePluginsSection(configContent);
128
+ tree.write(configPath, configContent);
129
+ devkit_1.logger.info(`✅ Updated ${configPath}`);
130
+ updatedCount++;
131
+ }
132
+ }
133
+ else {
134
+ devkit_1.logger.warn(`âš ī¸ ${configPath} not found, skipping config update`);
135
+ }
136
+ // 4. Add discover-plugins script to package.json
137
+ const pkgPath = `${sitePath}/package.json`;
138
+ if (tree.exists(pkgPath)) {
139
+ const pkg = (0, devkit_1.readJson)(tree, pkgPath);
140
+ if (!pkg.scripts?.['discover-plugins']) {
141
+ pkg.scripts = pkg.scripts || {};
142
+ pkg.scripts['discover-plugins'] =
143
+ 'node plugins/discover-typedoc-plugins.mjs';
144
+ (0, devkit_1.writeJson)(tree, pkgPath, pkg);
145
+ devkit_1.logger.info(`✅ Added discover-plugins script to ${pkgPath}`);
146
+ }
147
+ else {
148
+ devkit_1.logger.info(`â„šī¸ discover-plugins script already exists in ${pkgPath}`);
149
+ }
150
+ }
151
+ createdCount++;
152
+ }
153
+ catch (error) {
154
+ const msg = error instanceof Error ? error.message : 'Unknown error';
155
+ devkit_1.logger.warn(`âš ī¸ Failed to update ${sitePath}: ${msg}`);
156
+ }
157
+ }
158
+ devkit_1.logger.info(`✅ Processed ${docsSites.length} documentation site(s): ${createdCount} processed, ${skippedCount} skipped`);
159
+ await (0, devkit_1.formatFiles)(tree);
160
+ }
package/migrations.json CHANGED
@@ -378,6 +378,14 @@
378
378
  "cli": {
379
379
  "postUpdateMessage": "✅ ESLint ignoredFiles updated to cover vite.config.{ts,mts,js,mjs} and rollup.config.{js,mjs}"
380
380
  }
381
+ },
382
+ "3-23-0-update-documentation-typedoc-plugins": {
383
+ "version": "3.23.0",
384
+ "description": "Adds TypeDoc plugin auto-discovery to documentation sites",
385
+ "factory": "./dist/migrations/3-23-0/update-documentation-typedoc-plugins.js",
386
+ "cli": {
387
+ "postUpdateMessage": "✅ TypeDoc plugin auto-discovery added to documentation sites. Run 'npm run discover-plugins' inside any docs site to refresh plugins."
388
+ }
381
389
  }
382
390
  },
383
391
  "packageJsonUpdates": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unisphere/nx",
3
- "version": "3.22.0",
3
+ "version": "3.23.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1,5 +0,0 @@
1
- <svg width="1280" height="102" viewBox="0 0 1280 102" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M-369 51L-364.188 43.1783L-359.376 35.5491L-354.564 28.3005L-349.752 21.6107L-344.94 15.6447L-340.128 10.5491L-335.316 6.44967L-330.504 3.44717L-325.692 1.61558L-320.88 1L-316.068 1.61558L-311.256 3.44717L-306.444 6.44967L-301.632 10.5491L-296.82 15.6447L-292.008 21.6107L-287.195 28.3005L-282.383 35.5491L-277.571 43.1783L-272.759 51L-267.947 58.8217L-263.135 66.4509L-258.323 73.6995L-253.511 80.3893L-248.699 86.3553L-243.887 91.4509L-239.075 95.5503L-234.263 98.5528L-229.451 100.384L-224.639 101L-219.827 100.384L-215.015 98.5528L-210.203 95.5503L-205.391 91.4509L-200.579 86.3553L-195.767 80.3893L-190.955 73.6995L-186.143 66.4509L-181.331 58.8217L-176.519 51L-171.707 43.1783L-166.895 35.5491L-162.083 28.3005L-157.271 21.6107L-152.459 15.6447L-147.647 10.5491L-142.835 6.44967L-138.023 3.44717L-133.211 1.61558L-128.399 1L-123.586 1.61558L-118.774 3.44717L-113.962 6.44967L-109.15 10.5491L-104.338 15.6447L-99.5263 21.6107L-94.7143 28.3005L-89.9023 35.5491L-85.0902 43.1783L-80.2782 51L-75.4662 58.8217L-70.6541 66.4509L-65.8421 73.6995L-61.0301 80.3893L-56.218 86.3553L-51.406 91.4509L-46.594 95.5503L-41.782 98.5528L-36.9699 100.384L-32.1579 101L-27.3459 100.384L-22.5338 98.5528L-17.7218 95.5503L-12.9098 91.4509L-8.09775 86.3553L-3.28574 80.3893L1.52631 73.6995L6.33832 66.4509L11.1504 58.8217L15.9624 51L20.7744 43.1783L25.5865 35.5491L30.3985 28.3005L35.2105 21.6107L40.0225 15.6447L44.8346 10.5491L49.6466 6.44967L54.4586 3.44717L59.2707 1.61558L64.0827 1L68.8947 1.61558L73.7068 3.44717L78.5188 6.44967L83.3308 10.5491L88.1428 15.6447L92.9549 21.6107L97.7669 28.3005L102.579 35.5491L107.391 43.1783L112.203 51L117.015 58.8217L121.827 66.4509L126.639 73.6995L131.451 80.3893L136.263 86.3553L141.075 91.4509L145.887 95.5503L150.699 98.5528L155.511 100.384L160.323 101L165.135 100.384L169.947 98.5528L174.759 95.5503L179.571 91.4509L184.383 86.3553L189.195 80.3893L194.008 73.6995L198.82 66.4509L203.632 58.8217L208.444 51L213.256 43.1783L218.068 35.5491L222.88 28.3005L227.692 21.6107L232.504 15.6447L237.316 10.5491L242.128 6.44967L246.94 3.44717L251.752 1.61558L256.564 1L261.376 1.61558L266.188 3.44717L271 6.44967L275.812 10.5491L280.624 15.6447L285.436 21.6107L290.248 28.3005L295.06 35.5491L299.872 43.1783L304.684 51L309.496 58.8217L314.308 66.4509L319.12 73.6995L323.932 80.3893L328.744 86.3553L333.556 91.4509L338.368 95.5503L343.18 98.5528L347.992 100.384L352.805 101L357.617 100.384L362.429 98.5528L367.241 95.5503L372.053 91.4509L376.865 86.3553L381.677 80.3893L386.489 73.6995L391.301 66.4509L396.113 58.8217L400.925 51L405.737 43.1783L410.549 35.5491L415.361 28.3005L420.173 21.6107L424.985 15.6447L429.797 10.5491L434.609 6.44967L439.421 3.44717L444.233 1.61558L449.045 1L453.857 1.61558L458.669 3.44717L463.481 6.44967L468.293 10.5491L473.105 15.6447L477.917 21.6107L482.729 28.3005L487.541 35.5491L492.353 43.1783L497.165 51L501.977 58.8217L506.789 66.4509L511.601 73.6995L516.414 80.3893L521.226 86.3553L526.038 91.4509L530.85 95.5503L535.662 98.5528L540.474 100.384L545.286 101L550.098 100.384L554.91 98.5528L559.722 95.5503L564.534 91.4509L569.346 86.3553L574.158 80.3893L578.97 73.6995L583.782 66.4509L588.594 58.8217L593.406 51L598.218 43.1783L603.03 35.5491L607.842 28.3005L612.654 21.6107L617.466 15.6447L622.278 10.5491L627.09 6.44967L631.902 3.44717L636.714 1.61558L641.526 1L646.338 1.61558L651.15 3.44717L655.962 6.44967L660.774 10.5491L665.586 15.6447L670.398 21.6107L675.21 28.3005L680.022 35.5491L684.835 43.1783L689.647 51L694.459 58.8217L699.271 66.4509L704.083 73.6995L708.895 80.3893L713.707 86.3553L718.519 91.4509L723.331 95.5503L728.143 98.5528L732.955 100.384L737.767 101L742.579 100.384L747.391 98.5528L752.203 95.5503L757.015 91.4509L761.827 86.3553L766.639 80.3893L771.451 73.6995L776.263 66.4509L781.075 58.8217L785.887 51L790.699 43.1783L795.511 35.5491L800.323 28.3005L805.135 21.6107L809.947 15.6447L814.759 10.5491L819.571 6.44967L824.383 3.44717L829.195 1.61558L834.007 1L838.819 1.61558L843.631 3.44717L848.444 6.44967L853.256 10.5491L858.068 15.6447L862.88 21.6107L867.692 28.3005L872.504 35.5491L877.316 43.1783L882.128 51L886.94 58.8217L891.752 66.4509L896.564 73.6995L901.376 80.3893L906.188 86.3553L911 91.4509L915.812 95.5503L920.624 98.5528L925.436 100.384L930.248 101L935.06 100.384L939.872 98.5528L944.684 95.5503L949.496 91.4509L954.308 86.3553L959.12 80.3893L963.932 73.6995L968.744 66.4509L973.556 58.8217L978.368 51L983.18 43.1783L987.992 35.5491L992.804 28.3005L997.616 21.6107L1002.43 15.6447L1007.24 10.5491L1012.05 6.44967L1016.86 3.44717L1021.68 1.61558L1026.49 1L1031.3 1.61558L1036.11 3.44717L1040.92 6.44967L1045.74 10.5491L1050.55 15.6447L1055.36 21.6107L1060.17 28.3005L1064.98 35.5491L1069.8 43.1783L1074.61 51L1079.42 58.8217L1084.23 66.4509L1089.05 73.6995L1093.86 80.3893L1098.67 86.3553L1103.48 91.4509L1108.29 95.5503L1113.11 98.5528L1117.92 100.384L1122.73 101L1127.54 100.384L1132.35 98.5528L1137.17 95.5503L1141.98 91.4509L1146.79 86.3553L1151.6 80.3893L1156.41 73.6995L1161.23 66.4509L1166.04 58.8217L1170.85 51L1175.66 43.1783L1180.47 35.5491L1185.29 28.3005L1190.1 21.6107L1194.91 15.6447L1199.72 10.5491L1204.53 6.44967L1209.35 3.44717L1214.16 1.61558L1218.97 1L1223.78 1.61558L1228.59 3.44717L1233.41 6.44967L1238.22 10.5491L1243.03 15.6447L1247.84 21.6107L1252.65 28.3005L1257.47 35.5491L1262.28 43.1783L1267.09 51L1271.9 58.8217L1276.71 66.4509L1281.53 73.6995L1286.34 80.3893L1291.15 86.3553L1295.96 91.4509L1300.77 95.5503L1305.59 98.5528L1310.4 100.384L1315.21 101L1320.02 100.384L1324.83 98.5528L1329.65 95.5503L1334.46 91.4509L1339.27 86.3553L1344.08 80.3893L1348.89 73.6995L1353.71 66.4509L1358.52 58.8217L1363.33 51L1368.14 43.1783L1372.95 35.5491L1377.77 28.3005L1382.58 21.6107L1387.39 15.6447L1392.2 10.5491L1397.01 6.44967L1401.83 3.44717L1406.64 1.61558L1411.45 1L1416.26 1.61558L1421.08 3.44717L1425.89 6.44967L1430.7 10.5491L1435.51 15.6447L1440.32 21.6107L1445.14 28.3005L1449.95 35.5491L1454.76 43.1783L1459.57 51L1464.38 58.8217L1469.2 66.4509L1474.01 73.6995L1478.82 80.3893L1483.63 86.3553L1488.44 91.4509L1493.26 95.5503L1498.07 98.5528L1502.88 100.384L1507.69 101L1512.5 100.384L1517.32 98.5528L1522.13 95.5503L1526.94 91.4509L1531.75 86.3553L1536.56 80.3893L1541.38 73.6995L1546.19 66.4509L1551 58.8217" fill="#FF9DFF"/>
3
- <path d="M-369 51L-364.188 43.1783L-359.376 35.5491L-354.564 28.3005L-349.752 21.6107L-344.94 15.6447L-340.128 10.5491L-335.316 6.44967L-330.504 3.44717L-325.692 1.61558L-320.88 1L-316.068 1.61558L-311.256 3.44717L-306.444 6.44967L-301.632 10.5491L-296.82 15.6447L-292.008 21.6107L-287.195 28.3005L-282.383 35.5491L-277.571 43.1783L-272.759 51L-267.947 58.8217L-263.135 66.4509L-258.323 73.6995L-253.511 80.3893L-248.699 86.3553L-243.887 91.4509L-239.075 95.5503L-234.263 98.5528L-229.451 100.384L-224.639 101L-219.827 100.384L-215.015 98.5528L-210.203 95.5503L-205.391 91.4509L-200.579 86.3553L-195.767 80.3893L-190.955 73.6995L-186.143 66.4509L-181.331 58.8217L-176.519 51L-171.707 43.1783L-166.895 35.5491L-162.083 28.3005L-157.271 21.6107L-152.459 15.6447L-147.647 10.5491L-142.835 6.44967L-138.023 3.44717L-133.211 1.61558L-128.399 1L-123.586 1.61558L-118.774 3.44717L-113.962 6.44967L-109.15 10.5491L-104.338 15.6447L-99.5263 21.6107L-94.7143 28.3005L-89.9023 35.5491L-85.0902 43.1783L-80.2782 51L-75.4662 58.8217L-70.6542 66.4509L-65.8421 73.6995L-61.0301 80.3893L-56.2181 86.3553L-51.406 91.4509L-46.594 95.5503L-41.782 98.5528L-36.9699 100.384L-32.1579 101L-27.3459 100.384L-22.5339 98.5528L-17.7218 95.5503L-12.9098 91.4509L-8.09776 86.3553L-3.28573 80.3893L1.5263 73.6995L6.33833 66.4509L11.1504 58.8217L15.9624 51L20.7744 43.1783L25.5864 35.5491L30.3985 28.3005L35.2105 21.6107L40.0225 15.6447L44.8346 10.5491L49.6466 6.44967L54.4586 3.44717L59.2707 1.61558L64.0827 1L68.8947 1.61558L73.7067 3.44717L78.5188 6.44967L83.3308 10.5491L88.1428 15.6447L92.9549 21.6107L97.7669 28.3005L102.579 35.5491L107.391 43.1783L112.203 51L117.015 58.8217L121.827 66.4509L126.639 73.6995L131.451 80.3893L136.263 86.3553L141.075 91.4509L145.887 95.5503L150.699 98.5528L155.511 100.384L160.323 101L165.135 100.384L169.947 98.5528L174.759 95.5503L179.571 91.4509L184.383 86.3553L189.195 80.3893L194.007 73.6995L198.82 66.4509L203.632 58.8217L208.444 51L213.256 43.1783L218.068 35.5491L222.88 28.3005L227.692 21.6107L232.504 15.6447L237.316 10.5491L242.128 6.44967L246.94 3.44717L251.752 1.61558L256.564 1L261.376 1.61558L266.188 3.44717L271 6.44967L275.812 10.5491L280.624 15.6447L285.436 21.6107L290.248 28.3005L295.06 35.5491L299.872 43.1783L304.684 51L309.496 58.8217L314.308 66.4509L319.12 73.6995L323.932 80.3893L328.744 86.3553L333.556 91.4509L338.368 95.5503L343.18 98.5528L347.992 100.384L352.804 101L357.617 100.384L362.429 98.5528L367.241 95.5503L372.053 91.4509L376.865 86.3553L381.677 80.3893L386.489 73.6995L391.301 66.4509L396.113 58.8217L400.925 51L405.737 43.1783L410.549 35.5491L415.361 28.3005L420.173 21.6107L424.985 15.6447L429.797 10.5491L434.609 6.44967L439.421 3.44717L444.233 1.61558L449.045 1L453.857 1.61558L458.669 3.44717L463.481 6.44967L468.293 10.5491L473.105 15.6447L477.917 21.6107L482.729 28.3005L487.541 35.5491L492.353 43.1783L497.165 51L501.977 58.8217L506.789 66.4509L511.601 73.6995L516.413 80.3893L521.226 86.3553L526.038 91.4509L530.85 95.5503L535.662 98.5528L540.474 100.384L545.286 101L550.098 100.384L554.91 98.5528L559.722 95.5503L564.534 91.4509L569.346 86.3553L574.158 80.3893L578.97 73.6995L583.782 66.4509L588.594 58.8217L593.406 51L598.218 43.1783L603.03 35.5491L607.842 28.3005L612.654 21.6107L617.466 15.6447L622.278 10.5491L627.09 6.44967L631.902 3.44717L636.714 1.61558L641.526 1L646.338 1.61558L651.15 3.44717L655.962 6.44967L660.774 10.5491L665.586 15.6447L670.398 21.6107L675.21 28.3005L680.023 35.5491L684.835 43.1783L689.647 51L694.459 58.8217L699.271 66.4509L704.083 73.6995L708.895 80.3893L713.707 86.3553L718.519 91.4509L723.331 95.5503L728.143 98.5528L732.955 100.384L737.767 101L742.579 100.384L747.391 98.5528L752.203 95.5503L757.015 91.4509L761.827 86.3553L766.639 80.3893L771.451 73.6995L776.263 66.4509L781.075 58.8217L785.887 51L790.699 43.1783L795.511 35.5491L800.323 28.3005L805.135 21.6107L809.947 15.6447L814.759 10.5491L819.571 6.44967L824.383 3.44717L829.195 1.61558L834.007 1L838.819 1.61558L843.632 3.44717L848.444 6.44967L853.256 10.5491L858.068 15.6447L862.88 21.6107L867.692 28.3005L872.504 35.5491L877.316 43.1783L882.128 51L886.94 58.8217L891.752 66.4509L896.564 73.6995L901.376 80.3893L906.188 86.3553L911 91.4509L915.812 95.5503L920.624 98.5528L925.436 100.384L930.248 101L935.06 100.384L939.872 98.5528L944.684 95.5503L949.496 91.4509L954.308 86.3553L959.12 80.3893L963.932 73.6995L968.744 66.4509L973.556 58.8217L978.368 51L983.18 43.1783L987.992 35.5491L992.804 28.3005L997.616 21.6107L1002.43 15.6447L1007.24 10.5491L1012.05 6.44967L1016.86 3.44717L1021.68 1.61558L1026.49 1L1031.3 1.61558L1036.11 3.44717L1040.92 6.44967L1045.74 10.5491L1050.55 15.6447L1055.36 21.6107L1060.17 28.3005L1064.98 35.5491L1069.8 43.1783L1074.61 51L1079.42 58.8217L1084.23 66.4509L1089.05 73.6995L1093.86 80.3893L1098.67 86.3553L1103.48 91.4509L1108.29 95.5503L1113.11 98.5528L1117.92 100.384L1122.73 101L1127.54 100.384L1132.35 98.5528L1137.17 95.5503L1141.98 91.4509L1146.79 86.3553L1151.6 80.3893L1156.41 73.6995L1161.23 66.4509L1166.04 58.8217L1170.85 51L1175.66 43.1783L1180.47 35.5491L1185.29 28.3005L1190.1 21.6107L1194.91 15.6447L1199.72 10.5491L1204.53 6.44967L1209.35 3.44717L1214.16 1.61558L1218.97 1L1223.78 1.61558L1228.59 3.44717L1233.41 6.44967L1238.22 10.5491L1243.03 15.6447L1247.84 21.6107L1252.65 28.3005L1257.47 35.5491L1262.28 43.1783L1267.09 51L1271.9 58.8217L1276.71 66.4509L1281.53 73.6995L1286.34 80.3893L1291.15 86.3553L1295.96 91.4509L1300.77 95.5503L1305.59 98.5528L1310.4 100.384L1315.21 101L1320.02 100.384L1324.83 98.5528L1329.65 95.5503L1334.46 91.4509L1339.27 86.3553L1344.08 80.3893L1348.89 73.6995L1353.71 66.4509L1358.52 58.8217L1363.33 51L1368.14 43.1783L1372.95 35.5491L1377.77 28.3005L1382.58 21.6107L1387.39 15.6447L1392.2 10.5491L1397.01 6.44967L1401.83 3.44717L1406.64 1.61558L1411.45 1L1416.26 1.61558L1421.08 3.44717L1425.89 6.44967L1430.7 10.5491L1435.51 15.6447L1440.32 21.6107L1445.14 28.3005L1449.95 35.5491L1454.76 43.1783L1459.57 51L1464.38 58.8217L1469.2 66.4509L1474.01 73.6995L1478.82 80.3893L1483.63 86.3553L1488.44 91.4509L1493.26 95.5503L1498.07 98.5528L1502.88 100.384L1507.69 101L1512.5 100.384L1517.32 98.5528L1522.13 95.5503L1526.94 91.4509L1531.75 86.3553L1536.56 80.3893L1541.38 73.6995L1546.19 66.4509L1551 58.8217" stroke="currentColor" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
4
- <path d="M-272 51L-267.188 43.1783L-262.376 35.5491L-257.564 28.3005L-252.752 21.6107L-247.94 15.6447L-243.128 10.5491L-238.316 6.44967L-233.504 3.44717L-228.692 1.61558L-223.88 1L-219.068 1.61558L-214.256 3.44717L-209.444 6.44967L-204.632 10.5491L-199.82 15.6447L-195.008 21.6107L-190.195 28.3005L-185.383 35.5491L-180.571 43.1783L-175.759 51L-170.947 58.8217L-166.135 66.4509L-161.323 73.6995L-156.511 80.3893L-151.699 86.3553L-146.887 91.4509L-142.075 95.5503L-137.263 98.5528L-132.451 100.384L-127.639 101L-122.827 100.384L-118.015 98.5528L-113.203 95.5503L-108.391 91.4509L-103.579 86.3553L-98.7669 80.3893L-93.9549 73.6995L-89.1429 66.4509L-84.3308 58.8217L-79.5188 51L-74.7068 43.1783L-69.8947 35.5491L-65.0827 28.3005L-60.2707 21.6107L-55.4587 15.6447L-50.6466 10.5491L-45.8346 6.44967L-41.0226 3.44717L-36.2105 1.61558L-31.3985 1L-26.5865 1.61558L-21.7744 3.44717L-16.9624 6.44967L-12.1504 10.5491L-7.33836 15.6447L-2.52633 21.6107L2.2857 28.3005L7.09773 35.5491L11.9098 43.1783L16.7218 51L21.5338 58.8217L26.3458 66.4509L31.1579 73.6995L35.9699 80.3893L40.7819 86.3553L45.594 91.4509L50.406 95.5503L55.218 98.5528L60.0301 100.384L64.8421 101L69.6541 100.384L74.4661 98.5528L79.2782 95.5503L84.0902 91.4509L88.9022 86.3553L93.7143 80.3893L98.5263 73.6995L103.338 66.4509L108.15 58.8217L112.962 51L117.774 43.1783L122.586 35.5491L127.398 28.3005L132.211 21.6107L137.023 15.6447L141.835 10.5491L146.647 6.44967L151.459 3.44717L156.271 1.61558L161.083 1L165.895 1.61558L170.707 3.44717L175.519 6.44967L180.331 10.5491L185.143 15.6447L189.955 21.6107L194.767 28.3005L199.579 35.5491L204.391 43.1783L209.203 51L214.015 58.8217L218.827 66.4509L223.639 73.6995L228.451 80.3893L233.263 86.3553L238.075 91.4509L242.887 95.5503L247.699 98.5528L252.511 100.384L257.323 101L262.135 100.384L266.947 98.5528L271.759 95.5503L276.571 91.4509L281.383 86.3553L286.195 80.3893L291.007 73.6995L295.82 66.4509L300.632 58.8217L305.444 51L310.256 43.1783L315.068 35.5491L319.88 28.3005L324.692 21.6107L329.504 15.6447L334.316 10.5491L339.128 6.44967L343.94 3.44717L348.752 1.61558L353.564 1L358.376 1.61558L363.188 3.44717L368 6.44967L372.812 10.5491L377.624 15.6447L382.436 21.6107L387.248 28.3005L392.06 35.5491L396.872 43.1783L401.684 51L406.496 58.8217L411.308 66.4509L416.12 73.6995L420.932 80.3893L425.744 86.3553L430.556 91.4509L435.368 95.5503L440.18 98.5528L444.992 100.384L449.804 101L454.617 100.384L459.429 98.5528L464.241 95.5503L469.053 91.4509L473.865 86.3553L478.677 80.3893L483.489 73.6995L488.301 66.4509L493.113 58.8217L497.925 51L502.737 43.1783L507.549 35.5491L512.361 28.3005L517.173 21.6107L521.985 15.6447L526.797 10.5491L531.609 6.44967L536.421 3.44717L541.233 1.61558L546.045 1L550.857 1.61558L555.669 3.44717L560.481 6.44967L565.293 10.5491L570.105 15.6447L574.917 21.6107L579.729 28.3005L584.541 35.5491L589.353 43.1783L594.165 51L598.977 58.8217L603.789 66.4509L608.601 73.6995L613.413 80.3893L618.226 86.3553L623.038 91.4509L627.85 95.5503L632.662 98.5528L637.474 100.384L642.286 101L647.098 100.384L651.91 98.5528L656.722 95.5503L661.534 91.4509L666.346 86.3553L671.158 80.3893L675.97 73.6995L680.782 66.4509L685.594 58.8217L690.406 51L695.218 43.1783L700.03 35.5491L704.842 28.3005L709.654 21.6107L714.466 15.6447L719.278 10.5491L724.09 6.44967L728.902 3.44717L733.714 1.61558L738.526 1L743.338 1.61558L748.15 3.44717L752.962 6.44967L757.774 10.5491L762.586 15.6447L767.398 21.6107L772.21 28.3005L777.023 35.5491L781.835 43.1783L786.647 51L791.459 58.8217L796.271 66.4509L801.083 73.6995L805.895 80.3893L810.707 86.3553L815.519 91.4509L820.331 95.5503L825.143 98.5528L829.955 100.384L834.767 101L839.579 100.384L844.391 98.5528L849.203 95.5503L854.015 91.4509L858.827 86.3553L863.639 80.3893L868.451 73.6995L873.263 66.4509L878.075 58.8217L882.887 51L887.699 43.1783L892.511 35.5491L897.323 28.3005L902.135 21.6107L906.947 15.6447L911.759 10.5491L916.571 6.44967L921.383 3.44717L926.195 1.61558L931.007 1L935.819 1.61558L940.632 3.44717L945.444 6.44967L950.256 10.5491L955.068 15.6447L959.88 21.6107L964.692 28.3005L969.504 35.5491L974.316 43.1783L979.128 51L983.94 58.8217L988.752 66.4509L993.564 73.6995L998.376 80.3893L1003.19 86.3553L1008 91.4509L1012.81 95.5503L1017.62 98.5528L1022.44 100.384L1027.25 101L1032.06 100.384L1036.87 98.5528L1041.68 95.5503L1046.5 91.4509L1051.31 86.3553L1056.12 80.3893L1060.93 73.6995L1065.74 66.4509L1070.56 58.8217L1075.37 51L1080.18 43.1783L1084.99 35.5491L1089.8 28.3005L1094.62 21.6107L1099.43 15.6447L1104.24 10.5491L1109.05 6.44967L1113.86 3.44717L1118.68 1.61558L1123.49 1L1128.3 1.61558L1133.11 3.44717L1137.92 6.44967L1142.74 10.5491L1147.55 15.6447L1152.36 21.6107L1157.17 28.3005L1161.98 35.5491L1166.8 43.1783L1171.61 51L1176.42 58.8217L1181.23 66.4509L1186.05 73.6995L1190.86 80.3893L1195.67 86.3553L1200.48 91.4509L1205.29 95.5503L1210.11 98.5528L1214.92 100.384L1219.73 101L1224.54 100.384L1229.35 98.5528L1234.17 95.5503L1238.98 91.4509L1243.79 86.3553L1248.6 80.3893L1253.41 73.6995L1258.23 66.4509L1263.04 58.8217L1267.85 51L1272.66 43.1783L1277.47 35.5491L1282.29 28.3005L1287.1 21.6107L1291.91 15.6447L1296.72 10.5491L1301.53 6.44967L1306.35 3.44717L1311.16 1.61558L1315.97 1L1320.78 1.61558L1325.59 3.44717L1330.41 6.44967L1335.22 10.5491L1340.03 15.6447L1344.84 21.6107L1349.65 28.3005L1354.47 35.5491L1359.28 43.1783L1364.09 51L1368.9 58.8217L1373.71 66.4509L1378.53 73.6995L1383.34 80.3893L1388.15 86.3553L1392.96 91.4509L1397.77 95.5503L1402.59 98.5528L1407.4 100.384L1412.21 101L1417.02 100.384L1421.83 98.5528L1426.65 95.5503L1431.46 91.4509L1436.27 86.3553L1441.08 80.3893L1445.89 73.6995L1450.71 66.4509L1455.52 58.8217L1460.33 51L1465.14 43.1783L1469.95 35.5491L1474.77 28.3005L1479.58 21.6107L1484.39 15.6447L1489.2 10.5491L1494.01 6.44967L1498.83 3.44717L1503.64 1.61558L1508.45 1L1513.26 1.61558L1518.08 3.44717L1522.89 6.44967L1527.7 10.5491L1532.51 15.6447L1537.32 21.6107L1542.14 28.3005L1546.95 35.5491L1551.76 43.1783L1556.57 51L1561.38 58.8217L1566.2 66.4509L1571.01 73.6995L1575.82 80.3893L1580.63 86.3553L1585.44 91.4509L1590.26 95.5503L1595.07 98.5528L1599.88 100.384L1604.69 101L1609.5 100.384L1614.32 98.5528L1619.13 95.5503L1623.94 91.4509L1628.75 86.3553L1633.56 80.3893L1638.38 73.6995L1643.19 66.4509L1648 58.8217" stroke="currentColor" stroke-miterlimit="10" stroke-linecap="square" stroke-linejoin="round"/>
5
- </svg>