@uniformdev/transformer 1.1.12 → 1.1.13

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/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/cli/index.ts
4
- import { Command as Command11 } from "commander";
4
+ import { Command as Command13 } from "commander";
5
5
 
6
6
  // src/cli/commands/propagate-root-component-property.ts
7
7
  import { Command } from "commander";
@@ -4050,10 +4050,548 @@ function createConvertCompositionsToEntriesCommand() {
4050
4050
  return command;
4051
4051
  }
4052
4052
 
4053
+ // src/cli/commands/remove-parameter.ts
4054
+ import { Command as Command11 } from "commander";
4055
+
4056
+ // src/core/services/parameter-remover.service.ts
4057
+ var ParameterRemoverService = class {
4058
+ constructor(fileSystem, componentService, logger) {
4059
+ this.fileSystem = fileSystem;
4060
+ this.componentService = componentService;
4061
+ this.logger = logger;
4062
+ }
4063
+ compareIds(id1, id2, strict) {
4064
+ if (strict) {
4065
+ return id1 === id2;
4066
+ }
4067
+ return id1.toLowerCase() === id2.toLowerCase();
4068
+ }
4069
+ async remove(options) {
4070
+ const {
4071
+ rootDir,
4072
+ componentsDir,
4073
+ compositionsDir,
4074
+ compositionPatternsDir,
4075
+ componentPatternsDir,
4076
+ componentType,
4077
+ parameterId,
4078
+ whatIf,
4079
+ strict
4080
+ } = options;
4081
+ const findOptions = { strict };
4082
+ const fullComponentsDir = this.fileSystem.resolvePath(rootDir, componentsDir);
4083
+ const fullCompositionsDir = this.fileSystem.resolvePath(rootDir, compositionsDir);
4084
+ const fullCompositionPatternsDir = this.fileSystem.resolvePath(rootDir, compositionPatternsDir);
4085
+ const fullComponentPatternsDir = this.fileSystem.resolvePath(rootDir, componentPatternsDir);
4086
+ this.logger.info(`Loading component: ${componentType}`);
4087
+ const { component, filePath: componentFilePath } = await this.componentService.loadComponent(fullComponentsDir, componentType, findOptions);
4088
+ const param = this.componentService.findParameter(component, parameterId, findOptions);
4089
+ if (!param) {
4090
+ throw new PropertyNotFoundError(parameterId, componentType);
4091
+ }
4092
+ this.logger.action(
4093
+ whatIf,
4094
+ "REMOVE",
4095
+ `Parameter "${parameterId}" from component/${this.fileSystem.getBasename(componentFilePath)}`
4096
+ );
4097
+ let modifiedComponent = this.componentService.removeParameter(component, parameterId, findOptions);
4098
+ const beforeGroupCount = modifiedComponent.parameters?.filter(
4099
+ (p) => this.componentService.isGroupParameter(p)
4100
+ ).length ?? 0;
4101
+ modifiedComponent = this.componentService.removeEmptyGroups(modifiedComponent);
4102
+ const afterGroupCount = modifiedComponent.parameters?.filter(
4103
+ (p) => this.componentService.isGroupParameter(p)
4104
+ ).length ?? 0;
4105
+ if (afterGroupCount < beforeGroupCount) {
4106
+ const removedCount = beforeGroupCount - afterGroupCount;
4107
+ this.logger.action(
4108
+ whatIf,
4109
+ "REMOVE",
4110
+ `${removedCount} empty group(s) from component/${this.fileSystem.getBasename(componentFilePath)}`
4111
+ );
4112
+ }
4113
+ if (!whatIf) {
4114
+ await this.componentService.saveComponent(componentFilePath, modifiedComponent);
4115
+ }
4116
+ const compositionsResult = await this.removeParameterInDirectory(
4117
+ fullCompositionsDir,
4118
+ componentType,
4119
+ parameterId,
4120
+ whatIf,
4121
+ strict,
4122
+ "composition"
4123
+ );
4124
+ const compositionPatternsResult = await this.removeParameterInDirectory(
4125
+ fullCompositionPatternsDir,
4126
+ componentType,
4127
+ parameterId,
4128
+ whatIf,
4129
+ strict,
4130
+ "compositionPattern"
4131
+ );
4132
+ const componentPatternsResult = await this.removeParameterInDirectory(
4133
+ fullComponentPatternsDir,
4134
+ componentType,
4135
+ parameterId,
4136
+ whatIf,
4137
+ strict,
4138
+ "componentPattern"
4139
+ );
4140
+ const totalFiles = compositionsResult.filesModified + compositionPatternsResult.filesModified + componentPatternsResult.filesModified;
4141
+ const totalInstances = compositionsResult.instancesUpdated + compositionPatternsResult.instancesUpdated + componentPatternsResult.instancesUpdated;
4142
+ this.logger.info("");
4143
+ this.logger.info(
4144
+ `Summary: 1 component definition updated, ${totalFiles} file(s) (${totalInstances} instance(s)) updated.`
4145
+ );
4146
+ return {
4147
+ componentDefinitionUpdated: true,
4148
+ compositionsModified: compositionsResult.filesModified,
4149
+ compositionPatternsModified: compositionPatternsResult.filesModified,
4150
+ componentPatternsModified: componentPatternsResult.filesModified,
4151
+ instancesUpdated: totalInstances
4152
+ };
4153
+ }
4154
+ async removeParameterInDirectory(directory, componentType, parameterId, whatIf, strict, label) {
4155
+ let files;
4156
+ try {
4157
+ files = await this.fileSystem.findFiles(directory, "**/*.{json,yaml,yml}");
4158
+ } catch {
4159
+ return { filesModified: 0, instancesUpdated: 0 };
4160
+ }
4161
+ if (files.length === 0) {
4162
+ return { filesModified: 0, instancesUpdated: 0 };
4163
+ }
4164
+ let filesModified = 0;
4165
+ let instancesUpdated = 0;
4166
+ for (const filePath of files) {
4167
+ let composition;
4168
+ try {
4169
+ composition = await this.fileSystem.readFile(filePath);
4170
+ } catch {
4171
+ continue;
4172
+ }
4173
+ if (!composition?.composition) {
4174
+ continue;
4175
+ }
4176
+ const count = this.removeParameterFromTree(
4177
+ composition.composition,
4178
+ componentType,
4179
+ parameterId,
4180
+ strict
4181
+ );
4182
+ const overridesCount = this.removeParameterFromOverrides(
4183
+ composition,
4184
+ componentType,
4185
+ parameterId,
4186
+ strict
4187
+ );
4188
+ const totalCount = count + overridesCount;
4189
+ if (totalCount > 0) {
4190
+ const relativePath = filePath.replace(directory, "").replace(/^[/\\]/, "");
4191
+ this.logger.action(
4192
+ whatIf,
4193
+ "UPDATE",
4194
+ `${label}/${relativePath} (${totalCount} instance(s) of ${componentType})`
4195
+ );
4196
+ if (!whatIf) {
4197
+ await this.fileSystem.writeFile(filePath, composition);
4198
+ }
4199
+ filesModified++;
4200
+ instancesUpdated += totalCount;
4201
+ }
4202
+ }
4203
+ return { filesModified, instancesUpdated };
4204
+ }
4205
+ removeParameterFromTree(node, componentType, parameterId, strict) {
4206
+ let count = 0;
4207
+ if (this.compareIds(node.type, componentType, strict) && node.parameters) {
4208
+ const removed = this.removeKeyFromMap(node.parameters, parameterId, strict);
4209
+ if (removed) {
4210
+ count++;
4211
+ }
4212
+ }
4213
+ if (node.slots) {
4214
+ for (const slotInstances of Object.values(node.slots)) {
4215
+ if (!Array.isArray(slotInstances)) continue;
4216
+ for (const instance of slotInstances) {
4217
+ count += this.removeParameterFromTree(instance, componentType, parameterId, strict);
4218
+ }
4219
+ }
4220
+ }
4221
+ return count;
4222
+ }
4223
+ removeParameterFromOverrides(composition, componentType, parameterId, strict) {
4224
+ if (!composition.composition._overrides) {
4225
+ return 0;
4226
+ }
4227
+ let count = 0;
4228
+ if (this.compareIds(composition.composition.type, componentType, strict)) {
4229
+ const rootId = composition.composition._id;
4230
+ const rootOverrides = composition.composition._overrides[rootId];
4231
+ if (rootOverrides?.parameters) {
4232
+ const removed = this.removeKeyFromMap(rootOverrides.parameters, parameterId, strict);
4233
+ if (removed) {
4234
+ count++;
4235
+ }
4236
+ }
4237
+ }
4238
+ const counter = { count: 0 };
4239
+ this.removeOverridesForMatchingInstances(
4240
+ composition.composition,
4241
+ composition.composition._overrides,
4242
+ componentType,
4243
+ parameterId,
4244
+ strict,
4245
+ counter
4246
+ );
4247
+ count += counter.count;
4248
+ return count;
4249
+ }
4250
+ removeOverridesForMatchingInstances(node, overrides, componentType, parameterId, strict, counter) {
4251
+ if (node.slots) {
4252
+ for (const slotInstances of Object.values(node.slots)) {
4253
+ if (!Array.isArray(slotInstances)) continue;
4254
+ for (const instance of slotInstances) {
4255
+ if (this.compareIds(instance.type, componentType, strict) && instance._id) {
4256
+ const instanceOverrides = overrides[instance._id];
4257
+ if (instanceOverrides?.parameters) {
4258
+ const removed = this.removeKeyFromMap(instanceOverrides.parameters, parameterId, strict);
4259
+ if (removed) {
4260
+ counter.count++;
4261
+ }
4262
+ }
4263
+ }
4264
+ this.removeOverridesForMatchingInstances(
4265
+ instance,
4266
+ overrides,
4267
+ componentType,
4268
+ parameterId,
4269
+ strict,
4270
+ counter
4271
+ );
4272
+ }
4273
+ }
4274
+ }
4275
+ }
4276
+ removeKeyFromMap(map, key, strict) {
4277
+ const matchingKey = Object.keys(map).find(
4278
+ (k) => this.compareIds(k, key, strict)
4279
+ );
4280
+ if (!matchingKey) {
4281
+ return false;
4282
+ }
4283
+ delete map[matchingKey];
4284
+ return true;
4285
+ }
4286
+ };
4287
+
4288
+ // src/cli/commands/remove-parameter.ts
4289
+ function createRemoveParameterCommand() {
4290
+ const command = new Command11("remove-parameter");
4291
+ command.description(
4292
+ "Removes a parameter definition from a component and deletes all corresponding parameter values from compositions, composition patterns, and component patterns."
4293
+ ).option("--componentType <type>", "The component type that owns the parameter to remove").option("--parameterId <id>", "The parameter ID to remove").hook("preAction", (thisCommand) => {
4294
+ const opts = thisCommand.opts();
4295
+ const requiredOptions = [
4296
+ { name: "componentType", flag: "--componentType" },
4297
+ { name: "parameterId", flag: "--parameterId" }
4298
+ ];
4299
+ const missing = requiredOptions.filter((opt) => !opts[opt.name]).map((opt) => opt.flag);
4300
+ if (missing.length > 0) {
4301
+ console.error(`error: missing required options: ${missing.join(", ")}`);
4302
+ process.exit(1);
4303
+ }
4304
+ }).action(async (opts, cmd) => {
4305
+ const globalOpts = cmd.optsWithGlobals();
4306
+ const options = {
4307
+ ...globalOpts,
4308
+ componentType: opts.componentType,
4309
+ parameterId: opts.parameterId
4310
+ };
4311
+ const logger = new Logger();
4312
+ const fileSystem = new FileSystemService();
4313
+ const componentService = new ComponentService(fileSystem);
4314
+ const remover = new ParameterRemoverService(fileSystem, componentService, logger);
4315
+ try {
4316
+ const result = await remover.remove({
4317
+ rootDir: options.rootDir,
4318
+ componentsDir: options.componentsDir,
4319
+ compositionsDir: options.compositionsDir,
4320
+ compositionPatternsDir: options.compositionPatternsDir,
4321
+ componentPatternsDir: options.componentPatternsDir,
4322
+ componentType: options.componentType,
4323
+ parameterId: options.parameterId,
4324
+ whatIf: options.whatIf ?? false,
4325
+ strict: options.strict ?? false
4326
+ });
4327
+ logger.success(
4328
+ `Removed parameter: ${result.compositionsModified} composition(s), ${result.compositionPatternsModified} composition pattern(s), ${result.componentPatternsModified} component pattern(s) updated`
4329
+ );
4330
+ } catch (error) {
4331
+ if (error instanceof TransformError) {
4332
+ logger.error(error.message);
4333
+ process.exit(1);
4334
+ }
4335
+ throw error;
4336
+ }
4337
+ });
4338
+ return command;
4339
+ }
4340
+
4341
+ // src/cli/commands/remove-field.ts
4342
+ import { Command as Command12 } from "commander";
4343
+
4344
+ // src/core/services/field-remover.service.ts
4345
+ var FieldRemoverService = class {
4346
+ constructor(fileSystem, logger) {
4347
+ this.fileSystem = fileSystem;
4348
+ this.logger = logger;
4349
+ }
4350
+ compareIds(id1, id2, strict) {
4351
+ if (strict) {
4352
+ return id1 === id2;
4353
+ }
4354
+ return id1.toLowerCase() === id2.toLowerCase();
4355
+ }
4356
+ async remove(options) {
4357
+ const {
4358
+ rootDir,
4359
+ compositionsDir,
4360
+ compositionPatternsDir,
4361
+ componentPatternsDir,
4362
+ componentType,
4363
+ parameterId,
4364
+ whatIf,
4365
+ strict
4366
+ } = options;
4367
+ const fullCompositionsDir = this.fileSystem.resolvePath(rootDir, compositionsDir);
4368
+ const fullCompositionPatternsDir = this.fileSystem.resolvePath(rootDir, compositionPatternsDir);
4369
+ const fullComponentPatternsDir = this.fileSystem.resolvePath(rootDir, componentPatternsDir);
4370
+ this.logger.info(`Removing field "${parameterId}" from instances of ${componentType}`);
4371
+ const compositionsResult = await this.removeFieldInDirectory(
4372
+ fullCompositionsDir,
4373
+ componentType,
4374
+ parameterId,
4375
+ whatIf,
4376
+ strict,
4377
+ "composition"
4378
+ );
4379
+ const compositionPatternsResult = await this.removeFieldInDirectory(
4380
+ fullCompositionPatternsDir,
4381
+ componentType,
4382
+ parameterId,
4383
+ whatIf,
4384
+ strict,
4385
+ "compositionPattern"
4386
+ );
4387
+ const componentPatternsResult = await this.removeFieldInDirectory(
4388
+ fullComponentPatternsDir,
4389
+ componentType,
4390
+ parameterId,
4391
+ whatIf,
4392
+ strict,
4393
+ "componentPattern"
4394
+ );
4395
+ const totalFiles = compositionsResult.filesModified + compositionPatternsResult.filesModified + componentPatternsResult.filesModified;
4396
+ const totalInstances = compositionsResult.instancesUpdated + compositionPatternsResult.instancesUpdated + componentPatternsResult.instancesUpdated;
4397
+ this.logger.info("");
4398
+ this.logger.info(
4399
+ `Summary: ${totalFiles} file(s) (${totalInstances} instance(s)) updated.`
4400
+ );
4401
+ return {
4402
+ compositionsModified: compositionsResult.filesModified,
4403
+ compositionPatternsModified: compositionPatternsResult.filesModified,
4404
+ componentPatternsModified: componentPatternsResult.filesModified,
4405
+ instancesUpdated: totalInstances
4406
+ };
4407
+ }
4408
+ async removeFieldInDirectory(directory, componentType, parameterId, whatIf, strict, label) {
4409
+ let files;
4410
+ try {
4411
+ files = await this.fileSystem.findFiles(directory, "**/*.{json,yaml,yml}");
4412
+ } catch {
4413
+ return { filesModified: 0, instancesUpdated: 0 };
4414
+ }
4415
+ if (files.length === 0) {
4416
+ return { filesModified: 0, instancesUpdated: 0 };
4417
+ }
4418
+ let filesModified = 0;
4419
+ let instancesUpdated = 0;
4420
+ for (const filePath of files) {
4421
+ let composition;
4422
+ try {
4423
+ composition = await this.fileSystem.readFile(filePath);
4424
+ } catch {
4425
+ continue;
4426
+ }
4427
+ if (!composition?.composition) {
4428
+ continue;
4429
+ }
4430
+ const treeCount = this.removeFieldFromTree(
4431
+ composition.composition,
4432
+ componentType,
4433
+ parameterId,
4434
+ strict
4435
+ );
4436
+ const overridesCount = this.removeFieldFromOverrides(
4437
+ composition,
4438
+ componentType,
4439
+ parameterId,
4440
+ strict
4441
+ );
4442
+ const totalCount = treeCount + overridesCount;
4443
+ if (totalCount > 0) {
4444
+ const relativePath = filePath.replace(directory, "").replace(/^[/\\]/, "");
4445
+ this.logger.action(
4446
+ whatIf,
4447
+ "UPDATE",
4448
+ `${label}/${relativePath} (${totalCount} instance(s) of ${componentType})`
4449
+ );
4450
+ if (!whatIf) {
4451
+ await this.fileSystem.writeFile(filePath, composition);
4452
+ }
4453
+ filesModified++;
4454
+ instancesUpdated += totalCount;
4455
+ }
4456
+ }
4457
+ return { filesModified, instancesUpdated };
4458
+ }
4459
+ removeFieldFromTree(node, componentType, parameterId, strict) {
4460
+ let count = 0;
4461
+ if (this.compareIds(node.type, componentType, strict) && node.parameters) {
4462
+ const removed = this.removeKeyFromMap(node.parameters, parameterId, strict);
4463
+ if (removed) {
4464
+ count++;
4465
+ }
4466
+ }
4467
+ if (node.slots) {
4468
+ for (const slotInstances of Object.values(node.slots)) {
4469
+ if (!Array.isArray(slotInstances)) continue;
4470
+ for (const instance of slotInstances) {
4471
+ count += this.removeFieldFromTree(instance, componentType, parameterId, strict);
4472
+ }
4473
+ }
4474
+ }
4475
+ return count;
4476
+ }
4477
+ removeFieldFromOverrides(composition, componentType, parameterId, strict) {
4478
+ if (!composition.composition._overrides) {
4479
+ return 0;
4480
+ }
4481
+ let count = 0;
4482
+ if (this.compareIds(composition.composition.type, componentType, strict)) {
4483
+ const rootId = composition.composition._id;
4484
+ const rootOverrides = composition.composition._overrides[rootId];
4485
+ if (rootOverrides?.parameters) {
4486
+ const removed = this.removeKeyFromMap(rootOverrides.parameters, parameterId, strict);
4487
+ if (removed) {
4488
+ count++;
4489
+ }
4490
+ }
4491
+ }
4492
+ count += this.removeOverridesForMatchingInstances(
4493
+ composition.composition,
4494
+ composition.composition._overrides,
4495
+ componentType,
4496
+ parameterId,
4497
+ strict
4498
+ );
4499
+ return count;
4500
+ }
4501
+ removeOverridesForMatchingInstances(node, overrides, componentType, parameterId, strict) {
4502
+ let count = 0;
4503
+ if (node.slots) {
4504
+ for (const slotInstances of Object.values(node.slots)) {
4505
+ if (!Array.isArray(slotInstances)) continue;
4506
+ for (const instance of slotInstances) {
4507
+ if (this.compareIds(instance.type, componentType, strict) && instance._id) {
4508
+ const instanceOverrides = overrides[instance._id];
4509
+ if (instanceOverrides?.parameters) {
4510
+ const removed = this.removeKeyFromMap(instanceOverrides.parameters, parameterId, strict);
4511
+ if (removed) {
4512
+ count++;
4513
+ }
4514
+ }
4515
+ }
4516
+ count += this.removeOverridesForMatchingInstances(
4517
+ instance,
4518
+ overrides,
4519
+ componentType,
4520
+ parameterId,
4521
+ strict
4522
+ );
4523
+ }
4524
+ }
4525
+ }
4526
+ return count;
4527
+ }
4528
+ removeKeyFromMap(map, key, strict) {
4529
+ const matchingKey = Object.keys(map).find(
4530
+ (k) => this.compareIds(k, key, strict)
4531
+ );
4532
+ if (!matchingKey) {
4533
+ return false;
4534
+ }
4535
+ delete map[matchingKey];
4536
+ return true;
4537
+ }
4538
+ };
4539
+
4540
+ // src/cli/commands/remove-field.ts
4541
+ function createRemoveFieldCommand() {
4542
+ const command = new Command12("remove-field");
4543
+ command.description(
4544
+ "Removes parameter values from component instances in compositions, composition patterns, and component patterns without modifying the component definition."
4545
+ ).option("--componentType <type>", "The component type whose instances should have the parameter value removed").option("--parameterId <id>", "The parameter value key to remove from matching instances").hook("preAction", (thisCommand) => {
4546
+ const opts = thisCommand.opts();
4547
+ const requiredOptions = [
4548
+ { name: "componentType", flag: "--componentType" },
4549
+ { name: "parameterId", flag: "--parameterId" }
4550
+ ];
4551
+ const missing = requiredOptions.filter((opt) => !opts[opt.name]).map((opt) => opt.flag);
4552
+ if (missing.length > 0) {
4553
+ console.error(`error: missing required options: ${missing.join(", ")}`);
4554
+ process.exit(1);
4555
+ }
4556
+ }).action(async (opts, cmd) => {
4557
+ const globalOpts = cmd.optsWithGlobals();
4558
+ const options = {
4559
+ ...globalOpts,
4560
+ componentType: opts.componentType,
4561
+ parameterId: opts.parameterId
4562
+ };
4563
+ const logger = new Logger();
4564
+ const fileSystem = new FileSystemService();
4565
+ const remover = new FieldRemoverService(fileSystem, logger);
4566
+ try {
4567
+ const result = await remover.remove({
4568
+ rootDir: options.rootDir,
4569
+ compositionsDir: options.compositionsDir,
4570
+ compositionPatternsDir: options.compositionPatternsDir,
4571
+ componentPatternsDir: options.componentPatternsDir,
4572
+ componentType: options.componentType,
4573
+ parameterId: options.parameterId,
4574
+ whatIf: options.whatIf ?? false,
4575
+ strict: options.strict ?? false
4576
+ });
4577
+ logger.success(
4578
+ `Removed field: ${result.compositionsModified} composition(s), ${result.compositionPatternsModified} composition pattern(s), ${result.componentPatternsModified} component pattern(s) updated`
4579
+ );
4580
+ } catch (error) {
4581
+ if (error instanceof TransformError) {
4582
+ logger.error(error.message);
4583
+ process.exit(1);
4584
+ }
4585
+ throw error;
4586
+ }
4587
+ });
4588
+ return command;
4589
+ }
4590
+
4053
4591
  // package.json
