@sanity/plugin-kit 2.1.19 → 3.0.0

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.
Files changed (228) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +53 -37
  3. package/assets/inject/semver-workflow/lint-staged.template.js +1 -1
  4. package/assets/inject/ui-workshop/src/CustomField.tsx +15 -0
  5. package/assets/inject/ui-workshop/src/__workshop__/index.tsx +14 -0
  6. package/assets/inject/ui-workshop/src/__workshop__/props.tsx +20 -0
  7. package/assets/inject/ui-workshop/workshop.config.ts +5 -0
  8. package/bin/plugin-kit.js +2 -0
  9. package/dist/_chunks/cli-9f3b6fb3.js +162 -0
  10. package/dist/_chunks/cli-9f3b6fb3.js.map +1 -0
  11. package/dist/_chunks/init-3ad3f71f.js +104 -0
  12. package/dist/_chunks/init-3ad3f71f.js.map +1 -0
  13. package/dist/_chunks/init-ed4b5e78.js +952 -0
  14. package/dist/_chunks/init-ed4b5e78.js.map +1 -0
  15. package/dist/_chunks/inject-c90dc62d.js +49 -0
  16. package/dist/_chunks/inject-c90dc62d.js.map +1 -0
  17. package/dist/_chunks/link-watch-7f10aeab.js +94 -0
  18. package/dist/_chunks/link-watch-7f10aeab.js.map +1 -0
  19. package/dist/_chunks/package-ad838e5c.js +2246 -0
  20. package/dist/_chunks/package-ad838e5c.js.map +1 -0
  21. package/dist/_chunks/package-fa6580ba.js +152 -0
  22. package/dist/_chunks/package-fa6580ba.js.map +1 -0
  23. package/dist/_chunks/ts-89567e57.js +167 -0
  24. package/dist/_chunks/ts-89567e57.js.map +1 -0
  25. package/dist/_chunks/verify-package-27b93f01.js +96 -0
  26. package/dist/_chunks/verify-package-27b93f01.js.map +1 -0
  27. package/dist/_chunks/verify-studio-3633e659.js +75 -0
  28. package/dist/_chunks/verify-studio-3633e659.js.map +1 -0
  29. package/dist/_chunks/version-d6a290e2.js +58 -0
  30. package/dist/_chunks/version-d6a290e2.js.map +1 -0
  31. package/dist/cli.js +9 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -0
  36. package/package.json +30 -17
  37. package/src/actions/init.ts +2 -0
  38. package/src/actions/inject.ts +66 -87
  39. package/src/actions/link-watch.ts +8 -5
  40. package/src/actions/verify/types.ts +0 -23
  41. package/src/actions/verify/validations.ts +65 -39
  42. package/src/actions/verify/verify-common.ts +4 -4
  43. package/src/actions/verify-package.ts +13 -7
  44. package/src/actions/verify-studio.ts +7 -4
  45. package/src/cli.ts +1 -3
  46. package/src/cmds/index.ts +18 -6
  47. package/src/cmds/init.ts +1 -1
  48. package/src/cmds/inject.ts +6 -3
  49. package/src/cmds/link-watch.ts +0 -1
  50. package/src/configs/default-source.ts +10 -14
  51. package/src/configs/eslint.ts +51 -0
  52. package/src/configs/forced-package-versions.ts +8 -7
  53. package/src/configs/git.ts +68 -0
  54. package/src/configs/pkg-config.ts +31 -0
  55. package/src/configs/prettier.ts +11 -0
  56. package/src/configs/tsconfig.ts +79 -0
  57. package/src/constants.ts +2 -0
  58. package/src/index.ts +1 -4
  59. package/src/npm/package.ts +62 -26
  60. package/src/presets/presets.ts +3 -1
  61. package/src/presets/renovatebot.ts +10 -1
  62. package/src/presets/semver-workflow.ts +26 -14
  63. package/src/presets/ui-workshop.ts +97 -0
  64. package/src/presets/ui.ts +68 -0
  65. package/src/sanity/manifest.ts +2 -2
  66. package/src/util/files.ts +8 -8
  67. package/src/util/readme.ts +17 -15
  68. package/src/util/ts.ts +13 -0
  69. package/assets/inject/gitignore +0 -57
  70. package/assets/inject/package.config.template +0 -16
  71. package/assets/inject/template-tsconfig.json +0 -24
  72. package/lib/package.json +0 -128
  73. package/lib/src/actions/init.d.ts +0 -73
  74. package/lib/src/actions/init.js +0 -79
  75. package/lib/src/actions/init.js.map +0 -1
  76. package/lib/src/actions/inject.d.ts +0 -31
  77. package/lib/src/actions/inject.js +0 -350
  78. package/lib/src/actions/inject.js.map +0 -1
  79. package/lib/src/actions/link-watch.d.ts +0 -3
  80. package/lib/src/actions/link-watch.js +0 -87
  81. package/lib/src/actions/link-watch.js.map +0 -1
  82. package/lib/src/actions/verify/types.d.ts +0 -75
  83. package/lib/src/actions/verify/types.js +0 -3
  84. package/lib/src/actions/verify/types.js.map +0 -1
  85. package/lib/src/actions/verify/validations.d.ts +0 -27
  86. package/lib/src/actions/verify/validations.js +0 -410
  87. package/lib/src/actions/verify/validations.js.map +0 -1
  88. package/lib/src/actions/verify/verify-common.d.ts +0 -44
  89. package/lib/src/actions/verify/verify-common.js +0 -89
  90. package/lib/src/actions/verify/verify-common.js.map +0 -1
  91. package/lib/src/actions/verify-package.d.ts +0 -5
  92. package/lib/src/actions/verify-package.js +0 -73
  93. package/lib/src/actions/verify-package.js.map +0 -1
  94. package/lib/src/actions/verify-studio.d.ts +0 -5
  95. package/lib/src/actions/verify-studio.js +0 -55
  96. package/lib/src/actions/verify-studio.js.map +0 -1
  97. package/lib/src/cli.d.ts +0 -2
  98. package/lib/src/cli.js +0 -87
  99. package/lib/src/cli.js.map +0 -1
  100. package/lib/src/cmds/index.d.ts +0 -9
  101. package/lib/src/cmds/index.js +0 -11
  102. package/lib/src/cmds/index.js.map +0 -1
  103. package/lib/src/cmds/init.d.ts +0 -4
  104. package/lib/src/cmds/init.js +0 -95
  105. package/lib/src/cmds/init.js.map +0 -1
  106. package/lib/src/cmds/inject.d.ts +0 -4
  107. package/lib/src/cmds/inject.js +0 -76
  108. package/lib/src/cmds/inject.js.map +0 -1
  109. package/lib/src/cmds/link-watch.d.ts +0 -4
  110. package/lib/src/cmds/link-watch.js +0 -49
  111. package/lib/src/cmds/link-watch.js.map +0 -1
  112. package/lib/src/cmds/verify-package.d.ts +0 -4
  113. package/lib/src/cmds/verify-package.js +0 -38
  114. package/lib/src/cmds/verify-package.js.map +0 -1
  115. package/lib/src/cmds/verify-studio.d.ts +0 -4
  116. package/lib/src/cmds/verify-studio.js +0 -38
  117. package/lib/src/cmds/verify-studio.js.map +0 -1
  118. package/lib/src/cmds/verify.d.ts +0 -0
  119. package/lib/src/cmds/verify.js +0 -42
  120. package/lib/src/cmds/verify.js.map +0 -1
  121. package/lib/src/cmds/version.d.ts +0 -4
  122. package/lib/src/cmds/version.js +0 -55
  123. package/lib/src/cmds/version.js.map +0 -1
  124. package/lib/src/configs/banned-packages.d.ts +0 -2
  125. package/lib/src/configs/banned-packages.js +0 -30
  126. package/lib/src/configs/banned-packages.js.map +0 -1
  127. package/lib/src/configs/buildExtensions.d.ts +0 -1
  128. package/lib/src/configs/buildExtensions.js +0 -5
  129. package/lib/src/configs/buildExtensions.js.map +0 -1
  130. package/lib/src/configs/default-source.d.ts +0 -3
  131. package/lib/src/configs/default-source.js +0 -70
  132. package/lib/src/configs/default-source.js.map +0 -1
  133. package/lib/src/configs/forced-package-versions.d.ts +0 -16
  134. package/lib/src/configs/forced-package-versions.js +0 -14
  135. package/lib/src/configs/forced-package-versions.js.map +0 -1
  136. package/lib/src/configs/uselessFiles.d.ts +0 -1
  137. package/lib/src/configs/uselessFiles.js +0 -33
  138. package/lib/src/configs/uselessFiles.js.map +0 -1
  139. package/lib/src/constants.d.ts +0 -11
  140. package/lib/src/constants.js +0 -15
  141. package/lib/src/constants.js.map +0 -1
  142. package/lib/src/dependencies/find.d.ts +0 -0
  143. package/lib/src/dependencies/find.js +0 -195
  144. package/lib/src/dependencies/find.js.map +0 -1
  145. package/lib/src/dependencies/import-linter.d.ts +0 -3
  146. package/lib/src/dependencies/import-linter.js +0 -112
  147. package/lib/src/dependencies/import-linter.js.map +0 -1
  148. package/lib/src/index.d.ts +0 -2
  149. package/lib/src/index.js +0 -6
  150. package/lib/src/index.js.map +0 -1
  151. package/lib/src/npm/manager.d.ts +0 -7
  152. package/lib/src/npm/manager.js +0 -62
  153. package/lib/src/npm/manager.js.map +0 -1
  154. package/lib/src/npm/package.d.ts +0 -11
  155. package/lib/src/npm/package.js +0 -302
  156. package/lib/src/npm/package.js.map +0 -1
  157. package/lib/src/npm/publish.d.ts +0 -1
  158. package/lib/src/npm/publish.js +0 -14
  159. package/lib/src/npm/publish.js.map +0 -1
  160. package/lib/src/npm/resolveLatestVersions.d.ts +0 -3
  161. package/lib/src/npm/resolveLatestVersions.js +0 -37
  162. package/lib/src/npm/resolveLatestVersions.js.map +0 -1
  163. package/lib/src/presets/presets.d.ts +0 -8
  164. package/lib/src/presets/presets.js +0 -52
  165. package/lib/src/presets/presets.js.map +0 -1
  166. package/lib/src/presets/renovatebot.d.ts +0 -2
  167. package/lib/src/presets/renovatebot.js +0 -24
  168. package/lib/src/presets/renovatebot.js.map +0 -1
  169. package/lib/src/presets/semver-workflow.d.ts +0 -8
  170. package/lib/src/presets/semver-workflow.js +0 -166
  171. package/lib/src/presets/semver-workflow.js.map +0 -1
  172. package/lib/src/sanity/manifest.d.ts +0 -48
  173. package/lib/src/sanity/manifest.js +0 -263
  174. package/lib/src/sanity/manifest.js.map +0 -1
  175. package/lib/src/sharedFlags.d.ts +0 -15
  176. package/lib/src/sharedFlags.js +0 -17
  177. package/lib/src/sharedFlags.js.map +0 -1
  178. package/lib/src/util/command-parser.d.ts +0 -9
  179. package/lib/src/util/command-parser.js +0 -46
  180. package/lib/src/util/command-parser.js.map +0 -1
  181. package/lib/src/util/errorToUndefined.d.ts +0 -1
  182. package/lib/src/util/errorToUndefined.js +0 -11
  183. package/lib/src/util/errorToUndefined.js.map +0 -1
  184. package/lib/src/util/files.d.ts +0 -36
  185. package/lib/src/util/files.js +0 -264
  186. package/lib/src/util/files.js.map +0 -1
  187. package/lib/src/util/log.d.ts +0 -14
  188. package/lib/src/util/log.js +0 -36
  189. package/lib/src/util/log.js.map +0 -1
  190. package/lib/src/util/prompt.d.ts +0 -14
  191. package/lib/src/util/prompt.js +0 -75
  192. package/lib/src/util/prompt.js.map +0 -1
  193. package/lib/src/util/readme.d.ts +0 -8
  194. package/lib/src/util/readme.js +0 -92
  195. package/lib/src/util/readme.js.map +0 -1
  196. package/lib/src/util/request.d.ts +0 -1
  197. package/lib/src/util/request.js +0 -19
  198. package/lib/src/util/request.js.map +0 -1
  199. package/lib/src/util/user.d.ts +0 -13
  200. package/lib/src/util/user.js +0 -111
  201. package/lib/src/util/user.js.map +0 -1
  202. package/lib/test/cli.test.d.ts +0 -1
  203. package/lib/test/cli.test.js +0 -64
  204. package/lib/test/cli.test.js.map +0 -1
  205. package/lib/test/fixture-utils.d.ts +0 -25
  206. package/lib/test/fixture-utils.js +0 -67
  207. package/lib/test/fixture-utils.js.map +0 -1
  208. package/lib/test/init-verify-build.test.d.ts +0 -1
  209. package/lib/test/init-verify-build.test.js +0 -68
  210. package/lib/test/init-verify-build.test.js.map +0 -1
  211. package/lib/test/init.test.d.ts +0 -1
  212. package/lib/test/init.test.js +0 -169
  213. package/lib/test/init.test.js.map +0 -1
  214. package/lib/test/inject.test.d.ts +0 -1
  215. package/lib/test/inject.test.js +0 -75
  216. package/lib/test/inject.test.js.map +0 -1
  217. package/lib/test/run-test-command.d.ts +0 -1
  218. package/lib/test/run-test-command.js +0 -6
  219. package/lib/test/run-test-command.js.map +0 -1
  220. package/lib/test/semver-workflow.test.d.ts +0 -1
  221. package/lib/test/semver-workflow.test.js +0 -93
  222. package/lib/test/semver-workflow.test.js.map +0 -1
  223. package/lib/test/verify-package.test.d.ts +0 -1
  224. package/lib/test/verify-package.test.js +0 -87
  225. package/lib/test/verify-package.test.js.map +0 -1
  226. package/lib/test/version.test.d.ts +0 -1
  227. package/lib/test/version.test.js +0 -48
  228. package/lib/test/version.test.js.map +0 -1
