@gooddata/create-pluggable-module 11.42.0-alpha.3 → 11.42.0-alpha.5

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdc-app-template-name-harness",
3
- "version": "11.42.0-alpha.3",
3
+ "version": "11.42.0-alpha.5",
4
4
  "private": true,
5
5
  "description": "Standalone harness for gdc-app-template-name module",
6
6
  "license": "UNLICENSED",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdc-app-template-name-module",
3
- "version": "11.42.0-alpha.3",
3
+ "version": "11.42.0-alpha.5",
4
4
  "private": true,
5
5
  "description": "{applicationTemplateTitle} pluggable application module",
6
6
  "license": "UNLICENSED",
@@ -82,6 +82,7 @@ describe("snapshot: client profile end-to-end scaffold", () => {
82
82
  appName: "gdc-snap-test",
83
83
  title: "Snapshot Test",
84
84
  scope: "workspace",
85
+ maintainer: "team@gooddata.com",
85
86
  }, {
86
87
  repo: {
87
88
  repoRoot: testRoot,
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/engine/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA+DzF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D;AA+CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2BtG"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/engine/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA+DzF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D;AA+CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoCtG"}
@@ -126,7 +126,12 @@ export async function runPrompts(extraPrompts) {
126
126
  return validateTextValue(v);
127
127
  });
128
128
  const scope = await askScope(reader);
129
- const answers = { appName, title, scope };
129
+ const maintainer = await askUntilValid(reader, "Maintainer (preferably email, but could be a person or team name)", (v) => {
130
+ if (!v)
131
+ return "Maintainer is required.";
132
+ return validateTextValue(v);
133
+ });
134
+ const answers = { appName, title, scope, maintainer };
130
135
  for (const prompt of extraPrompts) {
131
136
  const value = await askExtra(reader, prompt);
132
137
  if (value !== undefined) {
@@ -3,7 +3,7 @@ import { describe, expect, it } from "vitest";
3
3
  import { clientProfile } from "../client.js";
4
4
  function mockCtx(overrides = {}) {
5
5
  return {
6
- answers: { appName: "gdc-mock", title: "Mock", scope: "workspace" },
6
+ answers: { appName: "gdc-mock", title: "Mock", scope: "workspace", maintainer: "team@gooddata.com" },
7
7
  derived: {
8
8
  route: "/mock",
9
9
  federationName: "gdc_mock",
@@ -59,11 +59,17 @@ describe("clientProfile", () => {
59
59
  });
60
60
  describe("resolveDestRoot", () => {
61
61
  it("uses modules/<appName> when destPath is not overridden", () => {
62
- const destRoot = clientProfile.resolveDestRoot({ appName: "gdc-x", title: "X", scope: "workspace" }, "/fake/repo");
62
+ const destRoot = clientProfile.resolveDestRoot({ appName: "gdc-x", title: "X", scope: "workspace", maintainer: "team@gooddata.com" }, "/fake/repo");
63
63
  expect(destRoot).toBe("/fake/repo/modules/gdc-x");
64
64
  });
65
65
  it("accepts an in-cwd destPath override", () => {
66
- const destRoot = clientProfile.resolveDestRoot({ appName: "gdc-x", title: "X", scope: "workspace", destPath: "apps/gdc-x" }, "/fake/repo");
66
+ const destRoot = clientProfile.resolveDestRoot({
67
+ appName: "gdc-x",
68
+ title: "X",
69
+ scope: "workspace",
70
+ maintainer: "team@gooddata.com",
71
+ destPath: "apps/gdc-x",
72
+ }, "/fake/repo");
67
73
  expect(destRoot).toBe("/fake/repo/apps/gdc-x");
68
74
  });
69
75
  it("rejects path-traversal destPath that resolves outside cwd", () => {
@@ -71,6 +77,7 @@ describe("clientProfile", () => {
71
77
  appName: "gdc-x",
72
78
  title: "X",
73
79
  scope: "workspace",
80
+ maintainer: "team@gooddata.com",
74
81
  destPath: "../../../etc",
75
82
  }, "/fake/repo")).toThrow(/resolves outside the current directory/);
76
83
  });
@@ -79,6 +86,7 @@ describe("clientProfile", () => {
79
86
  appName: "gdc-x",
80
87
  title: "X",
81
88
  scope: "workspace",
89
+ maintainer: "team@gooddata.com",
82
90
  destPath: "/somewhere/else",
83
91
  }, "/fake/repo")).toThrow(/resolves outside the current directory/);
84
92
  });
@@ -87,6 +95,7 @@ describe("clientProfile", () => {
87
95
  appName: "gdc-x",
88
96
  title: "X",
89
97
  scope: "workspace",
98
+ maintainer: "team@gooddata.com",
90
99
  destPath: "../repo-other/sub",
91
100
  }, "/fake/repo")).toThrow(/resolves outside the current directory/);
92
101
  });
@@ -147,5 +156,16 @@ describe("clientProfile", () => {
147
156
  expect(scripts.build).toBe("tsc");
148
157
  expect(scripts.test).toBe("vitest");
149
158
  });
159
+ it("records the entered maintainer as the package author (so the prompt isn't discarded)", () => {
160
+ const after = clientProfile.transformPackageJson({ author: "{applicationTemplateTitle} template author" }, mockCtx({
161
+ answers: {
162
+ appName: "gdc-mock",
163
+ title: "Mock",
164
+ scope: "workspace",
165
+ maintainer: "owner@gooddata.com",
166
+ },
167
+ }));
168
+ expect(after["author"]).toBe("owner@gooddata.com");
169
+ });
150
170
  });
