Skip to content
Open
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
14 changes: 12 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "v7cli",
"version": "1.0.15",
"version": "1.0.19",
"main": "index.js",
"scripts": {
"cli:publish": "npx tsc && npm publish"
Expand Down Expand Up @@ -49,6 +49,7 @@
"socket.io": "^4.8.1",
"socket.io-server": "^1.0.0-b",
"tslib": "^2.8.1",
"unzipit": "^2.0.3",
"zip-a-folder": "^3.1.9"
}
}
32 changes: 17 additions & 15 deletions src/commands/build/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import { intro, spinner } from "@clack/prompts";
import { cp, mkdir, rm, writeFile } from "fs/promises";
import { join } from "path";
import { cwd } from "process";
import signale from "signale";
import { zip } from "zip-a-folder";
import { Project } from "../../project";
import signale from "signale";
import buildTSTPA, { containsTypescript } from "../../tools/build-ts-tpa";

export default async function BuildCommand() {
try {
Expand All @@ -14,9 +15,7 @@ export default async function BuildCommand() {
if (!project.metadata) return;

if (await project.areTypeDefsOutdated()) {
signale.warn(
"Type definitions are outdated. Please run `npx v7cli update` to update them."
);
signale.warn("Type definitions are outdated. Please run `npx v7cli update` to update them.");
}

const appId = project.metadata?.metadata.appId;
Expand All @@ -35,14 +34,20 @@ export default async function BuildCommand() {
spin.message("Creating temp directory");
await mkdir(join(project.path, ".arcdev-build"), { recursive: true });

// DO THE BUILD HERE
const containsTS = containsTypescript(project.metadata.payloadDir);

const payloadDir = containsTS ? join(project.path, "dist") : join(project.path, project.metadata.payloadDir);

if (containsTS) {
spin.message("Compiling project");
await buildTSTPA(project.path, { silent: true });
}

spin.message("Copying payload");
await cp(
join(project.path, project.metadata.payloadDir),
".arcdev-build/payload",
{
recursive: true,
}
);
await cp(payloadDir, ".arcdev-build/payload", {
recursive: true,
});

spin.message("Writing _metadata.json");
await writeFile(
Expand All @@ -52,10 +57,7 @@ export default async function BuildCommand() {
);

spin.message("Bundling package");
await zip(
join(project.path, ".arcdev-build"),
join(project.path, project.metadata.outFile)
);
await zip(join(project.path, ".arcdev-build"), join(project.path, project.metadata.outFile));

spin.message("Removing temp directory");
await rm(join(project.path, ".arcdev-build"), {
Expand Down
19 changes: 12 additions & 7 deletions src/commands/dev/index.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import "colors";
import { cwd } from "process";
import signale from "signale";
import packageJson from "../../../package.json";
import { getArcBuild } from "../../build";
import { Project } from "../../project";
import { StartServer } from "../../server/api";
import signale from "signale";
import { getArcBuild } from "../../build";
import buildTSTPA, { containsTypescript } from "../../tools/build-ts-tpa";

export default async function DevCommand() {
const project = new Project(cwd());

await project.readProjectFile();

if (await project.areTypeDefsOutdated()) {
signale.warn(
"Type definitions are outdated. Please run `npx v7cli update` to update them."
);
signale.warn("Type definitions are outdated. Please run `npx v7cli update` to update them.");
}

const appId = project.metadata?.metadata.appId;
Expand All @@ -27,12 +26,18 @@ export default async function DevCommand() {
process.exit(1);
}

const buildHash = await getArcBuild()
const buildHash = await getArcBuild();

if (project.metadata?.buildHash == null || project.metadata.buildHash != buildHash) {
if (project.metadata?.buildHash == null) {
project.metadata!!.buildHash = buildHash;
}

const containsTS = containsTypescript(project.metadata!.payloadDir);

if (containsTS) {
await buildTSTPA(project.path);
}

await StartServer(project);

const name = "ArcOS v7 CLI".green.bold;
Expand Down
33 changes: 24 additions & 9 deletions src/commands/new/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { cancel, intro, isCancel, outro, spinner, text } from "@clack/prompts";
import { cancel, intro, isCancel, outro, select, spinner, text } from "@clack/prompts";
import { Command } from "commander";
import { userInfo } from "os";
import { join } from "path";
Expand Down Expand Up @@ -27,8 +27,7 @@ export default async function NewCommand(this: Command, destination: string) {

validate(value) {
if (!value) return `A description is required`;
if (value.length > 512)
return `Too long! Pick a description under 512 characters.`;
if (value.length > 512) return `Too long! Pick a description under 512 characters.`;
},
});

Expand All @@ -39,8 +38,7 @@ export default async function NewCommand(this: Command, destination: string) {
initialValue: userInfo().username,
validate(value) {
if (!value) return `An author is required`;
if (value.length > 32)
return `Too long! Pick a name under 32 characters.`;
if (value.length > 32) return `Too long! Pick a name under 32 characters.`;
},
});

Expand All @@ -50,8 +48,7 @@ export default async function NewCommand(this: Command, destination: string) {
message: "What version is your app?",
initialValue: "1.0.0",
validate(value) {
if (value.length !== 5 || value[1] !== "." || value[3] !== ".")
return "Need a version in an x.x.x format";
if (value.length !== 5 || value[1] !== "." || value[3] !== ".") return "Need a version in an x.x.x format";
},
});

Expand All @@ -77,7 +74,25 @@ export default async function NewCommand(this: Command, destination: string) {
},
});

if (isCancel(installLocation)) abort();
const processType = await select({
message: "What kind of app is this?",
options: [
{ value: "AppProcess", label: "AppProcess", hint: "A window is included for the user to interact with." },
{ value: "Process", label: "Process", hint: "No included window, yet has access to all ArcOS offers." },
],
});

if (isCancel(processType)) abort();

const projectType = await select({
message: "Do you want to enable experimental TypeScript support?",
options: [
{ value: "javascript", label: "No thanks." },
{ value: "typescript", label: "Sure!" },
],
});

if (isCancel(projectType)) abort();

const metadata: PackageMetadata = {
name: name.toString(),
Expand All @@ -100,7 +115,7 @@ export default async function NewCommand(this: Command, destination: string) {

const app = await TpaWizard(metadata);

scaffoldProject(app, project);
scaffoldProject(app, project, processType.toString(), projectType.toString());
}

export function abort(): any {
Expand Down
4 changes: 2 additions & 2 deletions src/commands/update.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { spinner } from "@clack/prompts";
import { cwd } from "process";
import { Project } from "../project";
import signale from "signale";
import { spinner } from "@clack/prompts";
import { Project } from "../project";

export default async function UpdateCommand() {
const project = new Project(cwd());
Expand Down
24 changes: 6 additions & 18 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,25 @@

import { Command } from "commander";
import packageJson from "../package.json";
import NewCommand from "./commands/new";
import DevCommand from "./commands/dev";
import BuildCommand from "./commands/build";
import DevCommand from "./commands/dev";
import NewCommand from "./commands/new";
import UpdateCommand from "./commands/update";

const program = new Command();

program
.name(packageJson.name)
.description("Develop applications for ArcOS v7")
.version(packageJson.version);
program.name(packageJson.name).description("Develop applications for ArcOS v7").version(packageJson.version);

program
.command("new")
.description("Creates a new ArcOS app project")
.argument("<destination>", "What folder to save the app in")
.action(NewCommand);

program
.command("dev")
.description("Start the development server")
.action(DevCommand);
program.command("dev").description("Start the development server").action(DevCommand);

program
.command("build")
.description("Compile the app into an ArcOS package")
.action(BuildCommand);
program.command("build").description("Compile the app into an ArcOS package").action(BuildCommand);

program
.command("update")
.description("Update your project's type definitions")
.action(UpdateCommand);
program.command("update").description("Update your project's type definitions").action(UpdateCommand);

program.parse();
29 changes: 10 additions & 19 deletions src/json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ export function keysToLowerCase(obj: any): any {
if (Array.isArray(obj)) {
return obj.map(keysToLowerCase);
} else if (obj !== null && typeof obj === "object") {
return Object.entries(obj).reduce((acc, [key, value]) => {
acc[key.toLowerCase()] = keysToLowerCase(value);
return acc;
}, {} as Record<string, any>);
return Object.entries(obj).reduce(
(acc, [key, value]) => {
acc[key.toLowerCase()] = keysToLowerCase(value);
return acc;
},
{} as Record<string, any>
);
}
return obj;
}
export type ValidationObject = { [key: string]: any };

export function validateObject(
target: ValidationObject,
validation: ValidationObject
): boolean {
export function validateObject(target: ValidationObject, validation: ValidationObject): boolean {
if (typeof validation !== "object" || validation === null) return false;

for (const key in validation) {
Expand All @@ -33,18 +33,9 @@ export function validateObject(

if (typeof validationValue === "object" && validationValue !== null) {
if (Array.isArray(validationValue)) {
if (
!Array.isArray(targetValue) ||
validationValue.length > targetValue.length
)
return false;
if (!Array.isArray(targetValue) || validationValue.length > targetValue.length) return false;

if (
!validationValue.every((val, index) =>
validateObject(targetValue[index], val)
)
)
return false;
if (!validationValue.every((val, index) => validateObject(targetValue[index], val))) return false;
} else {
if (!validateObject(targetValue, validationValue)) return false;
}
Expand Down
Loading