Skip to content

Commit

Permalink
fix: add Page Builder Element extension (#4340)
Browse files Browse the repository at this point in the history
  • Loading branch information
adrians5j authored Oct 18, 2024
1 parent 0e1178f commit c3a7d89
Show file tree
Hide file tree
Showing 45 changed files with 629 additions and 346 deletions.
18 changes: 14 additions & 4 deletions packages/cli-plugin-extensions/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
# @webiny/cli-plugin-extensions

[![](https://img.shields.io/npm/dw/@webiny/cli-plugin-extensions.svg)](https://www.npmjs.com/package/@webiny/cli-plugin-extensions)
[![](https://img.shields.io/npm/v/@webiny/cli-plugin-extensions.svg)](https://www.npmjs.com/package/@webiny/cli-plugin-extensions)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)

A plugin for @webiny/cli that provides scaffolding capabilities by means of scaffold plugins.

## Install
```
npm install --save @webiny/cli-plugin-extensions
```

Or if you prefer yarn:
```
yarn add @webiny/cli-plugin-extensions
```

Add plugin to your project by editing `webiny.project.js`:

```js
module.exports = {
projectName: "my-project",
cli: {
plugins: ["@webiny/cli-plugin-extensions"]
}
};
```
57 changes: 38 additions & 19 deletions packages/cli-plugin-extensions/package.json
Original file line number Diff line number Diff line change
@@ -1,47 +1,66 @@
{
"name": "@webiny/cli-plugin-extensions",
"version": "0.0.0",
"description": "Scaffolds essential files for creating a new plugin.",
"main": "index.js",
"types": "index.d.ts",
"repository": {
"type": "git",
"url": "git+https://github.com/webiny/webiny-js.git",
"url": "https://github.com/webiny/webiny-js.git",
"directory": "packages/cli-plugin-extensions"
},
"author": {
"name": "Webiny",
"url": "https://www.webiny.com"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/webiny/webiny-js/issues"
"author": "Webiny Ltd.",
"contributors": [
"Pavel Denisjuk <[email protected]>"
],
"description": "A tool to bootstrap a Webiny project.",
"dependencies": {
"@babel/runtime": "^7.24.0",
"@webiny/aws-sdk": "0.0.0",
"@webiny/cli": "0.0.0",
"@webiny/cli-plugin-scaffold": "0.0.0",
"@webiny/error": "0.0.0",
"case": "^1.6.3",
"chalk": "^4.1.0",
"execa": "^5.0.0",
"fast-glob": "^3.2.7",
"glob": "^7.1.2",
"inquirer": "8.2.6",
"load-json-file": "^6.2.0",
"ora": "4.1.1",
"replace-in-path": "^1.1.0",
"ts-morph": "^11.0.0",
"validate-npm-package-name": "^3.0.0",
"write-json-file": "^4.3.0"
},
"homepage": "https://github.com/webiny/webiny-js#readme",
"devDependencies": {
"@babel/cli": "^7.23.9",
"@babel/core": "^7.24.0",
"@babel/preset-env": "^7.24.0",
"@types/inquirer": "8.2.10",
"@types/ncp": "^2.0.4",
"@types/pluralize": "^0.0.29",
"@types/validate-npm-package-name": "^3.0.3",
"@webiny/cli": "0.0.0",
"@webiny/plugins": "0.0.0",
"@webiny/project-utils": "0.0.0",
"chalk": "^4.1.0",
"execa": "^5.0.0",
"fast-glob": "^3.2.7",
"find-up": "^5.0.0",
"prettier": "^2.8.3",
"rimraf": "^5.0.5",
"typescript": "4.9.5"
},
"scripts": {
"build": "yarn webiny run build",
"watch": "yarn webiny run watch"
},
"license": "MIT",
"publishConfig": {
"access": "public",
"directory": "dist"
},
"scripts": {
"build": "yarn webiny run build",
"watch": "yarn webiny run watch"
},
"adio": {
"ignoreDirs": [
"template"
]
}
},
"gitHead": "2cd812f1b150c10df088a5b2f75a62c9e376c1a4",
"types": "dist/types.d.ts"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import os from "os";
import path from "path";
import fs from "node:fs";
import fsAsync from "node:fs/promises";
import { CliCommandScaffoldCallableArgs } from "@webiny/cli-plugin-scaffold/types";
import { setTimeout } from "node:timers/promises";
import { WEBINY_DEV_VERSION } from "~/utils/constants";
import { linkAllExtensions } from "./utils/linkAllExtensions";
import { Input } from "./types";
import { downloadFolderFromS3 } from "./downloadAndLinkExtension/downloadFolderFromS3";
import { setWebinyPackageVersions } from "~/utils/setWebinyPackageVersions";
import { runYarnInstall } from "@webiny/cli-plugin-scaffold/utils";
import chalk from "chalk";
import { Extension } from "./extensions/Extension";
import glob from "fast-glob";
import { CliContext } from "@webiny/cli/types";
import { Ora } from "ora";

const EXTENSIONS_ROOT_FOLDER = "extensions";

Expand Down Expand Up @@ -54,15 +54,19 @@ const getExtensionPkgJsonGlobs = (extensionsFolderNames: string[]) => {
return [base + "/**/package.json", base + "/package.json"];
};

export interface DownloadAndLinkExtensionParams {
source: string;
context: CliContext;
ora: Ora;
}

export const downloadAndLinkExtension = async ({
input,
ora,
context
}: CliCommandScaffoldCallableArgs<Input>) => {
source: downloadExtensionSource,
context,
ora
}: DownloadAndLinkExtensionParams) => {
const currentWebinyVersion = context.version;

const downloadExtensionSource = input.templateArgs!;

try {
ora.start(`Downloading extension...`);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export abstract class AbstractExtension {
this.params = params;
}

abstract generate(): Promise<void>;
abstract link(): Promise<void>;

abstract getNextSteps(): string[];

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
import { AbstractExtension } from "./AbstractExtension";
import path from "path";
import readJson from "load-json-file";
import { PackageJson } from "@webiny/cli-plugin-scaffold/types";
import writeJson from "write-json-file";
import { EXTENSIONS_ROOT_FOLDER } from "~/utils/constants";
import chalk from "chalk";
import { JsxFragment, Node, Project } from "ts-morph";
import { formatCode } from "@webiny/cli-plugin-scaffold/utils";
import { updateDependencies, updateWorkspaces } from "~/utils";

export class AdminExtension extends AbstractExtension {
async generate() {
async link() {
await this.addPluginToAdminApp();

// Update dependencies list in package.json.
const packageJsonPath = path.join("apps", "admin", "package.json");
const packageJson = await readJson<PackageJson>(packageJsonPath);
if (!packageJson.dependencies) {
packageJson.dependencies = {};
}

packageJson.dependencies[this.params.packageName] = "1.0.0";
await updateDependencies(packageJsonPath, {
[this.params.packageName]: "1.0.0"
});

await writeJson(packageJsonPath, packageJson);
await updateWorkspaces(this.params.location);
}

getNextSteps(): string[] {
Expand All @@ -35,7 +30,10 @@ export class AdminExtension extends AbstractExtension {

return [
`run ${chalk.green(watchCommand)} to start a new local development session`,
`open ${chalk.green(indexTsxFilePath)} and start coding`
`open ${chalk.green(indexTsxFilePath)} and start coding`,
`to install additional dependencies, run ${chalk.green(
`yarn workspace ${this.params.packageName} add <package-name>`
)}`
];
}

Expand All @@ -57,9 +55,7 @@ export class AdminExtension extends AbstractExtension {

const existingImportDeclaration = source.getImportDeclaration(importPath);
if (existingImportDeclaration) {
throw new Error(
`Could not import "${importPath}" in "${extensionsFilePath}" as it already exists.`
);
return;
}

let index = 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
import { AbstractExtension } from "./AbstractExtension";
import path from "path";
import readJson from "load-json-file";
import { PackageJson } from "@webiny/cli-plugin-scaffold/types";
import writeJson from "write-json-file";
import { EXTENSIONS_ROOT_FOLDER } from "~/utils/constants";
import chalk from "chalk";
import { ArrayLiteralExpression, Node, Project } from "ts-morph";
import { formatCode } from "@webiny/cli-plugin-scaffold/utils";
import { updateDependencies, updateWorkspaces } from "~/utils";

export class ApiExtension extends AbstractExtension {
async generate() {
async link() {
await this.addPluginToApiApp();

// Update dependencies list in package.json.
const packageJsonPath = path.join("apps", "api", "graphql", "package.json");
const packageJson = await readJson<PackageJson>(packageJsonPath);
if (!packageJson.dependencies) {
packageJson.dependencies = {};
}

packageJson.dependencies[this.params.packageName] = "1.0.0";
await updateDependencies(packageJsonPath, {
[this.params.packageName]: "1.0.0"
});

await writeJson(packageJsonPath, packageJson);
await updateWorkspaces(this.params.location);
}

getNextSteps(): string[] {
Expand All @@ -35,7 +30,10 @@ export class ApiExtension extends AbstractExtension {

return [
`run ${chalk.green(watchCommand)} to start a new local development session`,
`open ${chalk.green(indexTsxFilePath)} and start coding`
`open ${chalk.green(indexTsxFilePath)} and start coding`,
`to install additional dependencies, run ${chalk.green(
`yarn workspace ${this.params.packageName} add <package-name>`
)}`
];
}

Expand All @@ -55,9 +53,7 @@ export class ApiExtension extends AbstractExtension {

const existingImportDeclaration = source.getImportDeclaration(importPath);
if (existingImportDeclaration) {
throw new Error(
`Could not import "${importPath}" in "${extensionsFilePath}" as it already exists.`
);
return;
}

let index = 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { AbstractExtension, ExtensionTypeConstructorParams } from "./AbstractExtension";
import { AdminExtension } from "./AdminExtension";
import { ApiExtension } from "./ApiExtension";
import { PbElementExtension } from "./PbElementExtension";
import { WorkspaceExtension } from "./WorkspaceExtension";
import loadJson from "load-json-file";
import { PackageJson } from "@webiny/cli-plugin-scaffold/types";
Expand All @@ -23,6 +24,10 @@ export class Extension extends AbstractExtension {
this.extension = new ApiExtension(params);
break;
}
case "pbElement": {
this.extension = new PbElementExtension(params);
break;
}
case "workspace": {
this.extension = new WorkspaceExtension(params);
break;
Expand All @@ -33,8 +38,8 @@ export class Extension extends AbstractExtension {
}
}

async generate() {
await this.extension.generate();
async link() {
await this.extension.link();
}

getNextSteps(): string[] {
Expand All @@ -50,7 +55,7 @@ export class Extension extends AbstractExtension {
}

return new Extension({
name: loadedPkgJson.name,
name: path.basename(path.dirname(pkgJsonPath)),
type: extensionType,
location: path.dirname(pkgJsonPath),
packageName: loadedPkgJson.name
Expand Down
Loading

0 comments on commit c3a7d89

Please sign in to comment.