From ff4ffd7a70db6251b0cf210ac7830df054a61866 Mon Sep 17 00:00:00 2001
From: Tony Alves <tony@3alves.com>
Date: Thu, 28 Mar 2019 11:37:23 -0700
Subject: [PATCH] feat: add byo react package netlify-cms-app (#2252)

---
 packages/netlify-cms-app/README.md            | 43 ++++++++++++++
 packages/netlify-cms-app/package.json         | 56 +++++++++++++++++++
 .../src/backends.js                           |  0
 .../src/editor-components.js                  |  0
 packages/netlify-cms-app/src/index.js         |  9 +++
 .../src/widgets.js                            |  0
 packages/netlify-cms-app/webpack.config.js    | 25 +++++++++
 packages/netlify-cms/package.json             | 32 +----------
 packages/netlify-cms/src/index.js             |  5 +-
 yarn.lock                                     |  2 +-
 10 files changed, 137 insertions(+), 35 deletions(-)
 create mode 100644 packages/netlify-cms-app/README.md
 create mode 100644 packages/netlify-cms-app/package.json
 rename packages/{netlify-cms => netlify-cms-app}/src/backends.js (100%)
 rename packages/{netlify-cms => netlify-cms-app}/src/editor-components.js (100%)
 create mode 100644 packages/netlify-cms-app/src/index.js
 rename packages/{netlify-cms => netlify-cms-app}/src/widgets.js (100%)
 create mode 100644 packages/netlify-cms-app/webpack.config.js

diff --git a/packages/netlify-cms-app/README.md b/packages/netlify-cms-app/README.md
new file mode 100644
index 00000000..86b8e6b1
--- /dev/null
+++ b/packages/netlify-cms-app/README.md
@@ -0,0 +1,43 @@
+# Netlify CMS App
+[![](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/netlify/netlifycms)
+
+_For a Netlify CMS overview, see the general [Netlify CMS project README](https://github.com/netlify/netlify-cms)._
+
+## Purpose
+This package is similar to the [`netlify-cms`](https://github.com/netlify/netlify-cms/tree/master/packages/netlify-cms/) package, but is designed for use with extensions. It serves that purpose in the following ways.
+
+- It does not automatically initialize - you must run the CMS `init` method.
+- It does not include `react` or `react-dom` - they are required as peer dependencies.
+- It does not include the following extensions:
+  - [`netlify-cms-media-library-cloudinary`]
+  - [`netlify-cms-media-library-uploadcare`]
+  
+## Usage
+Install via script tag:
+
+```html
+<!-- Excluding `doctype` and `head` but you should add them -->
+<body>
+  <!-- Add these scripts to the bottom of the body -->
+  <script src="https://unpkg.com/react@^16/umd/react.production.min.js"></script>
+  <script src="https://unpkg.com/react-dom@^16/umd/react-dom.production.min.js"></script>
+  <script src="https://unpkg.com/netlify-cms-app/dist/netlify-cms-app.js"></script>
+  
+  <!-- Initialize the CMS -->
+  <script>
+    NetlifyCmsApp.init();
+  </script>
+</body>
+```
+
+Install via npm:
+
+```
+npm i react react-dom netlify-cms-app
+```
+
+```js
+import CMS from 'netlify-cms-app';
+
+CMS.init();
+```
diff --git a/packages/netlify-cms-app/package.json b/packages/netlify-cms-app/package.json
new file mode 100644
index 00000000..bbb78ad7
--- /dev/null
+++ b/packages/netlify-cms-app/package.json
@@ -0,0 +1,56 @@
+{
+  "name": "netlify-cms-app",
+  "description": "An extensible, open source, Git-based, React CMS for static sites. Reusable congiuration with React as peer.",
+  "version": "2.8.1-beta.1",
+  "homepage": "https://www.netlifycms.org",
+  "repository": "https://github.com/netlify/netlify-cms/tree/master/packages/netlify-cms-app",
+  "bugs": "https://github.com/netlify/netlify-cms/issues",
+  "main": "dist/netlify-cms-app.js",
+  "scripts": {
+    "develop": "yarn build:esm --watch",
+    "build": "cross-env NODE_ENV=production webpack",
+    "build:esm": "cross-env NODE_ENV=esm babel src --out-dir dist/esm --ignore src/**/__tests__/* --root-mode upward -s"
+  },
+  "keywords": [
+    "netlify",
+    "cms",
+    "content editing",
+    "static site generators",
+    "jamstack"
+  ],
+  "license": "MIT",
+  "dependencies": {
+    "@emotion/core": "^10.0.9",
+    "@emotion/styled": "^10.0.9",
+    "immutable": "^3.7.6",
+    "lodash": "^4.17.11",
+    "moment": "^2.24.0",
+    "netlify-cms-backend-bitbucket": "^2.3.1-beta.1",
+    "netlify-cms-backend-git-gateway": "^2.4.1-beta.1",
+    "netlify-cms-backend-github": "^2.4.1-beta.1",
+    "netlify-cms-backend-gitlab": "^2.3.1-beta.1",
+    "netlify-cms-backend-test": "^2.2.1-beta.1",
+    "netlify-cms-core": "^2.10.1-beta.1",
+    "netlify-cms-editor-component-image": "^2.4.1-beta.1",
+    "netlify-cms-widget-boolean": "^2.2.1-beta.1",
+    "netlify-cms-widget-date": "^2.3.1-beta.1",
+    "netlify-cms-widget-datetime": "^2.2.1-beta.1",
+    "netlify-cms-widget-file": "^2.4.1-beta.1",
+    "netlify-cms-widget-image": "^2.3.1-beta.1",
+    "netlify-cms-widget-list": "^2.3.1-beta.1",
+    "netlify-cms-widget-map": "^1.3.1-beta.1",
+    "netlify-cms-widget-markdown": "^2.4.1-beta.1",
+    "netlify-cms-widget-number": "^2.3.1-beta.1",
+    "netlify-cms-widget-object": "^2.2.1-beta.1",
+    "netlify-cms-widget-relation": "^2.3.1-beta.1",
+    "netlify-cms-widget-select": "^2.4.1-beta.1",
+    "netlify-cms-widget-string": "^2.2.1-beta.1",
+    "netlify-cms-widget-text": "^2.2.1-beta.1",
+    "prop-types": "^15.7.2",
+    "react-immutable-proptypes": "^2.1.0"
+  },
+  "peerDependencies": {
+    "react": "^16.8.4",
+    "react-dom": "^16.8.4"
+  }
+}
diff --git a/packages/netlify-cms/src/backends.js b/packages/netlify-cms-app/src/backends.js
similarity index 100%
rename from packages/netlify-cms/src/backends.js
rename to packages/netlify-cms-app/src/backends.js
diff --git a/packages/netlify-cms/src/editor-components.js b/packages/netlify-cms-app/src/editor-components.js
similarity index 100%
rename from packages/netlify-cms/src/editor-components.js
rename to packages/netlify-cms-app/src/editor-components.js
diff --git a/packages/netlify-cms-app/src/index.js b/packages/netlify-cms-app/src/index.js
new file mode 100644
index 00000000..0725ad14
--- /dev/null
+++ b/packages/netlify-cms-app/src/index.js
@@ -0,0 +1,9 @@
+import { NetlifyCmsCore as CMS } from 'netlify-cms-core';
+import './backends';
+import './widgets';
+import './editor-components';
+
+export const NetlifyCmsApp = {
+  ...CMS,
+};
+export default CMS;
diff --git a/packages/netlify-cms/src/widgets.js b/packages/netlify-cms-app/src/widgets.js
similarity index 100%
rename from packages/netlify-cms/src/widgets.js
rename to packages/netlify-cms-app/src/widgets.js
diff --git a/packages/netlify-cms-app/webpack.config.js b/packages/netlify-cms-app/webpack.config.js
new file mode 100644
index 00000000..3fc7add9
--- /dev/null
+++ b/packages/netlify-cms-app/webpack.config.js
@@ -0,0 +1,25 @@
+const path = require('path');
+const webpack = require('webpack');
+const pkg = require('./package.json');
+const { getConfig, plugins } = require('../../scripts/webpack');
+const baseWebpackConfig = getConfig({ baseOnly: true });
+
+const isProduction = process.env.NODE_ENV === 'production';
+console.log(`${pkg.version}${isProduction ? '' : '-dev'}`);
+
+const baseConfig = {
+  ...baseWebpackConfig,
+  context: path.join(__dirname, 'src'),
+  entry: './index.js',
+  plugins: [
+    ...Object.entries(plugins)
+      .filter(([key]) => key !== 'friendlyErrors')
+      .map(([, plugin]) => plugin()),
+    new webpack.DefinePlugin({
+      NETLIFY_CMS_VERSION: JSON.stringify(`- app - ${pkg.version}${isProduction ? '' : '-dev'}`),
+      NETLIFY_CMS_CORE_VERSION: null,
+    }),
+  ],
+};
+
+module.exports = baseConfig;
diff --git a/packages/netlify-cms/package.json b/packages/netlify-cms/package.json
index 5cd83db3..290ce76c 100644
--- a/packages/netlify-cms/package.json
+++ b/packages/netlify-cms/package.json
@@ -20,38 +20,10 @@
   ],
   "license": "MIT",
   "dependencies": {
-    "@emotion/core": "^10.0.9",
-    "@emotion/styled": "^10.0.9",
-    "create-react-class": "^15.6.0",
-    "immutable": "^3.7.6",
-    "lodash": "^4.17.11",
-    "moment": "^2.24.0",
-    "netlify-cms-backend-bitbucket": "^2.3.1-beta.1",
-    "netlify-cms-backend-git-gateway": "^2.4.1-beta.1",
-    "netlify-cms-backend-github": "^2.4.1-beta.1",
-    "netlify-cms-backend-gitlab": "^2.3.1-beta.1",
-    "netlify-cms-backend-test": "^2.2.1-beta.1",
-    "netlify-cms-core": "^2.10.1-beta.1",
-    "netlify-cms-editor-component-image": "^2.4.1-beta.1",
+    "netlify-cms-app": "^2.8.1-beta.1",
     "netlify-cms-media-library-cloudinary": "^1.3.1-beta.1",
     "netlify-cms-media-library-uploadcare": "^0.5.1-beta.1",
-    "netlify-cms-widget-boolean": "^2.2.1-beta.1",
-    "netlify-cms-widget-date": "^2.3.1-beta.1",
-    "netlify-cms-widget-datetime": "^2.2.1-beta.1",
-    "netlify-cms-widget-file": "^2.4.1-beta.1",
-    "netlify-cms-widget-image": "^2.3.1-beta.1",
-    "netlify-cms-widget-list": "^2.3.1-beta.1",
-    "netlify-cms-widget-map": "^1.3.1-beta.1",
-    "netlify-cms-widget-markdown": "^2.4.1-beta.1",
-    "netlify-cms-widget-number": "^2.3.1-beta.1",
-    "netlify-cms-widget-object": "^2.2.1-beta.1",
-    "netlify-cms-widget-relation": "^2.3.1-beta.1",
-    "netlify-cms-widget-select": "^2.4.1-beta.1",
-    "netlify-cms-widget-string": "^2.2.1-beta.1",
-    "netlify-cms-widget-text": "^2.2.1-beta.1",
-    "prop-types": "^15.7.2",
     "react": "^16.8.4",
-    "react-dom": "^16.8.4",
-    "react-immutable-proptypes": "^2.1.0"
+    "react-dom": "^16.8.4"
   }
 }
diff --git a/packages/netlify-cms/src/index.js b/packages/netlify-cms/src/index.js
index 10b59b0c..391a3a8f 100644
--- a/packages/netlify-cms/src/index.js
+++ b/packages/netlify-cms/src/index.js
@@ -1,9 +1,6 @@
 import createReactClass from 'create-react-class';
 import React from 'react';
-import { NetlifyCmsCore as CMS } from 'netlify-cms-core';
-import './backends';
-import './widgets';
-import './editor-components';
+import { NetlifyCmsApp as CMS } from 'netlify-cms-app/dist/esm';
 import './media-libraries';
 
 /**
diff --git a/yarn.lock b/yarn.lock
index 19420618..9e4f28be 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3940,7 +3940,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-create-react-class@^15.5.1, create-react-class@^15.5.2, create-react-class@^15.6.0:
+create-react-class@^15.5.1, create-react-class@^15.5.2:
   version "15.6.3"
   resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
   integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==