create-authenik8-app 2.4.14 → 2.4.15

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 (227) hide show
  1. package/README.md +34 -516
  2. package/dist/src/bin/cli.d.ts +3 -0
  3. package/dist/src/bin/cli.d.ts.map +1 -0
  4. package/dist/src/bin/cli.js +112 -0
  5. package/dist/src/bin/cli.js.map +1 -0
  6. package/dist/src/bin/index.js +108 -23
  7. package/dist/src/bin/index.js.map +1 -1
  8. package/dist/src/commands/add/apply.d.ts +6 -0
  9. package/dist/src/commands/add/apply.d.ts.map +1 -0
  10. package/dist/src/commands/add/apply.js +123 -0
  11. package/dist/src/commands/add/apply.js.map +1 -0
  12. package/dist/src/commands/add/ci.d.ts +6 -0
  13. package/dist/src/commands/add/ci.d.ts.map +1 -0
  14. package/dist/src/commands/add/ci.js +108 -0
  15. package/dist/src/commands/add/ci.js.map +1 -0
  16. package/dist/src/commands/add/context.d.ts +5 -0
  17. package/dist/src/commands/add/context.d.ts.map +1 -0
  18. package/dist/src/commands/add/context.js +19 -0
  19. package/dist/src/commands/add/context.js.map +1 -0
  20. package/dist/src/commands/add/diff.d.ts +4 -0
  21. package/dist/src/commands/add/diff.d.ts.map +1 -0
  22. package/dist/src/commands/add/diff.js +114 -0
  23. package/dist/src/commands/add/diff.js.map +1 -0
  24. package/dist/src/commands/add/index.d.ts +6 -0
  25. package/dist/src/commands/add/index.d.ts.map +1 -0
  26. package/dist/src/commands/add/index.js +61 -0
  27. package/dist/src/commands/add/index.js.map +1 -0
  28. package/dist/src/commands/add/output.d.ts +5 -0
  29. package/dist/src/commands/add/output.d.ts.map +1 -0
  30. package/dist/src/commands/add/output.js +58 -0
  31. package/dist/src/commands/add/output.js.map +1 -0
  32. package/dist/src/commands/add/plan.d.ts +6 -0
  33. package/dist/src/commands/add/plan.d.ts.map +1 -0
  34. package/dist/src/commands/add/plan.js +93 -0
  35. package/dist/src/commands/add/plan.js.map +1 -0
  36. package/dist/src/commands/add/registry.d.ts +4 -0
  37. package/dist/src/commands/add/registry.d.ts.map +1 -0
  38. package/dist/src/commands/add/registry.js +37 -0
  39. package/dist/src/commands/add/registry.js.map +1 -0
  40. package/dist/src/commands/add/types.d.ts +37 -0
  41. package/dist/src/commands/add/types.d.ts.map +1 -0
  42. package/dist/src/commands/add/types.js +2 -0
  43. package/dist/src/commands/add/types.js.map +1 -0
  44. package/dist/src/commands/doctor/checks.d.ts +3 -0
  45. package/dist/src/commands/doctor/checks.d.ts.map +1 -0
  46. package/dist/src/commands/doctor/checks.js +353 -0
  47. package/dist/src/commands/doctor/checks.js.map +1 -0
  48. package/dist/src/commands/doctor/context.d.ts +5 -0
  49. package/dist/src/commands/doctor/context.d.ts.map +1 -0
  50. package/dist/src/commands/doctor/context.js +134 -0
  51. package/dist/src/commands/doctor/context.js.map +1 -0
  52. package/dist/src/commands/doctor/index.d.ts +9 -0
  53. package/dist/src/commands/doctor/index.d.ts.map +1 -0
  54. package/dist/src/commands/doctor/index.js +80 -0
  55. package/dist/src/commands/doctor/index.js.map +1 -0
  56. package/dist/src/commands/doctor/output.d.ts +4 -0
  57. package/dist/src/commands/doctor/output.d.ts.map +1 -0
  58. package/dist/src/commands/doctor/output.js +53 -0
  59. package/dist/src/commands/doctor/output.js.map +1 -0
  60. package/dist/src/commands/doctor/postGeneration.d.ts +7 -0
  61. package/dist/src/commands/doctor/postGeneration.d.ts.map +1 -0
  62. package/dist/src/commands/doctor/postGeneration.js +22 -0
  63. package/dist/src/commands/doctor/postGeneration.js.map +1 -0
  64. package/dist/src/commands/doctor/services.d.ts +5 -0
  65. package/dist/src/commands/doctor/services.d.ts.map +1 -0
  66. package/dist/src/commands/doctor/services.js +80 -0
  67. package/dist/src/commands/doctor/services.js.map +1 -0
  68. package/dist/src/commands/doctor/types.d.ts +69 -0
  69. package/dist/src/commands/doctor/types.d.ts.map +1 -0
  70. package/dist/src/commands/doctor/types.js +2 -0
  71. package/dist/src/commands/doctor/types.js.map +1 -0
  72. package/dist/src/commands/upgrade/context.d.ts +5 -0
  73. package/dist/src/commands/upgrade/context.d.ts.map +1 -0
  74. package/dist/src/commands/upgrade/context.js +57 -0
  75. package/dist/src/commands/upgrade/context.js.map +1 -0
  76. package/dist/src/commands/upgrade/index.d.ts +7 -0
  77. package/dist/src/commands/upgrade/index.d.ts.map +1 -0
  78. package/dist/src/commands/upgrade/index.js +35 -0
  79. package/dist/src/commands/upgrade/index.js.map +1 -0
  80. package/dist/src/commands/upgrade/migrations.d.ts +4 -0
  81. package/dist/src/commands/upgrade/migrations.d.ts.map +1 -0
  82. package/dist/src/commands/upgrade/migrations.js +22 -0
  83. package/dist/src/commands/upgrade/migrations.js.map +1 -0
  84. package/dist/src/commands/upgrade/output.d.ts +4 -0
  85. package/dist/src/commands/upgrade/output.d.ts.map +1 -0
  86. package/dist/src/commands/upgrade/output.js +52 -0
  87. package/dist/src/commands/upgrade/output.js.map +1 -0
  88. package/dist/src/commands/upgrade/plan.d.ts +3 -0
  89. package/dist/src/commands/upgrade/plan.d.ts.map +1 -0
  90. package/dist/src/commands/upgrade/plan.js +119 -0
  91. package/dist/src/commands/upgrade/plan.js.map +1 -0
  92. package/dist/src/commands/upgrade/types.d.ts +48 -0
  93. package/dist/src/commands/upgrade/types.d.ts.map +1 -0
  94. package/dist/src/commands/upgrade/types.js +2 -0
  95. package/dist/src/commands/upgrade/types.js.map +1 -0
  96. package/dist/src/lib/args.d.ts +21 -0
  97. package/dist/src/lib/args.d.ts.map +1 -1
  98. package/dist/src/lib/args.js +119 -1
  99. package/dist/src/lib/args.js.map +1 -1
  100. package/dist/src/lib/constants.d.ts +1 -1
  101. package/dist/src/lib/constants.d.ts.map +1 -1
  102. package/dist/src/lib/constants.js +3 -1
  103. package/dist/src/lib/constants.js.map +1 -1
  104. package/dist/src/lib/expressOAuth.d.ts +10 -0
  105. package/dist/src/lib/expressOAuth.d.ts.map +1 -0
  106. package/dist/src/lib/expressOAuth.js +164 -0
  107. package/dist/src/lib/expressOAuth.js.map +1 -0
  108. package/dist/src/lib/interruption.d.ts +14 -0
  109. package/dist/src/lib/interruption.d.ts.map +1 -0
  110. package/dist/src/lib/interruption.js +16 -0
  111. package/dist/src/lib/interruption.js.map +1 -0
  112. package/dist/src/lib/nonInteractive.d.ts +8 -0
  113. package/dist/src/lib/nonInteractive.d.ts.map +1 -0
  114. package/dist/src/lib/nonInteractive.js +111 -0
  115. package/dist/src/lib/nonInteractive.js.map +1 -0
  116. package/dist/src/lib/oauth.d.ts +9 -0
  117. package/dist/src/lib/oauth.d.ts.map +1 -0
  118. package/dist/src/lib/oauth.js +62 -0
  119. package/dist/src/lib/oauth.js.map +1 -0
  120. package/dist/src/lib/onboarding.d.ts +8 -0
  121. package/dist/src/lib/onboarding.d.ts.map +1 -0
  122. package/dist/src/lib/onboarding.js +35 -0
  123. package/dist/src/lib/onboarding.js.map +1 -0
  124. package/dist/src/lib/packageManagerCommands.d.ts +11 -0
  125. package/dist/src/lib/packageManagerCommands.d.ts.map +1 -0
  126. package/dist/src/lib/packageManagerCommands.js +34 -0
  127. package/dist/src/lib/packageManagerCommands.js.map +1 -0
  128. package/dist/src/lib/process.d.ts.map +1 -1
  129. package/dist/src/lib/process.js +9 -0
  130. package/dist/src/lib/process.js.map +1 -1
  131. package/dist/src/lib/projectManifest.d.ts +67 -0
  132. package/dist/src/lib/projectManifest.d.ts.map +1 -0
  133. package/dist/src/lib/projectManifest.js +134 -0
  134. package/dist/src/lib/projectManifest.js.map +1 -0
  135. package/dist/src/lib/release.d.ts +9 -0
  136. package/dist/src/lib/release.d.ts.map +1 -0
  137. package/dist/src/lib/release.js +48 -0
  138. package/dist/src/lib/release.js.map +1 -0
  139. package/dist/src/lib/rootCommand.d.ts +15 -0
  140. package/dist/src/lib/rootCommand.d.ts.map +1 -0
  141. package/dist/src/lib/rootCommand.js +17 -0
  142. package/dist/src/lib/rootCommand.js.map +1 -0
  143. package/dist/src/lib/schemas.d.ts +15 -6
  144. package/dist/src/lib/schemas.d.ts.map +1 -1
  145. package/dist/src/lib/schemas.js +8 -1
  146. package/dist/src/lib/schemas.js.map +1 -1
  147. package/dist/src/lib/semver.d.ts +10 -0
  148. package/dist/src/lib/semver.d.ts.map +1 -0
  149. package/dist/src/lib/semver.js +51 -0
  150. package/dist/src/lib/semver.js.map +1 -0
  151. package/dist/src/lib/types.d.ts +5 -1
  152. package/dist/src/lib/types.d.ts.map +1 -1
  153. package/dist/src/steps/configurePrisma.d.ts.map +1 -1
  154. package/dist/src/steps/configurePrisma.js +18 -23
  155. package/dist/src/steps/configurePrisma.js.map +1 -1
  156. package/dist/src/steps/configureReadme.d.ts +4 -0
  157. package/dist/src/steps/configureReadme.d.ts.map +1 -0
  158. package/dist/src/steps/configureReadme.js +22 -0
  159. package/dist/src/steps/configureReadme.js.map +1 -0
  160. package/dist/src/steps/createProject.d.ts.map +1 -1
  161. package/dist/src/steps/createProject.js +16 -170
  162. package/dist/src/steps/createProject.js.map +1 -1
  163. package/dist/src/steps/finalSetup.d.ts +3 -2
  164. package/dist/src/steps/finalSetup.d.ts.map +1 -1
  165. package/dist/src/steps/finalSetup.js +14 -9
  166. package/dist/src/steps/finalSetup.js.map +1 -1
  167. package/dist/src/steps/installDeps.d.ts +1 -0
  168. package/dist/src/steps/installDeps.d.ts.map +1 -1
  169. package/dist/src/steps/installDeps.js +11 -0
  170. package/dist/src/steps/installDeps.js.map +1 -1
  171. package/dist/src/steps/prompts.d.ts.map +1 -1
  172. package/dist/src/steps/prompts.js +32 -13
  173. package/dist/src/steps/prompts.js.map +1 -1
  174. package/dist/src/utils/output.d.ts.map +1 -1
  175. package/dist/src/utils/output.js +23 -11
  176. package/dist/src/utils/output.js.map +1 -1
  177. package/package.json +5 -4
  178. package/templates/express-auth/README.md +21 -12
  179. package/templates/express-auth/package.json +11 -7
  180. package/templates/express-auth/src/config/redis.ts +109 -0
  181. package/templates/express-auth/src/server.ts +2 -0
  182. package/templates/express-auth+/README.md +25 -18
  183. package/templates/express-auth+/package.json +11 -7
  184. package/templates/express-auth+/src/auth/auth.ts +2 -0
  185. package/templates/express-auth+/src/auth/controllers/password.controller.ts +12 -1
  186. package/templates/express-auth+/src/auth/routes/password.route.ts +1 -0
  187. package/templates/express-auth+/src/config/redis.ts +109 -0
  188. package/templates/express-auth+/src/utils/security.ts +12 -0
  189. package/templates/express-base/README.md +21 -12
  190. package/templates/express-base/package.json +11 -8
  191. package/templates/express-base/src/.env.example +1 -1
  192. package/templates/express-base/src/config/redis.ts +109 -0
  193. package/templates/express-base/src/server.ts +2 -0
  194. package/templates/fullstack/.env.example +3 -2
  195. package/templates/fullstack/PRESET_CONTRACT.md +7 -3
  196. package/templates/fullstack/README.md +45 -7
  197. package/templates/fullstack/apps/api/package.json +6 -4
  198. package/templates/fullstack/apps/api/prisma/migrations/20260721000000_init/migration.sql +163 -0
  199. package/templates/fullstack/apps/api/prisma/migrations/migration_lock.toml +3 -0
  200. package/templates/fullstack/apps/api/src/auth/authenik8.ts +13 -4
  201. package/templates/fullstack/apps/api/src/config/env.ts +9 -1
  202. package/templates/fullstack/apps/api/src/config/logger.ts +21 -11
  203. package/templates/fullstack/apps/api/tests/logger.test.ts +43 -0
  204. package/templates/fullstack/apps/web/package.json +3 -1
  205. package/templates/fullstack/apps/web/src/App.tsx +1 -1
  206. package/templates/fullstack/apps/web/src/auth/RouteGuards.tsx +1 -1
  207. package/templates/fullstack/apps/web/src/components/AppShell.tsx +90 -45
  208. package/templates/fullstack/apps/web/src/components/AuthShell.tsx +10 -7
  209. package/templates/fullstack/apps/web/src/components/Page.tsx +6 -3
  210. package/templates/fullstack/apps/web/src/features/projects/ProjectPages.tsx +1 -1
  211. package/templates/fullstack/apps/web/src/main.tsx +13 -6
  212. package/templates/fullstack/apps/web/src/pages/DashboardPage.tsx +163 -23
  213. package/templates/fullstack/apps/web/src/pages/StatusPages.tsx +1 -1
  214. package/templates/fullstack/apps/web/src/pages/auth/LoginPage.tsx +93 -17
  215. package/templates/fullstack/apps/web/src/pages/auth/OAuthCallbackPage.tsx +1 -1
  216. package/templates/fullstack/apps/web/src/pages/auth/RecoveryPages.tsx +1 -1
  217. package/templates/fullstack/apps/web/src/pages/auth/RegisterPage.tsx +1 -1
  218. package/templates/fullstack/apps/web/src/pages/auth/VerifyEmailPage.tsx +1 -1
  219. package/templates/fullstack/apps/web/src/styles.css +119 -43
  220. package/templates/fullstack/apps/web/vite.config.ts +12 -0
  221. package/templates/fullstack/docker-compose.yml +2 -2
  222. package/templates/fullstack/gitignore.template +1 -0
  223. package/templates/fullstack/package.json +17 -8
  224. package/templates/fullstack/scripts/run-local.mjs +157 -0
  225. package/templates/prisma/postgresql/.env.example +1 -2
  226. package/templates/prisma/sqlite/.env.example +1 -2
  227. package/templates/prisma/sqlite/client.ts +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/commands/add/context.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGnE,MAAM,OAAO,eAAgB,SAAQ,KAAK;CAAG;AAE7C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,eAAe,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CACvB,sGAAsG,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PlannedFileChange } from "./types.js";
