@forge/cli-shared 8.20.0 → 8.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @forge/cli-shared
2
2
 
3
+ ## 8.21.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 7f9ae91: Added variable prompting and structure skeleton for forge module add
8
+
9
+ ## 8.21.0-next.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 7f9ae91: Added variable prompting and structure skeleton for forge module add
14
+
3
15
  ## 8.20.0
4
16
 
5
17
  ### Minor Changes
@@ -5,5 +5,6 @@ export * from './package-installer';
5
5
  export * from './register-app';
6
6
  export * from './sites';
7
7
  export * from './template';
8
+ export * from './template-module';
8
9
  export * from './get-app-owner';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/apps/index.ts"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/apps/index.ts"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
package/out/apps/index.js CHANGED
@@ -8,4 +8,5 @@ tslib_1.__exportStar(require("./package-installer"), exports);
8
8
  tslib_1.__exportStar(require("./register-app"), exports);
9
9
  tslib_1.__exportStar(require("./sites"), exports);
10
10
  tslib_1.__exportStar(require("./template"), exports);
11
+ tslib_1.__exportStar(require("./template-module"), exports);
11
12
  tslib_1.__exportStar(require("./get-app-owner"), exports);
@@ -0,0 +1,62 @@
1
+ export declare class BifrostFetchError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare type UIFramework = 'ui-kit' | 'custom-ui';
5
+ export interface TemplateVariableDef {
6
+ name: string;
7
+ prompt: string;
8
+ default?: string;
9
+ }
10
+ export interface ModuleTemplateMeta {
11
+ name: string;
12
+ displayName: string;
13
+ description: string;
14
+ product: string;
15
+ category?: string;
16
+ uiFramework?: UIFramework;
17
+ moduleKey: string;
18
+ dependencies?: Record<string, string> | string[];
19
+ devDependencies?: Record<string, string> | string[];
20
+ frontend?: {
21
+ dependencies?: string[];
22
+ devDependencies?: string[];
23
+ };
24
+ customUiDependencies?: string[];
25
+ customUiDevDependencies?: string[];
26
+ requiredScopes?: string[];
27
+ variables?: TemplateVariableDef[];
28
+ fileOperations?: Array<{
29
+ type: 'create' | 'append' | 'merge' | 'update';
30
+ source?: string;
31
+ target: string;
32
+ template?: boolean;
33
+ }>;
34
+ variants?: Record<UIFramework, {
35
+ manifestPath?: string;
36
+ dependencies?: Record<string, string> | string[];
37
+ devDependencies?: Record<string, string> | string[];
38
+ frontend?: {
39
+ dependencies?: string[];
40
+ devDependencies?: string[];
41
+ };
42
+ variables?: TemplateVariableDef[];
43
+ fileOperations?: Array<{
44
+ type: 'create' | 'append' | 'merge' | 'update';
45
+ source?: string;
46
+ target: string;
47
+ template?: boolean;
48
+ }>;
49
+ }>;
50
+ cacheDir?: string;
51
+ }
52
+ export declare class TemplateModuleServices {
53
+ private readonly baseUrl;
54
+ private templatesCache;
55
+ constructor(baseUrl?: string);
56
+ getAvailableModules(product: string): Promise<ModuleTemplateMeta[]>;
57
+ private fetchModuleTemplates;
58
+ fetchManifestFragment(manifestPath: string): Promise<string>;
59
+ downloadModuleAssets(template: ModuleTemplateMeta, uiFramework?: UIFramework): Promise<ModuleTemplateMeta>;
60
+ cleanupCache(cacheDir: string): void;
61
+ }
62
+ //# sourceMappingURL=template-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-module.d.ts","sourceRoot":"","sources":["../../src/apps/template-module.ts"],"names":[],"mappings":"AAUA,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,oBAAY,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IAEF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IAEH,QAAQ,CAAC,EAAE,MAAM,CACf,WAAW,EACX;QACE,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;QACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;QACpD,QAAQ,CAAC,EAAE;YACT,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;YACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;QACF,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;QAClC,cAAc,CAAC,EAAE,KAAK,CAAC;YACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;YAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;KACJ,CACF,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,cAAc,CAAqC;gBAE/C,OAAO,CAAC,EAAE,MAAM;IAIf,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAOlE,oBAAoB;IAsBrB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa5D,oBAAoB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAkCvB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAO5C"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TemplateModuleServices = exports.BifrostFetchError = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = tslib_1.__importDefault(require("fs"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
8
+ const os_1 = tslib_1.__importDefault(require("os"));
9
+ const url_1 = require("url");
10
+ const text_1 = require("../ui/text");
11
+ const BIFROST_BASE_URL = 'https://forge-templates-bifrost.ddev.frontend.public.atl-paas.net/assets/';
12
+ const MODULE_INDEX_FILE = 'template-modules.json';
13
+ class BifrostFetchError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'BifrostFetchError';
17
+ }
18
+ }
19
+ exports.BifrostFetchError = BifrostFetchError;
20
+ class TemplateModuleServices {
21
+ baseUrl;
22
+ templatesCache = null;
23
+ constructor(baseUrl) {
24
+ this.baseUrl = baseUrl ?? BIFROST_BASE_URL;
25
+ }
26
+ async getAvailableModules(product) {
27
+ const infos = await this.fetchModuleTemplates();
28
+ const filtered = infos.filter((i) => i.product === product);
29
+ return filtered;
30
+ }
31
+ async fetchModuleTemplates() {
32
+ if (this.templatesCache) {
33
+ return this.templatesCache;
34
+ }
35
+ const indexUrl = new url_1.URL(MODULE_INDEX_FILE, this.baseUrl);
36
+ const res = await (0, node_fetch_1.default)(indexUrl);
37
+ if (!res.ok) {
38
+ throw new BifrostFetchError(text_1.Text.module.errors.bifrostIndexFetchFailed(res.status, res.statusText));
39
+ }
40
+ const json = await res.json();
41
+ if (Array.isArray(json)) {
42
+ this.templatesCache = json;
43
+ return this.templatesCache;
44
+ }
45
+ throw new BifrostFetchError(text_1.Text.module.errors.bifrostIndexInvalid);
46
+ }
47
+ async fetchManifestFragment(manifestPath) {
48
+ const url = `${this.baseUrl}${manifestPath}`;
49
+ const res = await (0, node_fetch_1.default)(url);
50
+ if (!res.ok) {
51
+ throw new BifrostFetchError(text_1.Text.module.errors.bifrostManifestFragmentFetchFailed(res.status, res.statusText));
52
+ }
53
+ return await res.text();
54
+ }
55
+ async downloadModuleAssets(template, uiFramework) {
56
+ let manifestFragment;
57
+ let variantData;
58
+ if (uiFramework) {
59
+ variantData = template.variants?.[uiFramework];
60
+ if (!variantData)
61
+ throw new Error(text_1.Text.module.add.errorInvalidUIFramework(uiFramework, template.moduleKey));
62
+ }
63
+ if (variantData?.manifestPath) {
64
+ manifestFragment = await this.fetchManifestFragment(variantData.manifestPath);
65
+ }
66
+ const cacheDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'forge-module-'));
67
+ if (manifestFragment) {
68
+ fs_1.default.writeFileSync(path_1.default.join(cacheDir, 'manifest-fragment.yml'), manifestFragment);
69
+ }
70
+ return {
71
+ ...template,
72
+ ...(variantData
73
+ ? {
74
+ uiFramework,
75
+ dependencies: variantData.dependencies ?? template.dependencies,
76
+ devDependencies: variantData.devDependencies ?? template.devDependencies,
77
+ frontend: variantData.frontend ?? template.frontend,
78
+ variables: variantData.variables ?? template.variables,
79
+ fileOperations: variantData.fileOperations ?? template.fileOperations
80
+ }
81
+ : {}),
82
+ cacheDir
83
+ };
84
+ }
85
+ cleanupCache(cacheDir) {
86
+ try {
87
+ fs_1.default.rmSync(cacheDir, { recursive: true, force: true });
88
+ }
89
+ catch {
90
+ }
91
+ }
92
+ }
93
+ exports.TemplateModuleServices = TemplateModuleServices;