storyblok 4.0.0-beta.0 → 4.0.0-beta.2
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 +4 -4
- package/dist/index.mjs +76 -46
- package/dist/index.mjs.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -89,11 +89,11 @@ pnpm run coverage
|
|
|
89
89
|
|
|
90
90
|
To debug the CLI you can use the `launch.json` configuration in the `.vscode` folder. You can run any command with the debugger attached.
|
|
91
91
|
|
|
92
|
-

|
|
93
93
|
|
|
94
94
|
Then you can set breakpoints directly to the typescript files and the debugger will handle the rest with sourcempaps.
|
|
95
95
|
|
|
96
|
-

|
|
97
97
|
|
|
98
98
|
## Community
|
|
99
99
|
|
|
@@ -107,7 +107,7 @@ For community support, chatting with other users, please visit:
|
|
|
107
107
|
|
|
108
108
|
## Support
|
|
109
109
|
|
|
110
|
-
For bugs or feature requests, please [submit an issue](https://github.com/storyblok/
|
|
110
|
+
For bugs or feature requests, please [submit an issue](https://github.com/storyblok/storyblok-cli/issues/new/choose).
|
|
111
111
|
|
|
112
112
|
> [!IMPORTANT]
|
|
113
113
|
> Please search existing issues before submitting a new one. Issues without a minimal reproducible example will be closed. [Why reproductions are Required](https://antfu.me/posts/why-reproductions-are-required).
|
|
@@ -122,7 +122,7 @@ If you have a question, please ask in the [Discuss Storyblok on Discord](https:/
|
|
|
122
122
|
|
|
123
123
|
## Contributing
|
|
124
124
|
|
|
125
|
-
If you're interested in contributing to
|
|
125
|
+
If you're interested in contributing to Storyblok CLI, please read our [contributing docs](https://github.com/storyblok/.github/blob/main/contributing.md) before submitting a pull request.
|
|
126
126
|
|
|
127
127
|
## License
|
|
128
128
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import dotenv from 'dotenv';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { dirname
|
|
4
|
+
import { dirname } from 'pathe';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import
|
|
8
|
-
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { readPackageUp } from 'read-package-up';
|
|
9
8
|
import { Spinner } from '@topcli/spinner';
|
|
10
9
|
import { select, password, input } from '@inquirer/prompts';
|
|
11
10
|
import { mkdir, writeFile, readFile as readFile$1, access, readdir } from 'node:fs/promises';
|
|
12
|
-
import { join, parse, resolve
|
|
11
|
+
import { join, parse, resolve } from 'node:path';
|
|
13
12
|
import { hash } from 'ohash';
|
|
14
13
|
import { compile } from 'json-schema-to-typescript';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
15
|
|
|
16
16
|
const commands = {
|
|
17
17
|
LOGIN: "login",
|
|
@@ -385,8 +385,6 @@ function formatHeader(title) {
|
|
|
385
385
|
}
|
|
386
386
|
const konsola = {
|
|
387
387
|
title: (message, color, subtitle) => {
|
|
388
|
-
console.log("");
|
|
389
|
-
console.log("");
|
|
390
388
|
if (subtitle) {
|
|
391
389
|
console.log(`${formatHeader(chalk.bgHex(color).bold(` ${message} `))} ${subtitle}`);
|
|
392
390
|
} else {
|
|
@@ -427,7 +425,7 @@ const konsola = {
|
|
|
427
425
|
const warnHeader = chalk.bgYellow.bold.black(` Warning `);
|
|
428
426
|
console.warn(formatHeader(warnHeader));
|
|
429
427
|
}
|
|
430
|
-
console.warn(message ? `${chalk.yellow("\u26A0\uFE0F")} ${message}` : "");
|
|
428
|
+
console.warn(message ? `${chalk.yellow("\u26A0\uFE0F ")} ${message}` : "");
|
|
431
429
|
},
|
|
432
430
|
error: (message, info, options) => {
|
|
433
431
|
if (options?.header) {
|
|
@@ -449,13 +447,25 @@ function isRegion(value) {
|
|
|
449
447
|
}
|
|
450
448
|
const isVitest = process.env.VITEST === "true";
|
|
451
449
|
|
|
452
|
-
|
|
453
|
-
const
|
|
450
|
+
let packageJson;
|
|
451
|
+
const result = await readPackageUp({
|
|
452
|
+
cwd: __dirname
|
|
453
|
+
});
|
|
454
|
+
if (!result) {
|
|
455
|
+
console.debug("Metadata not found");
|
|
456
|
+
packageJson = {
|
|
457
|
+
name: "storyblok",
|
|
458
|
+
description: "Storyblok CLI",
|
|
459
|
+
version: "0.0.0"
|
|
460
|
+
};
|
|
461
|
+
} else {
|
|
462
|
+
packageJson = result.packageJson;
|
|
463
|
+
}
|
|
454
464
|
let programInstance = null;
|
|
455
465
|
function getProgram() {
|
|
456
466
|
if (!programInstance) {
|
|
457
467
|
programInstance = new Command();
|
|
458
|
-
programInstance.name(packageJson.name).description(packageJson.description).version(packageJson.version);
|
|
468
|
+
programInstance.name(packageJson.name).description(packageJson.description || "").version(packageJson.version);
|
|
459
469
|
programInstance.configureOutput({
|
|
460
470
|
writeErr: (str) => handleError(new Error(str))
|
|
461
471
|
});
|
|
@@ -541,9 +551,9 @@ const readFile = async (filePath) => {
|
|
|
541
551
|
};
|
|
542
552
|
const resolvePath = (path, folder) => {
|
|
543
553
|
if (path) {
|
|
544
|
-
return resolve
|
|
554
|
+
return resolve(process.cwd(), path, folder);
|
|
545
555
|
}
|
|
546
|
-
return resolve
|
|
556
|
+
return resolve(resolve(process.cwd(), ".storyblok"), folder);
|
|
547
557
|
};
|
|
548
558
|
const getComponentNameFromFilename = (filename) => {
|
|
549
559
|
return filename.replace(/\.js$/, "");
|
|
@@ -690,31 +700,43 @@ const loginStrategy = {
|
|
|
690
700
|
};
|
|
691
701
|
program$d.command(commands.LOGIN).description("Login to the Storyblok CLI").option("-t, --token <token>", "Token to login directly without questions, like for CI environments").option(
|
|
692
702
|
"-r, --region <region>",
|
|
693
|
-
`The region you would like to work in. Please keep in mind that the region must match the region of your space. This region flag will be used for the other cli's commands. You can use the values: ${allRegionsText}
|
|
694
|
-
regions.EU
|
|
703
|
+
`The region you would like to work in. Please keep in mind that the region must match the region of your space. This region flag will be used for the other cli's commands. You can use the values: ${allRegionsText}.`
|
|
695
704
|
).action(async (options) => {
|
|
696
705
|
konsola.title(` ${commands.LOGIN} `, colorPalette.LOGIN);
|
|
697
706
|
const verbose = program$d.opts().verbose;
|
|
698
707
|
const { token, region } = options;
|
|
699
|
-
if (!isRegion(region)) {
|
|
700
|
-
handleError(new CommandError(`The provided region: ${region} is not valid. Please use one of the following values: ${Object.values(regions).join(" | ")}`));
|
|
701
|
-
}
|
|
702
708
|
const { state, updateSession, persistCredentials, initializeSession } = session();
|
|
703
709
|
await initializeSession();
|
|
704
710
|
if (state.isLoggedIn && !state.envLogin) {
|
|
705
711
|
konsola.ok(`You are already logged in. If you want to login with a different account, please logout first.`);
|
|
706
712
|
return;
|
|
707
713
|
}
|
|
714
|
+
if (region && !isRegion(region)) {
|
|
715
|
+
handleError(new CommandError(`The provided region: ${region} is not valid. Please use one of the following values: ${Object.values(regions).join(" | ")}`));
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
708
718
|
if (token) {
|
|
709
719
|
const spinner = new Spinner({
|
|
710
720
|
verbose: !isVitest
|
|
711
|
-
})
|
|
721
|
+
});
|
|
712
722
|
try {
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
723
|
+
let userRegion = region;
|
|
724
|
+
if (!userRegion) {
|
|
725
|
+
userRegion = await select({
|
|
726
|
+
message: "Please select the region you would like to work in:",
|
|
727
|
+
choices: Object.values(regions).map((region2) => ({
|
|
728
|
+
name: regionNames[region2],
|
|
729
|
+
value: region2
|
|
730
|
+
})),
|
|
731
|
+
default: regions.EU
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
spinner.start(`Logging in with token`);
|
|
735
|
+
const { user } = await loginWithToken(token, userRegion);
|
|
736
|
+
updateSession(user.email, token, userRegion);
|
|
737
|
+
await persistCredentials(userRegion);
|
|
716
738
|
spinner.succeed();
|
|
717
|
-
konsola.ok(`Successfully logged in. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);
|
|
739
|
+
konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[userRegion]} (${userRegion})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);
|
|
718
740
|
} catch (error) {
|
|
719
741
|
spinner.failed();
|
|
720
742
|
konsola.br();
|
|
@@ -738,7 +760,7 @@ program$d.command(commands.LOGIN).description("Login to the Storyblok CLI").opti
|
|
|
738
760
|
spinner.succeed();
|
|
739
761
|
updateSession(user.email, userToken, region);
|
|
740
762
|
await persistCredentials(region);
|
|
741
|
-
konsola.ok(`Successfully logged in. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);
|
|
763
|
+
konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[region]} (${region})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);
|
|
742
764
|
} else {
|
|
743
765
|
const userEmail = await input({
|
|
744
766
|
message: "Please enter your email address:",
|
|
@@ -751,14 +773,17 @@ program$d.command(commands.LOGIN).description("Login to the Storyblok CLI").opti
|
|
|
751
773
|
const userPassword = await password({
|
|
752
774
|
message: "Please enter your password:"
|
|
753
775
|
});
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
776
|
+
let userRegion = region;
|
|
777
|
+
if (!userRegion) {
|
|
778
|
+
userRegion = await select({
|
|
779
|
+
message: "Please select the region you would like to work in:",
|
|
780
|
+
choices: Object.values(regions).map((region2) => ({
|
|
781
|
+
name: regionNames[region2],
|
|
782
|
+
value: region2
|
|
783
|
+
})),
|
|
784
|
+
default: regions.EU
|
|
785
|
+
});
|
|
786
|
+
}
|
|
762
787
|
spinner.start(`Logging in with email`);
|
|
763
788
|
spinner.succeed();
|
|
764
789
|
const response = await loginWithEmailAndPassword(userEmail, userPassword, userRegion);
|
|
@@ -775,7 +800,7 @@ program$d.command(commands.LOGIN).description("Login to the Storyblok CLI").opti
|
|
|
775
800
|
updateSession(userEmail, response.access_token, userRegion);
|
|
776
801
|
}
|
|
777
802
|
await persistCredentials(region);
|
|
778
|
-
konsola.ok(`Successfully logged in. Welcome ${chalk.hex(colorPalette.PRIMARY)(userEmail)}.`, true);
|
|
803
|
+
konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[userRegion]} (${userRegion})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(userEmail)}.`, true);
|
|
779
804
|
}
|
|
780
805
|
} catch (error) {
|
|
781
806
|
spinner.failed();
|
|
@@ -882,7 +907,7 @@ const fetchComponent = async (space, componentName, token, region) => {
|
|
|
882
907
|
Authorization: token
|
|
883
908
|
}
|
|
884
909
|
});
|
|
885
|
-
return response.components?.
|
|
910
|
+
return response.components?.find((c) => c.name === componentName);
|
|
886
911
|
} catch (error) {
|
|
887
912
|
handleAPIError("pull_components", error, `Failed to fetch component ${componentName}`);
|
|
888
913
|
}
|
|
@@ -929,7 +954,7 @@ const fetchComponentInternalTags = async (space, token, region) => {
|
|
|
929
954
|
const saveComponentsToFiles = async (space, spaceData, options) => {
|
|
930
955
|
const { components = [], groups = [], presets = [], internalTags = [] } = spaceData;
|
|
931
956
|
const { filename = "components", suffix, path, separateFiles } = options;
|
|
932
|
-
const resolvedPath = path ? resolve
|
|
957
|
+
const resolvedPath = path ? resolve(process.cwd(), path, "components", space) : resolvePath(path, `components/${space}`);
|
|
933
958
|
try {
|
|
934
959
|
if (separateFiles) {
|
|
935
960
|
for (const component of components) {
|
|
@@ -1097,7 +1122,7 @@ const upsertComponentPreset = async (space, preset, token, region) => {
|
|
|
1097
1122
|
const responseData = error.response?.data;
|
|
1098
1123
|
if (responseData?.name?.[0] === "has already been taken") {
|
|
1099
1124
|
const existingPresets = await fetchComponentPresets(space, token, region);
|
|
1100
|
-
const existingPreset = existingPresets?.find((p) => p.name === preset.name);
|
|
1125
|
+
const existingPreset = existingPresets?.find((p) => p.name === preset.name && p.component_id === preset.component_id);
|
|
1101
1126
|
if (existingPreset) {
|
|
1102
1127
|
return await updateComponentPreset(space, existingPreset.id, { preset }, token, region);
|
|
1103
1128
|
}
|
|
@@ -1423,7 +1448,7 @@ function findRelatedResources(components, spaceData) {
|
|
|
1423
1448
|
let currentGroup = groupsMap.get(groupUuid);
|
|
1424
1449
|
while (currentGroup) {
|
|
1425
1450
|
relatedGroups.add(currentGroup);
|
|
1426
|
-
if (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0) {
|
|
1451
|
+
if (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0 && currentGroup.parent_uuid !== currentGroup.uuid) {
|
|
1427
1452
|
currentGroup = groupsMap.get(currentGroup.parent_uuid);
|
|
1428
1453
|
} else {
|
|
1429
1454
|
currentGroup = void 0;
|
|
@@ -1523,7 +1548,7 @@ async function handleComponentGroups(space, password, region, spaceData, skipUui
|
|
|
1523
1548
|
// Maps old IDs to new IDs
|
|
1524
1549
|
};
|
|
1525
1550
|
const groupsToProcess = skipUuids ? spaceData.filter((group) => !skipUuids.has(group.uuid)) : spaceData;
|
|
1526
|
-
const rootGroups = groupsToProcess.filter((group) => !group.parent_uuid && !group.parent_id);
|
|
1551
|
+
const rootGroups = groupsToProcess.filter((group) => (!group.parent_uuid || group.parent_uuid === group.uuid) && !group.parent_id);
|
|
1527
1552
|
for (const group of rootGroups) {
|
|
1528
1553
|
const spinner = new Spinner({
|
|
1529
1554
|
verbose: !isVitest
|
|
@@ -1650,7 +1675,7 @@ function updateSchemaWhitelists(schema, groupsUuidMap, tagsIdMap, componentNameM
|
|
|
1650
1675
|
function getGroupHierarchy(group, allGroups) {
|
|
1651
1676
|
const hierarchy = [group];
|
|
1652
1677
|
let currentGroup = group;
|
|
1653
|
-
while (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0) {
|
|
1678
|
+
while (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0 && currentGroup.parent_uuid !== currentGroup.uuid) {
|
|
1654
1679
|
const parentGroup = allGroups.find((g) => g.uuid === currentGroup.parent_uuid);
|
|
1655
1680
|
if (parentGroup) {
|
|
1656
1681
|
hierarchy.unshift(parentGroup);
|
|
@@ -2121,7 +2146,9 @@ languagesCommand.command("pull").description(`Download your space's languages sc
|
|
|
2121
2146
|
spinner.start(`Fetching ${chalk.hex(colorPalette.LANGUAGES)("languages")}`);
|
|
2122
2147
|
const internationalization = await fetchLanguages(space, state.password, state.region);
|
|
2123
2148
|
if (!internationalization || internationalization.languages?.length === 0) {
|
|
2124
|
-
|
|
2149
|
+
spinner.failed();
|
|
2150
|
+
konsola.warn(`No languages found in the space ${space}`, true);
|
|
2151
|
+
konsola.br();
|
|
2125
2152
|
return;
|
|
2126
2153
|
}
|
|
2127
2154
|
await saveLanguagesToFile(space, internationalization, {
|
|
@@ -2159,7 +2186,7 @@ const getMigrationTemplate = () => {
|
|
|
2159
2186
|
`;
|
|
2160
2187
|
};
|
|
2161
2188
|
const generateMigration = async (space, path, component, suffix) => {
|
|
2162
|
-
const resolvedPath = path ? resolve
|
|
2189
|
+
const resolvedPath = path ? resolve(process.cwd(), path, "migrations", space) : resolvePath(path, `migrations/${space}`);
|
|
2163
2190
|
const fileName = suffix ? `${component.name}.${suffix}.js` : `${component.name}.js`;
|
|
2164
2191
|
const migrationPath = join(resolvedPath, fileName);
|
|
2165
2192
|
try {
|
|
@@ -3296,7 +3323,7 @@ const getComponentPropertiesTypeAnnotations = async (component, options, spaceDa
|
|
|
3296
3323
|
};
|
|
3297
3324
|
const loadCustomFieldsParser = async (path) => {
|
|
3298
3325
|
try {
|
|
3299
|
-
const customFieldsParser = await import(resolve
|
|
3326
|
+
const customFieldsParser = await import(resolve(path));
|
|
3300
3327
|
return customFieldsParser.default;
|
|
3301
3328
|
} catch (error) {
|
|
3302
3329
|
handleError(error);
|
|
@@ -3305,7 +3332,7 @@ const loadCustomFieldsParser = async (path) => {
|
|
|
3305
3332
|
};
|
|
3306
3333
|
async function loadCompilerOptions(path) {
|
|
3307
3334
|
if (path) {
|
|
3308
|
-
const compilerOptions = await import(resolve
|
|
3335
|
+
const compilerOptions = await import(resolve(path));
|
|
3309
3336
|
return compilerOptions.default;
|
|
3310
3337
|
}
|
|
3311
3338
|
return {};
|
|
@@ -3387,7 +3414,7 @@ const generateTypes = async (spaceData, options = {
|
|
|
3387
3414
|
};
|
|
3388
3415
|
const saveTypesToFile = async (space, typedefString, options) => {
|
|
3389
3416
|
const { filename = "storyblok-components", path } = options;
|
|
3390
|
-
const resolvedPath = path ? resolve
|
|
3417
|
+
const resolvedPath = path ? resolve(process.cwd(), path, "types", space) : resolvePath(path, `types/${space}`);
|
|
3391
3418
|
try {
|
|
3392
3419
|
await saveToFile(join(resolvedPath, `${filename}.d.ts`), typedefString);
|
|
3393
3420
|
} catch (error) {
|
|
@@ -3397,7 +3424,7 @@ const saveTypesToFile = async (space, typedefString, options) => {
|
|
|
3397
3424
|
const generateStoryblokTypes = async (options = {}) => {
|
|
3398
3425
|
const { filename = "storyblok", path } = options;
|
|
3399
3426
|
try {
|
|
3400
|
-
const storyblokTypesPath = resolve
|
|
3427
|
+
const storyblokTypesPath = resolve(process.cwd(), "src", "types", "storyblok.ts");
|
|
3401
3428
|
const storyblokTypesContent = readFileSync(storyblokTypesPath, "utf-8");
|
|
3402
3429
|
const lines = storyblokTypesContent.split("\n");
|
|
3403
3430
|
const typeDefinitions = [];
|
|
@@ -3437,7 +3464,7 @@ const generateStoryblokTypes = async (options = {}) => {
|
|
|
3437
3464
|
"",
|
|
3438
3465
|
...typeDefinitions
|
|
3439
3466
|
].join("\n");
|
|
3440
|
-
const resolvedPath = path ? resolve
|
|
3467
|
+
const resolvedPath = path ? resolve(process.cwd(), path, "types") : resolvePath(path, "types");
|
|
3441
3468
|
await saveToFile(join(resolvedPath, `${filename}.d.ts`), typeDefs);
|
|
3442
3469
|
return true;
|
|
3443
3470
|
} catch (error) {
|
|
@@ -3489,12 +3516,14 @@ typesCommand.command("generate").description("Generate types d.ts for your compo
|
|
|
3489
3516
|
}
|
|
3490
3517
|
});
|
|
3491
3518
|
|
|
3492
|
-
const version = "4.0.0-beta.
|
|
3519
|
+
const version = "4.0.0-beta.2";
|
|
3493
3520
|
const pkg = {
|
|
3494
3521
|
version: version};
|
|
3495
3522
|
|
|
3496
3523
|
dotenv.config();
|
|
3497
3524
|
const program = getProgram();
|
|
3525
|
+
konsola.br();
|
|
3526
|
+
konsola.br();
|
|
3498
3527
|
konsola.title(` Storyblok CLI `, colorPalette.PRIMARY);
|
|
3499
3528
|
program.option("--verbose", "Enable verbose output");
|
|
3500
3529
|
program.version(pkg.version, "-v, --vers", "Output the current version");
|
|
@@ -3509,3 +3538,4 @@ try {
|
|
|
3509
3538
|
} catch (error) {
|
|
3510
3539
|
handleError(error);
|
|
3511
3540
|
}
|
|
3541
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/utils/fetch.ts","../src/utils/error/api-error.ts","../src/utils/error/command-error.ts","../src/utils/error/filesystem-error.ts","../src/utils/error/error.ts","../src/utils/format.ts","../src/utils/konsola.ts","../src/utils/index.ts","../src/program.ts","../src/utils/api-routes.ts","../src/commands/login/actions.ts","../src/utils/filesystem.ts","../src/creds.ts","../src/session.ts","../src/commands/login/index.ts","../src/commands/logout/index.ts","../src/commands/user/actions.ts","../src/commands/user/index.ts","../src/commands/components/command.ts","../src/commands/components/pull/actions.ts","../src/commands/components/push/actions.ts","../src/commands/components/pull/index.ts","../src/commands/components/push/operations.ts","../src/commands/components/push/index.ts","../src/commands/languages/actions.ts","../src/commands/languages/index.ts","../src/commands/migrations/command.ts","../src/commands/migrations/generate/actions.ts","../src/commands/migrations/generate/index.ts","../src/commands/stories/actions.ts","../src/commands/migrations/run/actions.ts","../src/commands/migrations/rollback/actions.ts","../src/commands/migrations/run/operations.ts","../src/commands/stories/utils.ts","../src/commands/migrations/run/index.ts","../src/commands/migrations/rollback/index.ts","../src/commands/types/command.ts","../src/utils/storyblok-schemas.ts","../src/commands/types/generate/actions.ts","../src/commands/types/generate/index.ts","../src/index.ts"],"sourcesContent":["export const commands = {\n LOGIN: 'login',\n LOGOUT: 'logout',\n USER: 'user',\n COMPONENTS: 'Components',\n LANGUAGES: 'languages',\n MIGRATIONS: 'Migrations',\n TYPES: 'Types',\n} as const;\n\nexport const colorPalette = {\n PRIMARY: '#8d60ff',\n LOGIN: '#dad4ff',\n LOGOUT: '#6d6d6d',\n USER: '#71d300',\n COMPONENTS: '#a185ff',\n LANGUAGES: '#f5c003',\n MIGRATIONS: '#8CE2FF',\n TYPES: '#3178C6',\n} as const;\n\nexport interface ReadonlyArray<T> {\n includes: (searchElement: any, fromIndex?: number) => searchElement is T;\n}\nexport const regionCodes = ['eu', 'us', 'cn', 'ca', 'ap'] as const;\nexport type RegionCode = typeof regionCodes[number];\n\nexport const regions: Record<Uppercase<RegionCode>, RegionCode> = {\n EU: 'eu',\n US: 'us',\n CN: 'cn',\n CA: 'ca',\n AP: 'ap',\n} as const;\n\nexport const regionsDomain: Record<RegionCode, string> = {\n eu: 'api.storyblok.com',\n us: 'api-us.storyblok.com',\n cn: 'app.storyblokchina.cn',\n ca: 'api-ca.storyblok.com',\n ap: 'api-ap.storyblok.com',\n} as const;\n\nexport const managementApiRegions: Record<RegionCode, string> = {\n eu: 'mapi.storyblok.com',\n us: 'mapi-us.storyblok.com',\n cn: 'mapi.storyblokchina.cn',\n ca: 'mapi-ca.storyblok.com',\n ap: 'mapi-ap.storyblok.com',\n} as const;\n\nexport const regionNames: Record<RegionCode, string> = {\n eu: 'Europe',\n us: 'United States',\n cn: 'China',\n ca: 'Canada',\n ap: 'Australia',\n} as const;\n\nexport const DEFAULT_AGENT = {\n SB_Agent: 'SB-CLI',\n SB_Agent_Version: process.env.npm_package_version || '4.x',\n} as const;\n\nexport interface SpaceOptions {\n spaceId: string;\n token: string;\n region: RegionCode;\n}\n","export class FetchError extends Error {\n response: {\n status: number;\n statusText: string;\n data?: Record<string, unknown> | null;\n };\n\n constructor(message: string, response: { status: number; statusText: string; data?: Record<string, unknown> | null }) {\n super(message);\n this.name = 'FetchError';\n this.response = response;\n }\n}\n\nexport const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\nexport interface FetchOptions {\n headers?: Record<string, string>;\n method?: string;\n body?: any;\n maxRetries?: number;\n baseDelay?: number;\n}\n\nexport async function customFetch<T>(url: string, options: FetchOptions = {}): Promise<T> {\n const maxRetries = options.maxRetries ?? 3;\n const baseDelay = options.baseDelay ?? 500; // 500ms base delay\n let attempt = 0;\n\n while (attempt <= maxRetries) {\n try {\n const headers = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n // Handle JSON body\n const fetchOptions: FetchOptions = {\n ...options,\n headers,\n };\n\n if (options.body) {\n fetchOptions.body = typeof options.body === 'string'\n ? options.body\n : JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n let data;\n try {\n // We try to parse the response as JSON\n data = await response.json();\n }\n catch {\n // If it fails, we throw an error\n throw new FetchError(`Non-JSON response`, {\n status: response.status,\n statusText: response.statusText,\n data: null,\n });\n }\n\n if (!response.ok) {\n // If we hit rate limit and have retries left\n if ((response.status === 429) && (attempt < maxRetries)) {\n const waitTime = baseDelay * 2 ** attempt;\n await delay(waitTime);\n attempt++;\n continue;\n }\n\n throw new FetchError(`HTTP error! status: ${response.status}`, {\n status: response.status,\n statusText: response.statusText,\n data,\n });\n }\n\n return data;\n }\n catch (error) {\n if (error instanceof FetchError) {\n throw error;\n }\n // For network errors or other non-HTTP errors, create a FetchError\n throw new FetchError(error instanceof Error ? error.message : String(error), {\n status: 0,\n statusText: 'Network Error',\n data: null,\n });\n }\n }\n\n throw new FetchError('Max retries exceeded', {\n status: 429,\n statusText: 'Rate Limit Exceeded',\n data: null,\n });\n}\n","import { FetchError } from '../fetch';\n\nexport const API_ACTIONS = {\n login: 'login',\n login_with_token: 'Failed to log in with token',\n login_with_otp: 'Failed to log in with email, password and otp',\n login_email_password: 'Failed to log in with email and password',\n get_user: 'Failed to get user',\n pull_languages: 'Failed to pull languages',\n pull_components: 'Failed to pull components',\n pull_component_groups: 'Failed to pull component groups',\n pull_component_presets: 'Failed to pull component presets',\n pull_component_internal_tags: 'Failed to pull component internal tags',\n push_component: 'Failed to push component',\n push_component_group: 'Failed to push component group',\n push_component_preset: 'Failed to push component preset',\n push_component_internal_tag: 'Failed to push component internal tag',\n update_component: 'Failed to update component',\n update_component_internal_tag: 'Failed to update component internal tag',\n update_component_group: 'Failed to update component group',\n update_component_preset: 'Failed to update component preset',\n pull_stories: 'Failed to pull stories',\n pull_story: 'Failed to pull story',\n update_story: 'Failed to update story',\n} as const;\n\nexport const API_ERRORS = {\n unauthorized: 'The user is not authorized to access the API',\n network_error: 'No response from server, please check if you are correctly connected to internet',\n invalid_credentials: 'The provided credentials are invalid',\n timeout: 'The API request timed out',\n generic: 'Error fetching data from the API',\n not_found: 'The requested resource was not found',\n unprocessable_entity: 'The request was well-formed but was unable to be followed due to semantic errors',\n\n} as const;\n\nexport function handleAPIError(action: keyof typeof API_ACTIONS, error: unknown, customMessage?: string): void {\n if (error instanceof FetchError) {\n const status = error.response.status;\n\n switch (status) {\n case 401:\n throw new APIError('unauthorized', action, error, customMessage);\n case 404:\n throw new APIError('not_found', action, error, customMessage);\n case 422:\n throw new APIError('unprocessable_entity', action, error, customMessage);\n default:\n throw new APIError('network_error', action, error, customMessage);\n }\n }\n throw new APIError('generic', action, error as FetchError, customMessage);\n}\n\nexport class APIError extends Error {\n errorId: string;\n cause: string;\n code: number;\n messageStack: string[];\n error: FetchError | undefined;\n response: FetchError['response'] | undefined;\n constructor(errorId: keyof typeof API_ERRORS, action: keyof typeof API_ACTIONS, error?: FetchError, customMessage?: string) {\n super(customMessage || API_ERRORS[errorId]);\n this.name = 'API Error';\n this.errorId = errorId;\n this.cause = API_ERRORS[errorId];\n this.code = error?.response?.status || 0;\n this.messageStack = [];\n this.error = error;\n this.response = error?.response;\n\n if (!customMessage) {\n this.messageStack.push(API_ACTIONS[action]);\n }\n this.messageStack.push(customMessage || API_ERRORS[errorId]);\n\n if (this.code === 422) {\n const responseData = this.response?.data as { [key: string]: string[] } | undefined;\n if (responseData?.name?.[0] === 'has already been taken') {\n this.message = 'A component with this name already exists';\n }\n Object.entries(responseData || {}).forEach(([key, errors]) => {\n if (Array.isArray(errors)) {\n errors.forEach((e) => {\n this.messageStack.push(`${key}: ${e}`);\n });\n }\n });\n }\n }\n\n getInfo() {\n return {\n name: this.name,\n message: this.message,\n httpCode: this.code,\n cause: this.cause,\n errorId: this.errorId,\n stack: this.stack,\n responseData: this.response?.data,\n };\n }\n}\n","export class CommandError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'Command Error';\n }\n\n getInfo() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n","const FS_ERRORS = {\n file_not_found: 'The file requested was not found',\n permission_denied: 'Permission denied while accessing the file',\n operation_on_directory: 'The operation is not allowed on a directory',\n not_a_directory: 'The path provided is not a directory',\n file_already_exists: 'The file already exists',\n directory_not_empty: 'The directory is not empty',\n too_many_open_files: 'Too many open files',\n no_space_left: 'No space left on the device',\n invalid_argument: 'An invalid argument was provided',\n unknown_error: 'An unknown error occurred',\n} as const;\n\nconst FS_ACTIONS = {\n read: 'Failed to read/parse file:',\n write: 'Writing file',\n delete: 'Deleting file',\n mkdir: 'Creating directory',\n rmdir: 'Removing directory',\n authorization_check: 'Failed to check authorization in .netrc file:',\n} as const;\n\nexport function handleFileSystemError(action: keyof typeof FS_ACTIONS, error: NodeJS.ErrnoException): void {\n if (error.code) {\n switch (error.code) {\n case 'ENOENT':\n throw new FileSystemError('file_not_found', action, error);\n case 'EACCES':\n case 'EPERM':\n throw new FileSystemError('permission_denied', action, error);\n case 'EISDIR':\n throw new FileSystemError('operation_on_directory', action, error);\n case 'ENOTDIR':\n throw new FileSystemError('not_a_directory', action, error);\n case 'EEXIST':\n throw new FileSystemError('file_already_exists', action, error);\n case 'ENOTEMPTY':\n throw new FileSystemError('directory_not_empty', action, error);\n case 'EMFILE':\n throw new FileSystemError('too_many_open_files', action, error);\n case 'ENOSPC':\n throw new FileSystemError('no_space_left', action, error);\n case 'EINVAL':\n throw new FileSystemError('invalid_argument', action, error);\n default:\n throw new FileSystemError('unknown_error', action, error);\n }\n }\n else {\n // In case the error does not have a known `fs` error code, throw a general error\n throw new FileSystemError('unknown_error', action, error);\n }\n}\n\nexport class FileSystemError extends Error {\n errorId: string;\n cause: string;\n code: string | undefined;\n messageStack: string[];\n error: NodeJS.ErrnoException | undefined;\n\n constructor(errorId: keyof typeof FS_ERRORS, action: keyof typeof FS_ACTIONS, error: NodeJS.ErrnoException, customMessage?: string) {\n super(customMessage || FS_ERRORS[errorId]);\n this.name = 'File System Error';\n this.errorId = errorId;\n this.cause = FS_ERRORS[errorId];\n this.code = error.code;\n this.messageStack = [];\n this.error = error;\n\n if (!customMessage) {\n this.messageStack.push(FS_ACTIONS[action]);\n }\n this.messageStack.push(customMessage || FS_ERRORS[errorId]);\n }\n\n getInfo() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause,\n errorId: this.errorId,\n stack: this.stack,\n };\n }\n}\n","import { konsola } from '..';\nimport type { FetchError } from '../fetch';\nimport { APIError } from './api-error';\nimport { CommandError } from './command-error';\nimport { FileSystemError } from './filesystem-error';\n\nexport function handleError(error: Error | FetchError, verbose = false): void {\n // Print the message stack if it exists\n if (error instanceof APIError || error instanceof FileSystemError) {\n const messageStack = (error).messageStack;\n messageStack.forEach((message: string, index: number) => {\n konsola.error(message, null, {\n header: index === 0,\n margin: false,\n });\n });\n }\n else {\n konsola.error(error.message, null, {\n header: true,\n });\n }\n if (verbose && (error instanceof CommandError || error instanceof APIError || error instanceof FileSystemError)) {\n const errorDetails = 'getInfo' in error ? error.getInfo() : {};\n if (error instanceof CommandError) {\n konsola.error(`Command Error: ${error.getInfo().message}`, errorDetails);\n }\n else if (error instanceof APIError) {\n konsola.error(`API Error: ${error.getInfo().cause}`, errorDetails);\n }\n else if (error instanceof FileSystemError) {\n konsola.error(`File System Error: ${error.getInfo().cause}`, errorDetails);\n }\n else {\n konsola.error(`Unexpected Error: ${error}`, errorDetails);\n }\n }\n else {\n konsola.br();\n konsola.info('For more information about the error, run the command with the `--verbose` flag');\n }\n\n if (!process.env.VITEST) {\n console.log(''); // Add a line break for readability\n // process.exit(1) // Exit process if not in a test environment\n }\n}\n","export const toPascalCase = (str: string) => {\n return str.replace(/(?:^|_)(\\w)/g, (_, char) => char.toUpperCase());\n};\n\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/(?:^|_)(\\w)/g, (_, char) => char.toUpperCase())\n .replace(/_/g, '')\n .replace(/^[A-Z]/, char => char.toLowerCase());\n};\n\nexport const toSnakeCase = (str: string) => {\n return str\n .replace(/([A-Z])/g, (_, char) => `_${char.toLowerCase()}`)\n .replace(/^_/, '');\n};\n\nexport function maskToken(token: string): string {\n // Show only the first 4 characters and replace the rest with asterisks\n if (token.length <= 4) {\n // If the token is too short, just return it as is\n return token;\n }\n const visiblePart = token.slice(0, 4);\n const maskedPart = '*'.repeat(token.length - 4);\n return `${visiblePart}${maskedPart}`;\n}\n\nexport const slugify = (text: string): string =>\n text\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/-{2,}/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start of text\n .replace(/-+$/, '');\n\nexport const removePropertyRecursively = (obj: Record<string, any>, property: string): Record<string, any> => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => removePropertyRecursively(item, property));\n }\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key !== property) {\n result[key] = removePropertyRecursively(value, property);\n }\n }\n return result;\n};\n\n/**\n * Converts an object with potential non-string values to an object with string values\n * for use with URLSearchParams\n *\n * @param obj - The object to convert\n * @returns An object with all values converted to strings\n */\nexport const objectToStringParams = (obj: Record<string, any>): Record<string, string> => {\n return Object.entries(obj).reduce((acc, [key, value]) => {\n // Skip undefined values\n if (value === undefined) {\n return acc;\n }\n\n // Convert objects/arrays to JSON strings\n if (typeof value === 'object' && value !== null) {\n acc[key] = JSON.stringify(value);\n }\n else {\n // Convert other types to strings\n acc[key] = String(value);\n }\n return acc;\n }, {} as Record<string, string>);\n};\n\n/**\n * Creates a regex pattern from a glob pattern\n * @param pattern - The glob pattern to convert\n * @returns A regex that matches the glob pattern\n */\nexport function createRegexFromGlob(pattern: string): RegExp {\n // Add ^ and $ to ensure exact match, escape the pattern to handle special characters\n return new RegExp(`^${pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\\\\\*/g, '.*')}$`);\n}\n","import chalk from 'chalk';\n\nexport interface KonsolaFormatOptions {\n header?: boolean;\n margin?: boolean;\n}\n\nexport function formatHeader(title: string) {\n return `${title}`;\n}\nexport const konsola = {\n title: (message: string, color: string, subtitle?: string) => {\n if (subtitle) {\n console.log(`${formatHeader(chalk.bgHex(color).bold(` ${message} `))} ${subtitle}`);\n }\n else {\n console.log(formatHeader(chalk.bgHex(color).bold(` ${message} `)));\n }\n console.log(''); // Add a line break\n console.log(''); // Add a line break\n },\n br: () => {\n console.log(''); // Add a line break\n },\n ok: (message?: string, header: boolean = false) => {\n if (header) {\n console.log(''); // Add a line break\n const successHeader = chalk.bgGreen.bold.white(` Success `);\n console.log(formatHeader(successHeader));\n console.log(''); // Add a line break\n }\n\n console.log(message ? `${chalk.green('✔')} ${message}` : '');\n },\n info: (message: string, options: KonsolaFormatOptions = {\n header: false,\n margin: true,\n }) => {\n if (options.header) {\n console.log(''); // Add a line break\n const infoHeader = chalk.bgBlue.bold.white(` Info `);\n console.log(formatHeader(infoHeader));\n }\n\n console.log(message ? `${chalk.blue('ℹ')} ${message}` : '');\n if (options.margin) {\n console.error(''); // Add a line break\n }\n },\n warn: (message?: string, header: boolean = false) => {\n if (header) {\n console.log(''); // Add a line break\n const warnHeader = chalk.bgYellow.bold.black(` Warning `);\n console.warn(formatHeader(warnHeader));\n }\n\n console.warn(message ? `${chalk.yellow('⚠️ ')} ${message}` : '');\n },\n error: (message: string, info?: unknown, options?: KonsolaFormatOptions) => {\n if (options?.header) {\n const errorHeader = chalk.bgRed.bold.white(` Error `);\n console.error(formatHeader(errorHeader));\n console.log(''); // Add a line break\n }\n\n console.error(`${chalk.red.bold('▲ error')} ${message}`, info || '');\n if (options?.margin) {\n console.error(''); // Add a line break\n }\n },\n};\n","import { fileURLToPath } from 'node:url';\nimport { dirname } from 'pathe';\nimport type { RegionCode } from '../constants';\nimport { regions } from '../constants';\n\nexport * from './error/';\nexport * from './format';\nexport * from './konsola';\n\nexport const __filename = fileURLToPath(import.meta.url);\nexport const __dirname = dirname(__filename);\n\nexport function isRegion(value: RegionCode): value is RegionCode {\n return Object.values(regions).includes(value);\n}\n\nexport const isVitest = process.env.VITEST === 'true';\n","// program.ts\nimport { Command } from 'commander';\nimport { __dirname, handleError } from './utils';\nimport type { NormalizedPackageJson } from 'read-package-up';\nimport { readPackageUp } from 'read-package-up';\n\nlet packageJson: NormalizedPackageJson;\n// Read package.json for metadata\nconst result = await readPackageUp({\n cwd: __dirname,\n});\n\nif (!result) {\n console.debug('Metadata not found');\n packageJson = {\n name: 'storyblok',\n description: 'Storyblok CLI',\n version: '0.0.0',\n } as NormalizedPackageJson;\n}\nelse {\n packageJson = result.packageJson;\n}\n\n// Declare a variable to hold the singleton instance\nlet programInstance: Command | null = null;\n\n// Singleton function to get the instance of program\n/**\n * Get the shared program singleton instance\n *\n * @export getProgram\n * @return {*} {Command}\n */\nexport function getProgram(): Command {\n if (!programInstance) {\n programInstance = new Command();\n programInstance\n .name(packageJson.name)\n .description(packageJson.description || '')\n .version(packageJson.version);\n\n // Global error handling\n programInstance.configureOutput({\n writeErr: str => handleError(new Error(str)),\n });\n }\n return programInstance;\n}\n","import type { RegionCode } from '../constants';\nimport { regionsDomain } from '../constants';\n\nconst API_VERSION = 'v1';\n\nexport const getStoryblokUrl = (region: RegionCode = 'eu') => {\n return `https://${regionsDomain[region]}/${API_VERSION}`;\n};\n","import chalk from 'chalk';\nimport type { RegionCode } from '../../constants';\nimport { customFetch, FetchError } from '../../utils/fetch';\nimport { APIError, handleAPIError, maskToken } from '../../utils';\nimport { getStoryblokUrl } from '../../utils/api-routes';\nimport type { StoryblokLoginResponse, StoryblokLoginWithOtpResponse, StoryblokUser } from '../../types';\n\nexport const loginWithToken = async (token: string, region: RegionCode) => {\n try {\n const url = getStoryblokUrl(region);\n return await customFetch<{\n user: StoryblokUser;\n }>(`${url}/users/me`, {\n headers: {\n Authorization: token,\n },\n });\n }\n catch (error) {\n if (error instanceof FetchError) {\n const status = error.response.status;\n\n switch (status) {\n case 401:\n throw new APIError('unauthorized', 'login_with_token', error, `The token provided ${chalk.bold(maskToken(token))} is invalid.\n Please make sure you are using the correct token and try again.`);\n default:\n throw new APIError('network_error', 'login_with_token', error);\n }\n }\n throw new APIError('generic', 'login_with_token', error, 'The provided credentials are invalid');\n }\n};\n\nexport const loginWithEmailAndPassword = async (email: string, password: string, region: RegionCode) => {\n try {\n const url = getStoryblokUrl(region);\n return await customFetch<StoryblokLoginResponse>(`${url}/users/login`, {\n method: 'POST',\n body: { email, password },\n });\n }\n catch (error) {\n handleAPIError('login_email_password', error, 'The provided credentials are invalid');\n }\n};\n\nexport const loginWithOtp = async (email: string, password: string, otp: string, region: RegionCode) => {\n try {\n const url = getStoryblokUrl(region);\n return await customFetch<StoryblokLoginWithOtpResponse>(`${url}/users/login`, {\n method: 'POST',\n body: { email, password, otp_attempt: otp },\n });\n }\n catch (error) {\n handleAPIError('login_with_otp', error as Error);\n }\n};\n","import { join, parse, resolve } from 'node:path';\nimport { mkdir, readFile as readFileImpl, writeFile } from 'node:fs/promises';\nimport { handleFileSystemError } from './error/filesystem-error';\n\nexport interface FileOptions {\n mode?: number;\n}\n\nexport const getStoryblokGlobalPath = () => {\n const homeDirectory = process.env[\n process.platform.startsWith('win') ? 'USERPROFILE' : 'HOME'\n ] || process.cwd();\n\n return join(homeDirectory, '.storyblok');\n};\n\nexport const saveToFile = async (filePath: string, data: string, options?: FileOptions) => {\n // Get the directory path\n const resolvedPath = parse(filePath).dir;\n\n // Ensure the directory exists\n try {\n await mkdir(resolvedPath, { recursive: true });\n }\n catch (mkdirError) {\n handleFileSystemError('mkdir', mkdirError as Error);\n return; // Exit early if the directory creation fails\n }\n\n // Write the file\n try {\n await writeFile(filePath, data, options);\n }\n catch (writeError) {\n handleFileSystemError('write', writeError as Error);\n }\n};\n\nexport const readFile = async (filePath: string) => {\n try {\n return await readFileImpl(filePath, 'utf8');\n }\n catch (error) {\n handleFileSystemError('read', error as Error);\n return '';\n }\n};\n\nexport const resolvePath = (path: string | undefined, folder: string) => {\n // If a custom path is provided, append the folder structure to it\n if (path) {\n return resolve(process.cwd(), path, folder);\n }\n // Otherwise use the default .storyblok path\n return resolve(resolve(process.cwd(), '.storyblok'), folder);\n};\n\n/**\n * Extracts the component name from a migration filename\n * @param filename - The migration filename (e.g., \"simple_component.js\")\n * @returns The component name (e.g., \"simple_component\")\n */\nexport const getComponentNameFromFilename = (filename: string): string => {\n // Remove the .js extension\n return filename.replace(/\\.js$/, '');\n};\n","import { access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { FileSystemError, handleFileSystemError, konsola } from './utils';\nimport chalk from 'chalk';\nimport type { RegionCode } from './constants';\nimport { colorPalette, regionsDomain } from './constants';\nimport { getStoryblokGlobalPath, readFile, saveToFile } from './utils/filesystem';\n\nexport const getCredentials = async (filePath = join(getStoryblokGlobalPath(), 'credentials.json')) => {\n try {\n await access(filePath);\n const content = await readFile(filePath);\n return JSON.parse(content);\n }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // File doesn't exist, create it with empty credentials\n await saveToFile(filePath, JSON.stringify({}, null, 2), { mode: 0o600 });\n return {};\n }\n handleFileSystemError('read', error as NodeJS.ErrnoException);\n return {};\n }\n};\n\nexport const addCredentials = async ({\n filePath = join(getStoryblokGlobalPath(), 'credentials.json'),\n machineName,\n login,\n password,\n region,\n}: Record<string, string>) => {\n const credentials = {\n ...await getCredentials(filePath),\n [machineName]: {\n login,\n password,\n region,\n },\n };\n\n try {\n await saveToFile(filePath, JSON.stringify(credentials, null, 2), { mode: 0o600 });\n }\n catch (error) {\n throw new FileSystemError('invalid_argument', 'write', error as NodeJS.ErrnoException, `Error adding/updating entry for machine ${machineName} in credentials.json file`);\n }\n};\n\nexport const removeCredentials = async (region: RegionCode, filepath: string = getStoryblokGlobalPath()) => {\n const filePath = join(filepath, 'credentials.json');\n const credentials = await getCredentials(filePath);\n const machineName = regionsDomain[region] || 'api.storyblok.com';\n\n if (credentials[machineName]) {\n delete credentials[machineName];\n\n try {\n await saveToFile(filePath, JSON.stringify(credentials, null, 2), { mode: 0o600 });\n\n konsola.ok(`Successfully removed entry for machine ${machineName} from ${chalk.hex(colorPalette.PRIMARY)(filePath)}`, true);\n }\n catch (error) {\n throw new FileSystemError('invalid_argument', 'write', error as NodeJS.ErrnoException, `Error removing entry for machine ${machineName} from credentials.json file`);\n }\n }\n else {\n konsola.warn(`No entry found for machine ${machineName} in ${chalk.hex(colorPalette.PRIMARY)(filePath)}`, true);\n }\n};\n\nexport const removeAllCredentials = async (filepath: string = getStoryblokGlobalPath()) => {\n const filePath = join(filepath, 'credentials.json');\n await saveToFile(filePath, JSON.stringify({}, null, 2), { mode: 0o600 });\n};\n","// session.ts\nimport { type RegionCode, regionsDomain } from './constants';\nimport { addCredentials, getCredentials } from './creds';\n\ninterface SessionState {\n isLoggedIn: boolean;\n login?: string;\n password?: string;\n region?: RegionCode;\n envLogin?: boolean;\n}\n\nlet sessionInstance: ReturnType<typeof createSession> | null = null;\n\nfunction createSession() {\n const state: SessionState = {\n isLoggedIn: false,\n };\n\n async function initializeSession(region = 'eu' as RegionCode) {\n // First, check for environment variables\n const envCredentials = getEnvCredentials();\n if (envCredentials) {\n state.isLoggedIn = true;\n state.login = envCredentials.login;\n state.password = envCredentials.password;\n state.region = envCredentials.region as RegionCode;\n state.envLogin = true;\n return;\n }\n\n // If no environment variables, fall back to .storyblok/credentials.json\n const machines = await getCredentials();\n const creds = machines[regionsDomain[region] || 'api.storyblok.com'];\n if (creds) {\n state.isLoggedIn = true;\n state.login = creds.login;\n state.password = creds.password;\n state.region = creds.region as RegionCode;\n }\n else {\n // No credentials found; set state to logged out\n state.isLoggedIn = false;\n state.login = undefined;\n state.password = undefined;\n state.region = undefined;\n }\n state.envLogin = false;\n }\n\n function getEnvCredentials() {\n const envLogin = process.env.STORYBLOK_LOGIN || process.env.TRAVIS_STORYBLOK_LOGIN;\n const envPassword = process.env.STORYBLOK_TOKEN || process.env.TRAVIS_STORYBLOK_TOKEN;\n const envRegion = process.env.STORYBLOK_REGION || process.env.TRAVIS_STORYBLOK_REGION;\n\n if (envLogin && envPassword && envRegion) {\n return {\n login: envLogin,\n password: envPassword,\n region: envRegion,\n };\n }\n return null;\n }\n\n async function persistCredentials(region: RegionCode) {\n if (state.isLoggedIn && state.login && state.password && state.region) {\n await addCredentials({\n machineName: regionsDomain[region] || 'api.storyblok.com',\n login: state.login,\n password: state.password,\n region: state.region,\n });\n }\n else {\n throw new Error('No credentials to save.');\n }\n }\n\n function updateSession(login: string, password: string, region: RegionCode) {\n state.isLoggedIn = true;\n state.login = login;\n state.password = password;\n state.region = region;\n }\n\n function logout() {\n state.isLoggedIn = false;\n state.login = undefined;\n state.password = undefined;\n state.region = undefined;\n }\n\n return {\n state,\n initializeSession,\n updateSession,\n persistCredentials,\n logout,\n };\n}\n\nexport function session() {\n if (!sessionInstance) {\n sessionInstance = createSession();\n }\n return sessionInstance;\n}\n","import { Spinner } from '@topcli/spinner';\nimport chalk from 'chalk';\nimport { input, password, select } from '@inquirer/prompts';\nimport type { RegionCode } from '../../constants';\nimport { colorPalette, commands, regionNames, regions } from '../../constants';\nimport { getProgram } from '../../program';\nimport { CommandError, handleError, isRegion, isVitest, konsola } from '../../utils';\nimport { loginWithEmailAndPassword, loginWithOtp, loginWithToken } from './actions';\nimport { session } from '../../session';\n\nconst program = getProgram(); // Get the shared singleton instance\n\nconst allRegionsText = Object.values(regions).join(',');\nconst loginStrategy = {\n message: 'How would you like to login?',\n choices: [\n {\n name: 'With email',\n value: 'login-with-email',\n short: 'Email',\n },\n {\n name: 'With Token (SSO)',\n value: 'login-with-token',\n short: 'Token',\n },\n ],\n};\n\nexport const loginCommand = program\n .command(commands.LOGIN)\n .description('Login to the Storyblok CLI')\n .option('-t, --token <token>', 'Token to login directly without questions, like for CI environments')\n .option(\n '-r, --region <region>',\n `The region you would like to work in. Please keep in mind that the region must match the region of your space. This region flag will be used for the other cli's commands. You can use the values: ${allRegionsText}.`,\n )\n .action(async (options: {\n token: string;\n region: RegionCode;\n }) => {\n konsola.title(` ${commands.LOGIN} `, colorPalette.LOGIN);\n // Global options\n const verbose = program.opts().verbose;\n // Command options\n const { token, region } = options;\n\n const { state, updateSession, persistCredentials, initializeSession } = session();\n\n await initializeSession();\n\n if (state.isLoggedIn && !state.envLogin) {\n konsola.ok(`You are already logged in. If you want to login with a different account, please logout first.`);\n return;\n }\n\n if (region && !isRegion(region)) {\n handleError(new CommandError(`The provided region: ${region} is not valid. Please use one of the following values: ${Object.values(regions).join(' | ')}`));\n return;\n }\n\n if (token) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n try {\n let userRegion = region;\n if (!userRegion) {\n userRegion = await select({\n message: 'Please select the region you would like to work in:',\n choices: Object.values(regions).map((region: RegionCode) => ({\n name: regionNames[region],\n value: region,\n })),\n default: regions.EU,\n });\n }\n spinner.start(`Logging in with token`);\n const { user } = await loginWithToken(token, userRegion);\n updateSession(user.email, token, userRegion);\n await persistCredentials(userRegion);\n spinner.succeed();\n\n konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[userRegion]} (${userRegion})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);\n }\n catch (error) {\n spinner.failed();\n konsola.br();\n handleError(error as Error, verbose);\n }\n }\n else {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n try {\n const strategy = await select(loginStrategy);\n if (strategy === 'login-with-token') {\n const userToken = await password({\n message: 'Please enter your token:',\n validate: (value: string) => {\n return value.length > 0;\n },\n });\n spinner.start(`Logging in with token`);\n const { user } = await loginWithToken(userToken, region);\n spinner.succeed();\n updateSession(user.email, userToken, region);\n await persistCredentials(region);\n\n konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[region]} (${region})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(user.friendly_name)}.`, true);\n }\n\n else {\n const userEmail = await input({\n message: 'Please enter your email address:',\n required: true,\n validate: (value: string) => {\n const emailRegex = /^[^\\s@]+@[^\\s@][^\\s.@]*\\.[^\\s@]+$/;\n return emailRegex.test(value);\n },\n });\n const userPassword = await password({\n message: 'Please enter your password:',\n });\n\n let userRegion = region;\n if (!userRegion) {\n userRegion = await select({\n message: 'Please select the region you would like to work in:',\n choices: Object.values(regions).map((region: RegionCode) => ({\n name: regionNames[region],\n value: region,\n })),\n default: regions.EU,\n });\n }\n\n spinner.start(`Logging in with email`);\n spinner.succeed();\n const response = await loginWithEmailAndPassword(userEmail, userPassword, userRegion);\n\n if (response?.otp_required) {\n const otp = await input({\n message: 'Add the code from your Authenticator app, or the one we sent to your e-mail / phone:',\n required: true,\n });\n\n const otpResponse = await loginWithOtp(userEmail, userPassword, otp, userRegion);\n if (otpResponse?.access_token) {\n updateSession(userEmail, otpResponse?.access_token, userRegion);\n }\n }\n else if (response?.access_token) {\n updateSession(userEmail, response.access_token, userRegion);\n }\n await persistCredentials(region);\n\n konsola.ok(`Successfully logged in to region ${chalk.hex(colorPalette.PRIMARY)(`${regionNames[userRegion]} (${userRegion})`)}. Welcome ${chalk.hex(colorPalette.PRIMARY)(userEmail)}.`, true);\n }\n }\n catch (error) {\n spinner.failed();\n konsola.br();\n handleError(error as Error, verbose);\n }\n }\n\n konsola.br();\n });\n","import { removeAllCredentials } from '../../creds';\nimport { colorPalette, commands } from '../../constants';\nimport { getProgram } from '../../program';\nimport { handleError, konsola } from '../../utils';\nimport { session } from '../../session';\n\nconst program = getProgram(); // Get the shared singleton instance\n\nexport const logoutCommand = program\n .command(commands.LOGOUT)\n .description('Logout from the Storyblok CLI')\n .action(async () => {\n konsola.title(` ${commands.LOGOUT} `, colorPalette.LOGOUT);\n\n const verbose = program.opts().verbose;\n try {\n const { state, initializeSession } = session();\n await initializeSession();\n if (!state.isLoggedIn || !state.password || !state.region) {\n konsola.warn(`You are already logged out. If you want to login, please use the login command.`);\n konsola.br();\n return;\n }\n await removeAllCredentials();\n\n konsola.ok(`Successfully logged out.`, true);\n konsola.br();\n }\n catch (error) {\n handleError(error as Error, verbose);\n }\n konsola.br();\n });\n","import chalk from 'chalk';\nimport type { RegionCode } from '../../constants';\nimport { customFetch, FetchError } from '../../utils/fetch';\nimport { APIError, maskToken } from '../../utils';\nimport { getStoryblokUrl } from '../../utils/api-routes';\nimport type { StoryblokUser } from '../../types';\n\nexport const getUser = async (token: string, region: RegionCode) => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n user: StoryblokUser;\n }>(`${url}/users/me`, {\n headers: {\n Authorization: token,\n },\n });\n return response;\n }\n catch (error) {\n if (error instanceof FetchError) {\n const status = error.response.status;\n\n switch (status) {\n case 401:\n throw new APIError('unauthorized', 'get_user', error, `The token provided ${chalk.bold(maskToken(token))} is invalid.\n Please make sure you are using the correct token and try again.`);\n default:\n throw new APIError('network_error', 'get_user', error);\n }\n }\n throw new APIError('generic', 'get_user', error as FetchError);\n }\n};\n","import chalk from 'chalk';\nimport { colorPalette, commands } from '../../constants';\nimport { getProgram } from '../../program';\nimport { CommandError, handleError, isVitest, konsola } from '../../utils';\nimport { getUser } from './actions';\nimport { session } from '../../session';\nimport { Spinner } from '@topcli/spinner';\n\nconst program = getProgram(); // Get the shared singleton instance\n\nexport const userCommand = program\n .command(commands.USER)\n .description('Get the current user')\n .action(async () => {\n konsola.title(` ${commands.USER} `, colorPalette.USER);\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`));\n return;\n }\n const spinner = new Spinner({\n verbose: !isVitest,\n }).start(`Fetching user info`);\n try {\n const { password, region } = state;\n if (!password || !region) {\n throw new Error('No password or region found');\n }\n const { user } = await getUser(password, region);\n spinner.succeed();\n konsola.ok(`Hi ${chalk.bold(user.friendly_name)}, you are currently logged in with ${chalk.hex(colorPalette.PRIMARY)(user.email)} on ${chalk.bold(region)} region`, true);\n }\n catch (error) {\n spinner.failed();\n handleError(error as Error, true);\n }\n konsola.br();\n });\n","import { getProgram } from '../../program';\n\nconst program = getProgram(); // Get the shared singleton instance\n\n// Components root command\nexport const componentsCommand = program\n .command('components')\n .alias('comp')\n .description(`Manage your space's block schema`)\n .option('-s, --space <space>', 'space ID')\n .option('-p, --path <path>', 'path to save the file. Default is .storyblok/components');\n","import { handleAPIError, handleFileSystemError } from '../../../utils';\nimport type { RegionCode } from '../../../constants';\nimport { customFetch } from '../../../utils/fetch';\nimport { getStoryblokUrl } from '../../../utils/api-routes';\nimport type { SpaceComponent, SpaceComponentGroup, SpaceComponentInternalTag, SpaceComponentPreset, SpaceData } from '../constants';\nimport { join, resolve } from 'node:path';\nimport { resolvePath, saveToFile } from '../../../utils/filesystem';\nimport type { SaveComponentsOptions } from './constants';\n// Components\nexport const fetchComponents = async (space: string, token: string, region: RegionCode): Promise<SpaceComponent[] | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n components: SpaceComponent[];\n }>(`${url}/spaces/${space}/components`, {\n headers: {\n Authorization: token,\n },\n });\n return response.components;\n }\n catch (error) {\n handleAPIError('pull_components', error as Error);\n }\n};\n\nexport const fetchComponent = async (space: string, componentName: string, token: string, region: RegionCode): Promise<SpaceComponent | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n components: SpaceComponent[];\n }>(`${url}/spaces/${space}/components?search=${encodeURIComponent(componentName)}`, {\n headers: {\n Authorization: token,\n },\n });\n return response.components?.find(c => c.name === componentName);\n }\n catch (error) {\n handleAPIError('pull_components', error as Error, `Failed to fetch component ${componentName}`);\n }\n};\n\n// Component group actions\nexport const fetchComponentGroups = async (space: string, token: string, region: RegionCode): Promise<SpaceComponentGroup[] | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n component_groups: SpaceComponentGroup[];\n }>(`${url}/spaces/${space}/component_groups`, {\n headers: {\n Authorization: token,\n },\n });\n return response.component_groups;\n }\n catch (error) {\n handleAPIError('pull_component_groups', error as Error);\n }\n};\n\n// Component preset actions\nexport const fetchComponentPresets = async (space: string, token: string, region: RegionCode): Promise<SpaceComponentPreset[] | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n presets: SpaceComponentPreset[];\n }>(`${url}/spaces/${space}/presets`, {\n headers: {\n Authorization: token,\n },\n });\n return response.presets;\n }\n catch (error) {\n handleAPIError('pull_component_presets', error as Error);\n }\n};\n\n// Component internal tags\nexport const fetchComponentInternalTags = async (space: string, token: string, region: RegionCode): Promise<SpaceComponentInternalTag[] | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n internal_tags: SpaceComponentInternalTag[];\n }>(`${url}/spaces/${space}/internal_tags`, {\n headers: {\n Authorization: token,\n },\n });\n return response.internal_tags.filter(tag => tag.object_type === 'component');\n }\n catch (error) {\n handleAPIError('pull_component_internal_tags', error as Error);\n }\n};\n\n// Filesystem actions\n\nexport const saveComponentsToFiles = async (\n space: string,\n spaceData: SpaceData,\n options: SaveComponentsOptions,\n) => {\n const { components = [], groups = [], presets = [], internalTags = [] } = spaceData;\n const { filename = 'components', suffix, path, separateFiles } = options;\n // Ensure we always include the components/space folder structure regardless of custom path\n const resolvedPath = path\n ? resolve(process.cwd(), path, 'components', space)\n : resolvePath(path, `components/${space}`);\n\n try {\n if (separateFiles) {\n // Save in separate files without nested structure\n for (const component of components) {\n const componentFilePath = join(resolvedPath, suffix ? `${component.name}.${suffix}.json` : `${component.name}.json`);\n await saveToFile(componentFilePath, JSON.stringify(component, null, 2));\n\n // Find and save associated presets\n const componentPresets = presets.filter(preset => preset.component_id === component.id);\n if (componentPresets.length > 0) {\n const presetsFilePath = join(resolvedPath, suffix ? `${component.name}.presets.${suffix}.json` : `${component.name}.presets.json`);\n await saveToFile(presetsFilePath, JSON.stringify(componentPresets, null, 2));\n }\n // Always save groups in a consolidated file\n const groupsFilePath = join(resolvedPath, suffix ? `groups.${suffix}.json` : `groups.json`);\n await saveToFile(groupsFilePath, JSON.stringify(groups, null, 2));\n\n // Always save internal tags in a consolidated file\n const internalTagsFilePath = join(resolvedPath, suffix ? `tags.${suffix}.json` : `tags.json`);\n await saveToFile(internalTagsFilePath, JSON.stringify(internalTags, null, 2));\n }\n return;\n }\n\n // Default to saving consolidated files\n const componentsFilePath = join(resolvedPath, suffix ? `${filename}.${suffix}.json` : `${filename}.json`);\n await saveToFile(componentsFilePath, JSON.stringify(components, null, 2));\n\n if (groups.length > 0) {\n const groupsFilePath = join(resolvedPath, suffix ? `groups.${suffix}.json` : `groups.json`);\n await saveToFile(groupsFilePath, JSON.stringify(groups, null, 2));\n }\n\n if (presets.length > 0) {\n const presetsFilePath = join(resolvedPath, suffix ? `presets.${suffix}.json` : `presets.json`);\n await saveToFile(presetsFilePath, JSON.stringify(presets, null, 2));\n }\n\n if (internalTags.length > 0) {\n const internalTagsFilePath = join(resolvedPath, suffix ? `tags.${suffix}.json` : `tags.json`);\n await saveToFile(internalTagsFilePath, JSON.stringify(internalTags, null, 2));\n }\n }\n catch (error) {\n handleFileSystemError('write', error as Error);\n }\n};\n","import { getStoryblokUrl } from '../../../utils/api-routes';\nimport { customFetch } from '../../../utils/fetch';\nimport { APIError, FileSystemError, handleAPIError, handleFileSystemError } from '../../../utils';\nimport type { RegionCode } from '../../../constants';\nimport type { SpaceComponent, SpaceComponentGroup, SpaceComponentInternalTag, SpaceComponentPreset, SpaceData } from '../constants';\nimport type { ReadComponentsOptions } from './constants';\nimport { join } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { resolvePath } from '../../../utils/filesystem';\nimport { fetchComponent, fetchComponentGroups, fetchComponentInternalTags, fetchComponentPresets } from '../actions';\nimport type { FileReaderResult } from '../../../types';\n\n// Component actions\nexport const pushComponent = async (space: string, component: SpaceComponent, token: string, region: RegionCode): Promise<SpaceComponent | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n\n const response = await customFetch<{\n component: SpaceComponent;\n }>(`${url}/spaces/${space}/components`, {\n method: 'POST',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(component),\n });\n\n return response.component;\n }\n catch (error) {\n handleAPIError('push_component', error as Error, `Failed to push component ${component.name}`);\n }\n};\n\nexport const updateComponent = async (space: string, componentId: number, component: SpaceComponent, token: string, region: RegionCode): Promise<SpaceComponent | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n component: SpaceComponent;\n }>(`${url}/spaces/${space}/components/${componentId}`, {\n method: 'PUT',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(component),\n });\n return response.component;\n }\n catch (error) {\n handleAPIError('update_component', error as Error, `Failed to update component ${component.name}`);\n }\n};\n\nexport const upsertComponent = async (space: string, component: SpaceComponent, token: string, region: RegionCode): Promise<SpaceComponent | undefined> => {\n try {\n return await pushComponent(space, component, token, region);\n }\n catch (error) {\n if (error instanceof APIError && error.code === 422) {\n const responseData = error.response?.data as { [key: string]: string[] } | undefined;\n if (responseData?.name?.[0] === 'has already been taken') {\n // Find existing component by name\n const existingComponent = await fetchComponent(space, component.name, token, region);\n if (existingComponent) {\n // Update existing component\n return await updateComponent(space, existingComponent.id, component, token, region);\n }\n }\n }\n throw error;\n }\n};\n\n// Component group actions\n\nexport const pushComponentGroup = async (space: string, componentGroup: SpaceComponentGroup, token: string, region: RegionCode): Promise<SpaceComponentGroup | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n component_group: SpaceComponentGroup;\n }>(`${url}/spaces/${space}/component_groups`, {\n method: 'POST',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentGroup),\n });\n return response.component_group;\n }\n catch (error) {\n handleAPIError('push_component_group', error as Error, `Failed to push component group ${componentGroup.name}`);\n }\n};\n\nexport const updateComponentGroup = async (space: string, groupId: number, componentGroup: SpaceComponentGroup, token: string, region: RegionCode): Promise<SpaceComponentGroup | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n component_group: SpaceComponentGroup;\n }>(`${url}/spaces/${space}/component_groups/${groupId}`, {\n method: 'PUT',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentGroup),\n });\n return response.component_group;\n }\n catch (error) {\n handleAPIError('update_component_group', error as Error, `Failed to update component group ${componentGroup.name}`);\n }\n};\n\nexport const upsertComponentGroup = async (space: string, group: SpaceComponentGroup, token: string, region: RegionCode): Promise<SpaceComponentGroup | undefined> => {\n try {\n return await pushComponentGroup(space, group, token, region);\n }\n catch (error) {\n if (error instanceof APIError && error.code === 422) {\n const responseData = error.response?.data as { [key: string]: string[] } | undefined;\n if (responseData?.name?.[0] === 'has already been taken') {\n // Find existing group by name\n const existingGroups = await fetchComponentGroups(space, token, region);\n const existingGroup = existingGroups?.find(g => g.name === group.name);\n if (existingGroup) {\n // Update existing group\n return await updateComponentGroup(space, existingGroup.id, group, token, region);\n }\n }\n }\n throw error;\n }\n};\n\n// Component preset actions\nexport const pushComponentPreset = async (space: string, componentPreset: { preset: Partial<SpaceComponentPreset> }, token: string, region: RegionCode): Promise<SpaceComponentPreset | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n preset: SpaceComponentPreset;\n }>(`${url}/spaces/${space}/presets`, {\n method: 'POST',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentPreset),\n });\n return response.preset;\n }\n catch (error) {\n handleAPIError('push_component_preset', error as Error, `Failed to push component preset ${componentPreset.preset.name}`);\n }\n};\n\nexport const updateComponentPreset = async (space: string, presetId: number, componentPreset: { preset: Partial<SpaceComponentPreset> }, token: string, region: RegionCode): Promise<SpaceComponentPreset | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n preset: SpaceComponentPreset;\n }>(`${url}/spaces/${space}/presets/${presetId}`, {\n method: 'PUT',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentPreset),\n });\n return response.preset;\n }\n catch (error) {\n handleAPIError('update_component_preset', error as Error, `Failed to update component preset ${componentPreset.preset.name}`);\n }\n};\n\nexport const upsertComponentPreset = async (space: string, preset: Partial<SpaceComponentPreset>, token: string, region: RegionCode): Promise<SpaceComponentPreset | undefined> => {\n try {\n return await pushComponentPreset(space, { preset }, token, region);\n }\n catch (error) {\n if (error instanceof APIError && error.code === 422) {\n const responseData = error.response?.data as { [key: string]: string[] } | undefined;\n if (responseData?.name?.[0] === 'has already been taken') {\n // Find existing preset by name\n const existingPresets = await fetchComponentPresets(space, token, region);\n const existingPreset = existingPresets?.find(p => p.name === preset.name && p.component_id === preset.component_id);\n if (existingPreset) {\n // Update existing preset\n return await updateComponentPreset(space, existingPreset.id, { preset }, token, region);\n }\n }\n }\n throw error;\n }\n};\n\n// Component internal tag actions\n\nexport const pushComponentInternalTag = async (space: string, componentInternalTag: SpaceComponentInternalTag, token: string, region: RegionCode): Promise<SpaceComponentInternalTag | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n internal_tag: SpaceComponentInternalTag;\n }>(`${url}/spaces/${space}/internal_tags`, {\n method: 'POST',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentInternalTag),\n });\n return response.internal_tag;\n }\n catch (error) {\n handleAPIError('push_component_internal_tag', error as Error, `Failed to push component internal tag ${componentInternalTag.name}`);\n }\n};\n\nexport const updateComponentInternalTag = async (space: string, tagId: number, componentInternalTag: SpaceComponentInternalTag, token: string, region: RegionCode): Promise<SpaceComponentInternalTag | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n internal_tag: SpaceComponentInternalTag;\n }>(`${url}/spaces/${space}/internal_tags/${tagId}`, {\n method: 'PUT',\n headers: {\n Authorization: token,\n },\n body: JSON.stringify(componentInternalTag),\n });\n return response.internal_tag;\n }\n catch (error) {\n handleAPIError('update_component_internal_tag', error as Error, `Failed to update component internal tag ${componentInternalTag.name}`);\n }\n};\n\nexport const upsertComponentInternalTag = async (space: string, tag: SpaceComponentInternalTag, token: string, region: RegionCode): Promise<SpaceComponentInternalTag | undefined> => {\n try {\n return await pushComponentInternalTag(space, tag, token, region);\n }\n catch (error) {\n if (error instanceof APIError && error.code === 422) {\n const responseData = error.response?.data as { [key: string]: string[] } | undefined;\n if (responseData?.name?.[0] === 'has already been taken') {\n // Find existing tag by name\n const existingTags = await fetchComponentInternalTags(space, token, region);\n const existingTag = existingTags?.find(t => t.name === tag.name);\n if (existingTag) {\n // Update existing tag\n return await updateComponentInternalTag(space, existingTag.id, tag, token, region);\n }\n }\n }\n throw error;\n }\n};\n\nasync function readJsonFile<T>(filePath: string): Promise<FileReaderResult<T>> {\n try {\n const content = (await readFile(filePath)).toString();\n if (!content) {\n return { data: [] };\n }\n const parsed = JSON.parse(content);\n return { data: Array.isArray(parsed) ? parsed : [parsed] };\n }\n catch (error) {\n return { data: [], error: error as Error };\n }\n}\n\nexport const readComponentsFiles = async (\n options: ReadComponentsOptions): Promise<SpaceData> => {\n const { from, path, separateFiles = false, suffix } = options;\n const resolvedPath = resolvePath(path, `components/${from}`);\n\n // Check if directory exists first\n try {\n await readdir(resolvedPath);\n }\n catch (error) {\n const message = `No directory found for space \"${from}\". Please make sure you have pulled the components first by running:\\n\\n storyblok components pull --space ${from} \\n\\n`;\n throw new FileSystemError(\n 'file_not_found',\n 'read',\n error as Error,\n message,\n );\n }\n\n if (separateFiles) {\n return await readSeparateFiles(resolvedPath, suffix);\n }\n\n return await readConsolidatedFiles(resolvedPath, suffix);\n};\n\nasync function readSeparateFiles(resolvedPath: string, suffix?: string): Promise<SpaceData> {\n const files = await readdir(resolvedPath);\n const components: SpaceComponent[] = [];\n const presets: SpaceComponentPreset[] = [];\n let groups: SpaceComponentGroup[] = [];\n let internalTags: SpaceComponentInternalTag[] = [];\n\n const filteredFiles = files.filter((file) => {\n if (suffix) {\n return file.endsWith(`.${suffix}.json`);\n }\n else {\n // Regex to match files with a pattern like .<suffix>.json\n return !/\\.\\w+\\.json$/.test(file) || file.endsWith('.presets.json'); ;\n }\n });\n\n for (const file of filteredFiles) {\n const filePath = join(resolvedPath, file);\n\n if (file === 'groups.json' || file === `groups.${suffix}.json`) {\n const result = await readJsonFile<SpaceComponentGroup>(filePath);\n if (result.error) {\n handleFileSystemError('read', result.error);\n continue;\n }\n groups = result.data;\n }\n else if (file === 'tags.json' || file === `tags.${suffix}.json`) {\n const result = await readJsonFile<SpaceComponentInternalTag>(filePath);\n if (result.error) {\n handleFileSystemError('read', result.error);\n continue;\n }\n internalTags = result.data;\n }\n else if (file.endsWith('.presets.json') || file.endsWith(`.presets.${suffix}.json`)) {\n const result = await readJsonFile<SpaceComponentPreset>(filePath);\n if (result.error) {\n handleFileSystemError('read', result.error);\n continue;\n }\n presets.push(...result.data);\n }\n else if (file.endsWith('.json') || file.endsWith(`${suffix}.json`)) {\n if (file === 'components.json' || file === `components.${suffix}.json`) {\n continue;\n }\n const result = await readJsonFile<SpaceComponent>(filePath);\n if (result.error) {\n handleFileSystemError('read', result.error);\n continue;\n }\n components.push(...result.data);\n }\n }\n\n return {\n components,\n groups,\n presets,\n internalTags,\n };\n}\n\nasync function readConsolidatedFiles(resolvedPath: string, suffix?: string): Promise<SpaceData> {\n // Read required components file\n const componentsPath = join(resolvedPath, suffix ? `components.${suffix}.json` : 'components.json');\n const componentsResult = await readJsonFile<SpaceComponent>(componentsPath);\n\n if (componentsResult.error || !componentsResult.data.length) {\n throw new FileSystemError(\n 'file_not_found',\n 'read',\n componentsResult.error || new Error('Components file is empty'),\n `No components found in ${componentsPath}. Please make sure you have pulled the components first.`,\n );\n }\n\n // Read optional files\n const [groupsResult, presetsResult, tagsResult] = await Promise.all([\n readJsonFile<SpaceComponentGroup>(join(resolvedPath, suffix ? `groups.${suffix}.json` : 'groups.json')),\n readJsonFile<SpaceComponentPreset>(join(resolvedPath, suffix ? `presets.${suffix}.json` : 'presets.json')),\n readJsonFile<SpaceComponentInternalTag>(join(resolvedPath, suffix ? `tags.${suffix}.json` : 'tags.json')),\n ]);\n\n return {\n components: componentsResult.data,\n groups: groupsResult.data,\n presets: presetsResult.data,\n internalTags: tagsResult.data,\n };\n}\n","import type { PullComponentsOptions } from './constants';\n\nimport { Spinner } from '@topcli/spinner';\nimport { colorPalette, commands } from '../../../constants';\nimport { CommandError, handleError, isVitest, konsola } from '../../../utils';\nimport { session } from '../../../session';\nimport { fetchComponent, fetchComponentGroups, fetchComponentInternalTags, fetchComponentPresets, fetchComponents, saveComponentsToFiles } from '../actions';\nimport { componentsCommand } from '../command';\nimport chalk from 'chalk';\nimport { getProgram } from '../../../program';\n\nconst program = getProgram();\n\ncomponentsCommand\n .command('pull [componentName]')\n .option('-f, --filename <filename>', 'custom name to be used in file(s) name instead of space id')\n .option('--sf, --separate-files', 'Argument to create a single file for each component')\n .option('--su, --suffix <suffix>', 'suffix to add to the file name (e.g. components.<suffix>.json)')\n .description(`Download your space's components schema as json. Optionally specify a component name to pull a single component.`)\n .action(async (componentName: string | undefined, options: PullComponentsOptions) => {\n konsola.title(` ${commands.COMPONENTS} `, colorPalette.COMPONENTS, componentName ? `Pulling component ${componentName}...` : 'Pulling components...');\n // Global options\n const verbose = program.opts().verbose;\n\n // Command options\n const { space, path } = componentsCommand.opts();\n const { separateFiles, suffix, filename = 'components' } = options;\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const { password, region } = state;\n\n const spinnerGroups = new Spinner({\n verbose: !isVitest,\n });\n const spinnerPresets = new Spinner({\n verbose: !isVitest,\n });\n const spinnerInternalTags = new Spinner({\n verbose: !isVitest,\n });\n const spinnerComponents = new Spinner({\n verbose: !isVitest,\n });\n\n try {\n // Fetch components groups\n spinnerGroups.start(`Fetching ${chalk.hex(colorPalette.COMPONENTS)('components groups')}`);\n\n const groups = await fetchComponentGroups(space, password, region);\n spinnerGroups.succeed(`${chalk.hex(colorPalette.COMPONENTS)('Groups')} - Completed in ${spinnerGroups.elapsedTime.toFixed(2)}ms`);\n\n // Fetch components presets\n spinnerPresets.start(`Fetching ${chalk.hex(colorPalette.COMPONENTS)('components presets')}`);\n\n const presets = await fetchComponentPresets(space, password, region);\n spinnerPresets.succeed(`${chalk.hex(colorPalette.COMPONENTS)('Presets')} - Completed in ${spinnerPresets.elapsedTime.toFixed(2)}ms`);\n\n // Fetch components internal tags\n spinnerInternalTags.start(`Fetching ${chalk.hex(colorPalette.COMPONENTS)('components internal tags')}`);\n\n const internalTags = await fetchComponentInternalTags(space, password, region);\n spinnerInternalTags.succeed(`${chalk.hex(colorPalette.COMPONENTS)('Tags')} - Completed in ${spinnerInternalTags.elapsedTime.toFixed(2)}ms`);\n\n // Save everything using the new structure\n let components;\n spinnerComponents.start(`Fetching ${chalk.hex(colorPalette.COMPONENTS)('components')}`);\n\n if (componentName) {\n const component = await fetchComponent(space, componentName, password, region);\n if (!component) {\n konsola.warn(`No component found with name \"${componentName}\"`);\n return;\n }\n components = [component];\n }\n else {\n components = await fetchComponents(space, password, region);\n if (!components || components.length === 0) {\n konsola.warn(`No components found in the space ${space}`);\n return;\n }\n }\n spinnerComponents.succeed(`${chalk.hex(colorPalette.COMPONENTS)('Components')} - Completed in ${spinnerComponents.elapsedTime.toFixed(2)}ms`);\n await saveComponentsToFiles(\n space,\n { components, groups: groups || [], presets: presets || [], internalTags: internalTags || [] },\n { ...options, path, separateFiles: separateFiles || !!componentName },\n );\n konsola.br();\n if (separateFiles) {\n if (filename !== 'components') {\n konsola.warn(`The --filename option is ignored when using --separate-files`);\n }\n const filePath = path ? `${path}/components/${space}/` : `.storyblok/components/${space}/`;\n\n konsola.ok(`Components downloaded successfully to ${chalk.hex(colorPalette.PRIMARY)(filePath)}`);\n }\n else if (componentName) {\n const fileName = suffix ? `${filename}.${suffix}.json` : `${componentName}.json`;\n const filePath = path ? `${path}/components/${space}/${fileName}` : `.storyblok/components/${space}/${fileName}`;\n konsola.ok(`Component ${chalk.hex(colorPalette.PRIMARY)(componentName)} downloaded successfully in ${chalk.hex(colorPalette.PRIMARY)(filePath)}`);\n }\n else {\n const fileName = suffix ? `${filename}.${suffix}.json` : `${filename}.json`;\n const filePath = path ? `${path}/components/${space}/${fileName}` : `.storyblok/components/${space}/${fileName}`;\n\n konsola.ok(`Components downloaded successfully to ${chalk.hex(colorPalette.PRIMARY)(filePath)}`);\n }\n konsola.br();\n }\n catch (error) {\n spinnerGroups.failed(`Pulling ${chalk.hex(colorPalette.COMPONENTS)('Groups')} - Failed`);\n spinnerPresets.failed(`Pulling ${chalk.hex(colorPalette.COMPONENTS)('Presets')} - Failed`);\n spinnerInternalTags.failed(`Pulling ${chalk.hex(colorPalette.COMPONENTS)('Tags')} - Failed`);\n spinnerComponents.failed(`Pulling ${chalk.hex(colorPalette.COMPONENTS)('Components')} - Failed`);\n konsola.br();\n handleError(error as Error, verbose);\n }\n });\n","import { Spinner } from '@topcli/spinner';\nimport chalk from 'chalk';\nimport { colorPalette } from '../../../constants';\nimport { createRegexFromGlob, isVitest } from '../../../utils';\nimport type { RegionCode } from '../../../constants';\nimport type {\n SpaceComponent,\n SpaceComponentGroup,\n SpaceComponentInternalTag,\n SpaceComponentPreset,\n SpaceData,\n} from '../constants';\nimport { upsertComponent, upsertComponentGroup, upsertComponentInternalTag, upsertComponentPreset } from './actions';\nimport { delay } from '../../../utils/fetch';\n\nfunction findRelatedResources(\n components: SpaceComponent[],\n spaceData: SpaceData,\n): {\n groups: SpaceComponentGroup[];\n presets: SpaceComponentPreset[];\n internalTags: SpaceComponentInternalTag[];\n whitelistedComponents: SpaceComponent[];\n } {\n // Get all component IDs and UUIDs for filtering related resources\n const componentIds = new Set(components.map(c => c.id));\n const whitelistedComponentNames = new Set<string>();\n\n // Get all group UUIDs from components and their schemas\n const componentGroupUuids = new Set<string>();\n\n components.forEach((component) => {\n // Add direct component group\n if (component.component_group_uuid && component.component_group_uuid.length > 0) {\n componentGroupUuids.add(component.component_group_uuid);\n }\n\n // Collect groups and whitelisted components from component's schema\n if (component.schema) {\n function traverseSchema(schema: Record<string, any>) {\n if (typeof schema === 'object' && schema !== null) {\n if (schema.type === 'bloks') {\n // Collect group whitelist\n if (schema.restrict_type === 'groups' && Array.isArray(schema.component_group_whitelist)) {\n schema.component_group_whitelist.forEach((uuid: string) => {\n if (uuid && uuid.length > 0) {\n componentGroupUuids.add(uuid);\n }\n });\n }\n\n // Collect component whitelist\n if (Array.isArray(schema.component_whitelist)) {\n schema.component_whitelist.forEach((name: string) => {\n if (name && typeof name === 'string') {\n whitelistedComponentNames.add(name);\n }\n });\n }\n }\n\n // Recursively traverse nested fields\n Object.values(schema).forEach((value) => {\n if (typeof value === 'object' && value !== null) {\n traverseSchema(value);\n }\n });\n }\n }\n\n traverseSchema(component.schema);\n }\n });\n\n const tagIds = new Set<number>();\n\n // Collect all tag IDs from components\n components.forEach((component) => {\n // Collect tags from component's internal_tag_ids\n component.internal_tag_ids?.forEach(id => tagIds.add(Number(id)));\n\n // Collect tags from component's schema whitelists\n if (component.schema) {\n function traverseSchema(schema: Record<string, any>) {\n if (typeof schema === 'object' && schema !== null) {\n if (schema.type === 'bloks' && Array.isArray(schema.component_tag_whitelist)) {\n schema.component_tag_whitelist.forEach((id: string | number) => {\n if (id) {\n tagIds.add(Number(id));\n }\n });\n }\n\n // Recursively traverse nested fields\n Object.values(schema).forEach((value) => {\n if (typeof value === 'object' && value !== null) {\n traverseSchema(value);\n }\n });\n }\n }\n\n traverseSchema(component.schema);\n }\n });\n\n // Get related presets for all components\n const relatedPresets = spaceData.presets.filter(p => componentIds.has(p.component_id));\n\n // Get related tags\n const relatedTags = spaceData.internalTags.filter(tag => tagIds.has(tag.id));\n\n // Get related groups (including parent hierarchy) for all components\n const relatedGroups = new Set<SpaceComponentGroup>();\n\n // Create a map of all groups for efficient lookup\n const groupsMap = new Map(spaceData.groups.map(g => [g.uuid, g]));\n\n // For each component's group UUID, traverse up the hierarchy\n componentGroupUuids.forEach((groupUuid) => {\n let currentGroup = groupsMap.get(groupUuid);\n\n while (currentGroup) {\n relatedGroups.add(currentGroup);\n\n // If the group has a parent, get it from the map\n if (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0 && currentGroup.parent_uuid !== currentGroup.uuid) {\n currentGroup = groupsMap.get(currentGroup.parent_uuid);\n }\n else {\n currentGroup = undefined;\n }\n }\n });\n\n // Get whitelisted components\n const whitelistedComponents = spaceData.components.filter(\n component => whitelistedComponentNames.has(component.name),\n );\n\n // Get related resources for whitelisted components recursively\n let additionalResources = {\n groups: [] as SpaceComponentGroup[],\n presets: [] as SpaceComponentPreset[],\n internalTags: [] as SpaceComponentInternalTag[],\n whitelistedComponents: [] as SpaceComponent[],\n };\n\n if (whitelistedComponents.length > 0) {\n additionalResources = findRelatedResources(whitelistedComponents, spaceData);\n }\n\n const result = {\n groups: Array.from(new Set([...Array.from(relatedGroups), ...additionalResources.groups])),\n presets: [...relatedPresets, ...additionalResources.presets],\n internalTags: [...relatedTags, ...additionalResources.internalTags],\n whitelistedComponents: [...whitelistedComponents, ...additionalResources.whitelistedComponents],\n };\n\n return result;\n}\n\nexport function filterSpaceDataByPattern(spaceData: SpaceData, pattern: string): SpaceData {\n const regex = createRegexFromGlob(pattern);\n const matchedComponents = spaceData.components.filter(c => regex.test(c.name));\n\n if (!matchedComponents.length) {\n return {\n components: [],\n groups: [],\n presets: [],\n internalTags: [],\n };\n }\n\n const relatedResources = findRelatedResources(matchedComponents, spaceData);\n\n return {\n components: [...matchedComponents, ...relatedResources.whitelistedComponents],\n groups: relatedResources.groups,\n presets: relatedResources.presets,\n internalTags: relatedResources.internalTags,\n };\n}\n\nexport function filterSpaceDataByComponent(spaceData: SpaceData, componentName: string): SpaceData {\n // Find the specific component\n const component = spaceData.components.find(c => c.name === componentName);\n if (!component) {\n return {\n components: [],\n groups: [],\n presets: [],\n internalTags: [],\n };\n }\n\n const relatedResources = findRelatedResources([component], spaceData);\n\n return {\n components: [component, ...relatedResources.whitelistedComponents],\n groups: relatedResources.groups,\n presets: relatedResources.presets,\n internalTags: relatedResources.internalTags,\n };\n}\n\nexport async function handleTags(\n space: string,\n password: string,\n region: RegionCode,\n spaceData: SpaceComponentInternalTag[],\n skipIds?: Set<number>,\n) {\n const results = {\n successful: [] as string[],\n failed: [] as Array<{ name: string; error: unknown }>,\n idMap: new Map<number, number>(),\n };\n\n // Filter out tags that should be skipped\n const tagsToProcess = skipIds\n ? spaceData.filter(tag => !skipIds.has(tag.id))\n : spaceData;\n\n await Promise.all(tagsToProcess.map(async (tag) => {\n const consolidatedSpinner = new Spinner({\n verbose: !isVitest,\n });\n consolidatedSpinner.start('Upserting tags...');\n try {\n const updatedTag = await upsertComponentInternalTag(space, tag, password, region);\n if (updatedTag) {\n results.idMap.set(tag.id, updatedTag.id);\n results.successful.push(tag.name);\n consolidatedSpinner.succeed(`Tag-> ${chalk.hex(colorPalette.COMPONENTS)(tag.name)} - Completed in ${consolidatedSpinner.elapsedTime.toFixed(2)}ms`);\n }\n }\n catch (error) {\n consolidatedSpinner.failed(`Tag-> ${chalk.hex(colorPalette.COMPONENTS)(tag.name)} - Failed`);\n results.failed.push({ name: tag.name, error });\n }\n }));\n return results;\n}\n\nexport async function handleComponentGroups(\n space: string,\n password: string,\n region: RegionCode,\n spaceData: SpaceComponentGroup[],\n skipUuids?: Set<string>,\n) {\n const results = {\n successful: [] as string[],\n failed: [] as Array<{ name: string; error: unknown }>,\n uuidMap: new Map<string, string>(), // Maps old UUIDs to new UUIDs\n idMap: new Map<number, number>(), // Maps old IDs to new IDs\n };\n\n // Filter out groups that should be skipped\n const groupsToProcess = skipUuids\n ? spaceData.filter(group => !skipUuids.has(group.uuid))\n : spaceData;\n\n // First, process groups without parents\n // This conditional handles a strange scenario where group (folders) ids are equal to their parents\n const rootGroups = groupsToProcess.filter(group => (!group.parent_uuid || group.parent_uuid === group.uuid) && !group.parent_id);\n for (const group of rootGroups) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start(`Upserting root group ${group.name}...`);\n try {\n const updatedGroup = await upsertComponentGroup(space, group, password, region);\n if (updatedGroup) {\n results.uuidMap.set(group.uuid, updatedGroup.uuid);\n results.idMap.set(group.id, updatedGroup.id);\n results.successful.push(group.name);\n spinner.succeed(`Group-> ${chalk.hex(colorPalette.COMPONENTS)(group.name)} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n }\n }\n catch (error) {\n spinner.failed(`Group-> ${chalk.hex(colorPalette.COMPONENTS)(group.name)} - Failed`);\n results.failed.push({ name: group.name, error });\n }\n }\n\n // Then process groups with parents recursively\n const processedGroups = new Set<string>();\n rootGroups.forEach(group => processedGroups.add(group.uuid));\n\n async function processChildGroups() {\n let processedAny = false;\n const remainingGroups = spaceData.filter(group => !processedGroups.has(group.uuid));\n\n for (const group of remainingGroups) {\n if (!group.parent_uuid || !group.parent_id) {\n continue;\n }\n\n // Check if parent has been processed\n const newParentUuid = results.uuidMap.get(group.parent_uuid);\n const newParentId = results.idMap.get(group.parent_id);\n if (!newParentUuid || !newParentId) {\n continue;\n }\n\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start(`Upserting child group ${group.name}...`);\n\n try {\n // Update the group with the new parent UUID and ID\n const groupToUpdate = {\n ...group,\n parent_uuid: newParentUuid,\n parent_id: newParentId,\n };\n\n const updatedGroup = await upsertComponentGroup(space, groupToUpdate, password, region);\n if (updatedGroup) {\n results.uuidMap.set(group.uuid, updatedGroup.uuid);\n results.idMap.set(group.id, updatedGroup.id);\n results.successful.push(group.name);\n processedGroups.add(group.uuid);\n processedAny = true;\n spinner.succeed(`Group-> ${chalk.hex(colorPalette.COMPONENTS)(group.name)} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n }\n }\n catch (error) {\n spinner.failed(`Group-> ${chalk.hex(colorPalette.COMPONENTS)(group.name)} - Failed`);\n results.failed.push({ name: group.name, error });\n processedGroups.add(group.uuid); // Mark as processed even if failed to avoid infinite loop\n }\n }\n\n // If we processed any groups and there are still unprocessed groups, continue recursively\n if (processedAny && processedGroups.size < spaceData.length) {\n await processChildGroups();\n }\n }\n\n await processChildGroups();\n return results;\n}\n\n/**\n * Collects all whitelist dependencies from a component's schema\n */\nfunction collectWhitelistDependencies(\n schema: Record<string, any>,\n): {\n groupUuids: Set<string>;\n tagIds: Set<number>;\n componentNames: Set<string>;\n } {\n const dependencies = {\n groupUuids: new Set<string>(),\n tagIds: new Set<number>(),\n componentNames: new Set<string>(),\n };\n\n function traverse(field: Record<string, any>) {\n if (typeof field === 'object' && field !== null) {\n if (field.type === 'bloks') {\n // Collect group whitelist UUIDs\n if (field.restrict_type === 'groups' && Array.isArray(field.component_group_whitelist)) {\n field.component_group_whitelist.forEach((uuid: string) => {\n if (uuid && uuid.length > 0) {\n dependencies.groupUuids.add(uuid);\n }\n });\n }\n\n // Collect tag whitelist IDs\n if (Array.isArray(field.component_tag_whitelist)) {\n field.component_tag_whitelist.forEach((id: string | number) => {\n if (id) {\n dependencies.tagIds.add(Number(id));\n }\n });\n }\n\n // Collect component whitelist names\n if (Array.isArray(field.component_whitelist)) {\n field.component_whitelist.forEach((name: string) => {\n if (name && typeof name === 'string') {\n dependencies.componentNames.add(name);\n }\n });\n }\n }\n\n // Recursively traverse nested fields\n Object.values(field).forEach((value) => {\n if (typeof value === 'object' && value !== null) {\n traverse(value);\n }\n });\n }\n }\n\n traverse(schema);\n return dependencies;\n}\n\n/**\n * Updates the whitelist references in a component's schema with new IDs/UUIDs\n */\nfunction updateSchemaWhitelists(\n schema: Record<string, any>,\n groupsUuidMap: Map<string, string>,\n tagsIdMap: Map<number, number>,\n componentNameMap?: Map<string, string>,\n): void {\n // Recursively process all fields in the schema\n Object.values(schema).forEach((field) => {\n if (typeof field === 'object' && field !== null) {\n if (field.type === 'bloks') {\n // Update group whitelist if present\n if (field.restrict_type === 'groups' && Array.isArray(field.component_group_whitelist)) {\n field.component_group_whitelist = field.component_group_whitelist\n .map((uuid: string) => groupsUuidMap.get(uuid))\n .filter(Boolean);\n }\n\n // Update tag whitelist if present\n if (Array.isArray(field.component_tag_whitelist)) {\n field.component_tag_whitelist = field.component_tag_whitelist\n .map((id: string | number) => tagsIdMap.get(Number(id)))\n .filter(Boolean);\n }\n\n // Update component whitelist if present and componentNameMap is provided\n if (Array.isArray(field.component_whitelist) && componentNameMap) {\n field.component_whitelist = field.component_whitelist\n .map((name: string) => componentNameMap.get(name))\n .filter(Boolean);\n }\n }\n\n // Recursively process nested fields\n updateSchemaWhitelists(field, groupsUuidMap, tagsIdMap, componentNameMap);\n }\n });\n}\n\n/**\n * Gets all groups in the hierarchy path of a given group\n */\nfunction getGroupHierarchy(group: SpaceComponentGroup, allGroups: SpaceComponentGroup[]): SpaceComponentGroup[] {\n const hierarchy: SpaceComponentGroup[] = [group];\n let currentGroup = group;\n\n while (currentGroup.parent_uuid && currentGroup.parent_uuid.length > 0 && currentGroup.parent_uuid !== currentGroup.uuid) {\n const parentGroup = allGroups.find(g => g.uuid === currentGroup.parent_uuid);\n if (parentGroup) {\n hierarchy.unshift(parentGroup); // Add parent to the start of the array\n currentGroup = parentGroup;\n }\n else {\n break;\n }\n }\n\n return hierarchy;\n}\n\nexport async function handleWhitelists(\n space: string,\n password: string,\n region: RegionCode,\n spaceData: SpaceData,\n): Promise<{\n successful: string[];\n failed: Array<{ name: string; error: unknown }>;\n groupsUuidMap: Map<string, string>;\n tagsIdMap: Map<number, number>;\n componentNameMap: Map<string, string>;\n processedTagIds: Set<number>;\n processedGroupUuids: Set<string>;\n processedComponentNames: Set<string>;\n }> {\n const results = {\n successful: [] as string[],\n failed: [] as Array<{ name: string; error: unknown }>,\n groupsUuidMap: new Map<string, string>(),\n tagsIdMap: new Map<number, number>(),\n componentNameMap: new Map<string, string>(),\n processedTagIds: new Set<number>(),\n processedGroupUuids: new Set<string>(),\n processedComponentNames: new Set<string>(),\n };\n\n // Collect all whitelist dependencies from all components\n const allDependencies = {\n groupUuids: new Set<string>(),\n tagIds: new Set<number>(),\n componentNames: new Set<string>(),\n };\n\n // First, collect all direct dependencies\n spaceData.components.forEach((component) => {\n if (component.schema) {\n const deps = collectWhitelistDependencies(component.schema);\n deps.groupUuids.forEach(uuid => allDependencies.groupUuids.add(uuid));\n deps.tagIds.forEach(id => allDependencies.tagIds.add(id));\n deps.componentNames.forEach(name => allDependencies.componentNames.add(name));\n }\n });\n\n // Process tags first\n const whitelistTags = spaceData.internalTags.filter(tag => allDependencies.tagIds.has(tag.id));\n if (whitelistTags.length > 0) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start('Processing whitelist tags...');\n const tagResults = await handleTags(space, password, region, whitelistTags);\n results.successful.push(...tagResults.successful);\n results.failed.push(...tagResults.failed);\n tagResults.idMap.forEach((newId, oldId) => {\n results.tagsIdMap.set(oldId, newId);\n results.processedTagIds.add(oldId);\n });\n spinner.succeed(`Processed ${whitelistTags.length} whitelist tags`);\n }\n\n // Process groups - include full hierarchy of whitelisted groups\n const whitelistGroupsSet = new Set<SpaceComponentGroup>();\n\n // First, collect directly whitelisted groups\n const directWhitelistGroups = spaceData.groups.filter(group => allDependencies.groupUuids.has(group.uuid));\n\n // Then, for each whitelisted group, get its full hierarchy\n directWhitelistGroups.forEach((group) => {\n const hierarchy = getGroupHierarchy(group, spaceData.groups);\n hierarchy.forEach(g => whitelistGroupsSet.add(g));\n });\n\n const whitelistGroups = Array.from(whitelistGroupsSet);\n if (whitelistGroups.length > 0) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start('Processing whitelist groups...');\n const groupResults = await handleComponentGroups(space, password, region, whitelistGroups);\n results.successful.push(...groupResults.successful);\n results.failed.push(...groupResults.failed);\n groupResults.uuidMap.forEach((newUuid, oldUuid) => {\n results.groupsUuidMap.set(oldUuid, newUuid);\n results.processedGroupUuids.add(oldUuid);\n });\n spinner.succeed(`Processed ${whitelistGroups.length} whitelist groups`);\n }\n\n // Process whitelisted components last (after tags and groups are processed)\n const whitelistComponents = spaceData.components.filter(component => allDependencies.componentNames.has(component.name));\n if (whitelistComponents.length > 0) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start('Processing whitelisted components...');\n\n // Process components in dependency order\n const processedComponents = new Set<string>();\n const failedComponents = new Set<string>();\n\n async function processComponent(componentName: string, visited = new Set<string>()): Promise<void> {\n // Skip if already processed or failed\n if (processedComponents.has(componentName) || failedComponents.has(componentName)) {\n return;\n }\n\n // Check for circular dependencies\n if (visited.has(componentName)) {\n failedComponents.add(componentName);\n results.failed.push({\n name: componentName,\n error: new Error(`Circular dependency detected for component ${componentName}`),\n });\n return;\n }\n\n visited.add(componentName);\n\n // Find the component\n const component = spaceData.components.find(c => c.name === componentName);\n if (!component) {\n failedComponents.add(componentName);\n results.failed.push({\n name: componentName,\n error: new Error(`Component ${componentName} not found`),\n });\n return;\n }\n\n // Process dependencies first\n if (component.schema) {\n const deps = collectWhitelistDependencies(component.schema);\n for (const depName of deps.componentNames) {\n await processComponent(depName, new Set(visited));\n }\n }\n\n // Skip if failed due to dependency failure\n if (failedComponents.has(componentName)) {\n return;\n }\n\n const componentSpinner = new Spinner({\n verbose: !isVitest,\n });\n componentSpinner.start(`Processing whitelisted component ${component.name}...`);\n\n try {\n // Update component with new tag IDs and group UUIDs before upserting\n const componentToUpdate = { ...component };\n\n // Map component_group_uuid if it exists\n if (component.component_group_uuid) {\n const newGroupUuid = results.groupsUuidMap.get(component.component_group_uuid);\n if (newGroupUuid) {\n componentToUpdate.component_group_uuid = newGroupUuid;\n }\n }\n\n // Process internal tags if they exist\n if (component.internal_tag_ids?.length > 0) {\n const processedTags: { ids: string[]; tags: SpaceComponentInternalTag[] } = {\n ids: [],\n tags: [],\n };\n\n // Map existing tag IDs to new ones\n for (const tagId of component.internal_tag_ids) {\n const tag = spaceData.internalTags.find(t => t.id === Number(tagId));\n if (tag) {\n const newTagId = results.tagsIdMap.get(tag.id);\n if (newTagId) {\n processedTags.ids.push(newTagId.toString());\n processedTags.tags.push({\n ...tag,\n id: newTagId,\n });\n }\n }\n }\n\n componentToUpdate.internal_tag_ids = processedTags.ids;\n componentToUpdate.internal_tags_list = processedTags.tags;\n }\n\n // Update schema whitelists with new IDs/UUIDs\n if (componentToUpdate.schema) {\n // Deep clone the schema to avoid modifying the original\n componentToUpdate.schema = JSON.parse(JSON.stringify(componentToUpdate.schema));\n updateSchemaWhitelists(\n componentToUpdate.schema,\n results.groupsUuidMap,\n results.tagsIdMap,\n results.componentNameMap,\n );\n }\n\n const updatedComponent = await upsertComponent(space, componentToUpdate, password, region);\n if (updatedComponent) {\n results.successful.push(component.name);\n results.componentNameMap.set(component.name, updatedComponent.name);\n results.processedComponentNames.add(component.name);\n processedComponents.add(component.name);\n componentSpinner.succeed(`Whitelisted component-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Completed in ${componentSpinner.elapsedTime.toFixed(2)}ms`);\n }\n }\n catch (error) {\n componentSpinner.failed(`Whitelisted component-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Failed`);\n failedComponents.add(componentName);\n results.failed.push({ name: component.name, error });\n }\n }\n\n // Process each whitelisted component and its dependencies\n for (const component of whitelistComponents) {\n await processComponent(component.name);\n }\n\n spinner.succeed(`Processed ${processedComponents.size} whitelisted components`);\n }\n\n return results;\n}\n\n// Update HandleComponentsOptions to include whitelist maps\ninterface HandleComponentsOptions {\n space: string;\n password: string;\n region: RegionCode;\n spaceData: SpaceData;\n groupsUuidMap: Map<string, string>;\n tagsIdMaps: Map<number, number>;\n componentNameMap: Map<string, string>;\n}\n\nexport async function handleComponents(options: HandleComponentsOptions) {\n const {\n space,\n password,\n region,\n spaceData: { components, internalTags, presets },\n groupsUuidMap,\n tagsIdMaps,\n componentNameMap,\n } = options;\n\n const results = {\n successful: [] as string[],\n failed: [] as Array<{ name: string; error: unknown }>,\n componentIdMap: new Map<number, number>(),\n };\n\n // Helper to check if a component has whitelists in its schema\n const hasWhitelists = (schema: Record<string, any>): boolean => {\n let found = false;\n function traverse(field: Record<string, any>) {\n if (typeof field === 'object' && field !== null) {\n if (field.type === 'bloks' && (\n (field.restrict_type === 'groups' && Array.isArray(field.component_group_whitelist))\n || Array.isArray(field.component_tag_whitelist)\n || Array.isArray(field.component_whitelist)\n )) {\n found = true;\n return;\n }\n Object.values(field).forEach((value) => {\n if (typeof value === 'object' && value !== null && !found) {\n traverse(value);\n }\n });\n }\n }\n traverse(schema);\n return found;\n };\n\n // First pass: Create/update all components\n for (const component of components) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n\n if (!component.name) {\n spinner.start(`Processing component...`);\n await delay(100);\n spinner.failed(`Component-> ${chalk.hex(colorPalette.COMPONENTS)('unknown')} is missing the name property - Failed`);\n results.failed.push({ name: 'unknown', error: new Error('Component name is required') });\n continue;\n }\n\n spinner.start(`Processing component ${component.name}...`);\n\n try {\n // Map component_group_uuid if it exists\n const componentToUpdate = { ...component };\n if (component.component_group_uuid) {\n const newGroupUuid = groupsUuidMap.get(component.component_group_uuid);\n if (newGroupUuid) {\n componentToUpdate.component_group_uuid = newGroupUuid;\n }\n }\n\n // Process internal tags if they exist\n if (component.internal_tag_ids?.length > 0) {\n const processedTags: { ids: string[]; tags: SpaceComponentInternalTag[] } = {\n ids: [],\n tags: [],\n };\n\n // Map existing tag IDs to new ones\n for (const tagId of component.internal_tag_ids) {\n const tag = internalTags.find(t => t.id === Number(tagId));\n if (tag) {\n const newTagId = tagsIdMaps.get(tag.id);\n if (newTagId) {\n processedTags.ids.push(newTagId.toString());\n processedTags.tags.push({\n ...tag,\n id: newTagId,\n });\n }\n }\n }\n\n componentToUpdate.internal_tag_ids = processedTags.ids;\n componentToUpdate.internal_tags_list = processedTags.tags;\n }\n\n // Update schema whitelists with new IDs/UUIDs if the component has whitelists\n if (componentToUpdate.schema && (hasWhitelists(componentToUpdate.schema))) {\n // Deep clone the schema to avoid modifying the original\n componentToUpdate.schema = JSON.parse(JSON.stringify(componentToUpdate.schema));\n updateSchemaWhitelists(\n componentToUpdate.schema,\n groupsUuidMap,\n tagsIdMaps,\n componentNameMap,\n );\n }\n\n // Upsert the component\n const updatedComponent = await upsertComponent(space, componentToUpdate, password, region);\n if (updatedComponent) {\n results.successful.push(component.name);\n results.componentIdMap.set(component.id, updatedComponent.id);\n spinner.succeed(`Component-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n }\n }\n catch (error) {\n spinner.failed(`Component-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Failed`);\n results.failed.push({ name: component.name, error });\n }\n }\n\n // Second pass: Only update components that have component_whitelist dependencies and weren't properly mapped in first pass\n const componentsWithUnmappedWhitelists = components.filter(component =>\n component.schema\n && hasWhitelists(component.schema)\n && componentNameMap\n && componentNameMap.size > 0,\n );\n\n if (componentsWithUnmappedWhitelists.length > 0) {\n for (const component of componentsWithUnmappedWhitelists) {\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n spinner.start(`Updating component whitelists for ${component.name}...`);\n\n try {\n const componentToUpdate = { ...component };\n // Preserve the group mapping from the first pass\n if (component.component_group_uuid) {\n const newGroupUuid = groupsUuidMap.get(component.component_group_uuid);\n if (newGroupUuid) {\n componentToUpdate.component_group_uuid = newGroupUuid;\n }\n }\n\n // Update schema whitelists including component whitelists\n updateSchemaWhitelists(\n componentToUpdate.schema,\n groupsUuidMap,\n tagsIdMaps,\n componentNameMap,\n );\n\n // Upsert the component again with updated component whitelists\n await upsertComponent(space, componentToUpdate, password, region);\n spinner.succeed(`Component whitelists-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n }\n catch (error) {\n spinner.failed(`Component whitelists-> ${chalk.hex(colorPalette.COMPONENTS)(component.name)} - Failed`);\n results.failed.push({ name: `${component.name} (whitelist update)`, error });\n }\n }\n }\n\n // Finally, process presets\n for (const component of components) {\n const relatedPresets = presets.filter(preset => preset.component_id === component.id);\n if (relatedPresets.length > 0) {\n for (const preset of relatedPresets) {\n const presetSpinner = new Spinner({\n verbose: !isVitest,\n });\n presetSpinner.start(`Processing preset ${preset.name}...`);\n\n try {\n const newComponentId = results.componentIdMap.get(component.id);\n if (!newComponentId) {\n throw new Error(`No new ID found for component ${component.name}`);\n }\n\n const presetToUpdate = {\n name: preset.name,\n preset: preset.preset,\n component_id: newComponentId,\n };\n\n await upsertComponentPreset(space, presetToUpdate, password, region);\n presetSpinner.succeed(`Preset-> ${chalk.hex(colorPalette.COMPONENTS)(preset.name)} - Completed in ${presetSpinner.elapsedTime.toFixed(2)}ms`);\n }\n catch (error) {\n presetSpinner.failed(`Preset-> ${chalk.hex(colorPalette.COMPONENTS)(preset.name)} - Failed`);\n results.failed.push({ name: preset.name, error });\n }\n }\n }\n }\n\n return results;\n}\n","import type { PushComponentsOptions } from './constants';\n\nimport { colorPalette, commands } from '../../../constants';\nimport { getProgram } from '../../../program';\nimport { CommandError, handleError, konsola } from '../../../utils';\nimport { session } from '../../../session';\nimport { readComponentsFiles } from './actions';\nimport { componentsCommand } from '../command';\nimport {\n filterSpaceDataByComponent,\n filterSpaceDataByPattern,\n handleComponentGroups,\n handleComponents,\n handleTags,\n handleWhitelists,\n} from './operations';\n\nconst program = getProgram(); // Get the shared singleton instance\n\ncomponentsCommand\n .command('push [componentName]')\n .description(`Push your space's components schema as json`)\n .option('-f, --from <from>', 'source space id')\n .option('--fi, --filter <filter>', 'glob filter to apply to the components before pushing')\n .option('--sf, --separate-files', 'Read from separate files instead of consolidated files')\n .option('--su, --suffix <suffix>', 'Suffix to add to the component name')\n .action(async (componentName: string | undefined, options: PushComponentsOptions) => {\n konsola.title(` ${commands.COMPONENTS} `, colorPalette.COMPONENTS, componentName ? `Pushing component ${componentName}...` : 'Pushing components...');\n // Global options\n const verbose = program.opts().verbose;\n const { space, path } = componentsCommand.opts();\n\n const { from, filter } = options;\n\n // Check if the user is logged in\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n\n // Check if the space is provided\n if (!space) {\n handleError(new CommandError(`Please provide the target space as argument --space TARGET_SPACE_ID.`), verbose);\n return;\n }\n\n if (!from) {\n // If no source space is provided, use the target space as source\n options.from = space;\n }\n\n const { password, region } = state;\n\n try {\n let spaceData = await readComponentsFiles({\n ...options,\n path,\n });\n\n // If componentName is provided, filter space data to only include related resources\n if (componentName) {\n spaceData = filterSpaceDataByComponent(spaceData, componentName);\n if (!spaceData.components.length) {\n handleError(new CommandError(`Component \"${componentName}\" not found.`), verbose);\n return;\n }\n }\n // If filter pattern is provided, filter space data to match the pattern\n else if (filter) {\n spaceData = filterSpaceDataByPattern(spaceData, filter);\n if (!spaceData.components.length) {\n handleError(new CommandError(`No components found matching pattern \"${filter}\".`), verbose);\n return;\n }\n konsola.info(`Filter applied: ${filter}`);\n }\n\n if (!spaceData.components.length) {\n konsola.warn('No components found. Please make sure you have pulled the components first.');\n return;\n }\n\n const results = {\n successful: [] as string[],\n failed: [] as Array<{ name: string; error: unknown }>,\n };\n\n // First, process whitelist dependencies\n const whitelistResults = await handleWhitelists(space, password, region, spaceData);\n results.successful.push(...whitelistResults.successful);\n results.failed.push(...whitelistResults.failed);\n\n // Then process remaining tags (skip those already processed in whitelists)\n const tagsResults = await handleTags(space, password, region, spaceData.internalTags, whitelistResults.processedTagIds);\n results.successful.push(...tagsResults.successful);\n results.failed.push(...tagsResults.failed);\n\n // Then process remaining groups (skip those already processed in whitelists)\n const groupsResults = await handleComponentGroups(space, password, region, spaceData.groups, whitelistResults.processedGroupUuids);\n results.successful.push(...groupsResults.successful);\n results.failed.push(...groupsResults.failed);\n\n // Finally process remaining components (skip those already processed in whitelists)\n const remainingComponents = spaceData.components.filter(\n component => !whitelistResults.processedComponentNames.has(component.name),\n );\n\n const componentsResults = await handleComponents({\n space,\n password,\n region,\n spaceData: {\n ...spaceData,\n components: remainingComponents,\n },\n groupsUuidMap: new Map([...whitelistResults.groupsUuidMap, ...groupsResults.uuidMap]), // Merge both group maps\n tagsIdMaps: new Map([...whitelistResults.tagsIdMap, ...tagsResults.idMap]), // Merge both tag maps\n componentNameMap: whitelistResults.componentNameMap,\n });\n results.successful.push(...componentsResults.successful);\n results.failed.push(...componentsResults.failed);\n\n if (results.failed.length > 0) {\n if (!verbose) {\n konsola.br();\n konsola.info('For more information about the error, run the command with the `--verbose` flag');\n }\n else {\n results.failed.forEach((failed) => {\n handleError(failed.error as Error, verbose);\n });\n }\n }\n }\n catch (error) {\n handleError(error as Error, verbose);\n }\n });\n","import { join } from 'node:path';\nimport { handleAPIError, handleFileSystemError } from '../../utils';\nimport { customFetch } from '../../utils/fetch';\nimport { resolvePath, saveToFile } from '../../utils/filesystem';\nimport type { PullLanguagesOptions } from './constants';\nimport type { RegionCode } from '../../constants';\nimport type { SpaceInternationalization } from '../../types';\nimport { getStoryblokUrl } from '../../utils/api-routes';\n\nexport const fetchLanguages = async (space: string, token: string, region: RegionCode): Promise<SpaceInternationalization | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const response = await customFetch<{\n space: SpaceInternationalization;\n }>(`${url}/spaces/${space}`, {\n headers: {\n Authorization: token,\n },\n });\n\n return {\n default_lang_name: response.space.default_lang_name,\n languages: response.space.languages,\n };\n }\n catch (error) {\n handleAPIError('pull_languages', error);\n }\n};\n\nexport const saveLanguagesToFile = async (space: string, internationalizationOptions: SpaceInternationalization, options: PullLanguagesOptions) => {\n try {\n const { filename = 'languages', suffix, path } = options;\n const data = JSON.stringify(internationalizationOptions, null, 2);\n const name = suffix ? `${filename}.${suffix}.json` : `${filename}.json`;\n const resolvedPath = resolvePath(path, `languages/${space}/`);\n const filePath = join(resolvedPath, name);\n\n await saveToFile(filePath, data);\n }\n catch (error) {\n handleFileSystemError('write', error as Error);\n }\n};\n","import { colorPalette, commands } from '../../constants';\nimport { CommandError, handleError, isVitest, konsola } from '../../utils';\nimport { getProgram } from '../../program';\nimport { session } from '../../session';\nimport { fetchLanguages, saveLanguagesToFile } from './actions';\nimport chalk from 'chalk';\nimport type { PullLanguagesOptions } from './constants';\nimport { Spinner } from '@topcli/spinner';\n\nconst program = getProgram(); // Get the shared singleton instance\n\nexport const languagesCommand = program\n .command('languages')\n .alias('lang')\n .description(`Manage your space's languages`)\n .option('-s, --space <space>', 'space ID')\n .option('-p, --path <path>', 'path to save the file. Default is .storyblok/languages');\n\nlanguagesCommand\n .command('pull')\n .description(`Download your space's languages schema as json`)\n .option('-f, --filename <filename>', 'filename to save the file as <filename>.<suffix>.json')\n .option('--su, --suffix <suffix>', 'suffix to add to the file name (e.g. languages.<suffix>.json). By default, the space ID is used.')\n .action(async (options: PullLanguagesOptions) => {\n konsola.title(` ${commands.LANGUAGES} `, colorPalette.LANGUAGES);\n\n // Global options\n const verbose = program.opts().verbose;\n\n // Command options\n const { space, path } = languagesCommand.opts();\n const { filename = 'languages', suffix = options.space } = options;\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n try {\n spinner.start(`Fetching ${chalk.hex(colorPalette.LANGUAGES)('languages')}`);\n\n const internationalization = await fetchLanguages(space, state.password, state.region);\n\n if (!internationalization || internationalization.languages?.length === 0) {\n spinner.failed();\n\n konsola.warn(`No languages found in the space ${space}`, true);\n konsola.br();\n return;\n }\n await saveLanguagesToFile(space, internationalization, {\n ...options,\n path,\n });\n const fileName = suffix ? `${filename}.${suffix}.json` : `${filename}.json`;\n const filePath = path ? `${path}/${fileName}` : `.storyblok/languages/${space}/${fileName}`;\n spinner.succeed();\n konsola.ok(`Languages schema downloaded successfully at ${chalk.hex(colorPalette.PRIMARY)(filePath)}`, true);\n }\n catch (error) {\n spinner.failed();\n konsola.br();\n handleError(error as Error, verbose);\n }\n konsola.br();\n });\n","import { getProgram } from '../../program';\n\nconst program = getProgram(); // Get the shared singleton instance\n\n// Components root command\nexport const migrationsCommand = program\n .command('migrations')\n .alias('mig')\n .description(`Manage your space's migrations`)\n .option('-s, --space <space>', 'space ID')\n .option('-p, --path <path>', 'path to save the file. Default is .storyblok/migrations');\n","import { resolvePath, saveToFile } from '../../../utils/filesystem';\nimport type { SpaceComponent } from '../../components/constants';\nimport { join, resolve } from 'node:path';\nimport { handleFileSystemError } from '../../../utils';\n\nconst getMigrationTemplate = () => {\n return `export default function (block) {\n // Example to change a string to boolean\n // block.field_name = !!(block.field_name)\n\n // Example to transfer content from other field\n // block.target_field = block.source_field\n\n // Example to transform an array\n // block.array_field = block.array_field.map(item => ({ ...item, new_prop: 'value' }))\n\n return block;\n}\n`;\n};\n\nexport const generateMigration = async (space: string, path: string | undefined, component: SpaceComponent, suffix?: string) => {\n const resolvedPath = path\n ? resolve(process.cwd(), path, 'migrations', space)\n : resolvePath(path, `migrations/${space}`);\n\n const fileName = suffix ? `${component.name}.${suffix}.js` : `${component.name}.js`;\n const migrationPath = join(resolvedPath, fileName);\n\n try {\n await saveToFile(migrationPath, getMigrationTemplate());\n }\n catch (error) {\n handleFileSystemError('write', error as Error);\n }\n};\n","import { Spinner } from '@topcli/spinner';\nimport chalk from 'chalk';\n\nimport type { MigrationsGenerateOptions } from './constants';\nimport { colorPalette, commands } from '../../../constants';\nimport { getProgram } from '../../../program';\nimport { CommandError, handleError, isVitest, konsola } from '../../../utils';\nimport { session } from '../../../session';\nimport { fetchComponent } from '../../../commands/components';\nimport { migrationsCommand } from '../command';\nimport { generateMigration } from './actions';\n\nconst program = getProgram();\n\nmigrationsCommand\n .command('generate [componentName]')\n .description('Generate a migration file')\n .option('--su, --suffix <suffix>', 'suffix to add to the file name (e.g. {component-name}.<suffix>.js)')\n .action(async (componentName: string | undefined, options: MigrationsGenerateOptions) => {\n konsola.title(` ${commands.MIGRATIONS} `, colorPalette.MIGRATIONS, componentName ? `Generating migration for component ${componentName}...` : 'Generating migrations...');\n // Global options\n const verbose = program.opts().verbose;\n\n // Command options\n const { space, path } = migrationsCommand.opts();\n\n const { suffix } = options;\n\n if (!componentName) {\n handleError(new CommandError(`Please provide the component name as argument ${chalk.hex(colorPalette.MIGRATIONS)('storyblok migrations generate YOUR_COMPONENT_NAME.')}`), verbose);\n return;\n }\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const { password, region } = state;\n\n const spinner = new Spinner({\n verbose: !isVitest,\n }).start(`Generating migration for component ${componentName}...`);\n try {\n const component = await fetchComponent(space, componentName, password, region);\n\n if (!component) {\n spinner.failed(`Failed to fetch component ${componentName}. Make sure the component exists in your space.`);\n handleError(new CommandError(`No component found with name \"${componentName}\"`), verbose);\n return;\n }\n\n await generateMigration(space, path, component, suffix);\n\n spinner.succeed(`Migration generated for component ${chalk.hex(colorPalette.MIGRATIONS)(componentName)} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n\n const fileName = suffix ? `${component.name}.${suffix}.js` : `${component.name}.js`;\n const migrationPath = path ? `${path}/migrations/${space}/${fileName}` : `.storyblok/migrations/${space}/${fileName}`;\n konsola.ok(`You can find the migration file in ${chalk.hex(colorPalette.MIGRATIONS)(migrationPath)}`);\n }\n catch (error) {\n spinner.failed(`Failed to generate migration for component ${componentName}`);\n handleError(error as Error, verbose);\n }\n });\n","import { customFetch } from '../../utils/fetch';\nimport { getStoryblokUrl } from '../../utils/api-routes';\nimport type { RegionCode, SpaceOptions } from '../../constants';\nimport type { StoriesFilterOptions, StoriesQueryParams, Story } from './constants';\nimport { handleAPIError } from '../../utils/error';\nimport { objectToStringParams } from '../../utils';\n\n/**\n * Fetches stories from Storyblok Management API with optional query parameters\n * @param space - The space ID\n * @param token - The authentication token\n * @param region - The region code\n * @param params - Optional query parameters for filtering stories\n * @returns Promise with an array of stories or undefined if error occurs\n */\nexport const fetchStories = async (\n space: string,\n token: string,\n region: RegionCode,\n params?: StoriesQueryParams,\n) => {\n try {\n const url = getStoryblokUrl(region);\n\n // Extract filter_query params to handle them separately\n const { filter_query, ...restParams } = params || {};\n\n // Handle regular params with URLSearchParams\n const regularParams = new URLSearchParams(objectToStringParams(restParams)).toString();\n\n // Combine regular params with filter_query params (if any)\n const queryString = filter_query\n ? `${regularParams ? `${regularParams}&` : ''}${filter_query}`\n : regularParams;\n\n const endpoint = `${url}/spaces/${space}/stories${queryString ? `?${queryString}` : ''}`;\n\n const response = await customFetch<{\n stories: Story[];\n }>(endpoint, {\n headers: {\n Authorization: token,\n },\n });\n return response.stories;\n }\n catch (error) {\n handleAPIError('pull_stories', error as Error);\n }\n};\n\nexport async function fetchStoriesByComponent(\n spaceOptions: SpaceOptions,\n filterOptions?: StoriesFilterOptions,\n): Promise<Story[] | undefined> {\n const { spaceId, token, region } = spaceOptions;\n const { componentName = '', query, starts_with } = filterOptions || {};\n\n // Convert filterOptions to StoriesQueryParams\n const params: StoriesQueryParams = {\n ...(starts_with && { starts_with }),\n };\n\n // Handle component filter\n if (componentName) {\n params.contain_component = componentName;\n }\n\n // Handle query string if provided\n if (query) {\n // Add filter_query prefix to the query parameter if it doesn't have it already\n params.filter_query = query.startsWith('filter_query') ? query : `filter_query${query}`;\n }\n\n try {\n const stories = await fetchStories(spaceId, token, region, params);\n return stories ?? [];\n }\n catch (error) {\n handleAPIError('pull_stories', error as Error);\n }\n}\n\nexport const fetchStory = async (\n space: string,\n token: string,\n region: RegionCode,\n storyId: string,\n) => {\n try {\n const url = getStoryblokUrl(region);\n const endpoint = `${url}/spaces/${space}/stories/${storyId}`;\n\n const response = await customFetch<{\n story: Story;\n }>(endpoint, {\n headers: {\n Authorization: token,\n },\n });\n return response.story;\n }\n catch (error) {\n handleAPIError('pull_story', error as Error);\n }\n};\n\n/**\n * Updates a story in Storyblok with new content\n * @param space - The space ID\n * @param token - The authentication token\n * @param region - The region code\n * @param storyId - The ID of the story to update\n * @param payload - The payload containing story data and update options\n * @param payload.story - The story data to update\n * @param payload.force_update - Whether to force the update (optional)\n * @param payload.publish - Whether to publish the story (optional)\n * @returns Promise with the updated story or undefined if error occurs\n */\nexport const updateStory = async (\n space: string,\n token: string,\n region: RegionCode,\n storyId: number,\n payload: {\n story: Partial<Story>;\n force_update?: string;\n publish?: number;\n },\n): Promise<Story | undefined> => {\n try {\n const url = getStoryblokUrl(region);\n const endpoint = `${url}/spaces/${space}/stories/${storyId}`;\n\n const response = await customFetch<{\n story: Story;\n }>(endpoint, {\n method: 'PUT',\n headers: {\n 'Authorization': token,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n return response.story;\n }\n catch (error) {\n handleAPIError('update_story', error as Error);\n }\n};\n","import { readdir, readFile } from 'node:fs/promises';\nimport { resolvePath } from '../../../utils/filesystem';\nimport { FileSystemError } from '../../../utils/error';\nimport { join } from 'node:path';\nimport type { MigrationFile, ReadMigrationFilesOptions } from './constants';\nimport { createRegexFromGlob, konsola } from '../../../utils';\nimport type { StoryContent } from '../../stories/constants';\n\nexport async function readJavascriptFile(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath, 'utf-8');\n if (!content) {\n throw new FileSystemError('invalid_argument', 'read', new Error(`File ${filePath} is empty`));\n }\n return content;\n }\n catch (error) {\n throw new FileSystemError('file_not_found', 'read', error as Error);\n }\n}\n\nexport async function readMigrationFiles(options: ReadMigrationFilesOptions): Promise<MigrationFile[]> {\n const { space, path, filter } = options;\n const resolvedPath = resolvePath(path, `migrations/${space}`);\n\n // Check if directory exists first\n try {\n await readdir(resolvedPath);\n }\n catch (error) {\n const message = `No directory found for space \"${space}\". Please make sure you have pulled the migrations first by running:\\n\\n storyblok migrations pull --space ${space}`;\n throw new FileSystemError(\n 'file_not_found',\n 'read',\n error as Error,\n message,\n );\n }\n\n try {\n const dirFiles = await readdir(resolvedPath);\n const migrationFiles: MigrationFile[] = [];\n const filterRegex = filter ? createRegexFromGlob(filter) : null;\n\n if (dirFiles.length > 0) {\n for (const file of dirFiles) {\n if (!file.endsWith('.js')) {\n continue;\n }\n\n // Apply glob filter if provided\n if (filterRegex && !filterRegex.test(file)) {\n continue;\n }\n\n const filePath = join(resolvedPath, file);\n const content = await readJavascriptFile(filePath);\n\n migrationFiles.push({\n name: file,\n content,\n });\n }\n }\n\n return migrationFiles;\n }\n catch (error) {\n throw new FileSystemError(\n 'file_not_found',\n 'read',\n error as Error,\n );\n }\n}\n\n/**\n * Loads a migration function from a file using dynamic import\n * @param fileName - The name of the migration file\n * @param space - The space ID\n * @param basePath - The base path for migrations\n * @returns The migration function or null if loading failed\n */\nexport async function getMigrationFunction(fileName: string, space: string, basePath: string): Promise<((block: any) => any) | null> {\n try {\n const resolvedPath = resolvePath(basePath, `migrations/${space}`);\n const filePath = join(resolvedPath, fileName);\n\n // Use dynamic import to load the module\n const migrationModule = await import(`file://${filePath}`);\n\n // Get the default export which should be the migration function\n if (typeof migrationModule.default === 'function') {\n return migrationModule.default;\n }\n\n konsola.error(`Migration file \"${fileName}\" does not export a default function.`);\n return null;\n }\n catch (error) {\n konsola.error(`Error loading migration function from \"${fileName}\": ${(error as Error).message}`);\n return null;\n }\n}\n\n/**\n * Recursively applies a migration function to all blocks in a content object that match the target component\n * @param content - The content object to process\n * @param migrationFunction - The migration function to apply\n * @param targetComponent - The component name to target for migration\n * @returns Whether any blocks were modified\n */\nexport function applyMigrationToAllBlocks(content: StoryContent, migrationFunction: (block: StoryContent) => StoryContent, targetComponent: string): boolean {\n if (!content || typeof content !== 'object') {\n return false;\n }\n\n let modified = false;\n\n // Get the base component name (everything before the first dot)\n const baseTargetComponent = targetComponent.split('.')[0];\n\n // If the content has a component property and it matches the base component name\n if (content.component === baseTargetComponent) {\n // Apply the migration function to this block\n const migratedContent = migrationFunction({ ...content });\n Object.assign(content, migratedContent);\n modified = true;\n }\n\n // Recursively process all properties that might contain nested blocks\n for (const key in content) {\n if (Object.prototype.hasOwnProperty.call(content, key)) {\n const value = content[key];\n\n // Process arrays (might contain blocks)\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n if (value[i] && typeof value[i] === 'object') {\n const blockModified = applyMigrationToAllBlocks(value[i], migrationFunction, targetComponent);\n modified = modified || blockModified;\n }\n }\n }\n // Process nested objects (might be blocks)\n else if (value && typeof value === 'object') {\n const blockModified = applyMigrationToAllBlocks(value, migrationFunction, targetComponent);\n modified = modified || blockModified;\n }\n }\n }\n\n return modified;\n}\n","import { join } from 'node:path';\nimport { resolvePath, saveToFile } from '../../../utils/filesystem';\nimport type { StoryContent } from '../../stories/constants';\nimport { readFile } from 'node:fs/promises';\nimport { CommandError } from '../../../utils';\n\nexport interface RollbackData {\n stories: Array<{\n storyId: number;\n name: string;\n content: StoryContent;\n }>;\n}\n\n/**\n * Save the rollback data for a migration\n * @param options - Options for saving rollback data\n * @param options.space - The space ID\n * @param options.path - Base path for saving rollback data\n * @param options.stories - Array of stories with their original content\n * @param options.migrationFile - Name of the migration file being applied\n */\nexport async function saveRollbackData({\n space,\n path,\n stories,\n migrationFile,\n}: {\n space: string;\n path: string;\n stories: Array<{ id: number; name: string; content: StoryContent }>;\n migrationFile: string;\n}): Promise<void> {\n // Create the rollback data structure\n const rollbackData: RollbackData = {\n stories: stories.map(story => ({\n storyId: story.id,\n name: story.name,\n content: story.content,\n })),\n };\n\n // Resolve the path for rollbacks\n const rollbacksPath = resolvePath(path, `migrations/${space}/rollbacks`);\n\n // The rollback file will have the same name as the migration file but with a timestamp suffix\n const timestamp = Date.now();\n const rollbackFileName = `${migrationFile.replace('.js', '')}.${timestamp}.json`;\n const rollbackFilePath = join(rollbacksPath, rollbackFileName);\n\n try {\n // Save the rollback data as JSON\n await saveToFile(\n rollbackFilePath,\n JSON.stringify(rollbackData, null, 2),\n );\n }\n catch (error) {\n // If the directory doesn't exist, create it and try again\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Create the directory structure\n const fs = await import('node:fs/promises');\n await fs.mkdir(rollbacksPath, { recursive: true });\n\n // Try saving again\n await saveToFile(\n rollbackFilePath,\n JSON.stringify(rollbackData, null, 2),\n );\n }\n else {\n throw error;\n }\n }\n}\n\n/**\n * Read rollback data from a file\n * @param options - Options for reading rollback data\n * @param options.space - The space ID\n * @param options.path - Base path for rollback files\n * @param options.migrationFile - Name of the migration file to rollback\n * @returns The rollback data containing stories to restore\n */\nexport async function readRollbackFile({\n space,\n path,\n migrationFile,\n}: {\n space: string;\n path: string;\n migrationFile: string;\n}): Promise<RollbackData> {\n try {\n const resolvedPath = resolvePath(path, `migrations/${space}/rollbacks`);\n const rollbackFilePath = join(resolvedPath, migrationFile);\n\n // Read the rollback file\n const filePath = rollbackFilePath.endsWith('.json')\n ? rollbackFilePath\n : `${rollbackFilePath}.json`;\n\n return JSON.parse(await readFile(filePath, 'utf-8'));\n }\n catch (error) {\n throw new CommandError(`Failed to read rollback file: ${(error as Error).message}`);\n }\n}\n","import { Spinner } from '@topcli/spinner';\nimport chalk from 'chalk';\nimport { colorPalette } from '../../../constants';\nimport { isVitest, konsola } from '../../../utils';\nimport type { RegionCode } from '../../../constants';\nimport type { StoryContent } from '../../stories/constants';\nimport { applyMigrationToAllBlocks, getMigrationFunction } from './actions';\nimport { getComponentNameFromFilename } from '../../../utils/filesystem';\nimport type { MigrationFile } from './constants';\nimport { hash } from 'ohash';\nimport { saveRollbackData } from '../rollback/actions';\n\n/**\n * Handles the processing of migration files for stories\n * @param options - Options for handling migrations\n * @param options.migrationFiles - Array of migration files to process\n * @param options.stories - Array of stories to apply migrations to\n * @param options.space - Space ID where the stories are located\n * @param options.path - Path to the migrations directory\n * @param options.componentName - Optional component name to filter migrations\n * @param options.password - Optional password for authentication\n * @param options.region - Optional region code for API requests\n * @returns {Promise<{\n * successful: Array<{\n * storyId: number;\n * name: string;\n * migrationName: string;\n * content: StoryContent;\n * }>;\n * failed: Array<{\n * storyId: number;\n * migrationName: string;\n * error: unknown;\n * }>;\n * skipped: Array<{\n * storyId: number;\n * name: string;\n * migrationName: string;\n * reason: string;\n * }>;\n * }>} Object containing arrays of successful, failed, and skipped migrations\n */\nexport async function handleMigrations({\n migrationFiles,\n stories,\n space,\n path,\n componentName,\n}: {\n migrationFiles: MigrationFile[];\n stories: Array<{ id: number; name: string; content?: StoryContent }>;\n space: string;\n path: string;\n componentName?: string;\n password?: string;\n region?: RegionCode;\n}): Promise<{\n successful: Array<{\n storyId: number;\n name: string;\n migrationName: string;\n content: StoryContent;\n }>;\n failed: Array<{ storyId: number; migrationName: string; error: unknown }>;\n skipped: Array<{ storyId: number; name: string; migrationName: string; reason: string }>;\n }> {\n const results = {\n successful: [] as Array<{\n storyId: number;\n name: string;\n migrationName: string;\n content: StoryContent;\n }>,\n failed: [] as Array<{ storyId: number; migrationName: string; error: unknown }>,\n skipped: [] as Array<{ storyId: number; name: string; migrationName: string; reason: string }>,\n };\n\n // Filter migrations based on component name if provided\n const relevantMigrations = componentName\n ? migrationFiles.filter((file) => {\n const targetComponent = getComponentNameFromFilename(file.name);\n return targetComponent.split('.')[0] === componentName;\n })\n : migrationFiles;\n\n // Process each migration file\n for (const migrationFile of relevantMigrations) {\n // Filter out stories without content\n const validStories = stories.filter(story => story.content) as Array<{ id: number; name: string; content: StoryContent }>;\n\n // Skip processing if no valid stories\n if (validStories.length === 0) {\n continue;\n }\n\n // First save all original states of stories before any modification\n // This ensures we have a snapshot before any change is made\n await saveRollbackData({\n space,\n path,\n stories: validStories,\n migrationFile: migrationFile.name,\n });\n\n // Load the migration function using dynamic import\n const migrationFunction = await getMigrationFunction(migrationFile.name, space, path);\n\n if (!migrationFunction) {\n // If migration function fails to load, mark all stories as failed for this migration\n stories.forEach((story) => {\n results.failed.push({\n storyId: story.id,\n migrationName: migrationFile.name,\n error: new Error(`Failed to load migration function from file \"${migrationFile.name}\"`),\n });\n });\n continue;\n }\n\n // Determine the target component from the migration filename if not explicitly provided\n const targetComponent = componentName || getComponentNameFromFilename(migrationFile.name);\n\n // Process each story\n for (const story of stories) {\n if (!story.content) {\n results.failed.push({\n storyId: story.id,\n migrationName: migrationFile.name,\n error: new Error('Story content is missing'),\n });\n continue;\n }\n\n // Create a deep copy of the story content to avoid modifying the original\n const storyContent = structuredClone(story.content) as StoryContent;\n\n // Calculate the original content hash for later comparison\n const originalContentHash = hash(story.content);\n\n try {\n // Apply the migration function to all matching components in the content\n const modified = applyMigrationToAllBlocks(storyContent, migrationFunction, targetComponent);\n\n // Calculate the new content hash\n const newContentHash = hash(storyContent);\n\n // Check if the content was actually modified by comparing hashes\n const contentChanged = originalContentHash !== newContentHash;\n\n if (modified && contentChanged) {\n const spinner = new Spinner({ verbose: !isVitest });\n spinner.start(`Applying migration ${chalk.hex(colorPalette.MIGRATIONS)(migrationFile.name)} to story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}...`);\n spinner.succeed(`Migration ${chalk.hex(colorPalette.MIGRATIONS)(migrationFile.name)} applied to story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())} - Completed in ${spinner.elapsedTime.toFixed(2)}ms`);\n\n // Store the migration that was applied\n results.successful.push({\n storyId: story.id,\n name: story.name,\n migrationName: migrationFile.name,\n content: storyContent,\n });\n }\n else if (modified && !contentChanged) {\n results.skipped.push({\n storyId: story.id,\n name: story.name,\n migrationName: migrationFile.name,\n reason: 'No changes detected after migration',\n });\n }\n else {\n // Get the base component name from the target component\n const baseComponent = targetComponent.split('.')[0];\n // Only add to skipped without logging\n results.skipped.push({\n storyId: story.id,\n name: story.name,\n migrationName: migrationFile.name,\n reason: baseComponent === componentName ? 'No matching components found' : 'Different component target',\n });\n }\n }\n catch (error) {\n const spinner = new Spinner({ verbose: !isVitest });\n spinner.start(`Applying migration ${chalk.hex(colorPalette.MIGRATIONS)(migrationFile.name)} to story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}...`);\n spinner.failed(`Failed to apply migration ${chalk.hex(colorPalette.MIGRATIONS)(migrationFile.name)} to story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}`);\n results.failed.push({\n storyId: story.id,\n migrationName: migrationFile.name,\n error,\n });\n }\n }\n }\n\n return results;\n}\n\n/**\n * Summarizes the results of the migration operations\n * @param results - Object containing migration operation results\n * @param results.successful - Array of successfully applied migrations\n * @param results.failed - Array of failed migrations\n * @param results.skipped - Array of skipped migrations\n */\nexport function summarizeMigrationResults(results: {\n successful: Array<{\n storyId: number;\n name: string;\n migrationName: string;\n content: StoryContent;\n }>;\n failed: Array<{ storyId: number; migrationName: string; error: unknown }>;\n skipped: Array<{ storyId: number; name: string; migrationName: string; reason: string }>;\n}): void {\n const { successful, failed, skipped } = results;\n\n // Count unique stories that were successfully processed\n const successfulStoryIds = new Set(successful.map(result => result.storyId));\n const failedStoryIds = new Set(failed.map(result => result.storyId));\n\n // Count unique migrations that were successfully applied\n const successfulMigrations = new Set(successful.map(result => result.migrationName));\n\n konsola.br();\n konsola.ok(`Successfully applied ${successfulMigrations.size} migrations to ${successfulStoryIds.size} stories`, true);\n\n // Group skipped stories by reason\n const skippedByReason = skipped.reduce((acc, item) => {\n if (!acc[item.reason]) {\n acc[item.reason] = [];\n }\n acc[item.reason].push(item);\n return acc;\n }, {} as Record<string, typeof skipped>);\n\n if (Object.keys(skippedByReason).length > 0) {\n konsola.info(`Skipped migrations:`);\n for (const [reason, items] of Object.entries(skippedByReason)) {\n const uniqueStories = new Set(items.map(item => item.storyId));\n konsola.info(` • ${reason}: ${uniqueStories.size} stories`);\n }\n }\n\n if (failed.length > 0) {\n konsola.warn(`- Failed to apply migrations to ${failedStoryIds.size} stories`, true);\n\n // Group failures by story ID for better reporting\n const failuresByStory = new Map<number, Array<{ migrationName: string; error: unknown }>>();\n\n failed.forEach(({ storyId, migrationName, error }) => {\n if (!failuresByStory.has(storyId)) {\n failuresByStory.set(storyId, []);\n }\n failuresByStory.get(storyId)?.push({ migrationName, error });\n });\n\n // Log failures grouped by story\n failuresByStory.forEach((failures, storyId) => {\n konsola.error(`Story ID ${storyId}:`);\n failures.forEach(({ migrationName, error }) => {\n konsola.error(`- Migration ${migrationName}: ${(error as Error).message}`);\n });\n });\n }\n else {\n konsola.ok(`No failures reported`);\n }\n konsola.br();\n}\n","import type { Story } from './constants';\n\n/**\n * @method isStoryPublishedWithoutChanges\n * @param {object} story\n * @return {boolean}\n */\nexport const isStoryPublishedWithoutChanges = (story: Partial<Story>) => {\n return story.published && !story.unpublished_changes;\n};\n\n/**\n * @method isStoryWithUnpublishedChanges\n * @param {object} story\n * @return {boolean}\n */\nexport const isStoryWithUnpublishedChanges = (story: Partial<Story>) => {\n return story.published && story.unpublished_changes;\n};\n","import { Spinner } from '@topcli/spinner';\nimport { getProgram } from '../../../program';\nimport { colorPalette, commands } from '../../../constants';\nimport { CommandError, handleError, isVitest, konsola } from '../../../utils';\nimport { session } from '../../../session';\nimport type { MigrationsRunOptions } from './constants';\nimport { migrationsCommand } from '../command';\nimport { fetchStoriesByComponent, fetchStory, updateStory } from '../../stories/actions';\nimport { readMigrationFiles } from './actions';\nimport { handleMigrations, summarizeMigrationResults } from './operations';\nimport type { Story, StoryContent } from '../../stories/constants';\nimport chalk from 'chalk';\nimport { isStoryPublishedWithoutChanges, isStoryWithUnpublishedChanges } from '../../stories/utils';\n\nconst program = getProgram();\n\nmigrationsCommand.command('run [componentName]')\n .description('Run migrations')\n .option('--fi, --filter <filter>', 'glob filter to apply to the components before pushing')\n .option('-d, --dry-run', 'Preview changes without applying them to Storyblok')\n .option('-q, --query <query>', 'Filter stories by content attributes using Storyblok filter query syntax. Example: --query=\"[highlighted][in]=true\"')\n .option('--starts-with <path>', 'Filter stories by path. Example: --starts-with=\"/en/blog/\"')\n .option('--publish <publish>', 'Options for publication mode: all | published | published-with-changes')\n .action(async (componentName: string | undefined, options: MigrationsRunOptions) => {\n konsola.title(` ${commands.MIGRATIONS} `, colorPalette.MIGRATIONS, componentName ? `Running migrations for component ${componentName}...` : 'Running migrations...');\n\n // Global options\n const verbose = program.opts().verbose;\n\n const { filter, dryRun = false, query, startsWith, publish } = options;\n\n // Command options\n const { space, path } = migrationsCommand.opts();\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const { password, region } = state;\n\n try {\n const spinner = new Spinner({\n verbose: !isVitest,\n }).start(`Fetching migration files and stories...`);\n\n // Read migration files\n const migrationFiles = await readMigrationFiles({\n space,\n path,\n filter,\n });\n\n if (migrationFiles.length === 0) {\n spinner.failed(`No migration files found for space \"${space}\"${filter ? ` matching filter \"${filter}\"` : ''}.`);\n return;\n }\n\n // Filter migrations based on component name if provided\n const filteredMigrations = componentName\n ? migrationFiles.filter((file) => {\n // Match any migration file that starts with the component name and is followed by either\n // the end of the filename or a dot\n return file.name.match(new RegExp(`^${componentName}(\\\\..*)?\\.js$`));\n })\n : migrationFiles;\n\n if (filteredMigrations.length === 0) {\n spinner.failed(`No migration files found${componentName ? ` for component \"${componentName}\"` : ''}${filter ? ` matching filter \"${filter}\"` : ''} in space \"${space}\".`);\n return;\n }\n\n // Spinner doesn't have update method, so we'll stop and start a new one\n spinner.succeed(`Found ${filteredMigrations.length} migration files.`);\n const storiesSpinner = new Spinner({ verbose: !isVitest }).start(`Fetching stories...`);\n\n // Fetch stories using the base component name\n const stories = await fetchStoriesByComponent(\n {\n spaceId: space,\n token: password,\n region,\n },\n // Filter options\n {\n componentName,\n query,\n starts_with: startsWith,\n },\n );\n\n if (!stories || stories.length === 0) {\n storiesSpinner.failed(`No stories found${componentName ? ` for component \"${componentName}\"` : ''}.`);\n return;\n }\n\n // Fetch full content for each story\n const storiesWithContent = await Promise.all(stories.map(async (story) => {\n const fullStory = await fetchStory(space, password, region, story.id.toString());\n return {\n ...story,\n content: fullStory?.content,\n };\n }));\n\n // Filter out stories with no content\n const validStories = storiesWithContent.filter(story => story.content);\n\n // Build filter message parts\n const filterParts = [];\n if (componentName) {\n filterParts.push(`component \"${componentName}\"`);\n }\n if (startsWith) {\n filterParts.push(chalk.hex(colorPalette.PRIMARY)(`starts_with=${startsWith}`));\n }\n if (query) {\n filterParts.push(chalk.hex(colorPalette.PRIMARY)(`filter_query=${query}`));\n }\n\n // Create filter message\n const filterMessage = filterParts.length > 0\n ? ` (filtered by ${filterParts.join(' and ')})`\n : '';\n\n // Spinner doesn't have update method, so we'll stop and start a new one\n storiesSpinner.succeed(`Fetched ${validStories.length} ${validStories.length === 1 ? 'story' : 'stories'} with related content${filterMessage}.`);\n\n // Process migrations using the new operations module\n const processingSpinner = new Spinner({ verbose: !isVitest }).start(`Processing migrations...`);\n processingSpinner.succeed(`Starting to process ${validStories.length} stories with ${filteredMigrations.length} migrations...`);\n\n const migrationResults = await handleMigrations({\n migrationFiles: filteredMigrations,\n stories: validStories,\n space,\n path,\n componentName,\n password,\n region,\n });\n\n // Summarize the results\n summarizeMigrationResults(migrationResults);\n\n // Update the stories in Storyblok with the modified content\n if (migrationResults.successful.length > 0 && !dryRun) {\n const updateSpinner = new Spinner({ verbose: !isVitest }).start(`Updating stories in Storyblok...`);\n\n // Group successful migrations by story ID to get the latest content for each story\n const storiesByIdMap = new Map<number, { id: number; name: string; content: StoryContent; published?: boolean; published_at?: string; unpublished_changes?: boolean }>();\n\n // Get the latest content for each story (in case multiple migrations were applied)\n migrationResults.successful.forEach((result) => {\n // Find the original story to get its published status\n const originalStory = validStories.find(s => s.id === result.storyId);\n storiesByIdMap.set(result.storyId, {\n id: result.storyId,\n name: result.name,\n content: result.content,\n published: originalStory?.published,\n published_at: originalStory?.published_at || undefined,\n unpublished_changes: originalStory?.unpublished_changes,\n });\n });\n\n const storiesToUpdate = Array.from(storiesByIdMap.values());\n\n if (storiesToUpdate.length === 0) {\n updateSpinner.succeed(`No stories need to be updated in Storyblok.`);\n }\n else {\n updateSpinner.succeed(`Found ${storiesToUpdate.length} stories to update.`);\n\n // Update each story\n let successCount = 0;\n let failCount = 0;\n\n for (const story of storiesToUpdate) {\n const storySpinner = new Spinner({ verbose: !isVitest }).start(`Updating story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}...`);\n const payload: {\n story: Partial<Story>;\n force_update?: string;\n publish?: number;\n } = {\n story: {\n content: story.content,\n id: story.id,\n name: story.name,\n },\n force_update: '1',\n };\n\n // If the story is published and has no unpublished changes, publish it\n if (publish === 'published' && isStoryPublishedWithoutChanges(story)) {\n payload.publish = 1;\n }\n\n // If the story is published and has unpublished changes, publish it\n if (publish === 'published-with-changes' && isStoryWithUnpublishedChanges(story)) {\n payload.publish = 1;\n }\n\n // If the story is not published, publish it\n if (publish === 'all') {\n payload.publish = 1;\n }\n\n try {\n const updatedStory = await updateStory(space, password, region, story.id, payload);\n\n if (updatedStory) {\n successCount++;\n storySpinner.succeed(`Updated story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())} - Completed in ${storySpinner.elapsedTime.toFixed(2)}ms`);\n }\n else {\n failCount++;\n storySpinner.failed(`Failed to update story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}`);\n }\n }\n catch (error) {\n failCount++;\n storySpinner.failed(`Failed to update story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.id.toString())}: ${(error as Error).message}`);\n }\n }\n\n // Show summary\n if (failCount > 0) {\n konsola.warn(`Updated ${successCount} stories successfully, ${failCount} failed.`);\n }\n else if (successCount > 0) {\n konsola.ok(`Successfully updated ${successCount} stories in Storyblok.`, true);\n }\n }\n }\n else if (dryRun) {\n konsola.info(`Dry run mode: No stories were updated in Storyblok.`);\n }\n else if (migrationResults.successful.length === 0) {\n konsola.info(`No stories were modified by the migrations.`);\n }\n }\n catch (error) {\n handleError(error as Error, verbose);\n }\n });\n","import { colorPalette, commands } from '../../../constants';\nimport { CommandError, handleError, konsola } from '../../../utils';\nimport { getProgram } from '../../../program';\nimport { migrationsCommand } from '../command';\nimport { session } from '../../../session';\nimport { readRollbackFile } from './actions';\nimport { updateStory } from '../../stories/actions';\nimport { Spinner } from '@topcli/spinner';\nimport chalk from 'chalk';\n\nconst program = getProgram();\n\nmigrationsCommand.command('rollback [migrationFile]')\n .description('Rollback a migration')\n .action(async (migrationFile: string) => {\n konsola.title(` ${commands.MIGRATIONS} `, colorPalette.MIGRATIONS, `Rolling back migration ${chalk.hex(colorPalette.MIGRATIONS)(migrationFile)}...`);\n\n const verbose = program.opts().verbose;\n\n // Command options\n const { space, path } = migrationsCommand.opts();\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const { password, region } = state;\n\n try {\n // Read the rollback data\n const rollbackData = await readRollbackFile({\n space,\n path,\n migrationFile,\n });\n\n // Restore each story to its original state\n for (const story of rollbackData.stories) {\n const spinner = new Spinner({ verbose }).start(`Restoring story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.storyId)}...`);\n try {\n await updateStory(space, password, region, story.storyId, {\n story: {\n content: story.content,\n id: story.storyId,\n name: story.name,\n },\n force_update: '1',\n });\n spinner.succeed(`Restored story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.storyId)}`);\n }\n catch (error) {\n spinner.failed(`Failed to restore story ${chalk.hex(colorPalette.PRIMARY)(story.name || story.storyId)}: ${(error as Error).message}`);\n }\n }\n }\n catch (error) {\n handleError(new CommandError(`Failed to rollback migration: ${(error as Error).message}`), verbose);\n }\n });\n","import { getProgram } from '../../program';\n\nconst program = getProgram(); // Get the shared singleton instance\n\n// Components root command\nexport const typesCommand = program\n .command('types')\n .alias('ts')\n .description(`Generate types d.ts for your component schemas`)\n .option('-s, --space <space>', 'space ID')\n .option('-p, --path <path>', 'path to save the file. Default is .storyblok/types');\n","import type { JSONSchema } from 'json-schema-to-typescript';\nimport type { StoryblokPropertyType } from '../types/storyblok';\n\nexport const getAssetJSONSchema = (title: string): JSONSchema => ({\n $id: '#/asset',\n title,\n type: 'object',\n required: ['id', 'fieldtype', 'filename', 'name', 'title', 'focus', 'alt'],\n properties: {\n alt: {\n type: ['string', 'null'],\n },\n copyright: {\n type: ['string', 'null'],\n },\n fieldtype: {\n type: 'string',\n enum: ['asset'],\n },\n id: {\n type: 'number',\n },\n filename: {\n type: ['string', 'null'],\n },\n name: {\n type: 'string',\n },\n title: {\n type: ['string', 'null'],\n },\n focus: {\n type: ['string', 'null'],\n },\n meta_data: {\n type: 'object',\n },\n source: {\n type: ['string', 'null'],\n },\n is_external_url: {\n type: 'boolean',\n },\n is_private: {\n type: 'boolean',\n },\n src: {\n type: 'string',\n },\n updated_at: {\n type: 'string',\n },\n // Cloudinary integration keys\n width: {\n type: ['number', 'null'],\n },\n height: {\n type: ['number', 'null'],\n },\n aspect_ratio: {\n type: ['number', 'null'],\n },\n public_id: {\n type: ['string', 'null'],\n },\n content_type: {\n type: 'string',\n },\n },\n});\n\nexport const getMultiassetJSONSchema = (title: string): JSONSchema => ({\n $id: '#/multiasset',\n title,\n type: 'array',\n items: {\n type: 'object',\n required: ['id', 'fieldtype', 'filename', 'name', 'title', 'focus', 'alt'],\n properties: {\n alt: {\n type: ['string', 'null'],\n },\n copyright: {\n type: ['string', 'null'],\n },\n fieldtype: {\n type: 'string',\n enum: ['asset'],\n },\n id: {\n type: 'number',\n },\n filename: {\n type: ['string', 'null'],\n },\n name: {\n type: 'string',\n },\n title: {\n type: ['string', 'null'],\n },\n focus: {\n type: ['string', 'null'],\n },\n meta_data: {\n type: 'object',\n },\n source: {\n type: ['string', 'null'],\n },\n is_external_url: {\n type: 'boolean',\n },\n is_private: {\n type: 'boolean',\n },\n src: {\n type: 'string',\n },\n updated_at: {\n type: 'string',\n },\n // Cloudinary integration keys\n width: {\n type: ['number', 'null'],\n },\n height: {\n type: ['number', 'null'],\n },\n aspect_ratio: {\n type: ['number', 'null'],\n },\n public_id: {\n type: ['string', 'null'],\n },\n content_type: {\n type: 'string',\n },\n },\n },\n});\n\n// TODO: find a reliable way to share props among different Link Types to increase maintainability\n// Currently not possible because of JSONSchema4 complaining\nconst multilinkSharedRequiredProps = ['fieldtype', 'id', 'url', 'cached_url', 'linktype'];\n\nexport const getMultilinkJSONSchema = (title: string): JSONSchema => ({\n $id: '#/multilink',\n title,\n oneOf: [\n {\n type: 'object',\n required: multilinkSharedRequiredProps,\n properties: {\n // Shared props\n fieldtype: {\n type: 'string',\n enum: ['multilink'],\n },\n id: { type: 'string' },\n url: { type: 'string' },\n cached_url: { type: 'string' },\n target: { type: 'string', enum: ['_blank', '_self'] },\n // Custom props\n anchor: {\n type: 'string',\n },\n rel: {\n type: 'string',\n },\n title: {\n type: 'string',\n },\n prep: {\n type: 'string',\n },\n linktype: {\n type: 'string',\n enum: ['story'],\n },\n story: {\n type: 'object',\n required: ['name', 'id', 'uuid', 'slug', 'full_slug'],\n properties: {\n name: {\n type: 'string',\n },\n created_at: {\n type: 'string',\n format: 'date-time',\n },\n published_at: {\n type: 'string',\n format: 'date-time',\n },\n id: {\n type: 'integer',\n },\n uuid: {\n type: 'string',\n format: 'uuid',\n },\n content: {\n type: 'object',\n },\n slug: {\n type: 'string',\n },\n full_slug: {\n type: 'string',\n },\n sort_by_date: {\n type: ['null', 'string'],\n format: 'date-time',\n },\n position: {\n type: 'integer',\n },\n tag_list: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n is_startpage: {\n type: 'boolean',\n },\n parent_id: {\n type: ['null', 'integer'],\n },\n meta_data: {\n type: ['null', 'object'],\n },\n group_id: {\n type: 'string',\n format: 'uuid',\n },\n first_published_at: {\n type: 'string',\n format: 'date-time',\n },\n release_id: {\n type: ['null', 'integer'],\n },\n lang: {\n type: 'string',\n },\n path: {\n type: ['null', 'string'],\n },\n alternates: {\n type: 'array',\n },\n default_full_slug: {\n type: ['null', 'string'],\n },\n translated_slugs: {\n type: ['null', 'array'],\n },\n },\n },\n },\n },\n {\n type: 'object',\n required: multilinkSharedRequiredProps,\n properties: {\n // Shared props\n fieldtype: {\n type: 'string',\n enum: ['multilink'],\n },\n id: { type: 'string' },\n url: { type: 'string' },\n cached_url: { type: 'string' },\n target: { type: 'string', enum: ['_blank', '_self'] },\n // Custom props\n linktype: {\n type: 'string',\n enum: ['url'],\n },\n rel: {\n type: 'string',\n },\n title: {\n type: 'string',\n },\n },\n },\n {\n type: 'object',\n required: multilinkSharedRequiredProps,\n properties: {\n // Shared props\n fieldtype: {\n type: 'string',\n enum: ['multilink'],\n },\n id: { type: 'string' },\n url: { type: 'string' },\n cached_url: { type: 'string' },\n target: { type: 'string', enum: ['_blank', '_self'] },\n // Custom props\n email: {\n type: 'string',\n },\n linktype: {\n type: 'string',\n enum: ['email'],\n },\n },\n },\n {\n type: 'object',\n required: multilinkSharedRequiredProps,\n properties: {\n // Shared props\n fieldtype: {\n type: 'string',\n enum: ['multilink'],\n },\n id: { type: 'string' },\n url: { type: 'string' },\n cached_url: { type: 'string' },\n target: { type: 'string', enum: ['_blank', '_self'] },\n // Custom props\n linktype: {\n type: 'string',\n enum: ['asset'],\n },\n },\n },\n ],\n});\n\nexport const getRichtextJSONSchema = (title: string): JSONSchema => ({\n $id: '#/richtext',\n title,\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n type: 'string',\n },\n content: {\n type: 'array',\n items: {\n $ref: '#',\n },\n },\n marks: {\n type: 'array',\n items: {\n $ref: '#',\n },\n },\n attrs: {},\n text: {\n type: 'string',\n },\n },\n});\n\nexport const getTableJSONSchema = (title: string): JSONSchema => ({\n $id: '#/table',\n title,\n type: 'object',\n required: ['tbody', 'thead'],\n properties: {\n thead: {\n type: 'array',\n items: {\n type: 'object',\n required: ['_uid', 'component'],\n properties: {\n _uid: {\n type: 'string',\n },\n value: {\n type: 'string',\n },\n component: {\n type: 'number',\n },\n },\n },\n },\n tbody: {\n type: 'array',\n items: {\n type: 'object',\n required: ['_uid', 'component', 'body'],\n properties: {\n _uid: {\n type: 'string',\n },\n body: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n _uid: {\n type: 'string',\n },\n value: {\n type: 'string',\n },\n component: {\n type: 'number',\n },\n },\n },\n },\n component: {\n type: 'number',\n },\n },\n },\n },\n },\n});\n\nexport const storyblokSchemas = new Map<StoryblokPropertyType, JSONSchema>([\n ['asset', getAssetJSONSchema],\n ['multiasset', getMultiassetJSONSchema],\n ['multilink', getMultilinkJSONSchema],\n ['table', getTableJSONSchema],\n ['richtext', getRichtextJSONSchema],\n]);\n","import { compile, type JSONSchema } from 'json-schema-to-typescript';\nimport type { SpaceComponent, SpaceData } from '../../../commands/components/constants';\nimport { handleError, handleFileSystemError, toCamelCase, toPascalCase } from '../../../utils';\nimport type { GenerateTypesOptions } from './constants';\nimport type { StoryblokPropertyType } from '../../../types/storyblok';\nimport { storyblokSchemas } from '../../../utils/storyblok-schemas';\nimport { join, resolve } from 'node:path';\nimport { resolvePath, saveToFile } from '../../../utils/filesystem';\nimport { readFileSync } from 'node:fs';\nimport type { ComponentPropertySchema } from '../../../types/schemas';\n\nexport interface ComponentGroupsAndNamesObject {\n componentGroups: Map<string, Set<string>>;\n componentNames: Set<string>;\n}\n\n// Constants\nconst DEFAULT_TYPEDEFS_HEADER = [\n '// This file was generated by the storyblok CLI.',\n '// DO NOT MODIFY THIS FILE BY HAND.',\n];\n\nconst getPropertyTypeAnnotation = (property: ComponentPropertySchema) => {\n // If a property type is one of the ones provided by Storyblok, return that type\n // Casting as string[] to avoid TS error on using Array.includes on different narrowed types\n if (Array.from(storyblokSchemas.keys()).includes(property.type as StoryblokPropertyType)) {\n return { type: property.type };\n }\n\n // Initialize property type as any (fallback type)\n // const type: string | string[] = 'any';\n\n const options = property.options && property.options.length > 0 ? property.options.map((item: { value: string }) => item.value) : [];\n\n // Add empty option to options array\n if (options.length > 0 && property.exclude_empty_option !== true) {\n options.unshift('');\n }\n\n switch (property.type) {\n case 'bloks':\n return { type: 'array' };\n case 'boolean':\n return { type: 'boolean' };\n case 'datetime':\n case 'image':\n case 'markdown':\n case 'number':\n case 'text':\n case 'textarea':\n return { type: 'string' };\n default:\n return { type: 'any' };\n }\n};\n\n/**\n * Generates a TypeScript type name for a component\n * @param componentName - The name of the component\n * @param options - Options for generating the type name\n * @returns The generated type name\n *\n * The type name can be customized with the following options:\n * - typePrefix: Prefix to be prepended to all generated component type names (can be set via --type-prefix flag)\n */\nexport const getComponentType = (\n componentName: string,\n options: GenerateTypesOptions,\n): string => {\n const prefix = options.typePrefix ?? '';\n\n // Sanitize the component name to handle special characters and emojis\n const sanitizedName = componentName\n // Replace any character that's not a letter or number with an underscore\n .replace(/[^a-z0-9]/gi, '_')\n // Replace multiple consecutive underscores with a single underscore\n .replace(/_+/g, '_')\n // Trim underscores from the beginning and end\n .replace(/^_+|_+$/g, '');\n\n // Convert to PascalCase\n const componentType = toPascalCase(toCamelCase(`${prefix}_${sanitizedName}`));\n\n // If the component type starts with a number, prefix it with an underscore\n const isFirstCharacterNumber = !Number.isNaN(Number.parseInt(componentType.charAt(0)));\n return isFirstCharacterNumber ? `_${componentType}` : componentType;\n};\n\nconst getComponentPropertiesTypeAnnotations = async (\n component: SpaceComponent,\n options: GenerateTypesOptions,\n spaceData: SpaceData,\n customFieldsParser?: (key: string, value: Record<string, unknown>) => Record<string, unknown>,\n): Promise<JSONSchema['properties']> => {\n return Object.entries<Record<string, any>>(component.schema).reduce(async (accPromise, [key, value]) => {\n const acc = await accPromise;\n\n // Skip tabbed properties\n if (key.startsWith('tab-')) {\n return acc;\n }\n\n const propertyType = value.type;\n const propertyTypeAnnotation: JSONSchema = {\n [key]: getPropertyTypeAnnotation(value as ComponentPropertySchema),\n };\n\n if (propertyType === 'custom' && customFieldsParser) {\n const customField = typeof customFieldsParser === 'function' ? customFieldsParser(key, value) : {};\n return {\n ...acc,\n ...customField,\n };\n }\n\n if (Array.from(storyblokSchemas.keys()).includes(propertyType as StoryblokPropertyType)) {\n // For Storyblok property types, don't apply the prefix\n const componentType = toPascalCase(toCamelCase(propertyType));\n propertyTypeAnnotation[key].tsType = `Storyblok${componentType}`;\n }\n\n if (propertyType === 'multilink') {\n const excludedLinktypes: string[] = [\n ...(!value.email_link_type ? ['{ linktype?: \"email\" }'] : []),\n ...(!value.asset_link_type ? ['{ linktype?: \"asset\" }'] : []),\n ];\n const componentType = toPascalCase(toCamelCase(propertyType));\n propertyTypeAnnotation[key].tsType\n = excludedLinktypes.length > 0 ? `Exclude<Storyblok${componentType}, ${excludedLinktypes.join(' | ')}>` : componentType;\n }\n\n if (propertyType === 'bloks') {\n if (value.restrict_components) {\n // Components restricted by groups\n if (value.restrict_type === 'groups') {\n if (\n Array.isArray(value.component_group_whitelist)\n && value.component_group_whitelist.length > 0\n ) {\n // Find components that belong to the whitelisted groups\n const componentsInGroupWhitelist = value.component_group_whitelist.reduce(\n (components: string[], groupUUID: string) => {\n // Find components that have this group UUID\n const componentsInGroup = spaceData.components.filter(\n component => component.component_group_uuid === groupUUID,\n );\n\n return componentsInGroup.length > 0\n ? [\n ...components,\n ...componentsInGroup.map(component => getComponentType(component.name, options)),\n ]\n : components;\n },\n [],\n );\n\n propertyTypeAnnotation[key].tsType\n = componentsInGroupWhitelist.length > 0 ? `(${componentsInGroupWhitelist.join(' | ')})[]` : `never[]`;\n }\n }\n else {\n // Components restricted by 1-by-1 list\n if (Array.isArray(value.component_whitelist) && value.component_whitelist.length > 0) {\n propertyTypeAnnotation[key].tsType = `(${value.component_whitelist\n .map((name: string) => getComponentType(name, options))\n .join(' | ')})[]`;\n }\n }\n }\n else {\n // All components can be slotted in this property (AKA no restrictions)\n // Add null check to ensure spaceData.components is defined\n if (spaceData && Array.isArray(spaceData.components)) {\n propertyTypeAnnotation[key].tsType = `(${spaceData.components\n .map(component => getComponentType(component.name, options))\n .join(' | ')})[]`;\n }\n else {\n // Fallback to never[] if components is undefined\n propertyTypeAnnotation[key].tsType = `never[]`;\n }\n }\n }\n\n return { ...acc, ...propertyTypeAnnotation };\n }, Promise.resolve({} as JSONSchema));\n};\n\nconst loadCustomFieldsParser = async (path: string) => {\n try {\n const customFieldsParser = await import(resolve(path));\n return customFieldsParser.default;\n }\n catch (error) {\n handleError(error as Error);\n return null;\n }\n};\n\nasync function loadCompilerOptions(path: string) {\n if (path) {\n const compilerOptions = await import(resolve(path));\n return compilerOptions.default;\n }\n return {};\n}\n\nexport const generateTypes = async (\n spaceData: SpaceData,\n options: GenerateTypesOptions = {\n strict: false,\n },\n) => {\n try {\n const typeDefs = [...DEFAULT_TYPEDEFS_HEADER];\n const storyblokPropertyTypes = new Set<string>();\n let customFieldsParser: Record<string, unknown> | undefined;\n let compilerOptions: Record<string, unknown> | undefined;\n // Custom fields parser\n if (options.customFieldsParser) {\n customFieldsParser = await loadCustomFieldsParser(options.customFieldsParser);\n }\n\n // Compiler options\n if (options.compilerOptions) {\n compilerOptions = await loadCompilerOptions(options.compilerOptions);\n }\n\n const schemas = await Promise.all(spaceData.components.map(async (component) => {\n // Get the component type name with proper handling of numbers at the start\n const type = getComponentType(component.name, options);\n const componentPropertiesTypeAnnotations = await getComponentPropertiesTypeAnnotations(component, options, spaceData, customFieldsParser);\n const requiredFields = Object.entries<Record<string, any>>(component.schema).reduce(\n (acc, [key, value]) => {\n if (value.required) {\n return [...acc, key];\n }\n return acc;\n },\n ['component', '_uid'],\n );\n\n // Check if any property has a type that's in storyblokSchemas.keys()\n if (componentPropertiesTypeAnnotations) {\n Object.entries(componentPropertiesTypeAnnotations).forEach(([_, property]) => {\n if (property.type && Array.from(storyblokSchemas.keys()).includes(property.type as StoryblokPropertyType)) {\n storyblokPropertyTypes.add(property.type as StoryblokPropertyType);\n }\n });\n }\n\n const componentSchema: JSONSchema = {\n $id: `#/${component.name}`,\n title: type, // This is the key - we're using the properly formatted type name\n type: 'object',\n required: requiredFields,\n properties: {\n ...componentPropertiesTypeAnnotations,\n component: {\n type: 'string',\n enum: [component.name],\n },\n _uid: {\n type: 'string',\n },\n },\n };\n\n return componentSchema;\n }));\n\n const result = await Promise.all(schemas.map(async (schema) => {\n // Use the title as the interface name\n return await compile(schema, schema.title || schema.$id.replace('#/', ''), {\n additionalProperties: !options.strict,\n bannerComment: '',\n ...compilerOptions,\n });\n }));\n\n // Add imports for Storyblok types if needed\n const imports: string[] = [];\n if (storyblokPropertyTypes.size > 0) {\n const typeImports = Array.from(storyblokPropertyTypes).map((type) => {\n const pascalType = toPascalCase(type);\n return `Storyblok${pascalType}`;\n });\n\n imports.push(`import type { ${typeImports.join(', ')} } from '../storyblok.d.ts';`);\n }\n\n const finalTypeDef = [...typeDefs, ...imports, ...result];\n\n return [\n ...finalTypeDef,\n ].join('\\n');\n }\n catch (error) {\n handleError(error as Error);\n }\n};\n\nexport const saveTypesToFile = async (space: string, typedefString: string, options: SaveTypesOptions) => {\n const { filename = 'storyblok-components', path } = options;\n // Ensure we always include the components/space folder structure regardless of custom path\n const resolvedPath = path\n ? resolve(process.cwd(), path, 'types', space)\n : resolvePath(path, `types/${space}`);\n\n try {\n await saveToFile(join(resolvedPath, `${filename}.d.ts`), typedefString);\n }\n catch (error) {\n handleFileSystemError('write', error as Error);\n }\n};\n\n// Add SaveTypesOptions interface\nexport interface SaveTypesOptions {\n filename?: string;\n path?: string;\n}\n\n/**\n * Generates a d.ts file with the Storyblok type definitions\n * @param options - Options for generating the types\n * @returns Promise that resolves when the file is saved\n */\nexport const generateStoryblokTypes = async (options: SaveTypesOptions = {}) => {\n const { filename = 'storyblok', path } = options;\n\n try {\n // Get the path to the storyblok.ts file\n const storyblokTypesPath = resolve(process.cwd(), 'src', 'types', 'storyblok.ts');\n\n // Read the content of the storyblok.ts file\n const storyblokTypesContent = readFileSync(storyblokTypesPath, 'utf-8');\n\n // Extract the type definitions using a more robust approach\n const lines = storyblokTypesContent.split('\\n');\n const typeDefinitions: string[] = [];\n let isCollecting = false;\n let bracketCount = 0;\n let currentType = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Check if this line starts a type definition\n if (line.includes('export type StoryblokPropertyType')\n || line.includes('export interface Storyblok')) {\n // If we were already collecting a type, add it to our results\n if (isCollecting) {\n typeDefinitions.push('');\n }\n\n isCollecting = true;\n typeDefinitions.push(line);\n currentType = line.includes('type') ? 'type' : 'interface';\n\n // Count opening and closing braces to handle nested structures\n bracketCount += (line.match(/\\{/g) || []).length;\n bracketCount -= (line.match(/\\}/g) || []).length;\n\n // For types, we don't need to collect more lines\n if (currentType === 'type') {\n isCollecting = false;\n continue;\n }\n\n // For interfaces, continue collecting lines until we've matched all braces\n let j = i + 1;\n while (j < lines.length && bracketCount > 0) {\n const nextLine = lines[j];\n bracketCount += (nextLine.match(/\\{/g) || []).length;\n bracketCount -= (nextLine.match(/\\}/g) || []).length;\n typeDefinitions.push(nextLine);\n j++;\n }\n\n // Skip the lines we've already processed\n i = j - 1;\n isCollecting = false;\n }\n }\n\n // Define the content of the d.ts file\n const typeDefs = [\n '// This file was generated by the storyblok CLI.',\n '// DO NOT MODIFY THIS FILE BY HAND.',\n '',\n ...typeDefinitions,\n ].join('\\n');\n\n // Determine the path to save the file\n const resolvedPath = path\n ? resolve(process.cwd(), path, 'types')\n : resolvePath(path, 'types');\n\n await saveToFile(join(resolvedPath, `${filename}.d.ts`), typeDefs);\n return true;\n }\n catch (error) {\n handleFileSystemError('read', error as Error);\n return false;\n }\n};\n","import { colorPalette, commands } from '../../../constants';\nimport { CommandError, handleError, isVitest, konsola } from '../../../utils';\nimport { getProgram } from '../../../program';\nimport { session } from '../../../session';\nimport { Spinner } from '@topcli/spinner';\nimport { readComponentsFiles } from '../../components/push/actions';\nimport type { GenerateTypesOptions } from './constants';\nimport type { ReadComponentsOptions } from '../../components/push/constants';\nimport { typesCommand } from '../command';\nimport { generateStoryblokTypes, generateTypes, saveTypesToFile } from './actions';\n\nconst program = getProgram();\n\ntypesCommand\n .command('generate')\n .description('Generate types d.ts for your component schemas')\n .option('--sf, --separate-files', '')\n .option('--strict', 'strict mode, no loose typing')\n .option('--type-prefix <prefix>', 'prefix to be prepended to all generated component type names')\n .option('--suffix <suffix>', 'Components suffix')\n .option('--custom-fields-parser <path>', 'Path to the parser file for Custom Field Types')\n .option('--compiler-options <options>', 'path to the compiler options from json-schema-to-typescript')\n .action(async (options: GenerateTypesOptions) => {\n konsola.title(` ${commands.TYPES} `, colorPalette.TYPES, 'Generating types...');\n // Global options\n const verbose = program.opts().verbose;\n\n // Command options\n const { space, path } = typesCommand.opts();\n\n const { state, initializeSession } = session();\n await initializeSession();\n\n if (!state.isLoggedIn || !state.password || !state.region) {\n handleError(new CommandError(`You are currently not logged in. Please login first to get your user info.`), verbose);\n return;\n }\n if (!space) {\n handleError(new CommandError(`Please provide the space as argument --space YOUR_SPACE_ID.`), verbose);\n return;\n }\n\n const spinner = new Spinner({\n verbose: !isVitest,\n });\n\n try {\n spinner.start(`Generating types...`);\n const spaceData = await readComponentsFiles({\n ...options as ReadComponentsOptions,\n from: space,\n path,\n });\n\n await generateStoryblokTypes({\n filename: options.filename,\n path: options.path,\n });\n\n const typedefString = await generateTypes(spaceData, options);\n\n if (typedefString) {\n await saveTypesToFile(space, typedefString, options);\n }\n\n spinner.succeed();\n konsola.ok(`Successfully generated types for space ${space}`, true);\n konsola.br();\n }\n catch (error) {\n spinner.failed(`Failed to generate types for space ${space}`);\n konsola.br();\n handleError(error as Error, verbose);\n }\n });\n","#!/usr/bin/env node\nimport dotenv from 'dotenv';\n\nimport { handleError, konsola } from './utils';\nimport { getProgram } from './program';\nimport './commands/login';\nimport './commands/logout';\nimport './commands/user';\nimport './commands/components';\nimport './commands/languages';\nimport './commands/migrations';\nimport './commands/types';\nimport pkg from '../package.json';\n\nimport { colorPalette } from './constants';\n\nexport * from './types/storyblok';\n\ndotenv.config(); // This will load variables from .env into process.env\nconst program = getProgram();\n\nkonsola.br();\nkonsola.br();\nkonsola.title(` Storyblok CLI `, colorPalette.PRIMARY);\n\nprogram.option('--verbose', 'Enable verbose output');\nprogram.version(pkg.version, '-v, --vers', 'Output the current version');\nprogram.helpOption('-h, --help', 'Display help for command');\n\nprogram.on('command:*', () => {\n console.error(`Invalid command: ${program.args.join(' ')}`);\n konsola.br();\n program.help();\n});\n\ntry {\n program.parse(process.argv);\n}\ncatch (error) {\n handleError(error as Error);\n}\n"],"names":["readFileImpl","program","region","readFile","component"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "storyblok",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.0.0-beta.
|
|
4
|
+
"version": "4.0.0-beta.2",
|
|
5
5
|
"packageManager": "pnpm@10.10.0",
|
|
6
6
|
"description": "Storyblok CLI",
|
|
7
7
|
"author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
|
|
@@ -25,9 +25,8 @@
|
|
|
25
25
|
],
|
|
26
26
|
"scripts": {
|
|
27
27
|
"build": "unbuild",
|
|
28
|
-
"build:stub": "unbuild --stub",
|
|
29
28
|
"release": "release-it",
|
|
30
|
-
"dev": "pnpm run build
|
|
29
|
+
"dev": "pnpm run build && node dist/index.mjs",
|
|
31
30
|
"lint": "eslint .",
|
|
32
31
|
"lint:fix": "eslint . --fix",
|
|
33
32
|
"test": "vitest",
|
|
@@ -44,13 +43,14 @@
|
|
|
44
43
|
"json-schema-to-typescript": "^15.0.4",
|
|
45
44
|
"ohash": "^2.0.11",
|
|
46
45
|
"pathe": "^2.0.3",
|
|
47
|
-
"
|
|
46
|
+
"read-package-up": "^11.0.0",
|
|
47
|
+
"storyblok-js-client": "^6.10.12"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@release-it/conventional-changelog": "10.0.0",
|
|
51
51
|
"@storyblok/eslint-config": "^0.3.0",
|
|
52
52
|
"@types/inquirer": "^9.0.8",
|
|
53
|
-
"@types/node": "^22.15.
|
|
53
|
+
"@types/node": "^22.15.18",
|
|
54
54
|
"@vitest/coverage-v8": "^3.1.3",
|
|
55
55
|
"@vitest/ui": "^3.1.3",
|
|
56
56
|
"eslint": "^9.26.0",
|