@@ -0,0 +1,952 @@
1
+ 'use strict';
2
+
3
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14;
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
8
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
9
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
10
+ var path = require('path');
11
+ var licenses = require('@rexxars/choosealicense-list');
12
+ var gitRemoteOriginUrl = require('git-remote-origin-url');
13
+ var cli = require('./cli-9f3b6fb3.js');
14
+ var xdgBasedir = require('xdg-basedir');
15
+ var gitUserInfo = require('git-user-info');
16
+ var emailValidator = require('email-validator');
17
+ var _package$1 = require('./package-ad838e5c.js');
18
+ var getIt = require('get-it');
19
+ var middleware = require('get-it/middleware');
20
+ var _package = require('./package-fa6580ba.js');
21
+ var outdent = require('outdent');
22
+ var chalk = require('chalk');
23
+ function _interopDefaultCompat(e) {
24
+ return e && typeof e === 'object' && 'default' in e ? e : {
25
+ default: e
26
+ };
27
+ }
28
+ var path__default = /*#__PURE__*/_interopDefaultCompat(path);
29
+ var licenses__default = /*#__PURE__*/_interopDefaultCompat(licenses);
30
+ var gitRemoteOriginUrl__default = /*#__PURE__*/_interopDefaultCompat(gitRemoteOriginUrl);
31
+ var xdgBasedir__default = /*#__PURE__*/_interopDefaultCompat(xdgBasedir);
32
+ var getIt__default = /*#__PURE__*/_interopDefaultCompat(getIt);
33
+ var outdent__default = /*#__PURE__*/_interopDefaultCompat(outdent);
34
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
35
+ const request = getIt__default.default([middleware.promise({
36
+ onlyBody: true
37
+ }), middleware.jsonRequest(), middleware.jsonResponse(), middleware.httpErrors(), middleware.headers({
38
+ "User-Agent": "".concat(_package.pkg.name, "@").concat(_package.pkg.version)
39
+ })]);
40
+ async function getUserInfo(_ref, pkg) {
41
+ var _flags$author;
42
+ let {
43
+ requireUserConfirmation,
44
+ flags
45
+ } = _ref;
46
+ const userInfo = getPackageUserInfo({
47
+ author: (_flags$author = flags.author) !== null && _flags$author !== void 0 ? _flags$author : pkg == null ? void 0 : pkg.author
48
+ }) || (await getSanityUserInfo()) || (await getGitUserInfo());
49
+ if (requireUserConfirmation) {
50
+ return promptForInfo(userInfo);
51
+ }
52
+ return userInfo;
53
+ }
54
+ function getPackageUserInfo(pkg) {
55
+ let author = pkg == null ? void 0 : pkg.author;
56
+ if (!author) {
57
+ return void 0;
58
+ }
59
+ if (author && typeof author !== "string") {
60
+ return author;
61
+ } else if (!author.includes("@")) {
62
+ return {
63
+ name: author
64
+ };
65
+ }
66
+ const [pre, ...post] = author.replace(/[<>[\]]/g, "").split(/@/);
67
+ const nameParts = pre.split(/\s+/);
68
+ const email = [nameParts[nameParts.length - 1], ...post].join("@");
69
+ const name = nameParts.slice(0, -1).join(" ");
70
+ return {
71
+ name,
72
+ email
73
+ };
74
+ }
75
+ async function promptForInfo(defValue) {
76
+ const name = await _package$1.prompt("Author name", {
77
+ filter: filterString,
78
+ default: defValue && defValue.name,
79
+ validate: requiredString
80
+ });
81
+ const email = await _package$1.prompt("Author email", {
82
+ filter: filterString,
83
+ default: defValue && defValue.email,
84
+ validate: validOrEmptyEmail
85
+ });
86
+ return {
87
+ name,
88
+ email
89
+ };
90
+ }
91
+ async function getSanityUserInfo() {
92
+ try {
93
+ var _xdgBasedir__default$;
94
+ const data = await _package$1.readJsonFile(path__default.default.join((_xdgBasedir__default$ = xdgBasedir__default.default.config) !== null && _xdgBasedir__default$ !== void 0 ? _xdgBasedir__default$ : "", "sanity", "config.json"));
95
+ const token = data == null ? void 0 : data.authToken;
96
+ if (!token) {
97
+ return void 0;
98
+ }
99
+ const user = await request({
100
+ url: "https://api.sanity.io/v1/users/me",
101
+ headers: {
102
+ Authorization: "Bearer ".concat(token)
103
+ }
104
+ });
105
+ if (!user) {
106
+ return void 0;
107
+ }
108
+ const {
109
+ name,
110
+ email
111
+ } = user;
112
+ return {
113
+ name,
114
+ email
115
+ };
116
+ } catch (err) {
117
+ return void 0;
118
+ }
119
+ }
120
+ async function getGitUserInfo() {
121
+ const user = await gitUserInfo.getGitUserInfo();
122
+ return user ? {
123
+ name: user.name,
124
+ email: user.email
125
+ } : void 0;
126
+ }
127
+ function filterString(val) {
128
+ return (val || "").trim();
129
+ }
130
+ function requiredString(value) {
131
+ return value.length > 1 ? true : "Required";
132
+ }
133
+ function validOrEmptyEmail(value) {
134
+ if (!value) {
135
+ return true;
136
+ }
137
+ return emailValidator.validate(value) ? true : "Must either be a valid email or empty";
138
+ }
139
+ function generateReadme(data) {
140
+ const {
141
+ user,
142
+ pluginName,
143
+ license,
144
+ description
145
+ } = data;
146
+ return outdent__default.default(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n # ", "\n\n ", "\n\n ", "\n\n ## Usage\n\n Add it as a plugin in `sanity.config.ts` (or .js):\n\n ```ts\n import {defineConfig} from 'sanity'\n import {myPlugin} from '", "'\n\n export default defineConfig({\n //...\n plugins: [myPlugin({})],\n })\n ```\n\n ", "\n ", "\n "], ["\n # ", "\n\n ", "\n\n ", "\n\n ## Usage\n\n Add it as a plugin in \\`sanity.config.ts\\` (or .js):\n\n \\`\\`\\`ts\n import {defineConfig} from 'sanity'\n import {myPlugin} from '", "'\n\n export default defineConfig({\n //...\n plugins: [myPlugin({})],\n })\n \\`\\`\\`\n\n ", "\n ", "\n "])), pluginName, v3BannerNotice(), installationSnippet(pluginName !== null && pluginName !== void 0 ? pluginName : "unknown"), pluginName, getLicenseText(license == null ? void 0 : license.id, (user == null ? void 0 : user.name) ? user : void 0), developTestSnippet()) + "\n";
147
+ }
148
+ function v3BannerNotice() {
149
+ return "> This is a **Sanity Studio v3** plugin.";
150
+ }
151
+ function installationSnippet(packageName) {
152
+ return outdent__default.default(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n ## Installation\n\n ```sh\n npm install ", "\n ```\n "], ["\n ## Installation\n\n \\`\\`\\`sh\n npm install ", "\n \\`\\`\\`\n "])), packageName);
153
+ }
154
+ function developTestSnippet() {
155
+ return outdent__default.default(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n ## Develop & test\n\n This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)\n with default configuration for build & watch scripts.\n\n See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)\n on how to run this plugin with hotreload in the studio.\n "])));
156
+ }
157
+ function getLicenseText(licenseId, user) {
158
+ if (!licenseId) {
159
+ return "";
160
+ }
161
+ let licenseName = licenses__default.default.find(licenseId).title;
162
+ licenseName = licenseName == null ? void 0 : licenseName.replace(/\s+license$/i, "");
163
+ let licenseText = "## License\n";
164
+ if (licenseName && (user == null ? void 0 : user.name)) {
165
+ licenseText = "".concat(licenseText, "\n[").concat(licenseName, "](LICENSE) \xA9 ").concat(user == null ? void 0 : user.name, "\n");
166
+ } else if (licenseName) {
167
+ licenseText = "".concat(licenseText, "\n[").concat(licenseName, "](LICENSE)\n");
168
+ } else {
169
+ licenseText = "".concat(licenseText, "\nSee [LICENSE](LICENSE)");
170
+ }
171
+ return licenseText;
172
+ }
173
+ function isDefaultGitHubReadme(readme) {
174
+ if (!readme) {
175
+ return false;
176
+ }
177
+ const lines = readme.split("\n", 20).filter(Boolean);
178
+ return lines.length <= 2 && lines[0].startsWith("#");
179
+ }
180
+ const semverWorkflowPreset = {
181
+ name: "semver-workflow",
182
+ description: "Files and dependencies for conventional-commits, github workflow and semantic-release.",
183
+ apply: applyPreset$3
184
+ };
185
+ const info = function (write, msg) {
186
+ for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
187
+ args[_key - 2] = arguments[_key];
188
+ }
189
+ return write && cli.log.info(msg, ...args);
190
+ };
191
+ async function applyPreset$3(options) {
192
+ await writeAssets(semverWorkflowFiles(), options);
193
+ await addPrepareScript(options);
194
+ await addDevDependencies$2(options);
195
+ await updateReadme(options);
196
+ }
197
+ async function addPrepareScript(options) {
198
+ const pkg = await _package$1.getPackage(options);
199
+ const didWrite = await _package$1.addPackageJsonScripts(pkg, options, scripts => {
200
+ scripts.prepare = _package$1.addScript("husky install", scripts.prepare);
201
+ return scripts;
202
+ });
203
+ info(didWrite, "Added prepare script to package.json");
204
+ }
205
+ async function addDevDependencies$2(options) {
206
+ const pkg = await _package$1.getPackage(options);
207
+ const devDeps = _package$1.sortKeys(_objectSpread(_objectSpread({}, pkg.devDependencies), await semverWorkflowDependencies()));
208
+ const newPkg = _objectSpread({}, pkg);
209
+ newPkg.devDependencies = devDeps;
210
+ await _package$1.writePackageJsonDirect(newPkg, options);
211
+ cli.log.info("Updated devDependencies.");
212
+ cli.log.info(chalk__default.default.green(outdent__default.default(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n semantic-release preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/semver-workflow.md#manual-steps-after-inject\n to finalize configuration for this preset.\n "]))).trim()));
213
+ }
214
+ async function updateReadme(options) {
215
+ var _await$_package$1$rea;
216
+ const {
217
+ basePath
218
+ } = options;
219
+ const readmePath = path__default.default.join(basePath, "README.md");
220
+ const readme = (_await$_package$1$rea = await _package$1.readFile(readmePath, "utf8").catch(_package$1.errorToUndefined)) !== null && _await$_package$1$rea !== void 0 ? _await$_package$1$rea : "";
221
+ const {
222
+ v3Banner,
223
+ install,
224
+ usage,
225
+ developTest,
226
+ license,
227
+ releaseSnippet
228
+ } = await readmeSnippets(options);
229
+ const prependSections = missingSections(readme, [v3Banner, install, usage]);
230
+ const appendSections = missingSections(readme, [license, developTest, releaseSnippet]);
231
+ if (prependSections.length || appendSections.length) {
232
+ const updatedReadme = [...prependSections, readme, ...appendSections].filter(Boolean).join("\n\n");
233
+ await _package$1.writeFile(readmePath, updatedReadme, {
234
+ encoding: "utf8"
235
+ });
236
+ cli.log.info("Updated README. Please review the changes.");
237
+ }
238
+ }
239
+ async function readmeSnippets(options) {
240
+ var _pkg$name;
241
+ const pkg = await _package$1.getPackage(options);
242
+ const user = await getUserInfo(options, pkg);
243
+ const bestEffortUrl = readmeBaseurl(pkg);
244
+ const install = installationSnippet((_pkg$name = pkg.name) !== null && _pkg$name !== void 0 ? _pkg$name : "unknown");
245
+ const usage = outdent__default.default(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n ## Usage\n "])));
246
+ const license = getLicenseText(typeof pkg.license === "string" ? pkg.license : void 0, user);
247
+ const releaseSnippet = outdent__default.default(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n ### Release new version\n\n Run [\"CI & Release\" workflow](", "/actions/workflows/main.yml).\n Make sure to select the main branch and check \"Release new version\".\n\n Semantic release will only release on configured branches, so it is safe to run release on any branch.\n "])), bestEffortUrl);
248
+ return {
249
+ v3Banner: v3BannerNotice(),
250
+ install,
251
+ usage,
252
+ license,
253
+ developTest: developTestSnippet(),
254
+ releaseSnippet
255
+ };
256
+ }
257
+ function missingSections(readme, sections) {
258
+ return sections.filter(section => !closeEnough(section, readme));
259
+ }
260
+ function closeEnough(a, b) {
261
+ const aLines = a.split("\n");
262
+ const bLines = b.split("\n");
263
+ const matchingLines = aLines.filter(line => bLines.find(bLine => bLine === line)).length;
264
+ const isCloseEnough = matchingLines >= aLines.length * 0.5;
265
+ return isCloseEnough;
266
+ }
267
+ function semverWorkflowFiles() {
268
+ const base = [{
269
+ type: "copy",
270
+ from: [".github", "workflows", "main.yml"],
271
+ to: [".github", "workflows", "main.yml"]
272
+ }, {
273
+ type: "copy",
274
+ from: [".husky", "commit-msg"],
275
+ to: [".husky", "commit-msg"]
276
+ }, {
277
+ type: "copy",
278
+ from: [".husky", "pre-commit"],
279
+ to: [".husky", "pre-commit"]
280
+ }, {
281
+ type: "copy",
282
+ from: [".releaserc.json"],
283
+ to: ".releaserc.json"
284
+ }, {
285
+ type: "copy",
286
+ from: ["npmrc"],
287
+ to: ".npmrc"
288
+ }, {
289
+ type: "copy",
290
+ from: ["commitlint.template.js"],
291
+ to: "commitlint.config.js"
292
+ }, {
293
+ type: "copy",
294
+ from: ["lint-staged.template.js"],
295
+ to: "lint-staged.config.js"
296
+ }];
297
+ return base.map(fromTo => {
298
+ if (fromTo.type === "copy") {
299
+ return _objectSpread(_objectSpread({}, fromTo), {}, {
300
+ from: ["semver-workflow", ...fromTo.from]
301
+ });
302
+ }
303
+ return fromTo;
304
+ });
305
+ }
306
+ async function semverWorkflowDependencies() {
307
+ return _package$1.resolveLatestVersions(["@commitlint/cli", "@commitlint/config-conventional", "@sanity/semantic-release-preset", "husky", "lint-staged"]);
308
+ }
309
+ function readmeBaseurl(pkg) {
310
+ var _ref2, _ref3;
311
+ var _a;
312
+ return ((_ref2 = (_ref3 = (_a = pkg.repository) == null ? void 0 : _a.url) !== null && _ref3 !== void 0 ? _ref3 : pkg.homepage) !== null && _ref2 !== void 0 ? _ref2 : "TODO").replace(/.+:\/\//g, "https://").replace(/\.git/g, "").replace(/git@github.com\//g, "github.com/").replace(/git@github.com:/g, "https://github.com/").replace(/#.+/g, "");
313
+ }
314
+ const renovatePreset = {
315
+ name: "renovatebot",
316
+ description: "Files to enable renovatebot.",
317
+ apply: applyPreset$2
318
+ };
319
+ async function applyPreset$2(options) {
320
+ await writeAssets([{
321
+ type: "copy",
322
+ from: ["renovatebot", "renovate.json"],
323
+ to: "renovate.json"
324
+ }], options);
325
+ }
326
+ const ui = {
327
+ name: "ui",
328
+ description: "`@sanity/ui` and dependencies",
329
+ apply: applyPreset$1
330
+ };
331
+ async function applyPreset$1(options) {
332
+ await addDependencies(options);
333
+ await addDevDependencies$1(options);
334
+ cli.log.info(chalk__default.default.green("ui preset injected"));
335
+ }
336
+ async function addDependencies(options) {
337
+ const pkg = await _package$1.getPackage(options);
338
+ const newDeps = _package$1.sortKeys(_package$1.forceDependencyVersions(_objectSpread(_objectSpread({}, pkg.dependencies), await resolveDependencyList()), _package$1.forcedPackageVersions));
339
+ const newPkg = _objectSpread({}, pkg);
340
+ newPkg.dependencies = newDeps;
341
+ await _package$1.writePackageJsonDirect(newPkg, options);
342
+ cli.log.info("Updated dependencies.");
343
+ }
344
+ async function addDevDependencies$1(options) {
345
+ const pkg = await _package$1.getPackage(options);
346
+ const newDeps = _package$1.sortKeys(_package$1.forceDependencyVersions(_objectSpread(_objectSpread({}, pkg.devDependencies), await resolveDevDependencyList()), _package$1.forcedDevPackageVersions));
347
+ const newPkg = _objectSpread({}, pkg);
348
+ newPkg.devDependencies = newDeps;
349
+ await _package$1.writePackageJsonDirect(newPkg, options);
350
+ cli.log.info("Updated devDependencies.");
351
+ }
352
+ async function resolveDependencyList() {
353
+ return _package$1.resolveLatestVersions(["@sanity/icons", "@sanity/ui"]);
354
+ }
355
+ async function resolveDevDependencyList() {
356
+ return _package$1.resolveLatestVersions(["react", "react-dom", "react-is", "styled-components"]);
357
+ }
358
+ const uiWorkshop = {
359
+ name: "ui-workshop",
360
+ description: "Files for testing custom components with @sanity/ui-workshop",
361
+ apply: applyPreset
362
+ };
363
+ async function applyPreset(options) {
364
+ await writeAssets(files(), options);
365
+ await addDevDependencies(options);
366
+ await updateGitIgnore(options);
367
+ cli.log.info(chalk__default.default.green(outdent__default.default(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n ui-workshop preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/ui-workshop.md#manual-steps-after-inject\n to finalize configuration for this preset.\n "]))).trim()));
368
+ }
369
+ function files() {
370
+ const base = [{
371
+ type: "copy",
372
+ from: ["workshop.config.ts"],
373
+ to: ["workshop.config.ts"]
374
+ }, {
375
+ type: "copy",
376
+ from: ["src", "CustomField.tsx"],
377
+ to: ["src", "CustomField.tsx"]
378
+ }, {
379
+ type: "copy",
380
+ from: ["src", "__workshop__", "index.tsx"],
381
+ to: ["src", "__workshop__", "index.tsx"]
382
+ }, {
383
+ type: "copy",
384
+ from: ["src", "__workshop__", "props.tsx"],
385
+ to: ["src", "__workshop__", "props.tsx"]
386
+ }];
387
+ return base.map(fromTo => {
388
+ if (fromTo.type === "copy") {
389
+ return _objectSpread(_objectSpread({}, fromTo), {}, {
390
+ from: ["ui-workshop", ...fromTo.from]
391
+ });
392
+ }
393
+ return fromTo;
394
+ });
395
+ }
396
+ async function updateGitIgnore(options) {
397
+ var _await$_package$1$rea2;
398
+ const {
399
+ basePath
400
+ } = options;
401
+ const gitignorePath = path__default.default.join(basePath, ".gitignore");
402
+ let gitignore = (_await$_package$1$rea2 = await _package$1.readFile(gitignorePath, "utf8").catch(_package$1.errorToUndefined)) !== null && _await$_package$1$rea2 !== void 0 ? _await$_package$1$rea2 : "";
403
+ const value = ".workshop";
404
+ if (gitignore.includes(value)) {
405
+ return;
406
+ }
407
+ gitignore += "\n\n".concat(value);
408
+ await _package$1.writeFile(gitignorePath, gitignore, {
409
+ encoding: "utf8"
410
+ });
411
+ }
412
+ async function addDevDependencies(options) {
413
+ const pkg = await _package$1.getPackage(options);
414
+ const devDeps = _package$1.sortKeys(_objectSpread(_objectSpread({}, pkg.devDependencies), await devDependencies()));
415
+ const newPkg = _objectSpread({}, pkg);
416
+ newPkg.devDependencies = devDeps;
417
+ await _package$1.writePackageJsonDirect(newPkg, options);
418
+ cli.log.info("Updated devDependencies.");
419
+ }
420
+ async function devDependencies() {
421
+ return _package$1.resolveLatestVersions(["@sanity/ui-workshop", "@sanity/icons", "@sanity/ui", "react", "react-dom", "styled-components"]);
422
+ }
423
+ const presets = [semverWorkflowPreset, renovatePreset, ui, uiWorkshop];
424
+ const presetNames = presets.map(p => p == null ? void 0 : p.name);
425
+ function presetHelpList(padStart) {
426
+ return presets.map(p => "".concat("".padStart(padStart)).concat(p.name.padEnd(20)).concat(p.description)).join("\n");
427
+ }
428
+ async function injectPresets(options) {
429
+ var _a;
430
+ if (options.flags.presetOnly && !((_a = options.flags.preset) == null ? void 0 : _a.length)) {
431
+ throw new Error("--preset-only, but no --preset [preset-name] was provided.");
432
+ }
433
+ const applyPresets = presetsFromInput(options.flags.preset);
434
+ for (const preset of applyPresets) {
435
+ await preset.apply(options);
436
+ }
437
+ }
438
+ function presetsFromInput(inputPresets) {
439
+ if (!inputPresets) {
440
+ return [];
441
+ }
442
+ const unknownPresets = inputPresets.filter(p => !presetNames.includes(p));
443
+ if (unknownPresets.length) {
444
+ throw new Error("Unknown --preset(s): [".concat(unknownPresets.join(", "), "]. Must be one of: [").concat(presetNames.join(", "), "]"));
445
+ }
446
+ return inputPresets.filter(onlyUnique).map(presetName => presets.find(p => p.name === presetName)).filter(p => !!p);
447
+ }
448
+ function onlyUnique(value, index, arr) {
449
+ return arr.indexOf(value) === index;
450
+ }
451
+ function tsconfigTemplate(options) {
452
+ const {
453
+ flags
454
+ } = options;
455
+ return {
456
+ type: "template",
457
+ force: flags.force,
458
+ to: "tsconfig.json",
459
+ value: outdent.outdent(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\", \"./package.config.ts\"],\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"jsx\": \"react-jsx\",\n \"noEmit\": true\n }\n }\n "])))
460
+ };
461
+ }
462
+ function tsconfigTemplateDist(options) {
463
+ const {
464
+ flags,
465
+ outDir
466
+ } = options;
467
+ return {
468
+ type: "template",
469
+ force: flags.force,
470
+ to: "tsconfig.".concat(outDir, ".json"),
471
+ value: outdent.outdent(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\"],\n \"exclude\": [\n \"./src/**/__fixtures__\",\n \"./src/**/__mocks__\",\n \"./src/**/*.test.ts\",\n \"./src/**/*.test.tsx\"\n ],\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"outDir\": \"./", "\",\n \"jsx\": \"react-jsx\",\n \"emitDeclarationOnly\": true\n }\n }\n "])), outDir)
472
+ };
473
+ }
474
+ function tsconfigTemplateSettings(options) {
475
+ const {
476
+ flags
477
+ } = options;
478
+ return {
479
+ type: "template",
480
+ force: flags.force,
481
+ to: "tsconfig.settings.json",
482
+ value: outdent.outdent(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n {\n \"compilerOptions\": {\n \"moduleResolution\": \"node\",\n \"target\": \"esnext\",\n \"module\": \"esnext\",\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n \"esModuleInterop\": true,\n \"strict\": true,\n \"downlevelIteration\": true,\n \"declaration\": true,\n \"allowSyntheticDefaultImports\": true,\n \"skipLibCheck\": true,\n \"isolatedModules\": true\n }\n }\n "])))
483
+ };
484
+ }
485
+ function pkgConfigTemplate(options) {
486
+ const {
487
+ flags,
488
+ outDir
489
+ } = options;
490
+ return {
491
+ type: "template",
492
+ force: flags.force,
493
+ to: flags.typescript ? "package.config.ts" : "package.config.js",
494
+ value: outdent.outdent(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n import {defineConfig} from '@sanity/pkg-utils'\n\n export default defineConfig({\n legacyExports: true,\n tsconfig: 'tsconfig.", ".json',\n\n // Remove this block to enable strict export validation\n extract: {\n rules: {\n 'ae-forgotten-export': 'off',\n 'ae-incompatible-release-tags': 'off',\n 'ae-internal-missing-underscore': 'off',\n 'ae-missing-release-tag': 'off',\n },\n },\n })\n "])), outDir)
495
+ };
496
+ }
497
+ function gitignoreTemplate() {
498
+ return {
499
+ type: "template",
500
+ to: ".gitignore",
501
+ value: outdent.outdent(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n # Logs\n logs\n *.log\n npm-debug.log*\n\n # Runtime data\n pids\n *.pid\n *.seed\n\n # Directory for instrumented libs generated by jscoverage/JSCover\n lib-cov\n\n # Coverage directory used by tools like istanbul\n coverage\n\n # nyc test coverage\n .nyc_output\n\n # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n .grunt\n\n # node-waf configuration\n .lock-wscript\n\n # Compiled binary addons (http://nodejs.org/api/addons.html)\n build/Release\n\n # Dependency directories\n node_modules\n jspm_packages\n\n # Optional npm cache directory\n .npm\n\n # Optional REPL history\n .node_repl_history\n\n # macOS finder cache file\n .DS_Store\n\n # VS Code settings\n .vscode\n\n # IntelliJ\n .idea\n *.iml\n\n # Cache\n .cache\n\n # Yalc\n .yalc\n yalc.lock\n\n # npm package zips\n *.tgz\n "])))
502
+ };
503
+ }
504
+ function eslintrcTemplate(options) {
505
+ const {
506
+ flags
507
+ } = options;
508
+ const eslintConfig = {
509
+ root: true,
510
+ env: {
511
+ node: true,
512
+ browser: true
513
+ },
514
+ extends: ["sanity", flags.typescript && "sanity/typescript", "sanity/react", "plugin:react-hooks/recommended", flags.prettier && "plugin:prettier/recommended", "plugin:react/jsx-runtime"].filter(Boolean)
515
+ };
516
+ return {
517
+ type: "template",
518
+ force: flags.force,
519
+ to: ".eslintrc",
520
+ value: JSON.stringify(eslintConfig, null, 2)
521
+ };
522
+ }
523
+ function eslintignoreTemplate(options) {
524
+ const {
525
+ flags,
526
+ outDir
527
+ } = options;
528
+ const patterns = [".eslintrc.js", "commitlint.config.js", outDir, "lint-staged.config.js", flags.typescript ? "package.config.ts" : "package.config.js", flags.typescript ? "*.js" : ""].filter(Boolean);
529
+ patterns.sort();
530
+ return {
531
+ type: "template",
532
+ force: flags.force,
533
+ to: ".eslintignore",
534
+ value: patterns.join("\n")
535
+ };
536
+ }
537
+ function prettierignoreTemplate(options) {
538
+ const {
539
+ outDir
540
+ } = options;
541
+ return {
542
+ type: "template",
543
+ to: ".prettierignore",
544
+ value: [outDir, "pnpm-lock.yaml", "yarn.lock", "package-lock.json"].join("\n")
545
+ };
546
+ }
547
+ const bannedFields = ["login", "description", "projecturl", "email"];
548
+ const preferredLicenses = ["MIT", "ISC", "BSD-3-Clause"];
549
+ const otherLicenses = Object.keys(licenses__default.default.list).filter(id => {
550
+ const license = licenses__default.default.list[id];
551
+ return !preferredLicenses.includes(id) && !bannedFields.some(field => license.body.includes("[".concat(field, "]")));
552
+ });
553
+ async function inject(options) {
554
+ if (options.flags.presetOnly) {
555
+ cli.log.info("Only apply presets, skipping default inject.");
556
+ } else {
557
+ await injectBase(options);
558
+ }
559
+ await injectPresets(options);
560
+ }
561
+ async function injectBase(options) {
562
+ var _flags$name, _flags$repo;
563
+ var _a;
564
+ const {
565
+ basePath,
566
+ flags,
567
+ requireUserConfirmation
568
+ } = options;
569
+ const info = function (write, msg) {
570
+ for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
571
+ args[_key2 - 2] = arguments[_key2];
572
+ }
573
+ return write && cli.log.info(msg, ...args);
574
+ };
575
+ const pkg = await _package$1.getPackage(options).catch(_package$1.errorToUndefined);
576
+ cli.log.debug("Plugin has package.json: %s", pkg ? "yes" : "no");
577
+ const user = await getUserInfo(options, pkg);
578
+ cli.log.debug("User information: %o", user);
579
+ const pkgName = (_flags$name = flags.name) !== null && _flags$name !== void 0 ? _flags$name : pkg == null ? void 0 : pkg.name;
580
+ const pluginName = requireUserConfirmation || !pkgName ? await _package$1.promptForPackageName(options, pkgName) : pkgName;
581
+ cli.log.debug("Plugin name: %s", pluginName);
582
+ const license = await getLicense(flags, {
583
+ user,
584
+ pluginName,
585
+ pkg,
586
+ requireUserConfirmation
587
+ });
588
+ const licenseChanged = (pkg && pkg.license) !== (license && license.id);
589
+ cli.log.debug("License: %s", license ? license.id : "<none>");
590
+ const description = await getProjectDescription(basePath, pkg, requireUserConfirmation);
591
+ cli.log.debug("Description: %s", description || "<none>");
592
+ const repoUrl = (_flags$repo = flags.repo) !== null && _flags$repo !== void 0 ? _flags$repo : (await gitRemoteOriginUrl__default.default(basePath).catch(_package$1.errorToUndefined)) || ((_a = pkg == null ? void 0 : pkg.repository) == null ? void 0 : _a.url);
593
+ const gitOrigin = requireUserConfirmation ? await _package$1.promptForRepoOrigin(options, repoUrl) : repoUrl;
594
+ cli.log.debug("Remote origin: %s", gitOrigin || "<none>");
595
+ const data = {
596
+ user,
597
+ pluginName,
598
+ license,
599
+ description,
600
+ pkg,
601
+ gitOrigin
602
+ };
603
+ let didWrite;
604
+ const newPkg = await _package$1.writePackageJson(data, options);
605
+ info(newPkg !== pkg, "Wrote package.json");
606
+ data.pkg = newPkg;
607
+ didWrite = await writeLicense(data, options, licenseChanged);
608
+ info(didWrite, "Wrote license file (LICENSE)");
609
+ didWrite = await writeReadme(data, options);
610
+ info(didWrite, "Wrote readme file (README.md)");
611
+ didWrite = await writeStaticAssets(options);
612
+ info(didWrite.length > 0, "Wrote static asset files: %s", didWrite.join(", "));
613
+ didWrite = await _package$1.addBuildScripts(newPkg, options);
614
+ info(didWrite, "Added build scripts to package.json");
615
+ didWrite = await addCompileDirToGitIgnore(data, options);
616
+ info(didWrite, "Added compilation output directory to .gitignore");
617
+ }
618
+ async function writeReadme(data, options) {
619
+ const {
620
+ basePath
621
+ } = options;
622
+ const readmePath = path__default.default.join(basePath, "README.md");
623
+ const readme = await _package$1.readFile(readmePath, "utf8").catch(_package$1.errorToUndefined);
624
+ if (readme && !isDefaultGitHubReadme(readme)) {
625
+ return false;
626
+ }
627
+ await _package$1.writeFileWithOverwritePrompt(readmePath, generateReadme(data), {
628
+ encoding: "utf8",
629
+ force: options.flags.force
630
+ });
631
+ return true;
632
+ }
633
+ async function writeLicense(_ref4, options, licenseChanged) {
634
+ let {
635
+ license
636
+ } = _ref4;
637
+ const {
638
+ basePath,
639
+ flags
640
+ } = options;
641
+ if (flags.license === false || !license) {
642
+ return false;
643
+ }
644
+ const hasLicenseMdFile = await _package$1.fileExists(path__default.default.join(basePath, "LICENSE.md"));
645
+ const licensePath = path__default.default.join(basePath, hasLicenseMdFile ? "LICENSE.md" : "LICENSE");
646
+ await _package$1.writeFileWithOverwritePrompt(licensePath, license.text, {
647
+ encoding: "utf8",
648
+ default: licenseChanged,
649
+ force: flags.force
650
+ });
651
+ return true;
652
+ }
653
+ async function getLicense(flags, _ref5) {
654
+ let {
655
+ user,
656
+ pluginName,
657
+ pkg,
658
+ requireUserConfirmation
659
+ } = _ref5;
660
+ const license = await getLicenseIdentifier(flags, pkg, requireUserConfirmation);
661
+ if (!license) {
662
+ return void 0;
663
+ }
664
+ const text = license.body.replace(/\[fullname\]/g, user == null ? void 0 : user.name).replace(/\[project\]/g, pluginName).replace(/\[year\]/g, new Date().getFullYear());
665
+ return {
666
+ id: license.id,
667
+ text
668
+ };
669
+ }
670
+ async function getLicenseIdentifier(flags, pkg) {
671
+ let requireUserConfirmation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
672
+ if (flags.license === false) {
673
+ return null;
674
+ }
675
+ if (typeof flags.license === "string") {
676
+ const license = licenses__default.default.find("".concat(flags.license));
677
+ if (!license) {
678
+ throw new Error("License \"".concat(flags.license, "\" not found"));
679
+ }
680
+ return license;
681
+ }
682
+ if (pkg && pkg.license && !requireUserConfirmation) {
683
+ const license = licenses__default.default.find("".concat(pkg.license));
684
+ if (license) {
685
+ return license;
686
+ }
687
+ cli.log.warn("package.json contains license \"".concat(pkg.license, "\", which is not recognized"));
688
+ }
689
+ const licenseId = await _package$1.prompt("Which license do you want to use?", {
690
+ default: pkg && pkg.license && licenses__default.default.find(pkg.license) ? pkg.license : preferredLicenses[0],
691
+ choices: [_package$1.prompt.separator(), ...preferredLicenses.map(value => ({
692
+ value,
693
+ name: licenses__default.default.list[value].title
694
+ })), _package$1.prompt.separator(), ...otherLicenses.map(value => ({
695
+ value,
696
+ name: licenses__default.default.list[value].title
697
+ }))]
698
+ });
699
+ return licenses__default.default.find(licenseId);
700
+ }
701
+ async function getProjectDescription(basePath, pkg) {
702
+ var _description;
703
+ let requireUserConfirmation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
704
+ let description = await resolveProjectDescription(basePath, pkg);
705
+ if (requireUserConfirmation) {
706
+ description = await _package$1.prompt("Plugin description", {
707
+ default: description || ""
708
+ });
709
+ }
710
+ return (_description = description) !== null && _description !== void 0 ? _description : "";
711
+ }
712
+ async function resolveProjectDescription(basePath, pkg) {
713
+ if (pkg && typeof pkg.description === "string" && pkg.description.length > 5) {
714
+ return pkg.description;
715
+ }
716
+ try {
717
+ const readmePath = path__default.default.join(basePath, "README.md");
718
+ const readme = await _package$1.readFile(readmePath, "utf8");
719
+ const [title, description] = readme.split("\n").filter(Boolean);
720
+ if (!title || !description || !title.match(/^#\s+\w+/)) {
721
+ return null;
722
+ }
723
+ const unlinked = description.replace(/\[(.*?)\]\(.*?\)/g, "$1");
724
+ if (/^[^#]/.test(unlinked)) {
725
+ return unlinked;
726
+ }
727
+ return null;
728
+ } catch (err) {
729
+ return _package$1.errorToUndefined(err);
730
+ }
731
+ }
732
+ async function writeAssets(injectables, _ref6) {
733
+ let {
734
+ basePath,
735
+ flags
736
+ } = _ref6;
737
+ const assetsDir = await findAssetsDir();
738
+ const from = function () {
739
+ for (var _len3 = arguments.length, segments = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
740
+ segments[_key3] = arguments[_key3];
741
+ }
742
+ return path__default.default.join(assetsDir, "inject", ...segments);
743
+ };
744
+ const to = function () {
745
+ for (var _len4 = arguments.length, segments = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
746
+ segments[_key4] = arguments[_key4];
747
+ }
748
+ return path__default.default.join(basePath, ...segments);
749
+ };
750
+ const writes = [];
751
+ for (const injectable of injectables) {
752
+ if (injectable.type === "copy") {
753
+ const fromPath = asArray(injectable.from);
754
+ const toPath = asArray(injectable.to);
755
+ if (await _package$1.copyFileWithOverwritePrompt(from(...fromPath), to(...toPath), flags)) {
756
+ writes.push(path__default.default.join(...toPath));
757
+ }
758
+ continue;
759
+ }
760
+ if (injectable.type === "template") {
761
+ const toPath = asArray(injectable.to);
762
+ await _package$1.writeFileWithOverwritePrompt(to(...toPath), "".concat(injectable.value.trim(), "\n"), {
763
+ default: "n",
764
+ force: injectable.force || flags.force
765
+ });
766
+ writes.push(path__default.default.join(...toPath));
767
+ continue;
768
+ }
769
+ throw new Error("Unknown operation type \"".concat(injectable.type, "\""));
770
+ }
771
+ return writes;
772
+ }
773
+ async function writeStaticAssets(options) {
774
+ const {
775
+ outDir,
776
+ flags
777
+ } = options;
778
+ const files = [flags.eslint && eslintrcTemplate({
779
+ flags: options.flags
780
+ }), flags.eslint && eslintignoreTemplate({
781
+ outDir,
782
+ flags: options.flags
783
+ }), {
784
+ type: "copy",
785
+ from: "editorconfig",
786
+ to: ".editorconfig"
787
+ }, {
788
+ type: "copy",
789
+ from: "sanity.json",
790
+ to: "sanity.json"
791
+ }, {
792
+ type: "copy",
793
+ from: "v2-incompatible.js.template",
794
+ to: "v2-incompatible.js"
795
+ }, pkgConfigTemplate({
796
+ outDir,
797
+ flags: options.flags
798
+ }), flags.gitignore && gitignoreTemplate(), flags.typescript && tsconfigTemplate({
799
+ flags: options.flags
800
+ }), flags.typescript && tsconfigTemplateDist({
801
+ outDir,
802
+ flags: options.flags
803
+ }), flags.typescript && tsconfigTemplateSettings({
804
+ flags: options.flags
805
+ }), flags.prettier && prettierignoreTemplate({
806
+ outDir
807
+ }), flags.prettier && {
808
+ type: "copy",
809
+ from: "prettierrc.json",
810
+ to: ".prettierrc"
811
+ }].map(f => f ? f : void 0).filter(f => !!f);
812
+ const result = writeAssets(files, options);
813
+ return result;
814
+ }
815
+ function asArray(input) {
816
+ return typeof input === "string" ? [input] : input;
817
+ }
818
+ async function findAssetsDir() {
819
+ let maxBackpaddle = 3;
820
+ let currDir = __dirname;
821
+ let assetsDir = "";
822
+ while (!assetsDir && maxBackpaddle) {
823
+ currDir = path__default.default.join(currDir, "..");
824
+ const assets = path__default.default.join(currDir, "assets");
825
+ if (await _package$1.fileExists(assets)) {
826
+ assetsDir = assets;
827
+ } else {
828
+ maxBackpaddle--;
829
+ }
830
+ }
831
+ if (!assetsDir) {
832
+ throw new Error("Could not find assets directory!");
833
+ }
834
+ return assetsDir;
835
+ }
836
+ async function addCompileDirToGitIgnore(data, options) {
837
+ var _ref7;
838
+ var _a, _b;
839
+ const gitIgnorePath = path__default.default.join(options.basePath, ".gitignore");
840
+ const gitignore = await _package$1.readFile(gitIgnorePath, "utf8").catch(_package$1.errorToUndefined);
841
+ if (!gitignore) {
842
+ return false;
843
+ }
844
+ const output = (_ref7 = (_a = data.pkg) == null ? void 0 : _a.main) !== null && _ref7 !== void 0 ? _ref7 : (_b = data.pkg) == null ? void 0 : _b.module;
845
+ if (!output) {
846
+ return false;
847
+ }
848
+ const ignorePath = output.replace(/^[./]+/, "");
849
+ const ignore = ignorePath.split("/")[0];
850
+ if (!ignore) {
851
+ return false;
852
+ }
853
+ const lines = gitignore.trim().split("\n");
854
+ if (lines.includes(ignore)) {
855
+ return false;
856
+ }
857
+ lines.push("", "# Compiled plugin", ignore);
858
+ await _package$1.writeFile(gitIgnorePath, lines.join("\n") + "\n", {
859
+ encoding: "utf8"
860
+ });
861
+ return true;
862
+ }
863
+ function defaultSourceJs(pkg) {
864
+ return outdent__default.default(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n import {definePlugin} from 'sanity'\n\n /**\n * Usage in sanity.config.js (or .ts)\n *\n * ```js\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '", "'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin({})],\n * })\n * ```\n */\n export const myPlugin = definePlugin((config = {}) => {\n // eslint-disable-next-line no-console\n console.log(`hello from ", "`)\n return {\n name: '", "',\n }\n })\n"], ["\n import {definePlugin} from 'sanity'\n\n /**\n * Usage in sanity.config.js (or .ts)\n *\n * \\`\\`\\`js\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '", "'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin({})],\n * })\n * \\`\\`\\`\n */\n export const myPlugin = definePlugin((config = {}) => {\n // eslint-disable-next-line no-console\n console.log(\\`hello from ", "\\`)\n return {\n name: '", "',\n }\n })\n"])), pkg.name, pkg.name, pkg.name).trimStart() + "\n";
865
+ }
866
+ function defaultSourceTs(pkg) {
867
+ return outdent__default.default(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n import {definePlugin} from 'sanity'\n\n interface MyPluginConfig {\n /* nothing here yet */\n }\n\n /**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '", "'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin()],\n * })\n * ```\n */\n export const myPlugin = definePlugin<MyPluginConfig | void>((config = {}) => {\n // eslint-disable-next-line no-console\n console.log('hello from ", "')\n return {\n name: '", "',\n }\n })\n"], ["\n import {definePlugin} from 'sanity'\n\n interface MyPluginConfig {\n /* nothing here yet */\n }\n\n /**\n * Usage in \\`sanity.config.ts\\` (or .js)\n *\n * \\`\\`\\`ts\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '", "'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin()],\n * })\n * \\`\\`\\`\n */\n export const myPlugin = definePlugin<MyPluginConfig | void>((config = {}) => {\n // eslint-disable-next-line no-console\n console.log('hello from ", "')\n return {\n name: '", "',\n }\n })\n"])), pkg.name, pkg.name, pkg.name).trimStart() + "\n";
868
+ }
869
+ const initFlags = _objectSpread(_objectSpread({}, cli.sharedFlags), {}, {
870
+ scripts: {
871
+ type: "boolean",
872
+ default: true
873
+ },
874
+ eslint: {
875
+ type: "boolean",
876
+ default: true
877
+ },
878
+ typescript: {
879
+ type: "boolean",
880
+ default: true
881
+ },
882
+ prettier: {
883
+ type: "boolean",
884
+ default: true
885
+ },
886
+ license: {
887
+ type: "string"
888
+ },
889
+ editorconfig: {
890
+ type: "boolean",
891
+ default: true
892
+ },
893
+ gitignore: {
894
+ type: "boolean",
895
+ default: true
896
+ },
897
+ force: {
898
+ type: "boolean",
899
+ default: false
900
+ },
901
+ install: {
902
+ type: "boolean",
903
+ default: true
904
+ },
905
+ name: {
906
+ type: "string"
907
+ },
908
+ author: {
909
+ type: "string"
910
+ },
911
+ repo: {
912
+ type: "string"
913
+ },
914
+ presetOnly: {
915
+ type: "boolean",
916
+ default: false
917
+ },
918
+ preset: {
919
+ type: "string",
920
+ isMultiple: true
921
+ }
922
+ });
923
+ async function init(options) {
924
+ let dependencies = {};
925
+ let devDependencies = {};
926
+ let peerDependencies = {};
927
+ await inject(_objectSpread(_objectSpread({}, options), {}, {
928
+ outDir: cli.defaultOutDir,
929
+ requireUserConfirmation: !options.flags.force,
930
+ dependencies,
931
+ devDependencies,
932
+ peerDependencies,
933
+ validate: false
934
+ }));
935
+ const packageJson = await _package$1.getPackage({
936
+ basePath: options.basePath,
937
+ validate: false
938
+ });
939
+ const typescript = options.flags.typescript;
940
+ const source = typescript ? defaultSourceTs(packageJson) : defaultSourceJs(packageJson);
941
+ const filename = typescript ? "index.ts" : "index.js";
942
+ const srcDir = path__default.default.resolve(options.basePath, "src");
943
+ await _package$1.ensureDir(srcDir);
944
+ await _package$1.writeFile(path__default.default.join(srcDir, filename), source, {
945
+ encoding: "utf8"
946
+ });
947
+ }
948
+ exports.init = init;
949
+ exports.initFlags = initFlags;
950
+ exports.inject = inject;
951
+ exports.presetHelpList = presetHelpList;
952
+ //# sourceMappingURL=init-ed4b5e78.js.map