2
+ export declare function formatFileDiff(change: PlannedFileChange): string;
3
+ export declare function formatAddDiff(changes: readonly PlannedFileChange[]): string;
4
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA4FpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAsBhE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,114 @@
1
+ function lines(source) {
2
+ const normalized = source.replace(/\r\n/g, "\n");
3
+ const withoutFinalNewline = normalized.endsWith("\n") ? normalized.slice(0, -1) : normalized;
4
+ return withoutFinalNewline ? withoutFinalNewline.split("\n") : [];
5
+ }
6
+ function lineOperations(before, after) {
7
+ const left = lines(before);
8
+ const right = lines(after);
9
+ if (left.length * right.length > 1_000_000) {
10
+ return [
11
+ ...left.map((line) => ({ type: "delete", line })),
12
+ ...right.map((line) => ({ type: "add", line })),
13
+ ];
14
+ }
15
+ const matrix = Array.from({ length: left.length + 1 }, () => new Uint32Array(right.length + 1));
16
+ for (let leftIndex = left.length - 1; leftIndex >= 0; leftIndex -= 1) {
17
+ for (let rightIndex = right.length - 1; rightIndex >= 0; rightIndex -= 1) {
18
+ matrix[leftIndex][rightIndex] = left[leftIndex] === right[rightIndex]
19
+ ? matrix[leftIndex + 1][rightIndex + 1] + 1
20
+ : Math.max(matrix[leftIndex + 1][rightIndex], matrix[leftIndex][rightIndex + 1]);
21
+ }
22
+ }
23
+ const operations = [];
24
+ let leftIndex = 0;
25
+ let rightIndex = 0;
26
+ while (leftIndex < left.length && rightIndex < right.length) {
27
+ if (left[leftIndex] === right[rightIndex]) {
28
+ operations.push({ type: "equal", line: left[leftIndex] });
29
+ leftIndex += 1;
30
+ rightIndex += 1;
31
+ }
32
+ else if (matrix[leftIndex + 1][rightIndex] >= matrix[leftIndex][rightIndex + 1]) {
33
+ operations.push({ type: "delete", line: left[leftIndex] });
34
+ leftIndex += 1;
35
+ }
36
+ else {
37
+ operations.push({ type: "add", line: right[rightIndex] });
38
+ rightIndex += 1;
39
+ }
40
+ }
41
+ while (leftIndex < left.length)
42
+ operations.push({ type: "delete", line: left[leftIndex++] });
43
+ while (rightIndex < right.length)
44
+ operations.push({ type: "add", line: right[rightIndex++] });
45
+ return operations;
46
+ }
47
+ function redactEnvironmentLine(line) {
48
+ const match = line.match(/^([^=]+)=(.*)$/);
49
+ if (!match)
50
+ return line;
51
+ const name = match[1]?.trim() ?? "";
52
+ if (/(?:SECRET|PASSWORD|TOKEN|PRIVATE|SIGNING_JWKS|CLIENT_ID)$/i.test(name)) {
53
+ return `${name}=<redacted>`;
54
+ }
55
+ return line;
56
+ }
57
+ function hunkRanges(operations, contextLines) {
58
+ const changed = operations
59
+ .map((operation, index) => operation.type === "equal" ? -1 : index)
60
+ .filter((index) => index >= 0);
61
+ if (changed.length === 0)
62
+ return [];
63
+ const ranges = [];
64
+ for (const index of changed) {
65
+ const start = Math.max(0, index - contextLines);
66
+ const end = Math.min(operations.length, index + contextLines + 1);
67
+ const previous = ranges.at(-1);
68
+ if (previous && start <= previous[1])
69
+ previous[1] = Math.max(previous[1], end);
70
+ else
71
+ ranges.push([start, end]);
72
+ }
73
+ return ranges;
74
+ }
75
+ function positionsBefore(operations) {
76
+ const result = [];
77
+ let old = 1;
78
+ let next = 1;
79
+ for (const operation of operations) {
80
+ result.push({ old, next });
81
+ if (operation.type !== "add")
82
+ old += 1;
83
+ if (operation.type !== "delete")
84
+ next += 1;
85
+ }
86
+ result.push({ old, next });
87
+ return result;
88
+ }
89
+ export function formatFileDiff(change) {
90
+ const operations = lineOperations(change.before ?? "", change.after);
91
+ const contextLines = change.sensitive ? 0 : 3;
92
+ const ranges = hunkRanges(operations, contextLines);
93
+ const positions = positionsBefore(operations);
94
+ const suffix = change.sensitive ? " (sensitive values redacted)" : "";
95
+ const beforeLabel = change.before === null ? "/dev/null" : `a/${change.relativePath}${suffix}`;
96
+ const output = [`--- ${beforeLabel}`, `+++ b/${change.relativePath}${suffix}`];
97
+ for (const [start, end] of ranges) {
98
+ const oldCount = operations.slice(start, end).filter((item) => item.type !== "add").length;
99
+ const newCount = operations.slice(start, end).filter((item) => item.type !== "delete").length;
100
+ const position = positions[start] ?? { old: 1, next: 1 };
101
+ const oldStart = change.before === null ? 0 : position.old;
102
+ output.push(`@@ -${oldStart},${oldCount} +${position.next},${newCount} @@`);
103
+ for (const operation of operations.slice(start, end)) {
104
+ const prefix = operation.type === "add" ? "+" : operation.type === "delete" ? "-" : " ";
105
+ const value = change.sensitive ? redactEnvironmentLine(operation.line) : operation.line;
106
+ output.push(`${prefix}${value}`);
107
+ }
108
+ }
109
+ return output.join("\n");
110
+ }
111
+ export function formatAddDiff(changes) {
112
+ return changes.map(formatFileDiff).join("\n\n");
113
+ }
114
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../src/commands/add/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AddOptions, AddResult } from "./types.js";
2
+ export declare class AddUsageError extends Error {
3
+ }
4
+ export declare function parseAddArguments(args: readonly string[], cwd?: string): AddOptions;
5
+ export declare function runAdd(options: AddOptions): Promise<AddResult>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAE3C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,SAAgB,GAClB,UAAU,CA4BZ;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA2BpE"}
@@ -0,0 +1,61 @@
1
+ import path from "node:path";
2
+ import { applyPlannedChanges } from "./apply.js";
3
+ import { createAddContext } from "./context.js";
4
+ import { findAddRecipe } from "./registry.js";
5
+ export class AddUsageError extends Error {
6
+ }
7
+ export function parseAddArguments(args, cwd = process.cwd()) {
8
+ const positional = [];
9
+ let dryRun = false;
10
+ let list = false;
11
+ let help = false;
12
+ for (const argument of args) {
13
+ if (argument === "--dry-run" || argument === "--diff")
14
+ dryRun = true;
15
+ else if (argument === "--list")
16
+ list = true;
17
+ else if (argument === "--help" || argument === "-h")
18
+ help = true;
19
+ else if (argument.startsWith("-"))
20
+ throw new AddUsageError(`Unknown add option: ${argument}`);
21
+ else
22
+ positional.push(argument);
23
+ }
24
+ if (positional.length > 2) {
25
+ throw new AddUsageError("Add accepts one recipe and at most one project directory.");
26
+ }
27
+ if (!list && !help && !positional[0]) {
28
+ throw new AddUsageError("Add requires a recipe name. Use --list to see available recipes.");
29
+ }
30
+ return {
31
+ ...(positional[0] ? { recipeName: positional[0] } : {}),
32
+ directory: path.resolve(cwd, positional[1] ?? "."),
33
+ dryRun,
34
+ list,
35
+ help,
36
+ };
37
+ }
38
+ export async function runAdd(options) {
39
+ if (!options.recipeName)
40
+ throw new AddUsageError("Add requires a recipe name.");
41
+ const recipe = findAddRecipe(options.recipeName);
42
+ if (!recipe) {
43
+ throw new AddUsageError(`Unknown recipe "${options.recipeName}". Use create-authenik8-app add --list.`);
44
+ }
45
+ const context = await createAddContext(options.directory);
46
+ const changes = await recipe.plan(context);
47
+ if (changes.length === 0) {
48
+ return { recipe, rootDir: context.rootDir, changes, status: "unchanged" };
49
+ }
50
+ if (options.dryRun) {
51
+ return { recipe, rootDir: context.rootDir, changes, status: "preview" };
52
+ }
53
+ await applyPlannedChanges(context.rootDir, changes, async () => {
54
+ const verified = await recipe.plan(await createAddContext(context.rootDir));
55
+ if (verified.length > 0) {
56
+ throw new Error(`Post-apply verification found ${verified.length} unapplied recipe change(s).`);
57
+ }
58
+ });
59
+ return { recipe, rootDir: context.rootDir, changes, status: "applied" };
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/add/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AddResult } from "./types.js";
2
+ export declare function addHelp(): string;
3
+ export declare function formatRecipeList(): string;
4
+ export declare function formatAddResult(result: AddResult): string;
5
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,wBAAgB,OAAO,IAAI,MAAM,CAkBhC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CA6BzD"}
@@ -0,0 +1,58 @@
1
+ import { addRecipes } from "./registry.js";
2
+ import { formatAddDiff } from "./diff.js";
3
+ export function addHelp() {
4
+ return `
5
+ AUTHENIK8 ADD
6
+ Apply a built-in, auditable auth recipe to a generated project
7
+
8
+ Usage:
9
+ create-authenik8-app add <recipe> [directory] [options]
10
+ create-authenik8-app add --list
11
+
12
+ Options:
13
+ --dry-run, --diff Print the exact proposed diff without writing files
14
+ --list List built-in recipes and compatible presets
15
+ -h, --help Show this help message
16
+
17
+ Examples:
18
+ npx create-authenik8-app add oauth-github
19
+ npx create-authenik8-app add oauth-google ./my-app --dry-run
20
+ `;
21
+ }
22
+ export function formatRecipeList() {
23
+ const lines = ["\nBuilt-in Authenik8 recipes", ""];
24
+ for (const recipe of addRecipes) {
25
+ lines.push(` ${recipe.id.padEnd(16)} ${recipe.description}`, ` ${"".padEnd(16)} Presets: ${recipe.supportedPresets.join(", ")}`);
26
+ }
27
+ lines.push("", "Preview any recipe with --dry-run before applying it.", "");
28
+ return lines.join("\n");
29
+ }
30
+ export function formatAddResult(result) {
31
+ const lines = [
32
+ "",
33
+ `Authenik8 add · ${result.recipe.id}`,
34
+ `Project: ${result.rootDir}`,
35
+ "",
36
+ ];
37
+ if (result.status === "unchanged") {
38
+ lines.push("Nothing to change. The recipe is already fully wired.", "");
39
+ return lines.join("\n");
40
+ }
41
+ lines.push(formatAddDiff(result.changes), "");
42
+ if (result.status === "preview") {
43
+ lines.push(`Dry run: ${result.changes.length} file(s) would change; no files were written.`);
44
+ }
45
+ else {
46
+ lines.push(`Applied and verified ${result.changes.length} file(s).`);
47
+ if (result.recipe.provider) {
48
+ const prefix = result.recipe.provider.toUpperCase();
49
+ lines.push(`Next: set ${prefix}_CLIENT_ID and ${prefix}_CLIENT_SECRET, then run create-authenik8-app doctor.`);
50
+ }
51
+ else {
52
+ lines.push("Next: commit the workflow and let its Authenik8 checks run on a pull request.");
53
+ }
54
+ }
55
+ lines.push("");
56
+ return lines.join("\n");
57
+ }
58
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../../src/commands/add/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,OAAO;IACrB,OAAO;;;;;;;;;;;;;;;;CAgBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EACjD,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,uDAAuD,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,mBAAmB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE;QACrC,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,EAAE;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,+CAA+C,CAAC,CAAC;IAC/F,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CACR,aAAa,MAAM,kBAAkB,MAAM,uDAAuD,CACnG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type OAuthProvider } from "../../lib/oauth.js";
2
+ import type { AddContext, PlannedFileChange } from "./types.js";
3
+ export declare class AddRecipeError extends Error {
4
+ }
5
+ export declare function planOAuthProvider(context: AddContext, provider: OAuthProvider): Promise<PlannedFileChange[]>;
6
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/plan.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAS5B,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIhE,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAkG5C,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8C9B"}
@@ -0,0 +1,93 @@
1
+ import path from "node:path";
2
+ import fs from "fs-extra";
3
+ import { ensureOAuthEnvironment, oauthProviders, supportedOAuthProviders, } from "../../lib/oauth.js";
4
+ import { expressOAuthFiles, renderExpressOAuthFiles, } from "../../lib/expressOAuth.js";
5
+ import { PROJECT_MANIFEST_FILENAME, projectManifestSchema, } from "../../lib/projectManifest.js";
6
+ const fullstackProviderFile = "apps/web/src/auth/providers.ts";
7
+ export class AddRecipeError extends Error {
8
+ }
9
+ async function requiredSource(context, relativePath) {
10
+ const filename = path.join(context.rootDir, relativePath);
11
+ if (!(await fs.pathExists(filename))) {
12
+ throw new AddRecipeError(`Required generated file is missing: ${relativePath}`);
13
+ }
14
+ return fs.readFile(filename, "utf8");
15
+ }
16
+ function addChange(changes, relativePath, before, after, sensitive = false) {
17
+ if (before !== after) {
18
+ changes.push({ relativePath, before, after, ...(sensitive ? { sensitive: true } : {}) });
19
+ }
20
+ }
21
+ function sameProviders(left, right) {
22
+ return left.length === right.length && left.every((provider, index) => provider === right[index]);
23
+ }
24
+ function nextProviders(current, added) {
25
+ const enabled = new Set([...current, added]);
26
+ return oauthProviders.filter((provider) => enabled.has(provider));
27
+ }
28
+ function renderFullstackProviderSource(source, manifestProviders, providers) {
29
+ const pattern = /(export const enabledOAuthProviders[^=]*=\s*)(\[[^;]*\])/gs;
30
+ const matches = [...source.matchAll(pattern)];
31
+ if (matches.length !== 1) {
32
+ throw new AddRecipeError(`${fullstackProviderFile} does not contain one recognizable provider registry; refusing to guess.`);
33
+ }
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(matches[0]?.[2] ?? "");
37
+ }
38
+ catch {
39
+ throw new AddRecipeError(`${fullstackProviderFile} contains an invalid provider registry.`);
40
+ }
41
+ const actual = Array.isArray(parsed)
42
+ ? supportedOAuthProviders(parsed.filter((value) => typeof value === "string"))
43
+ : [];
44
+ if (!Array.isArray(parsed) || actual.length !== parsed.length || !sameProviders(actual, manifestProviders)) {
45
+ throw new AddRecipeError(`${fullstackProviderFile} has drifted from authenik8.json; run doctor and reconcile it before adding auth features.`);
46
+ }
47
+ return source.replace(pattern, `$1${JSON.stringify(providers)}`);
48
+ }
49
+ async function planExpressSource(context, currentProviders, providers, changes) {
50
+ const current = renderExpressOAuthFiles(currentProviders);
51
+ const next = renderExpressOAuthFiles(providers);
52
+ for (const relativePath of Object.values(expressOAuthFiles)) {
53
+ const before = await requiredSource(context, relativePath);
54
+ if (before !== current[relativePath]) {
55
+ throw new AddRecipeError(`${relativePath} has local changes. The recipe will not overwrite modified auth code; integrate the provider manually or restore the generated file.`);
56
+ }
57
+ addChange(changes, relativePath, before, next[relativePath]);
58
+ }
59
+ }
60
+ async function planEnvironment(context, provider, preset, changes) {
61
+ for (const relativePath of [".env.example", ".env"]) {
62
+ const before = await requiredSource(context, relativePath);
63
+ const after = ensureOAuthEnvironment(before, provider, preset);
64
+ addChange(changes, relativePath, before, after, relativePath === ".env");
65
+ }
66
+ }
67
+ export async function planOAuthProvider(context, provider) {
68
+ const { manifest } = context;
69
+ if (manifest.preset !== "auth-oauth" && manifest.preset !== "fullstack") {
70
+ throw new AddRecipeError(`oauth-${provider} supports auth-oauth and fullstack projects; this project uses ${manifest.preset}.`);
71
+ }
72
+ const currentProviders = supportedOAuthProviders(manifest.features.oauthProviders);
73
+ const providers = nextProviders(currentProviders, provider);
74
+ const changes = [];
75
+ if (manifest.preset === "auth-oauth") {
76
+ await planExpressSource(context, currentProviders, providers, changes);
77
+ }
78
+ else {
79
+ const before = await requiredSource(context, fullstackProviderFile);
80
+ addChange(changes, fullstackProviderFile, before, renderFullstackProviderSource(before, currentProviders, providers));
81
+ }
82
+ await planEnvironment(context, provider, manifest.preset === "fullstack" ? "fullstack" : "express", changes);
83
+ if (!sameProviders(currentProviders, providers)) {
84
+ const before = await requiredSource(context, PROJECT_MANIFEST_FILENAME);
85
+ const updated = projectManifestSchema.parse({
86
+ ...manifest,
87
+ features: { ...manifest.features, oauthProviders: providers },
88
+ });
89
+ addChange(changes, PROJECT_MANIFEST_FILENAME, before, `${JSON.stringify(updated, null, 2)}\n`);
90
+ }
91
+ return changes;
92
+ }
93
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/commands/add/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AddRecipe } from "./types.js";
2
+ export declare const addRecipes: readonly AddRecipe[];
3
+ export declare function findAddRecipe(name: string): AddRecipe | undefined;
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiC5C,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAIzC,CAAC;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjE"}
@@ -0,0 +1,37 @@
1
+ import { planOAuthProvider } from "./plan.js";
2
+ import { planGithubCi } from "./ci.js";
3
+ const googleRecipe = Object.freeze({
4
+ id: "oauth-google",
5
+ aliases: Object.freeze(["google"]),
6
+ description: "Enable Google OAuth across the generated provider registry and environment",
7
+ provider: "google",
8
+ category: "oauth",
9
+ supportedPresets: Object.freeze(["auth-oauth", "fullstack"]),
10
+ plan: (context) => planOAuthProvider(context, "google"),
11
+ });
12
+ const githubRecipe = Object.freeze({
13
+ id: "oauth-github",
14
+ aliases: Object.freeze(["github"]),
15
+ description: "Enable GitHub OAuth across the generated provider registry and environment",
16
+ provider: "github",
17
+ category: "oauth",
18
+ supportedPresets: Object.freeze(["auth-oauth", "fullstack"]),
19
+ plan: (context) => planOAuthProvider(context, "github"),
20
+ });
21
+ const githubCiRecipe = Object.freeze({
22
+ id: "ci-github",
23
+ aliases: Object.freeze(["github-ci"]),
24
+ description: "Add a pinned GitHub Actions auth-boundary and upgrade-policy gate",
25
+ category: "ci",
26
+ supportedPresets: Object.freeze(["base", "auth", "auth-oauth", "fullstack"]),
27
+ plan: planGithubCi,
28
+ });
29
+ export const addRecipes = Object.freeze([
30
+ googleRecipe,
31
+ githubRecipe,
32
+ githubCiRecipe,
33
+ ]);
34
+ export function findAddRecipe(name) {
35
+ return addRecipes.find((recipe) => recipe.id === name || recipe.aliases.includes(name));
36
+ }
37
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/commands/add/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClC,WAAW,EAAE,4EAA4E;IACzF,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,OAAO;IACjB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;CACpC,CAAC,CAAC;AAEzB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClC,WAAW,EAAE,4EAA4E;IACzF,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,OAAO;IACjB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;CACpC,CAAC,CAAC;AAEzB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,WAAW;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IACrC,WAAW,EAAE,mEAAmE;IAChF,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5E,IAAI,EAAE,YAAY;CACC,CAAC,CAAC;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAyB,MAAM,CAAC,MAAM,CAAC;IAC5D,YAAY;IACZ,YAAY;IACZ,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { AuthMode } from "../../lib/types.js";
2
+ import type { OAuthProvider } from "../../lib/oauth.js";
3
+ import type { ProjectManifest } from "../../lib/projectManifest.js";
4
+ export type AddRecipeId = `oauth-${OAuthProvider}` | "ci-github";
5
+ export type PlannedFileChange = {
6
+ relativePath: string;
7
+ before: string | null;
8
+ after: string;
9
+ sensitive?: boolean;
10
+ };
11
+ export type AddContext = {
12
+ rootDir: string;
13
+ manifest: ProjectManifest;
14
+ };
15
+ export type AddRecipe = {
16
+ id: AddRecipeId;
17
+ aliases: readonly string[];
18
+ description: string;
19
+ provider?: OAuthProvider;
20
+ category: "oauth" | "ci";
21
+ supportedPresets: readonly AuthMode[];
22
+ plan(context: AddContext): Promise<PlannedFileChange[]>;
23
+ };
24
+ export type AddOptions = {
25
+ recipeName?: string;
26
+ directory: string;
27
+ dryRun: boolean;
28
+ list: boolean;
29
+ help: boolean;
30
+ };
31
+ export type AddResult = {
32
+ recipe: AddRecipe;
33
+ rootDir: string;
34
+ changes: PlannedFileChange[];
35
+ status: "applied" | "preview" | "unchanged";
36
+ };
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/add/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,SAAS,aAAa,EAAE,GAAG,WAAW,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,SAAS,QAAQ,EAAE,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;CAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/add/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { DoctorCheck, DoctorContext } from "./types.js";
2
+ export declare function runStaticChecks(context: DoctorContext, nodeVersion?: string, allowMissingCore?: boolean): Promise<DoctorCheck[]>;
3
+ //# sourceMappingURL=checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../../src/commands/doctor/checks.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EAEd,MAAM,YAAY,CAAC;AAkbpB,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,WAAW,SAAwB,EACnC,gBAAgB,UAAQ,GACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmDxB"}