@memberjunction/open-app-engine 0.0.1 → 5.1.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 (58) hide show
  1. package/dist/dependency/dependency-resolver.d.ts +23 -0
  2. package/dist/dependency/dependency-resolver.d.ts.map +1 -0
  3. package/dist/dependency/dependency-resolver.js +63 -0
  4. package/dist/dependency/dependency-resolver.js.map +1 -0
  5. package/dist/dependency/version-checker.d.ts +8 -0
  6. package/dist/dependency/version-checker.d.ts.map +1 -0
  7. package/dist/dependency/version-checker.js +65 -0
  8. package/dist/dependency/version-checker.js.map +1 -0
  9. package/dist/github/github-client.d.ts +29 -0
  10. package/dist/github/github-client.d.ts.map +1 -0
  11. package/dist/github/github-client.js +127 -0
  12. package/dist/github/github-client.js.map +1 -0
  13. package/dist/index.d.ts +25 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +13 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/install/client-bootstrap-gen.d.ts +8 -0
  18. package/dist/install/client-bootstrap-gen.d.ts.map +1 -0
  19. package/dist/install/client-bootstrap-gen.js +35 -0
  20. package/dist/install/client-bootstrap-gen.js.map +1 -0
  21. package/dist/install/config-manager.d.ts +15 -0
  22. package/dist/install/config-manager.d.ts.map +1 -0
  23. package/dist/install/config-manager.js +114 -0
  24. package/dist/install/config-manager.js.map +1 -0
  25. package/dist/install/history-recorder.d.ts +25 -0
  26. package/dist/install/history-recorder.d.ts.map +1 -0
  27. package/dist/install/history-recorder.js +184 -0
  28. package/dist/install/history-recorder.js.map +1 -0
  29. package/dist/install/install-orchestrator.d.ts +20 -0
  30. package/dist/install/install-orchestrator.d.ts.map +1 -0
  31. package/dist/install/install-orchestrator.js +634 -0
  32. package/dist/install/install-orchestrator.js.map +1 -0
  33. package/dist/install/migration-runner.d.ts +23 -0
  34. package/dist/install/migration-runner.d.ts.map +1 -0
  35. package/dist/install/migration-runner.js +66 -0
  36. package/dist/install/migration-runner.js.map +1 -0
  37. package/dist/install/package-manager.d.ts +19 -0
  38. package/dist/install/package-manager.d.ts.map +1 -0
  39. package/dist/install/package-manager.js +89 -0
  40. package/dist/install/package-manager.js.map +1 -0
  41. package/dist/install/schema-manager.d.ts +11 -0
  42. package/dist/install/schema-manager.d.ts.map +1 -0
  43. package/dist/install/schema-manager.js +125 -0
  44. package/dist/install/schema-manager.js.map +1 -0
  45. package/dist/manifest/manifest-loader.d.ts +10 -0
  46. package/dist/manifest/manifest-loader.d.ts.map +1 -0
  47. package/dist/manifest/manifest-loader.js +30 -0
  48. package/dist/manifest/manifest-loader.js.map +1 -0
  49. package/dist/manifest/manifest-schema.d.ts +351 -0
  50. package/dist/manifest/manifest-schema.d.ts.map +1 -0
  51. package/dist/manifest/manifest-schema.js +80 -0
  52. package/dist/manifest/manifest-schema.js.map +1 -0
  53. package/dist/types/open-app-types.d.ts +66 -0
  54. package/dist/types/open-app-types.d.ts.map +1 -0
  55. package/dist/types/open-app-types.js +2 -0
  56. package/dist/types/open-app-types.js.map +1 -0
  57. package/package.json +34 -7
  58. package/README.md +0 -45
