Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions lib/commands/widget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import * as plist from "plist";
import { injector } from "../common/yok";
import { capitalizeFirstLetter } from "../common/utils";
import { EOL } from "os";
import { SupportedConfigValues } from "../tools/config-manipulation/config-transformer";

export class WidgetCommand implements ICommand {
public allowedParameters: ICommandParameter[] = [];
Expand Down Expand Up @@ -219,10 +218,7 @@ public struct ${capitalizeFirstLetter(name)}Model: ActivityAttributes {
}

configData.ios.SPMPackages = spmPackages;
await this.$projectConfigService.setValue(
"", // root
configData as { [key: string]: SupportedConfigValues },
);
await this.$projectConfigService.setValue("ios.SPMPackages", spmPackages);

if (fs.existsSync(gitIgnorePath)) {
const gitIgnore = fs.readFileSync(gitIgnorePath, {
Expand Down
78 changes: 74 additions & 4 deletions lib/tools/config-manipulation/config-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,34 +184,64 @@ export class ConfigTransformer implements IConfigTransformer {
return `{}`;
}

private isBooleanLiteralNode(initializer: any): boolean {
return (
initializer?.getKind() === SyntaxKind.TrueKeyword ||
initializer?.getKind() === SyntaxKind.FalseKeyword
);
}

private replaceInitializer(
initializer: any,
newValue: SupportedConfigValues,
) {
return initializer.replaceWithText(this.createInitializer(newValue));
}

private setInitializerValue(
initializer: any,
newValue: SupportedConfigValues,
) {
if (Node.isStringLiteral(initializer)) {
if (typeof newValue !== "string") {
return this.replaceInitializer(initializer, newValue);
}
return (initializer as StringLiteral).setLiteralValue(newValue as string);
}

if (Node.isNumericLiteral(initializer)) {
if (typeof newValue !== "number") {
return this.replaceInitializer(initializer, newValue);
}
return (initializer as NumericLiteral).setLiteralValue(
newValue as number,
);
}

if (Node.isBooleanKeyword(initializer)) {
if (this.isBooleanLiteralNode(initializer)) {
if (typeof newValue !== "boolean") {
return this.replaceInitializer(initializer, newValue);
}
return (initializer as BooleanLiteral).setLiteralValue(
newValue as boolean,
);
}

if (
Node.isArrayLiteralExpression(initializer) ||
Node.isObjectLiteralExpression(initializer)
) {
return this.replaceInitializer(initializer, newValue);
}

if (Node.isIdentifier(initializer)) {
return this.setIdentifierValue(initializer as Identifier, newValue);
}

throw new Error("Unsupported value type: " + initializer.getKindName());
}

private getInitializerValue(initializer: any) {
private getInitializerValue(initializer: any): any {
if (Node.isStringLiteral(initializer)) {
return (initializer as StringLiteral).getLiteralValue();
}
Expand All @@ -220,10 +250,30 @@ export class ConfigTransformer implements IConfigTransformer {
return (initializer as NumericLiteral).getLiteralValue();
}

if (Node.isBooleanKeyword(initializer)) {
if (this.isBooleanLiteralNode(initializer)) {
return (initializer as BooleanLiteral).getLiteralValue();
}

if (Node.isArrayLiteralExpression(initializer)) {
return initializer
.getElements()
.map((element: any) => this.getInitializerValue(element));
}

if (Node.isObjectLiteralExpression(initializer)) {
const result: Record<string, SupportedConfigValues> = {};
for (const property of initializer.getProperties()) {
if (!Node.isPropertyAssignment(property)) {
continue;
}
const name = property.getNameNode().getText().replace(/['\"]/g, "");
result[name] = this.getInitializerValue(
property.getInitializerOrThrow(),
);
}
return result;
}

if (Node.isIdentifier(initializer)) {
return this.getIdentifierValue(initializer as Identifier);
}
Expand Down Expand Up @@ -278,10 +328,30 @@ export class ConfigTransformer implements IConfigTransformer {
return (initializer as NumericLiteral).getLiteralValue();
}

if (Node.isBooleanKeyword(initializer)) {
if (this.isBooleanLiteralNode(initializer)) {
return (initializer as BooleanLiteral).getLiteralValue();
}

if (Node.isArrayLiteralExpression(initializer)) {
return initializer
.getElements()
.map((element: any) => this.getInitializerValue(element));
}

if (Node.isObjectLiteralExpression(initializer)) {
const result: Record<string, SupportedConfigValues> = {};
for (const property of initializer.getProperties()) {
if (!Node.isPropertyAssignment(property)) {
continue;
}
const name = property.getNameNode().getText().replace(/['\"]/g, "");
result[name] = this.getInitializerValue(
property.getInitializerOrThrow(),
);
}
return result;
}

if (Node.isIdentifier(initializer)) {
return this.getIdentifierValue(initializer as Identifier);
}
Expand Down
62 changes: 62 additions & 0 deletions test/tools/config-manipulation/config-transformer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { assert } from "chai";
import { ConfigTransformer } from "../../../lib/tools/config-manipulation/config-transformer";

describe("ConfigTransformer", () => {
it("updates existing boolean literals", () => {
const content = `export default {
id: 'org.nativescript.myapp',
discardUncaughtJsExceptions: true,
} as any;`;

const transformer = new ConfigTransformer(content);
const updated = transformer.setValue("discardUncaughtJsExceptions", false);
const updatedTransformer = new ConfigTransformer(updated);

assert.strictEqual(
updatedTransformer.getValue("discardUncaughtJsExceptions"),
false,
);
});

it("updates existing ios.SPMPackages array literals", () => {
const content = `import { NativeScriptConfig } from '@nativescript/core'
export default {
id: 'org.nativescript.myapp',
ios: {
SPMPackages: [
{
name: 'RiveRuntime',
libs: ['RiveRuntime'],
repositoryURL: 'https://github.com/rive-app/rive-ios.git',
version: '6.11.0',
},
],
},
} as NativeScriptConfig`;

const spmPackages = [
{
name: "RiveRuntime",
libs: ["RiveRuntime"],
repositoryURL: "https://github.com/rive-app/rive-ios.git",
version: "6.11.0",
},
{
name: "SharedWidget",
libs: ["SharedWidget"],
path: "./Shared_Resources/iOS/SharedWidget",
targets: ["widget"],
},
];

const transformer = new ConfigTransformer(content);
const updated = transformer.setValue("ios.SPMPackages", spmPackages);
const updatedTransformer = new ConfigTransformer(updated);

assert.deepStrictEqual(
updatedTransformer.getValue("ios.SPMPackages"),
spmPackages,
);
});
});