4054
4592
  var package_default = {
4055
4593
  name: "@uniformdev/transformer",
4056
- version: "1.1.12",
4594
+ version: "1.1.13",
4057
4595
  description: "CLI tool for transforming Uniform.dev serialization files offline",
4058
4596
  type: "module",
4059
4597
  bin: {
@@ -4122,7 +4660,7 @@ var package_default = {
4122
4660
  };
4123
4661
 
4124
4662
  // src/cli/index.ts
4125
- var program = new Command11();
4663
+ var program = new Command13();
4126
4664
  var appVersion = package_default.version;
4127
4665
  console.error(`uniform-transform v${appVersion}`);
4128
4666
  program.name("uniform-transform").description("CLI tool for transforming Uniform.dev serialization files offline").version(appVersion);
@@ -4145,5 +4683,7 @@ program.addCommand(createAddComponentCommand());
4145
4683
  program.addCommand(createAddComponentPatternCommand());
4146
4684
  program.addCommand(createPropagateRootComponentSlotCommand());
4147
4685
  program.addCommand(createConvertCompositionsToEntriesCommand());
4686
+ program.addCommand(createRemoveParameterCommand());
4687
+ program.addCommand(createRemoveFieldCommand());
4148
4688
  program.parse();
4149
4689
  //# sourceMappingURL=index.js.map