@@ -0,0 +1,23 @@
1
+ import type { ResolvedDependency } from '../types/open-app-types.js';
2
+ export type DependencyValue = string | {
3
+ version: string;
4
+ repository: string;
5
+ };
6
+ export interface DependencyNode {
7
+ AppName: string;
8
+ Repository: string;
9
+ Dependencies: Record<string, DependencyValue>;
10
+ }
11
+ export interface DependencyResolutionResult {
12
+ Success: boolean;
13
+ InstallOrder?: ResolvedDependency[];
14
+ ErrorMessage?: string;
15
+ }
16
+ export interface InstalledAppMap {
17
+ [appName: string]: {
18
+ Version: string;
19
+ Repository: string;
20
+ };
21
+ }
22
+ export declare function ResolveDependencies(rootNode: DependencyNode, installedApps: InstalledAppMap): DependencyResolutionResult;
23
+ //# sourceMappingURL=dependency-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/dependency/dependency-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAMrE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAK/E,MAAM,WAAW,cAAc;IAE3B,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACjD;AAKD,MAAM,WAAW,0BAA0B;IAEvC,OAAO,EAAE,OAAO,CAAC;IAEjB,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAEpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,MAAM,WAAW,eAAe;IAC5B,CAAC,OAAO,EAAE,MAAM,GAAG;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAaD,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,eAAe,GAC/B,0BAA0B,CAY5B"}
@@ -0,0 +1,63 @@
1
+ import { CheckDependencyVersionCompatibility } from './version-checker.js';
2
+ export function ResolveDependencies(rootNode, installedApps) {
3
+ const visited = new Set();
4
+ const inStack = new Set();
5
+ const order = [];
6
+ const cycleError = VisitNode(rootNode.AppName, rootNode.Dependencies, visited, inStack, order, installedApps);
7
+ if (cycleError) {
8
+ return { Success: false, ErrorMessage: cycleError };
9
+ }
10
+ return { Success: true, InstallOrder: order };
11
+ }
12
+ function ParseDependencyValue(value) {
13
+ if (typeof value === 'string') {
14
+ return { versionRange: value };
15
+ }
16
+ return { versionRange: value.version, repository: value.repository };
17
+ }
18
+ function VisitNode(appName, dependencies, visited, inStack, order, installedApps) {
19
+ if (visited.has(appName)) {
20
+ return undefined;
21
+ }
22
+ if (inStack.has(appName)) {
23
+ const chain = [...inStack, appName].join(' -> ');
24
+ return `Circular dependency detected: ${chain}`;
25
+ }
26
+ inStack.add(appName);
27
+ for (const [depName, depValue] of Object.entries(dependencies)) {
28
+ const depError = VisitDependency(depName, depValue, visited, inStack, order, installedApps);
29
+ if (depError) {
30
+ return depError;
31
+ }
32
+ }
33
+ inStack.delete(appName);
34
+ visited.add(appName);
35
+ return undefined;
36
+ }
37
+ function VisitDependency(depName, depValue, visited, inStack, order, installedApps) {
38
+ const { versionRange, repository: manifestRepo } = ParseDependencyValue(depValue);
39
+ const installed = installedApps[depName];
40
+ const alreadyInstalled = installed !== undefined;
41
+ if (alreadyInstalled && installed.Version) {
42
+ const compatCheck = CheckDependencyVersionCompatibility(installed.Version, versionRange);
43
+ if (!compatCheck.Compatible) {
44
+ return `Dependency '${depName}' is installed (v${installed.Version}) but does not satisfy required range '${versionRange}': ${compatCheck.Message}`;
45
+ }
46
+ }
47
+ const resolved = {
48
+ AppName: depName,
49
+ VersionRange: versionRange,
50
+ Repository: installed?.Repository ?? manifestRepo ?? '',
51
+ AlreadyInstalled: alreadyInstalled,
52
+ InstalledVersion: installed?.Version
53
+ };
54
+ const depError = VisitNode(depName, {}, visited, inStack, order, installedApps);
55
+ if (depError) {
56
+ return depError;
57
+ }
58
+ if (!order.some(entry => entry.AppName === depName)) {
59
+ order.push(resolved);
60
+ }
61
+ return undefined;
62
+ }
63
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/dependency/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface VersionCheckResult {
2
+ Compatible: boolean;
3
+ Message?: string;
4
+ }
5
+ export declare function CheckMJVersionCompatibility(mjVersion: string, requiredRange: string): VersionCheckResult;
6
+ export declare function CheckDependencyVersionCompatibility(installedVersion: string, requiredRange: string): VersionCheckResult;
7
+ export declare function IsValidUpgrade(currentVersion: string, targetVersion: string): VersionCheckResult;
8
+ //# sourceMappingURL=version-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-checker.d.ts","sourceRoot":"","sources":["../../src/dependency/version-checker.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,kBAAkB;IAE/B,UAAU,EAAE,OAAO,CAAC;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAuBxG;AASD,wBAAgB,mCAAmC,CAC/C,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,GACtB,kBAAkB,CAuBpB;AAUD,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAuBhG"}
@@ -0,0 +1,65 @@
1
+ import semver from 'semver';
2
+ export function CheckMJVersionCompatibility(mjVersion, requiredRange) {
3
+ if (!semver.valid(mjVersion)) {
4
+ return {
5
+ Compatible: false,
6
+ Message: `Invalid MJ version: '${mjVersion}' is not a valid semver string`
7
+ };
8
+ }
9
+ if (!semver.validRange(requiredRange)) {
10
+ return {
11
+ Compatible: false,
12
+ Message: `Invalid version range in manifest: '${requiredRange}' is not a valid semver range`
13
+ };
14
+ }
15
+ if (semver.satisfies(mjVersion, requiredRange)) {
16
+ return { Compatible: true };
17
+ }
18
+ return {
19
+ Compatible: false,
20
+ Message: `MJ version ${mjVersion} does not satisfy the required range '${requiredRange}'`
21
+ };
22
+ }
23
+ export function CheckDependencyVersionCompatibility(installedVersion, requiredRange) {
24
+ if (!semver.valid(installedVersion)) {
25
+ return {
26
+ Compatible: false,
27
+ Message: `Invalid installed version: '${installedVersion}' is not a valid semver string`
28
+ };
29
+ }
30
+ if (!semver.validRange(requiredRange)) {
31
+ return {
32
+ Compatible: false,
33
+ Message: `Invalid dependency range: '${requiredRange}' is not a valid semver range`
34
+ };
35
+ }
36
+ if (semver.satisfies(installedVersion, requiredRange)) {
37
+ return { Compatible: true };
38
+ }
39
+ return {
40
+ Compatible: false,
41
+ Message: `Installed version ${installedVersion} does not satisfy required range '${requiredRange}'`
42
+ };
43
+ }
44
+ export function IsValidUpgrade(currentVersion, targetVersion) {
45
+ if (!semver.valid(currentVersion) || !semver.valid(targetVersion)) {
46
+ return {
47
+ Compatible: false,
48
+ Message: `Invalid version(s): current='${currentVersion}', target='${targetVersion}'`
49
+ };
50
+ }
51
+ if (semver.gt(targetVersion, currentVersion)) {
52
+ return { Compatible: true };
53
+ }
54
+ if (semver.eq(targetVersion, currentVersion)) {
55
+ return {
56
+ Compatible: false,
57
+ Message: `Target version ${targetVersion} is the same as the installed version`
58
+ };
59
+ }
60
+ return {
61
+ Compatible: false,
62
+ Message: `Target version ${targetVersion} is older than installed version ${currentVersion}`
63
+ };
64
+ }
65
+ //# sourceMappingURL=version-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-checker.js","sourceRoot":"","sources":["../../src/dependency/version-checker.ts"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAmB5B,MAAM,UAAU,2BAA2B,CAAC,SAAiB,EAAE,aAAqB;IAChF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,wBAAwB,SAAS,gCAAgC;SAC7E,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,uCAAuC,aAAa,+BAA+B;SAC/F,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,cAAc,SAAS,yCAAyC,aAAa,GAAG;KAC5F,CAAC;AACN,CAAC;AASD,MAAM,UAAU,mCAAmC,CAC/C,gBAAwB,EACxB,aAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,+BAA+B,gBAAgB,gCAAgC;SAC3F,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,8BAA8B,aAAa,+BAA+B;SACtF,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,qBAAqB,gBAAgB,qCAAqC,aAAa,GAAG;KACtG,CAAC;AACN,CAAC;AAUD,MAAM,UAAU,cAAc,CAAC,cAAsB,EAAE,aAAqB;IACxE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAChE,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,gCAAgC,cAAc,cAAc,aAAa,GAAG;SACxF,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QAC3C,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,kBAAkB,aAAa,uCAAuC;SAClF,CAAC;IACN,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,kBAAkB,aAAa,oCAAoC,cAAc,EAAE;KAC/F,CAAC;AACN,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface GitHubClientOptions {
2
+ Token?: string;
3
+ }
4
+ export interface GitHubRelease {
5
+ TagName: string;
6
+ PreRelease: boolean;
7
+ Draft: boolean;
8
+ CreatedAt: string;
9
+ }
10
+ export interface ManifestFetchResult {
11
+ Success: boolean;
12
+ ManifestJSON?: string;
13
+ ErrorMessage?: string;
14
+ }
15
+ export interface MigrationDownloadResult {
16
+ Success: boolean;
17
+ LocalPath?: string;
18
+ Files?: string[];
19
+ ErrorMessage?: string;
20
+ }
21
+ export declare function ParseGitHubUrl(repoUrl: string): {
22
+ Owner: string;
23
+ Repo: string;
24
+ } | null;
25
+ export declare function FetchManifestFromGitHub(repoUrl: string, version: string | undefined, options: GitHubClientOptions): Promise<ManifestFetchResult>;
26
+ export declare function ListGitHubReleases(repoUrl: string, options: GitHubClientOptions): Promise<GitHubRelease[]>;
27
+ export declare function DownloadMigrations(repoUrl: string, version: string | undefined, migrationsPath: string, localDir: string, options: GitHubClientOptions): Promise<MigrationDownloadResult>;
28
+ export declare function GetLatestVersion(repoUrl: string, options: GitHubClientOptions): Promise<string | null>;
29
+ //# sourceMappingURL=github-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/github/github-client.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,mBAAmB;IAEhC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,aAAa;IAE1B,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,OAAO,CAAC;IAEpB,KAAK,EAAE,OAAO,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,mBAAmB;IAEhC,OAAO,EAAE,OAAO,CAAC;IAEjB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,MAAM,WAAW,uBAAuB;IAEpC,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMtF;AAwBD,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAiC9B;AASD,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B;AAYD,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,uBAAuB,CAAC,CA2DlC;AASD,wBAAsB,gBAAgB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB"}
@@ -0,0 +1,127 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function ParseGitHubUrl(repoUrl) {
4
+ const match = repoUrl.match(/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);
5
+ if (!match) {
6
+ return null;
7
+ }
8
+ return { Owner: match[1], Repo: match[2] };
9
+ }
10
+ function BuildHeaders(token) {
11
+ const headers = {
12
+ 'Accept': 'application/vnd.github.v3+json',
13
+ 'User-Agent': 'open-app-engine'
14
+ };
15
+ if (token) {
16
+ headers['Authorization'] = `Bearer ${token}`;
17
+ }
18
+ return headers;
19
+ }
20
+ export async function FetchManifestFromGitHub(repoUrl, version, options) {
21
+ const parsed = ParseGitHubUrl(repoUrl);
22
+ if (!parsed) {
23
+ return { Success: false, ErrorMessage: `Invalid GitHub URL: ${repoUrl}` };
24
+ }
25
+ const ref = version ? `v${version.replace(/^v/, '')}` : 'HEAD';
26
+ const apiUrl = `https://api.github.com/repos/${parsed.Owner}/${parsed.Repo}/contents/mj-app.json?ref=${ref}`;
27
+ try {
28
+ const response = await fetch(apiUrl, {
29
+ headers: BuildHeaders(options.Token)
30
+ });
31
+ if (!response.ok) {
32
+ if (response.status === 404) {
33
+ return { Success: false, ErrorMessage: `mj-app.json not found in ${parsed.Owner}/${parsed.Repo} at ref ${ref}` };
34
+ }
35
+ return { Success: false, ErrorMessage: `GitHub API error: ${response.status} ${response.statusText}` };
36
+ }
37
+ const data = await response.json();
38
+ if (!data.content || data.encoding !== 'base64') {
39
+ return { Success: false, ErrorMessage: 'Unexpected response format from GitHub API' };
40
+ }
41
+ const decoded = Buffer.from(data.content, 'base64').toString('utf-8');
42
+ return { Success: true, ManifestJSON: decoded };
43
+ }
44
+ catch (error) {
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ return { Success: false, ErrorMessage: `Failed to fetch manifest: ${message}` };
47
+ }
48
+ }
49
+ export async function ListGitHubReleases(repoUrl, options) {
50
+ const parsed = ParseGitHubUrl(repoUrl);
51
+ if (!parsed) {
52
+ return [];
53
+ }
54
+ const apiUrl = `https://api.github.com/repos/${parsed.Owner}/${parsed.Repo}/releases`;
55
+ try {
56
+ const response = await fetch(apiUrl, {
57
+ headers: BuildHeaders(options.Token)
58
+ });
59
+ if (!response.ok) {
60
+ return [];
61
+ }
62
+ const releases = await response.json();
63
+ return releases.map(r => ({
64
+ TagName: r.tag_name,
65
+ PreRelease: r.prerelease,
66
+ Draft: r.draft,
67
+ CreatedAt: r.created_at
68
+ }));
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ export async function DownloadMigrations(repoUrl, version, migrationsPath, localDir, options) {
75
+ const parsed = ParseGitHubUrl(repoUrl);
76
+ if (!parsed) {
77
+ return { Success: false, ErrorMessage: `Invalid GitHub URL: ${repoUrl}` };
78
+ }
79
+ const ref = version ? `v${version.replace(/^v/, '')}` : 'HEAD';
80
+ const cleanPath = migrationsPath.replace(/^\/|\/$/g, '');
81
+ const apiUrl = `https://api.github.com/repos/${parsed.Owner}/${parsed.Repo}/contents/${cleanPath}?ref=${ref}`;
82
+ try {
83
+ const response = await fetch(apiUrl, {
84
+ headers: BuildHeaders(options.Token)
85
+ });
86
+ if (!response.ok) {
87
+ return { Success: false, ErrorMessage: `Failed to list migrations: ${response.status} ${response.statusText}` };
88
+ }
89
+ const items = await response.json();
90
+ const sqlFiles = items.filter(item => item.type === 'file' && item.name.endsWith('.sql'));
91
+ if (sqlFiles.length === 0) {
92
+ return { Success: true, LocalPath: localDir, Files: [] };
93
+ }
94
+ if (!existsSync(localDir)) {
95
+ mkdirSync(localDir, { recursive: true });
96
+ }
97
+ const downloadedFiles = [];
98
+ for (const file of sqlFiles) {
99
+ if (!file.download_url) {
100
+ continue;
101
+ }
102
+ const fileResponse = await fetch(file.download_url, {
103
+ headers: BuildHeaders(options.Token)
104
+ });
105
+ if (fileResponse.ok) {
106
+ const content = await fileResponse.text();
107
+ const localPath = join(localDir, file.name);
108
+ writeFileSync(localPath, content, 'utf-8');
109
+ downloadedFiles.push(file.name);
110
+ }
111
+ }
112
+ return { Success: true, LocalPath: localDir, Files: downloadedFiles };
113
+ }
114
+ catch (error) {
115
+ const message = error instanceof Error ? error.message : String(error);
116
+ return { Success: false, ErrorMessage: `Failed to download migrations: ${message}` };
117
+ }
118
+ }
119
+ export async function GetLatestVersion(repoUrl, options) {
120
+ const releases = await ListGitHubReleases(repoUrl, options);
121
+ const stable = releases.find(r => !r.PreRelease && !r.Draft);
122
+ if (!stable) {
123
+ return null;
124
+ }
125
+ return stable.TagName.replace(/^v/, '');
126
+ }
127
+ //# sourceMappingURL=github-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/github/github-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export { mjAppManifestSchema } from './manifest/manifest-schema.js';
2
+ export type { MJAppManifest, ManifestPackageEntry, PackageRole } from './manifest/manifest-schema.js';
3
+ export { LoadManifestFromFile, ParseAndValidateManifest, ValidateManifestObject } from './manifest/manifest-loader.js';
4
+ export type { ManifestLoadResult } from './manifest/manifest-loader.js';
5
+ export type { AppStatus, InstallAction, ErrorPhase, DependencyStatus, AppInstallCallbacks, InstallOptions, UpgradeOptions, RemoveOptions, AppOperationResult, InstalledAppInfo, ResolvedDependency } from './types/open-app-types.js';
6
+ export { ResolveDependencies } from './dependency/dependency-resolver.js';
7
+ export type { DependencyNode, DependencyValue, DependencyResolutionResult, InstalledAppMap } from './dependency/dependency-resolver.js';
8
+ export { CheckMJVersionCompatibility, CheckDependencyVersionCompatibility, IsValidUpgrade } from './dependency/version-checker.js';
9
+ export type { VersionCheckResult } from './dependency/version-checker.js';
10
+ export { FetchManifestFromGitHub, ListGitHubReleases, DownloadMigrations, GetLatestVersion, ParseGitHubUrl } from './github/github-client.js';
11
+ export type { GitHubClientOptions, GitHubRelease, ManifestFetchResult, MigrationDownloadResult } from './github/github-client.js';
12
+ export { CreateAppSchema, DropAppSchema, SchemaExists, ValidateSchemaName, EscapeSqlString } from './install/schema-manager.js';
13
+ export type { SchemaOperationResult } from './install/schema-manager.js';
14
+ export { RunAppMigrations } from './install/migration-runner.js';
15
+ export type { MigrationRunOptions, MigrationRunResult, FlywayDatabaseConfig, SkywayDatabaseConfig } from './install/migration-runner.js';
16
+ export { AddAppPackages, RemoveAppPackages, RunNpmInstall } from './install/package-manager.js';
17
+ export type { PackageManagerOptions, PackageOperationResult } from './install/package-manager.js';
18
+ export { AddServerDynamicPackages, RemoveServerDynamicPackages, ToggleServerDynamicPackages } from './install/config-manager.js';
19
+ export type { DynamicPackageEntry, ConfigOperationResult } from './install/config-manager.js';
20
+ export { RegenerateClientBootstrap } from './install/client-bootstrap-gen.js';
21
+ export type { ClientBootstrapEntry } from './install/client-bootstrap-gen.js';
22
+ export { RecordAppInstallation, UpdateAppRecord, SetAppStatus, RecordInstallHistoryEntry, RecordAppDependencies, DeleteAppDependencies, FindInstalledApp, ListInstalledApps, FindDependentApps } from './install/history-recorder.js';
23
+ export { InstallApp, UpgradeApp, RemoveApp, DisableApp, EnableApp } from './install/install-orchestrator.js';
24
+ export type { OrchestratorContext } from './install/install-orchestrator.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvH,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,YAAY,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,YAAY,EACR,cAAc,EACd,eAAe,EACf,0BAA0B,EAC1B,eAAe,EAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,2BAA2B,EAC3B,mCAAmC,EACnC,cAAc,EACjB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,OAAO,EACH,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACR,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAChI,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEzI,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAChG,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAElG,OAAO,EACH,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC9B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,OAAO,EACH,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACpB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACH,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACZ,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { mjAppManifestSchema } from './manifest/manifest-schema.js';
2
+ export { LoadManifestFromFile, ParseAndValidateManifest, ValidateManifestObject } from './manifest/manifest-loader.js';
3
+ export { ResolveDependencies } from './dependency/dependency-resolver.js';
4
+ export { CheckMJVersionCompatibility, CheckDependencyVersionCompatibility, IsValidUpgrade } from './dependency/version-checker.js';
5
+ export { FetchManifestFromGitHub, ListGitHubReleases, DownloadMigrations, GetLatestVersion, ParseGitHubUrl } from './github/github-client.js';
6
+ export { CreateAppSchema, DropAppSchema, SchemaExists, ValidateSchemaName, EscapeSqlString } from './install/schema-manager.js';
7
+ export { RunAppMigrations } from './install/migration-runner.js';
8
+ export { AddAppPackages, RemoveAppPackages, RunNpmInstall } from './install/package-manager.js';
9
+ export { AddServerDynamicPackages, RemoveServerDynamicPackages, ToggleServerDynamicPackages } from './install/config-manager.js';
10
+ export { RegenerateClientBootstrap } from './install/client-bootstrap-gen.js';
11
+ export { RecordAppInstallation, UpdateAppRecord, SetAppStatus, RecordInstallHistoryEntry, RecordAppDependencies, DeleteAppDependencies, FindInstalledApp, ListInstalledApps, FindDependentApps } from './install/history-recorder.js';
12
+ export { InstallApp, UpgradeApp, RemoveApp, DisableApp, EnableApp } from './install/install-orchestrator.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAmBvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAO1E,OAAO,EACH,2BAA2B,EAC3B,mCAAmC,EACnC,cAAc,EACjB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACH,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGhI,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGhG,OAAO,EACH,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC9B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,OAAO,EACH,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACpB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACH,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACZ,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ClientBootstrapEntry {
2
+ AppName: string;
3
+ Version: string;
4
+ PackageName: string;
5
+ Enabled: boolean;
6
+ }
7
+ export declare function RegenerateClientBootstrap(repoRoot: string, entries: ClientBootstrapEntry[]): void;
8
+ //# sourceMappingURL=client-bootstrap-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-bootstrap-gen.d.ts","sourceRoot":"","sources":["../../src/install/client-bootstrap-gen.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,oBAAoB;IAEjC,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,MAAM,CAAC;IAEpB,OAAO,EAAE,OAAO,CAAC;CACpB;AAYD,wBAAgB,yBAAyB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,EAAE,GAChC,IAAI,CAQN"}
@@ -0,0 +1,35 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ export function RegenerateClientBootstrap(repoRoot, entries) {
4
+ const filePath = resolve(repoRoot, 'packages/MJExplorer/src/app/generated/open-app-bootstrap.generated.ts');
5
+ const content = BuildBootstrapFileContent(entries);
6
+ writeFileSync(filePath, content, 'utf-8');
7
+ }
8
+ function BuildBootstrapFileContent(entries) {
9
+ const header = BuildFileHeader();
10
+ if (entries.length === 0) {
11
+ return header + '\n// No Open Apps installed\n';
12
+ }
13
+ const importLines = entries.map(entry => BuildImportLine(entry)).join('\n');
14
+ return header + '\n' + importLines + '\n';
15
+ }
16
+ function BuildFileHeader() {
17
+ return `/**
18
+ * Open App Bootstrap - AUTO-GENERATED by \`mj app install\` / \`mj app remove\`
19
+ * DO NOT EDIT - this file is overwritten on every app install/upgrade/remove
20
+ *
21
+ * Each import below loads an Open App's client bootstrap package, which triggers
22
+ * @RegisterClass decorators and makes the app's components available to MJ's class factory.
23
+ *
24
+ * Generated: ${new Date().toISOString()}
25
+ */
26
+ `;
27
+ }
28
+ function BuildImportLine(entry) {
29
+ const comment = `// ${entry.AppName} (v${entry.Version})`;
30
+ if (entry.Enabled) {
31
+ return `${comment}\nimport '${entry.PackageName}';\n`;
32
+ }
33
+ return `${comment} [DISABLED]\n// import '${entry.PackageName}';\n`;
34
+ }
35
+ //# sourceMappingURL=client-bootstrap-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-bootstrap-gen.js","sourceRoot":"","sources":["../../src/install/client-bootstrap-gen.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,MAAM,UAAU,yBAAyB,CACrC,QAAgB,EAChB,OAA+B;IAE/B,MAAM,QAAQ,GAAG,OAAO,CACpB,QAAQ,EACR,uEAAuE,CAC1E,CAAC;IAEF,MAAM,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAKD,SAAS,yBAAyB,CAAC,OAA+B;IAC9D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,GAAG,+BAA+B,CAAC;IACpD,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAAC;AAC9C,CAAC;AAKD,SAAS,eAAe;IACpB,OAAO;;;;;;;gBAOK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;CAEvC,CAAC;AACF,CAAC;AAKD,SAAS,eAAe,CAAC,KAA2B;IAChD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,OAAO,GAAG,CAAC;IAE1D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,aAAa,KAAK,CAAC,WAAW,MAAM,CAAC;IAC1D,CAAC;IAED,OAAO,GAAG,OAAO,2BAA2B,KAAK,CAAC,WAAW,MAAM,CAAC;AACxE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MJAppManifest } from '../manifest/manifest-schema.js';
2
+ export interface DynamicPackageEntry {
3
+ PackageName: string;
4
+ StartupExport: string;
5
+ AppName: string;
6
+ Enabled: boolean;
7
+ }
8
+ export interface ConfigOperationResult {
9
+ Success: boolean;
10
+ ErrorMessage?: string;
11
+ }
12
+ export declare function AddServerDynamicPackages(repoRoot: string, manifest: MJAppManifest): ConfigOperationResult;
13
+ export declare function RemoveServerDynamicPackages(repoRoot: string, appName: string): ConfigOperationResult;
14
+ export declare function ToggleServerDynamicPackages(repoRoot: string, appName: string, enabled: boolean): ConfigOperationResult;
15
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/install/config-manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAKpE,MAAM,WAAW,mBAAmB;IAEhC,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,CAAC;IAEtB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,OAAO,CAAC;CACpB;AAKD,MAAM,WAAW,qBAAqB;IAElC,OAAO,EAAE,OAAO,CAAC;IAEjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AASD,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,GACxB,qBAAqB,CAuBvB;AASD,wBAAgB,2BAA2B,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAChB,qBAAqB,CAavB;AAUD,wBAAgB,2BAA2B,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACjB,qBAAqB,CAavB"}
@@ -0,0 +1,114 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ export function AddServerDynamicPackages(repoRoot, manifest) {
4
+ const configPath = resolve(repoRoot, 'mj.config.cjs');
5
+ const serverPackages = GetServerPackagesFromManifest(manifest);
6
+ if (serverPackages.length === 0) {
7
+ return { Success: true };
8
+ }
9
+ try {
10
+ let content = readFileSync(configPath, 'utf-8');
11
+ content = EnsureDynamicPackagesSection(content);
12
+ for (const entry of serverPackages) {
13
+ content = AddEntryToServerArray(content, entry);
14
+ }
15
+ writeFileSync(configPath, content, 'utf-8');
16
+ return { Success: true };
17
+ }
18
+ catch (error) {
19
+ const message = error instanceof Error ? error.message : String(error);
20
+ return { Success: false, ErrorMessage: `Failed to update config: ${message}` };
21
+ }
22
+ }
23
+ export function RemoveServerDynamicPackages(repoRoot, appName) {
24
+ const configPath = resolve(repoRoot, 'mj.config.cjs');
25
+ try {
26
+ let content = readFileSync(configPath, 'utf-8');
27
+ content = RemoveEntriesForApp(content, appName);
28
+ writeFileSync(configPath, content, 'utf-8');
29
+ return { Success: true };
30
+ }
31
+ catch (error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ return { Success: false, ErrorMessage: `Failed to update config: ${message}` };
34
+ }
35
+ }
36
+ export function ToggleServerDynamicPackages(repoRoot, appName, enabled) {
37
+ const configPath = resolve(repoRoot, 'mj.config.cjs');
38
+ try {
39
+ let content = readFileSync(configPath, 'utf-8');
40
+ content = ToggleEntriesForApp(content, appName, enabled);
41
+ writeFileSync(configPath, content, 'utf-8');
42
+ return { Success: true };
43
+ }
44
+ catch (error) {
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ return { Success: false, ErrorMessage: `Failed to update config: ${message}` };
47
+ }
48
+ }
49
+ function GetServerPackagesFromManifest(manifest) {
50
+ const entries = [];
51
+ const serverPkgs = manifest.packages?.server ?? [];
52
+ const sharedPkgs = manifest.packages?.shared ?? [];
53
+ for (const pkg of [...serverPkgs, ...sharedPkgs]) {
54
+ if (pkg.startupExport) {
55
+ entries.push({
56
+ PackageName: pkg.name,
57
+ StartupExport: pkg.startupExport,
58
+ AppName: manifest.name,
59
+ Enabled: true
60
+ });
61
+ }
62
+ }
63
+ return entries;
64
+ }
65
+ function EnsureDynamicPackagesSection(content) {
66
+ if (content.includes('dynamicPackages')) {
67
+ return content;
68
+ }
69
+ const insertionPoint = content.lastIndexOf('};');
70
+ if (insertionPoint === -1) {
71
+ return content;
72
+ }
73
+ const section = `\n dynamicPackages: {\n server: []\n },\n`;
74
+ return content.slice(0, insertionPoint) + section + content.slice(insertionPoint);
75
+ }
76
+ function AddEntryToServerArray(content, entry) {
77
+ const serverArrayMatch = content.match(/server:\s*\[/);
78
+ if (!serverArrayMatch || serverArrayMatch.index === undefined) {
79
+ return content;
80
+ }
81
+ const entryStr = `\n {\n PackageName: '${entry.PackageName}',\n StartupExport: '${entry.StartupExport}',\n AppName: '${entry.AppName}',\n Enabled: ${entry.Enabled}\n },`;
82
+ const arrayStart = serverArrayMatch.index + serverArrayMatch[0].length;
83
+ const closingBracket = FindMatchingBracket(content, arrayStart - 1);
84
+ if (closingBracket === -1) {
85
+ return content;
86
+ }
87
+ return content.slice(0, closingBracket) + entryStr + '\n ' + content.slice(closingBracket);
88
+ }
89
+ function RemoveEntriesForApp(content, appName) {
90
+ const pattern = new RegExp(`\\s*\\{[^{}]*AppName:\\s*'${EscapeRegex(appName)}'[^{}]*\\},?`, 'g');
91
+ return content.replace(pattern, '');
92
+ }
93
+ function ToggleEntriesForApp(content, appName, enabled) {
94
+ const pattern = new RegExp(`(AppName:\\s*'${EscapeRegex(appName)}'[^{}]*Enabled:\\s*)(?:true|false)`, 'g');
95
+ return content.replace(pattern, `$1${enabled}`);
96
+ }
97
+ function FindMatchingBracket(content, openPos) {
98
+ const openChar = content[openPos];
99
+ const closeChar = openChar === '[' ? ']' : '}';
100
+ let depth = 1;
101
+ let pos = openPos + 1;
102
+ while (pos < content.length && depth > 0) {
103
+ if (content[pos] === openChar)
104
+ depth++;
105
+ if (content[pos] === closeChar)
106
+ depth--;
107
+ pos++;
108
+ }
109
+ return depth === 0 ? pos - 1 : -1;
110
+ }
111
+ function EscapeRegex(str) {
112
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
113
+ }
114
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/install/config-manager.ts"],"names":[],"mappings":"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"}