151
171
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/profiles/client.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAMR,gBAAgB,EAEnB,MAAM,aAAa,CAAC;AA+CrB,eAAO,MAAM,aAAa,EAAE,gBAmI3B,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/profiles/client.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAMR,gBAAgB,EAEnB,MAAM,aAAa,CAAC;AA+CrB,eAAO,MAAM,aAAa,EAAE,gBAuI3B,CAAC"}
@@ -118,6 +118,10 @@ export const clientProfile = {
118
118
  `${ctx.answers.appName}-harness`,
119
119
  ]);
120
120
  const out = { ...pkg };
121
+ // Record the maintainer the user entered as the package owner. Without this
122
+ // the required maintainer prompt would be collected and silently discarded,
123
+ // leaving the scaffolded client metadata stuck with the template's author.
124
+ out.author = ctx.answers.maintainer;
121
125
  out.dependencies = rewriteWorkspaceDeps(pkg.dependencies, version, siblings);
122
126
  out.devDependencies = rewriteWorkspaceDeps(pkg.devDependencies, version, siblings);
123
127
  out.peerDependencies = rewriteWorkspaceDeps(pkg.peerDependencies, version, siblings);
package/esm/types.d.ts CHANGED
@@ -26,9 +26,9 @@ export interface IRepoInfo {
26
26
  packageManager: PackageManager;
27
27
  }
28
28
  /**
29
- * Answers populated by the engine via the shared prompts (appName, title, scope).
30
- * Profile-specific extra prompts (e.g. `maintainer` for internal, `destPath` for
31
- * client) write into the same object under their declared `key`.
29
+ * Answers populated by the engine via the shared prompts (appName, title, scope,
30
+ * maintainer). Profile-specific extra prompts (e.g. `destPath` for client) write
31
+ * into the same object under their declared `key`.
32
32
  *
33
33
  * The index signature is intentional — profiles narrow with a local cast in
34
34
  * their callbacks since they know which extras they registered. Trying to make
@@ -39,6 +39,8 @@ export interface IScaffoldAnswers {
39
39
  appName: string;
40
40
  title: string;
41
41
  scope: ApplicationScope;
42
+ /** Owner contact for the new app — required for every profile. Preferably an email. */
43
+ maintainer: string;
42
44
  [extraKey: string]: string | undefined;
43
45
  }
44
46
  export interface IPromptDescriptor {
@@ -128,7 +130,7 @@ export interface IOverlayPath {
128
130
  }
129
131
  export interface IScaffoldProfile {
130
132
  readonly name: ProfileName;
131
- /** Prompts displayed after the shared appName/title/scope prompts, in array order. */
133
+ /** Prompts displayed after the shared appName/title/scope/maintainer prompts, in array order. */
132
134
  readonly extraPrompts: readonly IPromptDescriptor[];
133
135
  /** Resolves where the scaffolded files will land. Receives raw cwd, not repoRoot. */
134
136
  resolveDestRoot(answers: IScaffoldAnswers, cwd: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/create-pluggable-module",
3
- "version": "11.42.0-alpha.3",
3
+ "version": "11.42.0-alpha.5",
4
4
  "description": "Scaffolder for GoodData pluggable applications. Invoked via `npm init @gooddata/pluggable-module`.",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -50,10 +50,10 @@
50
50
  "typescript": "5.9.3",
51
51
  "vite": "8.0.16",
52
52
  "vitest": "4.1.8",
53
- "@gooddata/eslint-config": "11.42.0-alpha.3",
54
- "@gooddata/oxlint-config": "11.42.0-alpha.3",
55
- "gdc-app-template-name-harness": "11.42.0-alpha.3",
56
- "gdc-app-template-name-module": "11.42.0-alpha.3"
53
+ "@gooddata/oxlint-config": "11.42.0-alpha.5",
54
+ "@gooddata/eslint-config": "11.42.0-alpha.5",
55
+ "gdc-app-template-name-module": "11.42.0-alpha.5",
56
+ "gdc-app-template-name-harness": "11.42.0-alpha.5"
57
57
  },
58
58
  "engines": {
59
59
  "node": ">=24.12.0"