tailar 0.4.0 → 0.5.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/README.md +5 -2
- package/README.npm.md +5 -2
- package/dist/api/client.d.ts +22 -28
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +111 -236
- package/dist/api/client.js.map +1 -1
- package/dist/api/errors.d.ts +16 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +32 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/auth/flow.js +1 -1
- package/dist/auth/flow.js.map +1 -1
- package/dist/commands/add.d.ts +9 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +63 -113
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +106 -70
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +1 -23
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/playground.d.ts.map +1 -1
- package/dist/commands/playground.js +2 -1
- package/dist/commands/playground.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +9 -4
- package/dist/commands/sync.js.map +1 -1
- package/dist/installers/agent-files.d.ts +26 -0
- package/dist/installers/agent-files.d.ts.map +1 -0
- package/dist/installers/agent-files.js +110 -0
- package/dist/installers/agent-files.js.map +1 -0
- package/dist/installers/dependencies.d.ts +10 -0
- package/dist/installers/dependencies.d.ts.map +1 -1
- package/dist/installers/dependencies.js +52 -8
- package/dist/installers/dependencies.js.map +1 -1
- package/dist/installers/files.d.ts +2 -6
- package/dist/installers/files.d.ts.map +1 -1
- package/dist/installers/files.js +30 -35
- package/dist/installers/files.js.map +1 -1
- package/dist/installers/install-feature.d.ts +25 -1
- package/dist/installers/install-feature.d.ts.map +1 -1
- package/dist/installers/install-feature.js +100 -59
- package/dist/installers/install-feature.js.map +1 -1
- package/dist/installers/managed-blocks.d.ts +26 -0
- package/dist/installers/managed-blocks.d.ts.map +1 -0
- package/dist/installers/managed-blocks.js +47 -0
- package/dist/installers/managed-blocks.js.map +1 -0
- package/dist/installers/post-install.d.ts +12 -0
- package/dist/installers/post-install.d.ts.map +1 -1
- package/dist/installers/post-install.js +19 -0
- package/dist/installers/post-install.js.map +1 -1
- package/dist/installers/setup-guide.d.ts +38 -0
- package/dist/installers/setup-guide.d.ts.map +1 -0
- package/dist/installers/setup-guide.js +206 -0
- package/dist/installers/setup-guide.js.map +1 -0
- package/dist/installers/variant-switch.d.ts +34 -0
- package/dist/installers/variant-switch.d.ts.map +1 -0
- package/dist/installers/variant-switch.js +139 -0
- package/dist/installers/variant-switch.js.map +1 -0
- package/dist/installers/when.d.ts +22 -0
- package/dist/installers/when.d.ts.map +1 -0
- package/dist/installers/when.js +35 -0
- package/dist/installers/when.js.map +1 -0
- package/dist/registry/query.d.ts +6 -1
- package/dist/registry/query.d.ts.map +1 -1
- package/dist/registry/query.js +22 -0
- package/dist/registry/query.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/registry.d.ts +65 -6
- package/dist/types/registry.d.ts.map +1 -1
- package/dist/types/wizard.d.ts +34 -8
- package/dist/types/wizard.d.ts.map +1 -1
- package/dist/types/wizard.js +74 -40
- package/dist/types/wizard.js.map +1 -1
- package/dist/utils/clack-wizard.d.ts +3 -1
- package/dist/utils/clack-wizard.d.ts.map +1 -1
- package/dist/utils/clack-wizard.js +205 -107
- package/dist/utils/clack-wizard.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -5
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/init-flags.d.ts +43 -8
- package/dist/utils/init-flags.d.ts.map +1 -1
- package/dist/utils/init-flags.js +119 -32
- package/dist/utils/init-flags.js.map +1 -1
- package/dist/utils/local-options.js +1 -1
- package/dist/utils/local-options.js.map +1 -1
- package/dist/utils/next-steps.d.ts +9 -0
- package/dist/utils/next-steps.d.ts.map +1 -0
- package/dist/utils/next-steps.js +15 -0
- package/dist/utils/next-steps.js.map +1 -0
- package/dist/utils/presets.d.ts +34 -0
- package/dist/utils/presets.d.ts.map +1 -0
- package/dist/utils/presets.js +82 -0
- package/dist/utils/presets.js.map +1 -0
- package/dist/utils/recipe-id.d.ts +19 -0
- package/dist/utils/recipe-id.d.ts.map +1 -0
- package/dist/utils/recipe-id.js +72 -0
- package/dist/utils/recipe-id.js.map +1 -0
- package/dist/utils/recipe.d.ts +49 -0
- package/dist/utils/recipe.d.ts.map +1 -0
- package/dist/utils/recipe.js +227 -0
- package/dist/utils/recipe.js.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-files.js","sourceRoot":"","sources":["../../src/installers/agent-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,16 @@ export declare function mergeDependencies(projectPath: string, dependencyMaps: D
|
|
|
14
14
|
};
|
|
15
15
|
conflicts: string[];
|
|
16
16
|
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Read package.json as it is now, or null when there is none or it is invalid.
|
|
19
|
+
*/
|
|
20
|
+
export declare function snapshotPackageJson(projectPath: string): Promise<Record<string, any> | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Put back what an overriding package.json took away. Keys the new file
|
|
23
|
+
* already has win (so a base sync still updates the base versions); keys it
|
|
24
|
+
* lacks (module dependencies, scripts, the project name) come from `previous`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function restorePackageJson(projectPath: string, previous: Record<string, any>): Promise<boolean>;
|
|
17
27
|
/**
|
|
18
28
|
* Run package manager install
|
|
19
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/installers/dependencies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqBlE;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,aAAa,EAAE,GAC9B,OAAO,CAAC;IACT,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAsID;AAcD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/installers/dependencies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqBlE;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,aAAa,EAAE,GAC9B,OAAO,CAAC;IACT,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAsID;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAMrC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAelB;AAcD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,GAAG,EACV,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,EAAE,CAiBjB"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { readFile, writeFile } from "fs/promises";
|
|
7
7
|
import { join } from "path";
|
|
8
|
-
import {
|
|
8
|
+
import { spawn } from "child_process";
|
|
9
9
|
import { getInstallCommand } from "../utils/package-manager.js";
|
|
10
10
|
/**
|
|
11
11
|
* Read package.json
|
|
@@ -134,6 +134,39 @@ export async function mergeDependencies(projectPath, dependencyMaps) {
|
|
|
134
134
|
await writePackageJson(projectPath, pkg);
|
|
135
135
|
return { added, conflicts };
|
|
136
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Read package.json as it is now, or null when there is none or it is invalid.
|
|
139
|
+
*/
|
|
140
|
+
export async function snapshotPackageJson(projectPath) {
|
|
141
|
+
try {
|
|
142
|
+
return await readPackageJson(projectPath);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Put back what an overriding package.json took away. Keys the new file
|
|
150
|
+
* already has win (so a base sync still updates the base versions); keys it
|
|
151
|
+
* lacks (module dependencies, scripts, the project name) come from `previous`.
|
|
152
|
+
*/
|
|
153
|
+
export async function restorePackageJson(projectPath, previous) {
|
|
154
|
+
const current = await readPackageJson(projectPath);
|
|
155
|
+
const next = { ...current };
|
|
156
|
+
for (const section of ["scripts", "dependencies", "devDependencies"]) {
|
|
157
|
+
if (!previous[section])
|
|
158
|
+
continue;
|
|
159
|
+
const merged = { ...previous[section], ...(current[section] ?? {}) };
|
|
160
|
+
next[section] =
|
|
161
|
+
section === "scripts" ? merged : sortObject(merged);
|
|
162
|
+
}
|
|
163
|
+
if (previous.name)
|
|
164
|
+
next.name = previous.name;
|
|
165
|
+
const changed = JSON.stringify(next) !== JSON.stringify(current);
|
|
166
|
+
if (changed)
|
|
167
|
+
await writePackageJson(projectPath, next);
|
|
168
|
+
return changed;
|
|
169
|
+
}
|
|
137
170
|
/**
|
|
138
171
|
* Sort object keys alphabetically
|
|
139
172
|
*/
|
|
@@ -154,15 +187,26 @@ export async function runInstall(projectPath, packageManager, options = {}) {
|
|
|
154
187
|
if (packageManager === "npm") {
|
|
155
188
|
command += " --legacy-peer-deps";
|
|
156
189
|
}
|
|
157
|
-
|
|
158
|
-
|
|
190
|
+
// Asynchronous on purpose: a blocking call would freeze the CLI spinner for
|
|
191
|
+
// the whole install and make the terminal look stuck.
|
|
192
|
+
await new Promise((resolve, reject) => {
|
|
193
|
+
const child = spawn(command, {
|
|
159
194
|
cwd: projectPath,
|
|
160
|
-
|
|
195
|
+
shell: true,
|
|
196
|
+
stdio: options.silent ? ["ignore", "ignore", "pipe"] : "inherit",
|
|
161
197
|
});
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
198
|
+
let stderr = "";
|
|
199
|
+
child.stderr?.on("data", (chunk) => {
|
|
200
|
+
stderr = (stderr + String(chunk)).slice(-2000);
|
|
201
|
+
});
|
|
202
|
+
child.on("error", (error) => reject(new Error(`Failed to run ${command}: ${error}`)));
|
|
203
|
+
child.on("close", (code) => {
|
|
204
|
+
if (code === 0)
|
|
205
|
+
resolve();
|
|
206
|
+
else
|
|
207
|
+
reject(new Error(`Failed to run ${command}: exited with code ${code}${stderr ? `\n${stderr.trim()}` : ""}`));
|
|
208
|
+
});
|
|
209
|
+
});
|
|
166
210
|
}
|
|
167
211
|
/**
|
|
168
212
|
* Collect all dependencies from entry and its variants
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/installers/dependencies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/installers/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,11 +26,11 @@ export declare function checkFileExists(projectPath: string, targetPath: string)
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function installFile(sourceContent: string, projectPath: string, targetPath: string, variables?: Record<string, string>, options?: {
|
|
28
28
|
overwrite?: boolean;
|
|
29
|
-
strategy?: "override" | "merge";
|
|
29
|
+
strategy?: "override" | "merge" | "managed";
|
|
30
30
|
}): Promise<void>;
|
|
31
31
|
/**
|
|
32
32
|
* Install multiple files from file mappings.
|
|
33
|
-
* Local registry mode reads sources from disk and skips
|
|
33
|
+
* Local registry mode reads sources from disk and skips login and licence checks.
|
|
34
34
|
*/
|
|
35
35
|
export declare function installFiles(projectPath: string, fileMappings: FileMapping[], context: ProjectContext, variables: Record<string, string> | undefined, options: {
|
|
36
36
|
overwrite?: boolean;
|
|
@@ -38,10 +38,6 @@ export declare function installFiles(projectPath: string, fileMappings: FileMapp
|
|
|
38
38
|
componentType: "feature" | "block" | "component" | "template";
|
|
39
39
|
componentName: string;
|
|
40
40
|
variant?: string;
|
|
41
|
-
registryEntry?: {
|
|
42
|
-
requiresSubscription?: boolean;
|
|
43
|
-
subscriptionTier?: number;
|
|
44
|
-
};
|
|
45
41
|
}): Promise<{
|
|
46
42
|
installed: string[];
|
|
47
43
|
skipped: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/installers/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/installers/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQhE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACrC,MAAM,CAuBR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,MAAM,CAYR;AA8BD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAGT;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACtC,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;CACxC,GACL,OAAO,CAAC,IAAI,CAAC,CA2Cf;AA4BD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAK,EACtC,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CA6FD"}
|
package/dist/installers/files.js
CHANGED
|
@@ -7,8 +7,11 @@
|
|
|
7
7
|
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
8
8
|
import { existsSync } from "fs";
|
|
9
9
|
import { join, dirname } from "path";
|
|
10
|
-
import { fetchComponentFile,
|
|
10
|
+
import { fetchComponentFile, requireLicence } from "../api/client.js";
|
|
11
|
+
import { isLicenceRequiredError } from "../api/errors.js";
|
|
11
12
|
import { getLocalRegistry, readLocalComponentFile } from "../registry/local-mode.js";
|
|
13
|
+
import { evaluateWhen } from "./when.js";
|
|
14
|
+
import { mergeManagedContent, extractManagedBlocks } from "./managed-blocks.js";
|
|
12
15
|
/**
|
|
13
16
|
* Resolve template variables in a path
|
|
14
17
|
*/
|
|
@@ -51,7 +54,7 @@ export function mergeJsonContent(existingContent, newContent) {
|
|
|
51
54
|
const newData = JSON.parse(newContent);
|
|
52
55
|
// Deep merge the objects
|
|
53
56
|
const merged = deepMerge(existing, newData);
|
|
54
|
-
return JSON.stringify(merged, null, 2);
|
|
57
|
+
return JSON.stringify(merged, null, 2) + "\n";
|
|
55
58
|
}
|
|
56
59
|
catch (error) {
|
|
57
60
|
throw new Error(`Failed to merge JSON: ${error}`);
|
|
@@ -96,8 +99,14 @@ export async function installFile(sourceContent, projectPath, targetPath, variab
|
|
|
96
99
|
const fileExists = existsSync(fullTargetPath);
|
|
97
100
|
// Apply template substitution
|
|
98
101
|
let processedContent = applyTemplateSubstitution(sourceContent, variables);
|
|
99
|
-
//
|
|
100
|
-
if (fileExists &&
|
|
102
|
+
// Managed files keep user text; only the tailar blocks are replaced
|
|
103
|
+
if (fileExists &&
|
|
104
|
+
options.strategy === "managed" &&
|
|
105
|
+
extractManagedBlocks(processedContent).length > 0) {
|
|
106
|
+
const existingContent = await readFile(fullTargetPath, "utf-8");
|
|
107
|
+
processedContent = mergeManagedContent(existingContent, processedContent);
|
|
108
|
+
}
|
|
109
|
+
else if (fileExists && options.strategy === "merge") {
|
|
101
110
|
// Check if it's a JSON file
|
|
102
111
|
if (targetPath.endsWith(".json")) {
|
|
103
112
|
const existingContent = await readFile(fullTargetPath, "utf-8");
|
|
@@ -110,6 +119,7 @@ export async function installFile(sourceContent, projectPath, targetPath, variab
|
|
|
110
119
|
else if (fileExists &&
|
|
111
120
|
!options.overwrite &&
|
|
112
121
|
options.strategy !== "merge" &&
|
|
122
|
+
options.strategy !== "managed" &&
|
|
113
123
|
options.strategy !== "override") {
|
|
114
124
|
// File exists and we're not overwriting, merging, or using override strategy
|
|
115
125
|
throw new Error(`File already exists: ${targetPath}`);
|
|
@@ -124,12 +134,13 @@ export async function installFile(sourceContent, projectPath, targetPath, variab
|
|
|
124
134
|
/**
|
|
125
135
|
* Fetch file content from API endpoint
|
|
126
136
|
*/
|
|
127
|
-
async function fetchFileFromAPI(type, name, filePath, variant
|
|
137
|
+
async function fetchFileFromAPI(type, name, filePath, variant) {
|
|
128
138
|
try {
|
|
129
|
-
return await fetchComponentFile(type, name, filePath, { variant
|
|
139
|
+
return await fetchComponentFile(type, name, filePath, { variant });
|
|
130
140
|
}
|
|
131
141
|
catch (error) {
|
|
132
|
-
if (error
|
|
142
|
+
if (isLicenceRequiredError(error) ||
|
|
143
|
+
(error instanceof Error && error.message.includes("Access denied"))) {
|
|
133
144
|
throw error;
|
|
134
145
|
}
|
|
135
146
|
throw new Error(`Failed to fetch file from API: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -137,42 +148,24 @@ async function fetchFileFromAPI(type, name, filePath, variant, requireAuth) {
|
|
|
137
148
|
}
|
|
138
149
|
/**
|
|
139
150
|
* Install multiple files from file mappings.
|
|
140
|
-
* Local registry mode reads sources from disk and skips
|
|
151
|
+
* Local registry mode reads sources from disk and skips login and licence checks.
|
|
141
152
|
*/
|
|
142
153
|
export async function installFiles(projectPath, fileMappings, context, variables = {}, options) {
|
|
143
154
|
const installed = [];
|
|
144
155
|
const skipped = [];
|
|
145
156
|
const conflicts = [];
|
|
146
157
|
const local = getLocalRegistry();
|
|
147
|
-
//
|
|
148
|
-
// This prevents repeated authentication prompts for paid components
|
|
149
|
-
const requireAuth = !local?.enabled &&
|
|
150
|
-
options.registryEntry?.requiresSubscription === true &&
|
|
151
|
-
(options.registryEntry.subscriptionTier || 0) > 0;
|
|
152
|
-
// Check subscription before installing.
|
|
158
|
+
// Registry files need a logged-in licence holder (checked once per run).
|
|
153
159
|
// Local mode is for development and CI and does not talk to the API.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
const accessCheck = await checkSubscription(options.componentType, options.componentName, options.registryEntry);
|
|
158
|
-
if (!accessCheck.accessible) {
|
|
159
|
-
throw new Error(accessCheck.reason ||
|
|
160
|
-
"Subscription required. Visit https://tailar.dev/choose-plan to upgrade.");
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
// Always throw subscription/authentication errors - don't silently continue
|
|
165
|
-
if (error instanceof Error &&
|
|
166
|
-
(error.message.includes("Subscription") ||
|
|
167
|
-
error.message.includes("Authentication") ||
|
|
168
|
-
error.message.includes("Access denied"))) {
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
// For other errors, also throw to prevent installation without proper verification
|
|
172
|
-
throw new Error(`Failed to verify subscription access: ${error instanceof Error ? error.message : String(error)}`);
|
|
173
|
-
}
|
|
160
|
+
if (!local?.enabled && !options.dryRun) {
|
|
161
|
+
await requireLicence();
|
|
174
162
|
}
|
|
175
163
|
for (const mapping of fileMappings) {
|
|
164
|
+
// Files that depend on other installed features (db, auth)
|
|
165
|
+
if (!evaluateWhen(mapping.when, context.config, context.plannedFeatures)) {
|
|
166
|
+
skipped.push(mapping.target);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
176
169
|
// Resolve target path
|
|
177
170
|
const targetPath = resolveTemplatePath(mapping.target, context, variables);
|
|
178
171
|
// Determine strategy (default to override)
|
|
@@ -208,7 +201,7 @@ export async function installFiles(projectPath, fileMappings, context, variables
|
|
|
208
201
|
sourceContent = await readLocalComponentFile(local.componentsPath, options.componentType, options.componentName, effectiveSource);
|
|
209
202
|
}
|
|
210
203
|
else {
|
|
211
|
-
sourceContent = await fetchFileFromAPI(options.componentType, options.componentName, effectiveSource, options.variant
|
|
204
|
+
sourceContent = await fetchFileFromAPI(options.componentType, options.componentName, effectiveSource, options.variant);
|
|
212
205
|
}
|
|
213
206
|
// Install file
|
|
214
207
|
await installFile(sourceContent, projectPath, targetPath, variables, {
|
|
@@ -218,6 +211,8 @@ export async function installFiles(projectPath, fileMappings, context, variables
|
|
|
218
211
|
installed.push(targetPath);
|
|
219
212
|
}
|
|
220
213
|
catch (error) {
|
|
214
|
+
if (isLicenceRequiredError(error))
|
|
215
|
+
throw error;
|
|
221
216
|
throw new Error(`Failed to install ${targetPath}: ${error}`);
|
|
222
217
|
}
|
|
223
218
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/installers/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/installers/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Programmatic install of a registry feature (same pipeline as tailar add).
|
|
3
3
|
*/
|
|
4
|
-
import type { ProjectConfig } from '../types/index.js';
|
|
4
|
+
import type { ProjectConfig, RegistryEntry } from '../types/index.js';
|
|
5
5
|
export interface InstallFeatureOptions {
|
|
6
6
|
yes?: boolean;
|
|
7
7
|
force?: boolean;
|
|
@@ -14,6 +14,8 @@ export interface InstallFeatureOptions {
|
|
|
14
14
|
* installation. Keys must already be UPPER_SNAKE_CASE (e.g. PROJECT_NAME).
|
|
15
15
|
*/
|
|
16
16
|
extraVars?: Record<string, string>;
|
|
17
|
+
/** Features selected for the same run; `when` treats them as present. */
|
|
18
|
+
plannedFeatures?: string[];
|
|
17
19
|
}
|
|
18
20
|
export interface InstallFeatureResult {
|
|
19
21
|
postInstallSteps: unknown[];
|
|
@@ -23,6 +25,28 @@ export interface InstallFeatureResult {
|
|
|
23
25
|
}
|
|
24
26
|
/** Variant already recorded in .tailar.json, if this entry was installed before. */
|
|
25
27
|
export declare function installedVariantFor(config: ProjectConfig | null | undefined, name: string): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Refuse to reinstall an entry over an app generated with a variant the
|
|
30
|
+
* registry no longer ships. Copying the new files over old data would break
|
|
31
|
+
* the app, so the registry names the migration instead.
|
|
32
|
+
*/
|
|
33
|
+
export declare function assertNotLegacyVariant(entry: Pick<RegistryEntry, 'name' | 'legacyVariants'>, config: ProjectConfig | null | undefined): void;
|
|
34
|
+
export interface VariantSelectionInput {
|
|
35
|
+
variant?: string;
|
|
36
|
+
provider?: string;
|
|
37
|
+
/** True when the caller supplied preset answers (a remembered variant is then not reused). */
|
|
38
|
+
presetAnswers?: boolean;
|
|
39
|
+
answers: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Pick the variant to install for an entry. Shared by `installFeature`
|
|
43
|
+
* (init, sync) and `tailar add`.
|
|
44
|
+
*
|
|
45
|
+
* A variant picked by looking at another feature (resolver.detect) is
|
|
46
|
+
* detected again, so `sync` follows a changed auth or db. Variants chosen
|
|
47
|
+
* by the user are remembered.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveSelectedVariant(entry: RegistryEntry, config: ProjectConfig | null | undefined, input: VariantSelectionInput): string | undefined;
|
|
26
50
|
/**
|
|
27
51
|
* Install a single registry entry by name. Caller must install dependencies first if needed.
|
|
28
52
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-feature.d.ts","sourceRoot":"","sources":["../../src/installers/install-feature.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"install-feature.d.ts","sourceRoot":"","sources":["../../src/installers/install-feature.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH,OAAO,KAAK,EAAE,aAAa,EAAkB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAItF,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACxC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CASpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAAC,EACrD,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GACvC,IAAI,CAQN;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACxC,KAAK,EAAE,qBAAqB,GAC3B,MAAM,GAAG,SAAS,CAgDpB;AAYD;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAmJ/B"}
|
|
@@ -10,11 +10,12 @@ import { loadRegistry } from '../registry/loader.js';
|
|
|
10
10
|
import { getEntry, getVariant } from '../registry/query.js';
|
|
11
11
|
import { runPrompts } from '../utils/prompts.js';
|
|
12
12
|
import { installFiles } from './files.js';
|
|
13
|
-
import {
|
|
13
|
+
import { evaluateWhen } from './when.js';
|
|
14
|
+
import { installAgentFiles } from './agent-files.js';
|
|
15
|
+
import { cleanupPreviousVariant } from './variant-switch.js';
|
|
16
|
+
import { mergeDependencies, collectDependencies, snapshotPackageJson, restorePackageJson, } from './dependencies.js';
|
|
14
17
|
import { collectTemplateVariables, extractVariablesFromAnswers, mergeVariables, } from './templates.js';
|
|
15
|
-
import {
|
|
16
|
-
import { checkSubscription } from '../api/client.js';
|
|
17
|
-
import { getLocalRegistry } from '../registry/local-mode.js';
|
|
18
|
+
import { requireLicence } from '../api/client.js';
|
|
18
19
|
import { logger } from '../utils/logger.js';
|
|
19
20
|
/** Variant already recorded in .tailar.json, if this entry was installed before. */
|
|
20
21
|
export function installedVariantFor(config, name) {
|
|
@@ -28,6 +29,72 @@ export function installedVariantFor(config, name) {
|
|
|
28
29
|
];
|
|
29
30
|
return items.find((item) => item.name === name)?.variant;
|
|
30
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Refuse to reinstall an entry over an app generated with a variant the
|
|
34
|
+
* registry no longer ships. Copying the new files over old data would break
|
|
35
|
+
* the app, so the registry names the migration instead.
|
|
36
|
+
*/
|
|
37
|
+
export function assertNotLegacyVariant(entry, config) {
|
|
38
|
+
const installed = installedVariantFor(config, entry.name);
|
|
39
|
+
const message = installed ? entry.legacyVariants?.[installed] : undefined;
|
|
40
|
+
if (message) {
|
|
41
|
+
throw new Error(`${entry.name} was installed with the retired "${installed}" variant. ${message}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Pick the variant to install for an entry. Shared by `installFeature`
|
|
46
|
+
* (init, sync) and `tailar add`.
|
|
47
|
+
*
|
|
48
|
+
* A variant picked by looking at another feature (resolver.detect) is
|
|
49
|
+
* detected again, so `sync` follows a changed auth or db. Variants chosen
|
|
50
|
+
* by the user are remembered.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveSelectedVariant(entry, config, input) {
|
|
53
|
+
const { answers } = input;
|
|
54
|
+
const rememberedVariant = !input.variant &&
|
|
55
|
+
!input.provider &&
|
|
56
|
+
!input.presetAnswers &&
|
|
57
|
+
!entry.variantResolver?.detect
|
|
58
|
+
? installedVariantFor(config, entry.name)
|
|
59
|
+
: undefined;
|
|
60
|
+
if (input.variant)
|
|
61
|
+
return input.variant;
|
|
62
|
+
if (rememberedVariant)
|
|
63
|
+
return rememberedVariant;
|
|
64
|
+
if (typeof answers.variant === 'string')
|
|
65
|
+
return answers.variant;
|
|
66
|
+
const resolver = entry.variantResolver;
|
|
67
|
+
if (!resolver)
|
|
68
|
+
return undefined;
|
|
69
|
+
let selected;
|
|
70
|
+
if (resolver.detect && config) {
|
|
71
|
+
const installedFeature = config.installed.features.find((f) => f.name === resolver.detect);
|
|
72
|
+
if (installedFeature?.variant) {
|
|
73
|
+
if (resolver.mapping) {
|
|
74
|
+
const mapped = resolver.mapping[installedFeature.variant];
|
|
75
|
+
selected = mapped || installedFeature.variant;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
selected = installedFeature.variant;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!selected && resolver.answerKey) {
|
|
83
|
+
const answerValue = input.provider ?? answers[resolver.answerKey];
|
|
84
|
+
if (answerValue !== undefined) {
|
|
85
|
+
if (resolver.mapping) {
|
|
86
|
+
const mapped = resolver.mapping[String(answerValue)];
|
|
87
|
+
selected = mapped || String(answerValue);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
selected = String(answerValue);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!selected && resolver.default)
|
|
95
|
+
selected = resolver.default;
|
|
96
|
+
return selected;
|
|
97
|
+
}
|
|
31
98
|
function defaultAnswersFromQuestions(questions) {
|
|
32
99
|
const out = {};
|
|
33
100
|
for (const q of questions) {
|
|
@@ -51,22 +118,16 @@ export async function installFeature(projectPath, name, options = {}) {
|
|
|
51
118
|
packageManager,
|
|
52
119
|
structure,
|
|
53
120
|
config,
|
|
121
|
+
...(options.plannedFeatures ? { plannedFeatures: options.plannedFeatures } : {}),
|
|
54
122
|
};
|
|
55
123
|
const registry = await loadRegistry();
|
|
56
124
|
const entry = getEntry(registry, name);
|
|
57
125
|
if (!entry) {
|
|
58
126
|
throw new Error(`Entry not found: ${name}`);
|
|
59
127
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
await authenticate();
|
|
64
|
-
}
|
|
65
|
-
const accessCheck = await checkSubscription(entry.type, name);
|
|
66
|
-
if (!accessCheck.accessible) {
|
|
67
|
-
throw new Error(accessCheck.reason || 'Subscription required');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
128
|
+
assertNotLegacyVariant(entry, config);
|
|
129
|
+
// Registry files need a logged-in licence holder; no-op in local mode.
|
|
130
|
+
await requireLicence();
|
|
70
131
|
let answers = {};
|
|
71
132
|
if (entry.questions && entry.questions.length > 0) {
|
|
72
133
|
if (options.presetAnswers) {
|
|
@@ -98,49 +159,12 @@ export async function installFeature(projectPath, name, options = {}) {
|
|
|
98
159
|
}
|
|
99
160
|
if (options.variant)
|
|
100
161
|
answers.variant = options.variant;
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
else if (rememberedVariant) {
|
|
109
|
-
selectedVariant = rememberedVariant;
|
|
110
|
-
}
|
|
111
|
-
else if (typeof answers.variant === 'string') {
|
|
112
|
-
selectedVariant = answers.variant;
|
|
113
|
-
}
|
|
114
|
-
else if (entry.variantResolver) {
|
|
115
|
-
const resolver = entry.variantResolver;
|
|
116
|
-
if (resolver.detect && context.config) {
|
|
117
|
-
const installedFeature = context.config.installed.features.find((f) => f.name === resolver.detect);
|
|
118
|
-
if (installedFeature?.variant) {
|
|
119
|
-
if (resolver.mapping) {
|
|
120
|
-
const mapped = resolver.mapping[installedFeature.variant];
|
|
121
|
-
selectedVariant = mapped || installedFeature.variant;
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
selectedVariant = installedFeature.variant;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (!selectedVariant && resolver.answerKey) {
|
|
129
|
-
const answerValue = options.provider ?? answers[resolver.answerKey];
|
|
130
|
-
if (answerValue !== undefined) {
|
|
131
|
-
if (resolver.mapping) {
|
|
132
|
-
const mapped = resolver.mapping[String(answerValue)];
|
|
133
|
-
selectedVariant = mapped || String(answerValue);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
selectedVariant = String(answerValue);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (!selectedVariant && resolver.default) {
|
|
141
|
-
selectedVariant = resolver.default;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
162
|
+
const selectedVariant = resolveSelectedVariant(entry, context.config, {
|
|
163
|
+
variant: options.variant,
|
|
164
|
+
provider: options.provider,
|
|
165
|
+
presetAnswers: Boolean(options.presetAnswers),
|
|
166
|
+
answers,
|
|
167
|
+
});
|
|
144
168
|
const variant = selectedVariant ? getVariant(entry, selectedVariant) : undefined;
|
|
145
169
|
let templateVars = {};
|
|
146
170
|
if (entry.templates && entry.templates.length > 0) {
|
|
@@ -153,17 +177,32 @@ export async function installFeature(projectPath, name, options = {}) {
|
|
|
153
177
|
let files = [...entry.files];
|
|
154
178
|
if (variant?.files)
|
|
155
179
|
files.push(...variant.files);
|
|
180
|
+
// Read before the install records the new variant
|
|
181
|
+
const previousVariant = installedVariantFor(context.config, name);
|
|
182
|
+
// An entry that overrides package.json (base) must not drop what other
|
|
183
|
+
// modules and the user added to it, e.g. on `tailar sync base`.
|
|
184
|
+
const overridesPackageJson = files.some((f) => f.target === 'package.json' && (f.strategy ?? 'override') === 'override');
|
|
185
|
+
const packageBefore = overridesPackageJson
|
|
186
|
+
? await snapshotPackageJson(context.root)
|
|
187
|
+
: null;
|
|
156
188
|
const result = await installFiles(context.root, files, context, allVars, {
|
|
157
189
|
overwrite: options.force || true,
|
|
158
190
|
componentType: entry.type,
|
|
159
191
|
componentName: entry.name,
|
|
160
192
|
variant: selectedVariant,
|
|
161
|
-
registryEntry: entry,
|
|
162
193
|
});
|
|
163
194
|
if (result.conflicts.length > 0 && !options.force) {
|
|
164
195
|
throw new Error(`File conflicts: ${result.conflicts.join(', ')}`);
|
|
165
196
|
}
|
|
197
|
+
if (packageBefore) {
|
|
198
|
+
await restorePackageJson(context.root, packageBefore);
|
|
199
|
+
}
|
|
166
200
|
logger.success(`Installed ${result.installed.length} files for ${entry.label}`);
|
|
201
|
+
await cleanupPreviousVariant(entry, previousVariant, selectedVariant, context, allVars);
|
|
202
|
+
const agentFiles = await installAgentFiles(context.root, entry.name);
|
|
203
|
+
if (agentFiles.length > 0) {
|
|
204
|
+
logger.success(`Wrote ${agentFiles.length} agent files for ${entry.label}`);
|
|
205
|
+
}
|
|
167
206
|
const deps = collectDependencies(entry, selectedVariant);
|
|
168
207
|
let hasDependencies = false;
|
|
169
208
|
let dependenciesChanged = false;
|
|
@@ -178,7 +217,9 @@ export async function installFeature(projectPath, name, options = {}) {
|
|
|
178
217
|
const postInstallSteps = [
|
|
179
218
|
...(entry.postInstall || []),
|
|
180
219
|
...(variant?.postInstall || []),
|
|
181
|
-
]
|
|
220
|
+
]
|
|
221
|
+
.filter((step) => evaluateWhen(step.when, context.config, context.plannedFeatures))
|
|
222
|
+
.map((step) => ({ ...step, source: entry.name, sourceLabel: entry.label }));
|
|
182
223
|
const provider = options.provider ||
|
|
183
224
|
answers.emailProvider ||
|
|
184
225
|
answers.dbProvider;
|