@sanity/plugin-kit 7.0.1 → 8.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.
- package/README.md +83 -6
- package/assets/inject/semver-workflow/.github/workflows/main.yml +3 -3
- package/assets/inject/semver-workflow/commitlint.template.js +1 -1
- package/assets/inject/semver-workflow/lint-staged.template.js +3 -3
- package/dist/{_chunks-es/constants.js → constants-BLTUL_Wd.js} +2 -3
- package/dist/constants-BLTUL_Wd.js.map +1 -0
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/{_chunks-es/init.js → init-BDY7XRmJ.js} +31 -74
- package/dist/init-BDY7XRmJ.js.map +1 -0
- package/dist/{_chunks-es/init2.js → init-v15fyisU.js} +9 -9
- package/dist/init-v15fyisU.js.map +1 -0
- package/dist/{_chunks-es/inject.js → inject-B41UktQ3.js} +10 -10
- package/dist/inject-B41UktQ3.js.map +1 -0
- package/dist/{_chunks-es/link-watch.js → link-watch-B2ixqs1y.js} +6 -6
- package/dist/link-watch-B2ixqs1y.js.map +1 -0
- package/dist/{_chunks-es/load-package-config.js → load-package-config-CNQRvdGW.js} +1 -1
- package/dist/load-package-config-CNQRvdGW.js.map +1 -0
- package/dist/{_chunks-es/log.js → log-DgQL-Rv9.js} +1 -1
- package/dist/log-DgQL-Rv9.js.map +1 -0
- package/dist/oxfmt.d.ts +29 -0
- package/dist/oxfmt.d.ts.map +1 -0
- package/dist/oxfmt.js +46 -0
- package/dist/oxfmt.js.map +1 -0
- package/dist/oxlint.d.ts +35 -0
- package/dist/oxlint.d.ts.map +1 -0
- package/dist/oxlint.js +126 -0
- package/dist/oxlint.js.map +1 -0
- package/dist/{_chunks-es/package.js → package-BrKrShA_.js} +283 -51
- package/dist/package-BrKrShA_.js.map +1 -0
- package/dist/package-z3cLp2Jt.js +4 -0
- package/dist/package-z3cLp2Jt.js.map +1 -0
- package/dist/verify-common-CzG3zw3J.js +39 -0
- package/dist/verify-common-CzG3zw3J.js.map +1 -0
- package/dist/{_chunks-es/verify-package.js → verify-package-B32oCYay.js} +16 -9
- package/dist/verify-package-B32oCYay.js.map +1 -0
- package/dist/{_chunks-es/verify-studio.js → verify-studio-DUoKxnYy.js} +8 -12
- package/dist/verify-studio-DUoKxnYy.js.map +1 -0
- package/dist/{_chunks-es/version.js → version-N9n1cr5G.js} +3 -3
- package/dist/version-N9n1cr5G.js.map +1 -0
- package/package.json +22 -20
- package/assets/inject/prettierrc.json +0 -6
- package/dist/_chunks-es/constants.js.map +0 -1
- package/dist/_chunks-es/init.js.map +0 -1
- package/dist/_chunks-es/init2.js.map +0 -1
- package/dist/_chunks-es/inject.js.map +0 -1
- package/dist/_chunks-es/link-watch.js.map +0 -1
- package/dist/_chunks-es/load-package-config.js.map +0 -1
- package/dist/_chunks-es/log.js.map +0 -1
- package/dist/_chunks-es/package.js.map +0 -1
- package/dist/_chunks-es/package2.js +0 -4
- package/dist/_chunks-es/package2.js.map +0 -1
- package/dist/_chunks-es/verify-common.js +0 -161
- package/dist/_chunks-es/verify-common.js.map +0 -1
- package/dist/_chunks-es/verify-package.js.map +0 -1
- package/dist/_chunks-es/verify-studio.js.map +0 -1
- package/dist/_chunks-es/version.js.map +0 -1
package/README.md
CHANGED
|
@@ -30,6 +30,8 @@ Check the [FAQ](#faq) fro more on these.
|
|
|
30
30
|
|
|
31
31
|
- [Installation](#installation)
|
|
32
32
|
- [Initialize a new plugin](#initialize-a-new-plugin)
|
|
33
|
+
- [Formatting with oxfmt](#formatting-with-oxfmt)
|
|
34
|
+
- [Linting with oxlint](#linting-with-oxlint)
|
|
33
35
|
- [Verify plugin package](#verify-plugin-package)
|
|
34
36
|
- [Upgrading a v2 plugin](#upgrading-a-v2-plugin)
|
|
35
37
|
- [Upgrade help in v2 Studio](#upgrade-help-in-v2-studio)
|
|
@@ -114,6 +116,83 @@ npx @sanity/plugin-kit@latest init --help
|
|
|
114
116
|
|
|
115
117
|
for up-to-date specifics.
|
|
116
118
|
|
|
119
|
+
## Formatting with oxfmt
|
|
120
|
+
|
|
121
|
+
Plugins are formatted with [oxfmt](https://oxc.rs/docs/guide/usage/formatter.html) using a shared
|
|
122
|
+
preset exported as `@sanity/plugin-kit/oxfmt`. `plugin-kit init` sets this up automatically: it adds
|
|
123
|
+
an `oxfmt` devDependency, a `format` script, and an `oxfmt.config.ts` re-exporting the preset:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
export {default} from '@sanity/plugin-kit/oxfmt'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
The config file belongs next to the `package.json` that installs and runs oxfmt. In a monorepo that
|
|
130
|
+
is the workspace root, so every package is formatted the same way; in a standalone plugin repository
|
|
131
|
+
it is the plugin directory itself.
|
|
132
|
+
|
|
133
|
+
Oxfmt has no `extends` mechanism. To customize, spread the preset and override options:
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import pluginKitOxfmt from '@sanity/plugin-kit/oxfmt'
|
|
137
|
+
import {defineConfig} from 'oxfmt'
|
|
138
|
+
|
|
139
|
+
export default defineConfig({
|
|
140
|
+
...pluginKitOxfmt,
|
|
141
|
+
ignorePatterns: [...(pluginKitOxfmt.ignorePatterns ?? []), 'CHANGELOG.md'],
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Note: oxfmt loads TypeScript config files with Node's native TypeScript support, which requires
|
|
146
|
+
Node `^20.19 || >=22.18`.
|
|
147
|
+
|
|
148
|
+
Migrating a plugin from prettier? Remove the prettier config file (custom options can be migrated
|
|
149
|
+
with `npx oxfmt --migrate=prettier`), drop the `prettier`, `prettier-plugin-packagejson` and
|
|
150
|
+
`eslint-plugin-prettier` devDependencies, and add the `oxfmt.config.ts` above.
|
|
151
|
+
|
|
152
|
+
## Linting with oxlint
|
|
153
|
+
|
|
154
|
+
Plugins are linted with [oxlint](https://oxc.rs/docs/guide/usage/linter.html) using a shared config
|
|
155
|
+
exported as `@sanity/plugin-kit/oxlint`. It enables type-aware rules and TypeScript type checking
|
|
156
|
+
(via [oxlint-tsgolint](https://github.com/oxc-project/tsgolint)), treats warnings as errors, and
|
|
157
|
+
turns on the React, React Compiler, import, promise, a11y and unicorn rule sets - the same setup
|
|
158
|
+
the [sanity-io/plugins](https://github.com/sanity-io/plugins) monorepo uses. Because oxlint
|
|
159
|
+
type-checks as part of linting, there is no separate `tsc` step.
|
|
160
|
+
|
|
161
|
+
`plugin-kit init` sets this up automatically: it adds `oxlint` and `oxlint-tsgolint`
|
|
162
|
+
devDependencies, a `lint` script, and an `oxlint.config.ts` re-exporting the shared config:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
export {default} from '@sanity/plugin-kit/oxlint'
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Like the oxfmt config, the `oxlint.config.ts` belongs next to the `package.json` that installs and
|
|
169
|
+
runs oxlint: the workspace root in a monorepo, otherwise the plugin directory. To customize,
|
|
170
|
+
[extend](https://oxc.rs/docs/guide/usage/linter/config.html#extend-shared-configs) the shared
|
|
171
|
+
config and add your own options (`ignorePatterns` do not propagate through `extends`, so spread
|
|
172
|
+
them explicitly when adding your own):
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import sanityPluginKitOxlint from '@sanity/plugin-kit/oxlint'
|
|
176
|
+
import {defineConfig} from 'oxlint'
|
|
177
|
+
|
|
178
|
+
export default defineConfig({
|
|
179
|
+
extends: [sanityPluginKitOxlint],
|
|
180
|
+
ignorePatterns: [...(sanityPluginKitOxlint.ignorePatterns ?? []), 'examples/**'],
|
|
181
|
+
overrides: [
|
|
182
|
+
{
|
|
183
|
+
files: ['test/**'],
|
|
184
|
+
rules: {'no-console': 'off'},
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Note: TypeScript config files require the Node-based `oxlint` package and Node `>=22.18`.
|
|
191
|
+
|
|
192
|
+
Migrating a plugin from eslint? Remove the eslint config files and the eslint devDependencies
|
|
193
|
+
(`eslint`, `eslint-config-*`, `eslint-plugin-*`, `@typescript-eslint/*`), and add the
|
|
194
|
+
`oxlint.config.ts` above.
|
|
195
|
+
|
|
117
196
|
## Verify plugin package
|
|
118
197
|
|
|
119
198
|
Verify that the plugin package is configured correctly by running:
|
|
@@ -131,10 +210,10 @@ Verify that the plugin package is configured correctly by running:
|
|
|
131
210
|
- Check for redundant v2 config:
|
|
132
211
|
- babel
|
|
133
212
|
- the deprecated `@sanity/incompatible-plugin` v2 compatibility shim (`sanity.json` + `v2-incompatible.js`)
|
|
134
|
-
- Check
|
|
213
|
+
- Check that the plugin is formatted with oxfmt using the shared `@sanity/plugin-kit/oxfmt` preset (and that no legacy prettier config remains)
|
|
214
|
+
- Check that the plugin lints with oxlint using the shared `@sanity/plugin-kit/oxlint` config (and that no legacy eslint config remains)
|
|
135
215
|
- Check tsconfig.json settings
|
|
136
216
|
- Check for [SPDX](https://spdx.org/licenses/) compatible license definition
|
|
137
|
-
- If the package uses TypeScript, this will also run `tsc --build` when all other checks have passed
|
|
138
217
|
|
|
139
218
|
Each check will explain why it is needed, steps to fix it and how it can be individually disabled.
|
|
140
219
|
|
|
@@ -167,7 +246,6 @@ This will:
|
|
|
167
246
|
|
|
168
247
|
- Check for `sanity.json,` `sanity.config.(ts|js)` and `sanity.cli.(ts|js)` and advice on how to convert the former to the latter two.
|
|
169
248
|
- Check for sanity dependencies that has changed in v3
|
|
170
|
-
- Check for sanity imports that has changed in v3, using ESlint
|
|
171
249
|
|
|
172
250
|
### Fail fast mode
|
|
173
251
|
|
|
@@ -426,19 +504,18 @@ Provide a sanityPlugin config in package.json (defaults shown):
|
|
|
426
504
|
"packageName": true,
|
|
427
505
|
"esmOnly": true,
|
|
428
506
|
"tsconfig": true,
|
|
429
|
-
"tsc": true,
|
|
430
507
|
"dependencies": true,
|
|
431
508
|
"deprecatedDependencies": true,
|
|
432
509
|
"babelConfig": true,
|
|
433
510
|
"incompatiblePlugin": true,
|
|
434
|
-
"eslintImports": true,
|
|
435
511
|
"scripts": true,
|
|
436
512
|
"pkg-utils": true,
|
|
437
513
|
"nodeEngine": true,
|
|
438
514
|
"studioConfig": true,
|
|
439
515
|
"srcIndex": true,
|
|
440
516
|
"bannedFiles": true,
|
|
441
|
-
"
|
|
517
|
+
"oxfmt": true,
|
|
518
|
+
"oxlint": true
|
|
442
519
|
}
|
|
443
520
|
}
|
|
444
521
|
}
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
name: Lint & Build
|
|
47
47
|
steps:
|
|
48
48
|
- uses: actions/checkout@v7
|
|
49
|
-
- uses: actions/setup-node@
|
|
49
|
+
- uses: actions/setup-node@v7
|
|
50
50
|
with:
|
|
51
51
|
cache: npm
|
|
52
52
|
node-version: lts/*
|
|
@@ -86,7 +86,7 @@ jobs:
|
|
|
86
86
|
git config --global core.autocrlf false
|
|
87
87
|
git config --global core.eol lf
|
|
88
88
|
- uses: actions/checkout@v7
|
|
89
|
-
- uses: actions/setup-node@
|
|
89
|
+
- uses: actions/setup-node@v7
|
|
90
90
|
with:
|
|
91
91
|
cache: npm
|
|
92
92
|
node-version: ${{ matrix.node }}
|
|
@@ -110,7 +110,7 @@ jobs:
|
|
|
110
110
|
# Need to fetch entire commit history to
|
|
111
111
|
# analyze every commit since last release
|
|
112
112
|
fetch-depth: 0
|
|
113
|
-
- uses: actions/setup-node@
|
|
113
|
+
- uses: actions/setup-node@v7
|
|
114
114
|
with:
|
|
115
115
|
cache: npm
|
|
116
116
|
node-version: lts/*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
'**/*.{
|
|
3
|
-
'**/*.{ts,tsx}': ['
|
|
1
|
+
export default {
|
|
2
|
+
'**/*.{json,jsonc,md}': ['oxfmt'],
|
|
3
|
+
'**/*.{js,jsx,ts,tsx}': ['oxfmt', 'oxlint'],
|
|
4
4
|
}
|
|
@@ -4,9 +4,8 @@ const cliName = "@sanity/plugin-kit", urls = {
|
|
|
4
4
|
migrationGuidePlugin: "https://beta.sanity.io/docs/platform/v2-to-v3/plugins",
|
|
5
5
|
pluginReadme: "https://github.com/sanity-io/plugin-kit",
|
|
6
6
|
incompatiblePlugin: "https://github.com/sanity-io/incompatible-plugin",
|
|
7
|
-
sanityExchange: "https://www.sanity.io/exchange"
|
|
8
|
-
linterPackage: "https://github.com/sanity-io/eslint-config-no-v2-imports"
|
|
7
|
+
sanityExchange: "https://www.sanity.io/exchange"
|
|
9
8
|
}, incompatiblePluginPackage = "@sanity/incompatible-plugin", defaultOutDir = "dist", requiredNodeEngine = ">=20.19 <22 || >=22.12";
|
|
10
9
|
export { urls as a, requiredNodeEngine as i, defaultOutDir as n, incompatiblePluginPackage as r, cliName as t };
|
|
11
10
|
|
|
12
|
-
//# sourceMappingURL=constants.js.map
|
|
11
|
+
//# sourceMappingURL=constants-BLTUL_Wd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-BLTUL_Wd.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["export const cliName = '@sanity/plugin-kit'\n\nexport const urls = {\n refDocs: 'https://beta.sanity.io/docs/reference',\n migrationGuideStudio: 'https://beta.sanity.io/docs/platform/v2-to-v3',\n migrationGuidePlugin: 'https://beta.sanity.io/docs/platform/v2-to-v3/plugins',\n pluginReadme: 'https://github.com/sanity-io/plugin-kit',\n incompatiblePlugin: 'https://github.com/sanity-io/incompatible-plugin',\n sanityExchange: 'https://www.sanity.io/exchange',\n}\n\nexport const incompatiblePluginPackage = '@sanity/incompatible-plugin'\n\nexport const defaultOutDir = 'dist'\n\n/**\n * Minimum major version of `@sanity/pkg-utils` required in userland.\n *\n * plugin-kit loads `package.config.ts` via the plugin's own `@sanity/pkg-utils` (a peer\n * dependency) using the `loadConfig({cwd, pkgPath})` signature introduced in v10. Older majors\n * expose an incompatible `loadConfig({cwd})` and cannot reliably load ESM TypeScript configs.\n */\nexport const minPkgUtilsMajor = 10\n\n/**\n * Required `engines.node` range for plugins, matching `@sanity/pkg-utils` so plugins declare the\n * same Node.js support as the build tool they use.\n */\nexport const requiredNodeEngine = '>=20.19 <22 || >=22.12'\n"],"mappings":"AAAA,MAAa,UAAU,sBAEV,OAAO;CAClB,SAAS;CACT,sBAAsB;CACtB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,gBAAgB;AAClB,GAEa,4BAA4B,+BAE5B,gBAAgB,QAehB,qBAAqB"}
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { t as cliName } from "./
|
|
2
|
-
import { n as sharedFlags_default, t as log_default } from "./
|
|
1
|
+
import { t as cliName } from "./constants-BLTUL_Wd.js";
|
|
2
|
+
import { n as sharedFlags_default, t as log_default } from "./log-DgQL-Rv9.js";
|
|
3
3
|
import meow from "meow";
|
|
4
4
|
var cmds_default = {
|
|
5
5
|
init: async (options) => {
|
|
6
|
-
await (await import("./
|
|
6
|
+
await (await import("./init-v15fyisU.js")).default(options);
|
|
7
7
|
},
|
|
8
8
|
inject: async (options) => {
|
|
9
|
-
await (await import("./
|
|
9
|
+
await (await import("./inject-B41UktQ3.js")).default(options);
|
|
10
10
|
},
|
|
11
11
|
"link-watch": async (options) => {
|
|
12
|
-
await (await import("./
|
|
12
|
+
await (await import("./link-watch-B2ixqs1y.js")).default(options);
|
|
13
13
|
},
|
|
14
14
|
"verify-package": async (options) => {
|
|
15
|
-
await (await import("./
|
|
15
|
+
await (await import("./verify-package-B32oCYay.js")).default(options);
|
|
16
16
|
},
|
|
17
17
|
"verify-studio": async (options) => {
|
|
18
|
-
await (await import("./
|
|
18
|
+
await (await import("./verify-studio-DUoKxnYy.js")).default(options);
|
|
19
19
|
},
|
|
20
20
|
version: async (options) => {
|
|
21
|
-
(await import("./
|
|
21
|
+
(await import("./version-N9n1cr5G.js")).default(options);
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
/** @public */
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["sharedFlags","commands"],"sources":["../src/cmds/index.ts","../src/cli.ts"],"sourcesContent":["export default {\n 'init': async (options: {argv: string[]}) => {\n await (await import('./init')).default(options)\n },\n 'inject': async (options: {argv: string[]}) => {\n await (await import('./inject')).default(options)\n },\n 'link-watch': async (options: {argv: string[]}) => {\n await (await import('./link-watch')).default(options)\n },\n 'verify-package': async (options: {argv: string[]}) => {\n await (await import('./verify-package')).default(options)\n },\n 'verify-studio': async (options: {argv: string[]}) => {\n await (await import('./verify-studio')).default(options)\n },\n 'version': async (options: {argv: string[]}) => {\n ;(await import('./version')).default(options)\n },\n}\n","import meow from 'meow'\n\nimport commands from './cmds'\nimport {cliName} from './constants'\nimport sharedFlags from './sharedFlags'\nimport log from './util/log'\n\n/** @public */\nexport async function cliEntry(argv = process.argv) {\n const cli = meow(\n `\n\tUsage\n\t $ ${cliName} [--help] [--debug] <command> [<args>]\n\n These are common commands used in various situations:\n\n init Create a new Sanity plugin\n inject Inject config into an existing Sanity v3 plugin\n verify-package Check that a Sanity plugin package follows V3 conventions. Prints upgrade steps.\n verify-studio Check that a Sanity Studio follows V3 conventions. Prints upgrade steps.\n link-watch Recompiles plugin automatically on changes and runs yalc push --publish\n version Show the version of ${cliName} currently installed\n\n Options\n --silent Do not print info and warning messages\n --verbose Log everything. This option conflicts with --silent\n --debug Print stack trace on errors\n --version Output the version number\n --help Output usage information\n\n Examples\n # Init a new plugin in current directory\n $ ${cliName} init\n\n # Init a new plugin in my-sanity-plugin directory\n $ ${cliName} init my-sanity-plugin\n\n # Check that a Sanity plugin package in current directory follows V3 conventions\n $ ${cliName} verify-package\n\n # Check that a Sanity Studio in current directory follows V3 conventions\n $ ${cliName} verify-studio\n`,\n {\n autoHelp: false,\n flags: sharedFlags,\n argv: argv.slice(2),\n },\n )\n\n const commandName = cli.input[0]\n if (!commandName) {\n cli.showHelp() // Exits\n }\n\n if (!(commandName in commands)) {\n console.error(`Unknown command \"${commandName}\"`)\n cli.showHelp() // Exits\n }\n\n if (cli.flags.silent && cli.flags.verbose) {\n log.error(`--silent and --verbose are mutually exclusive`)\n cli.showHelp() // Exits\n }\n\n // Lazy-load command\n const cmd = commands[commandName as keyof typeof commands]\n\n try {\n log.setVerbosity(cli.flags)\n await cmd({argv: argv.slice(3)})\n } catch (err: any) {\n log.error(err instanceof TypeError || cli.flags.debug ? err.stack : err.message)\n\n process.exit(1)\n }\n}\n"],"mappings":";;;AAAA,IAAA,eAAe;CACb,MAAQ,OAAO,YAA8B;EAC3C,OAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","names":["sharedFlags","commands"],"sources":["../src/cmds/index.ts","../src/cli.ts"],"sourcesContent":["export default {\n 'init': async (options: {argv: string[]}) => {\n await (await import('./init')).default(options)\n },\n 'inject': async (options: {argv: string[]}) => {\n await (await import('./inject')).default(options)\n },\n 'link-watch': async (options: {argv: string[]}) => {\n await (await import('./link-watch')).default(options)\n },\n 'verify-package': async (options: {argv: string[]}) => {\n await (await import('./verify-package')).default(options)\n },\n 'verify-studio': async (options: {argv: string[]}) => {\n await (await import('./verify-studio')).default(options)\n },\n 'version': async (options: {argv: string[]}) => {\n ;(await import('./version')).default(options)\n },\n}\n","import meow from 'meow'\n\nimport commands from './cmds'\nimport {cliName} from './constants'\nimport sharedFlags from './sharedFlags'\nimport log from './util/log'\n\n/** @public */\nexport async function cliEntry(argv = process.argv) {\n const cli = meow(\n `\n\tUsage\n\t $ ${cliName} [--help] [--debug] <command> [<args>]\n\n These are common commands used in various situations:\n\n init Create a new Sanity plugin\n inject Inject config into an existing Sanity v3 plugin\n verify-package Check that a Sanity plugin package follows V3 conventions. Prints upgrade steps.\n verify-studio Check that a Sanity Studio follows V3 conventions. Prints upgrade steps.\n link-watch Recompiles plugin automatically on changes and runs yalc push --publish\n version Show the version of ${cliName} currently installed\n\n Options\n --silent Do not print info and warning messages\n --verbose Log everything. This option conflicts with --silent\n --debug Print stack trace on errors\n --version Output the version number\n --help Output usage information\n\n Examples\n # Init a new plugin in current directory\n $ ${cliName} init\n\n # Init a new plugin in my-sanity-plugin directory\n $ ${cliName} init my-sanity-plugin\n\n # Check that a Sanity plugin package in current directory follows V3 conventions\n $ ${cliName} verify-package\n\n # Check that a Sanity Studio in current directory follows V3 conventions\n $ ${cliName} verify-studio\n`,\n {\n autoHelp: false,\n flags: sharedFlags,\n argv: argv.slice(2),\n },\n )\n\n const commandName = cli.input[0]\n if (!commandName) {\n cli.showHelp() // Exits\n }\n\n if (!(commandName in commands)) {\n console.error(`Unknown command \"${commandName}\"`)\n cli.showHelp() // Exits\n }\n\n if (cli.flags.silent && cli.flags.verbose) {\n log.error(`--silent and --verbose are mutually exclusive`)\n cli.showHelp() // Exits\n }\n\n // Lazy-load command\n const cmd = commands[commandName as keyof typeof commands]\n\n try {\n log.setVerbosity(cli.flags)\n await cmd({argv: argv.slice(3)})\n } catch (err: any) {\n log.error(err instanceof TypeError || cli.flags.debug ? err.stack : err.message)\n\n process.exit(1)\n }\n}\n"],"mappings":";;;AAAA,IAAA,eAAe;CACb,MAAQ,OAAO,YAA8B;EAC3C,OAAO,MAAM,OAAO,sBAAA,CAAW,QAAQ,OAAO;CAChD;CACA,QAAU,OAAO,YAA8B;EAC7C,OAAO,MAAM,OAAO,wBAAA,CAAa,QAAQ,OAAO;CAClD;CACA,cAAc,OAAO,YAA8B;EACjD,OAAO,MAAM,OAAO,4BAAA,CAAiB,QAAQ,OAAO;CACtD;CACA,kBAAkB,OAAO,YAA8B;EACrD,OAAO,MAAM,OAAO,gCAAA,CAAqB,QAAQ,OAAO;CAC1D;CACA,iBAAiB,OAAO,YAA8B;EACpD,OAAO,MAAM,OAAO,+BAAA,CAAoB,QAAQ,OAAO;CACzD;CACA,SAAW,OAAO,YAA8B;EAC7C,CAAC,MAAM,OAAO,yBAAA,CAAc,QAAQ,OAAO;CAC9C;AACF;;ACXA,eAAsB,SAAS,OAAO,QAAQ,MAAM;CAClD,IAAM,MAAM,KACV;;OAEG,QAAQ;;;;;;;;;0CAS2B,QAAQ;;;;;;;;;;;QAW1C,QAAQ;;;QAGR,QAAQ;;;QAGR,QAAQ;;;QAGR,QAAQ;GAEZ;EACE,UAAU;EACV,OAAOA;EACP,MAAM,KAAK,MAAM,CAAC;CACpB,CACF,GAEM,cAAc,IAAI,MAAM;CAU9B,AATK,eACH,IAAI,SAAS,GAGT,eAAeC,iBACnB,QAAQ,MAAM,oBAAoB,YAAY,EAAE,GAChD,IAAI,SAAS,IAGX,IAAI,MAAM,UAAU,IAAI,MAAM,YAChC,YAAI,MAAM,+CAA+C,GACzD,IAAI,SAAS;CAIf,IAAM,MAAMA,aAAS;CAErB,IAAI;EAEF,AADA,YAAI,aAAa,IAAI,KAAK,GAC1B,MAAM,IAAI,EAAC,MAAM,KAAK,MAAM,CAAC,EAAC,CAAC;CACjC,SAAS,KAAU;EAGjB,AAFA,YAAI,MAAM,eAAe,aAAa,IAAI,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,GAE/E,QAAQ,KAAK,CAAC;CAChB;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as defaultOutDir } from "./constants.js";
|
|
2
|
-
import { n as sharedFlags_default, t as log_default } from "./log.js";
|
|
3
|
-
import { B as writeFileWithOverwritePrompt, H as promptForPackageName, L as readFile, M as copyFileWithOverwritePrompt, N as ensureDir, P as fileExists, R as readJsonFile, U as promptForRepoOrigin, V as prompt, a as getPackage, c as writePackageJsonDirect, f as errorToUndefined, i as forceDependencyVersions, l as resolveLatestVersions, m as forcedPackageVersions, n as addPackageJsonScripts, o as sortKeys, p as forcedDevPackageVersions, r as addScript, s as writePackageJson, t as addBuildScripts, z as writeFile } from "./package.js";
|
|
4
|
-
import { n as name, r as version } from "./
|
|
1
|
+
import { n as defaultOutDir } from "./constants-BLTUL_Wd.js";
|
|
2
|
+
import { n as sharedFlags_default, t as log_default } from "./log-DgQL-Rv9.js";
|
|
3
|
+
import { B as writeFileWithOverwritePrompt, H as promptForPackageName, L as readFile, M as copyFileWithOverwritePrompt, N as ensureDir, P as fileExists, R as readJsonFile, U as promptForRepoOrigin, V as prompt, a as getPackage, c as writePackageJsonDirect, f as errorToUndefined, i as forceDependencyVersions, l as resolveLatestVersions, m as forcedPackageVersions, n as addPackageJsonScripts, o as sortKeys, p as forcedDevPackageVersions, r as addScript, s as writePackageJson, t as addBuildScripts, z as writeFile } from "./package-BrKrShA_.js";
|
|
4
|
+
import { n as name, r as version } from "./package-z3cLp2Jt.js";
|
|
5
5
|
import chalk from "chalk";
|
|
6
6
|
import path from "path";
|
|
7
7
|
import outdent, { outdent as outdent$1 } from "outdent";
|
|
@@ -31,8 +31,8 @@ function defaultSourceJs(pkg) {
|
|
|
31
31
|
*
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
|
-
export const myPlugin = definePlugin((
|
|
35
|
-
//
|
|
34
|
+
export const myPlugin = definePlugin((_config = {}) => {
|
|
35
|
+
// oxlint-disable-next-line no-console
|
|
36
36
|
console.log(\`hello from ${pkg.name}\`)
|
|
37
37
|
return {
|
|
38
38
|
name: '${pkg.name}',
|
|
@@ -63,8 +63,8 @@ function defaultSourceTs(pkg) {
|
|
|
63
63
|
*
|
|
64
64
|
* @public
|
|
65
65
|
*/
|
|
66
|
-
export const myPlugin = definePlugin<MyPluginConfig | void>((
|
|
67
|
-
//
|
|
66
|
+
export const myPlugin = definePlugin<MyPluginConfig | void>((_config = {}) => {
|
|
67
|
+
// oxlint-disable-next-line no-console
|
|
68
68
|
console.log('hello from ${pkg.name}')
|
|
69
69
|
return {
|
|
70
70
|
name: '${pkg.name}',
|
|
@@ -72,45 +72,6 @@ function defaultSourceTs(pkg) {
|
|
|
72
72
|
})
|
|
73
73
|
`.trimStart() + "\n";
|
|
74
74
|
}
|
|
75
|
-
function eslintrcTemplate(options) {
|
|
76
|
-
let { flags } = options, eslintConfig = {
|
|
77
|
-
root: !0,
|
|
78
|
-
env: {
|
|
79
|
-
node: !0,
|
|
80
|
-
browser: !0
|
|
81
|
-
},
|
|
82
|
-
extends: [
|
|
83
|
-
"sanity",
|
|
84
|
-
flags.typescript && "sanity/typescript",
|
|
85
|
-
"sanity/react",
|
|
86
|
-
"plugin:react-hooks/recommended",
|
|
87
|
-
flags.prettier && "plugin:prettier/recommended",
|
|
88
|
-
"plugin:react/jsx-runtime"
|
|
89
|
-
].filter(Boolean)
|
|
90
|
-
};
|
|
91
|
-
return {
|
|
92
|
-
type: "template",
|
|
93
|
-
force: flags.force,
|
|
94
|
-
to: ".eslintrc",
|
|
95
|
-
value: JSON.stringify(eslintConfig, null, 2)
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
function eslintignoreTemplate(options) {
|
|
99
|
-
let { flags, outDir } = options, patterns = [
|
|
100
|
-
".eslintrc.js",
|
|
101
|
-
"commitlint.config.js",
|
|
102
|
-
outDir,
|
|
103
|
-
"lint-staged.config.js",
|
|
104
|
-
"package.config.ts",
|
|
105
|
-
flags.typescript ? "*.js" : ""
|
|
106
|
-
].filter(Boolean);
|
|
107
|
-
return patterns.sort(), {
|
|
108
|
-
type: "template",
|
|
109
|
-
force: flags.force,
|
|
110
|
-
to: ".eslintignore",
|
|
111
|
-
value: patterns.join("\n")
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
75
|
function gitignoreTemplate() {
|
|
115
76
|
return {
|
|
116
77
|
type: "template",
|
|
@@ -176,6 +137,24 @@ function gitignoreTemplate() {
|
|
|
176
137
|
`
|
|
177
138
|
};
|
|
178
139
|
}
|
|
140
|
+
function oxfmtConfigTemplate(options) {
|
|
141
|
+
let { flags } = options;
|
|
142
|
+
return {
|
|
143
|
+
type: "template",
|
|
144
|
+
force: flags.force,
|
|
145
|
+
to: "oxfmt.config.ts",
|
|
146
|
+
value: "export {default} from '@sanity/plugin-kit/oxfmt'"
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function oxlintConfigTemplate(options) {
|
|
150
|
+
let { flags } = options;
|
|
151
|
+
return {
|
|
152
|
+
type: "template",
|
|
153
|
+
force: flags.force,
|
|
154
|
+
to: "oxlint.config.ts",
|
|
155
|
+
value: "export {default} from '@sanity/plugin-kit/oxlint'"
|
|
156
|
+
};
|
|
157
|
+
}
|
|
179
158
|
function pkgConfigTemplate(options) {
|
|
180
159
|
let { flags, outDir } = options;
|
|
181
160
|
return {
|
|
@@ -201,19 +180,6 @@ function pkgConfigTemplate(options) {
|
|
|
201
180
|
`
|
|
202
181
|
};
|
|
203
182
|
}
|
|
204
|
-
function prettierignoreTemplate(options) {
|
|
205
|
-
let { outDir } = options;
|
|
206
|
-
return {
|
|
207
|
-
type: "template",
|
|
208
|
-
to: ".prettierignore",
|
|
209
|
-
value: [
|
|
210
|
-
outDir,
|
|
211
|
-
"pnpm-lock.yaml",
|
|
212
|
-
"yarn.lock",
|
|
213
|
-
"package-lock.json"
|
|
214
|
-
].join("\n")
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
183
|
function tsconfigTemplate(options) {
|
|
218
184
|
let { flags } = options;
|
|
219
185
|
return {
|
|
@@ -741,11 +707,7 @@ async function writeAssets(injectables, { basePath, flags }) {
|
|
|
741
707
|
async function writeStaticAssets(options) {
|
|
742
708
|
let { outDir, flags } = options;
|
|
743
709
|
return writeAssets([
|
|
744
|
-
flags.
|
|
745
|
-
flags.eslint && eslintignoreTemplate({
|
|
746
|
-
outDir,
|
|
747
|
-
flags: options.flags
|
|
748
|
-
}),
|
|
710
|
+
flags.oxlint && oxlintConfigTemplate({ flags: options.flags }),
|
|
749
711
|
{
|
|
750
712
|
type: "copy",
|
|
751
713
|
from: "editorconfig",
|
|
@@ -765,12 +727,7 @@ async function writeStaticAssets(options) {
|
|
|
765
727
|
outDir,
|
|
766
728
|
flags: options.flags
|
|
767
729
|
}),
|
|
768
|
-
flags.
|
|
769
|
-
flags.prettier && {
|
|
770
|
-
type: "copy",
|
|
771
|
-
from: "prettierrc.json",
|
|
772
|
-
to: ".prettierrc"
|
|
773
|
-
}
|
|
730
|
+
flags.oxfmt && oxfmtConfigTemplate({ flags: options.flags })
|
|
774
731
|
].map((f) => f || void 0).filter((f) => !!f), options);
|
|
775
732
|
}
|
|
776
733
|
function asArray(input) {
|
|
@@ -804,7 +761,7 @@ const initFlags = {
|
|
|
804
761
|
type: "boolean",
|
|
805
762
|
default: !0
|
|
806
763
|
},
|
|
807
|
-
|
|
764
|
+
oxlint: {
|
|
808
765
|
type: "boolean",
|
|
809
766
|
default: !0
|
|
810
767
|
},
|
|
@@ -812,7 +769,7 @@ const initFlags = {
|
|
|
812
769
|
type: "boolean",
|
|
813
770
|
default: !0
|
|
814
771
|
},
|
|
815
|
-
|
|
772
|
+
oxfmt: {
|
|
816
773
|
type: "boolean",
|
|
817
774
|
default: !0
|
|
818
775
|
},
|
|
@@ -864,4 +821,4 @@ async function init(options) {
|
|
|
864
821
|
}
|
|
865
822
|
export { presetHelpList as i, initFlags as n, inject as r, init as t };
|
|
866
823
|
|
|
867
|
-
//# sourceMappingURL=init.js.map
|
|
824
|
+
//# sourceMappingURL=init-BDY7XRmJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-BDY7XRmJ.js","names":["applyPreset","pkg.name","pkg.version","isValidEmail","applyPreset","log","addDevDependencies","log","sharedFlags"],"sources":["../src/configs/default-source.ts","../src/configs/git.ts","../src/configs/oxfmt.ts","../src/configs/oxlint.ts","../src/configs/pkg-config.ts","../src/configs/tsconfig.ts","../src/presets/renovatebot.ts","../src/util/readme.ts","../src/util/request.ts","../src/util/user.ts","../src/presets/semver-workflow.ts","../src/presets/ui.ts","../src/presets/presets.ts","../src/actions/inject.ts","../src/actions/init.ts"],"sourcesContent":["import outdent from 'outdent'\n\nimport type {PackageJson} from '../actions/verify/types'\n\nexport function defaultSourceJs(pkg: PackageJson) {\n return (\n outdent`\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 '${pkg.name}'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin({})],\n * })\n * \\`\\`\\`\n *\n * @public\n */\n export const myPlugin = definePlugin((_config = {}) => {\n // oxlint-disable-next-line no-console\n console.log(\\`hello from ${pkg.name}\\`)\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n\nexport function defaultSourceTs(pkg: PackageJson) {\n return (\n outdent`\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 '${pkg.name}'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin()],\n * })\n * \\`\\`\\`\n *\n * @public\n */\n export const myPlugin = definePlugin<MyPluginConfig | void>((_config = {}) => {\n // oxlint-disable-next-line no-console\n console.log('hello from ${pkg.name}')\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n","import {outdent} from 'outdent'\n\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function gitignoreTemplate(): InjectTemplate {\n return {\n type: 'template',\n to: '.gitignore',\n value: outdent`\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 `,\n }\n}\n","import type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxfmtConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxfmt.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxfmt'`,\n }\n}\n","import type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxlintConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxlint.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxlint'`,\n }\n}\n","import {outdent} from 'outdent'\n\nimport type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function pkgConfigTemplate(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n // Always a `.ts` config: plugins are ESM (`\"type\": \"module\"`), so `@sanity/pkg-utils`\n // loads it without needing a `.mts`/`.mjs` extension to force ESM interpretation.\n to: 'package.config.ts',\n value: outdent`\n import {defineConfig} from '@sanity/pkg-utils'\n\n export default defineConfig({\n dist: '${outDir}',\n tsconfig: 'tsconfig.${outDir}.json',\n\n // Remove this block to enable strict export validation\n extract: {\n rules: {\n 'ae-incompatible-release-tags': 'off',\n 'ae-internal-missing-underscore': 'off',\n 'ae-missing-release-tag': 'off',\n },\n },\n })\n `,\n }\n}\n","import {outdent} from 'outdent'\n\nimport type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function tsconfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'tsconfig.json',\n value: outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\", \"./package.config.ts\"]\n }\n `,\n }\n}\n\nexport function tsconfigTemplateDist(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.${outDir}.json`,\n value: outdent`\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 }\n `,\n }\n}\n\nexport function tsconfigTemplateSettings(options: {\n outDir: string\n flags: InitFlags\n}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.settings.json`,\n value: outdent`\n {\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"outDir\": \"./${outDir}\",\n\n \"target\": \"esnext\",\n \"jsx\": \"preserve\",\n \"module\": \"preserve\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"resolveJsonModule\": true,\n \"moduleDetection\": \"force\",\n \"strict\": true,\n \"allowSyntheticDefaultImports\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n\n // Don't emit by default, pkg-utils will ignore this when generating .d.ts files\n \"noEmit\": true\n }\n }\n `,\n }\n}\n","import {type InjectOptions, writeAssets} from '../actions/inject'\nimport type {Preset} from './presets'\n\nexport const renovatePreset: Preset = {\n name: 'renovatebot',\n description: 'Files to enable renovatebot.',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(\n [\n {\n type: 'copy',\n from: ['renovatebot', 'renovate.json'],\n to: 'renovate.json',\n },\n ],\n options,\n )\n}\n","import licenses from '@rexxars/choosealicense-list'\nimport outdent from 'outdent'\n\nimport type {PackageData} from '../actions/inject'\nimport type {User} from './user'\n\nexport function generateReadme(data: PackageData) {\n const {user, pluginName, license} = data\n\n return (\n outdent`\n # ${pluginName}\n\n\n ${installationSnippet(pluginName ?? 'unknown')}\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 '${pluginName}'\n\n export default defineConfig({\n //...\n plugins: [myPlugin({})],\n })\n \\`\\`\\`\n\n ${getLicenseText(license?.id, user?.name ? (user as User) : undefined)}\n ${developTestSnippet()}\n ` + '\\n'\n )\n}\n\nexport function installationSnippet(packageName: string) {\n return outdent`\n ## Installation\n\n \\`\\`\\`sh\n npm install ${packageName}\n \\`\\`\\`\n `\n}\n\nexport function developTestSnippet() {\n return outdent`\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 `\n}\n\nexport function getLicenseText(licenseId?: string, user?: User) {\n if (!licenseId) {\n return ''\n }\n\n const license = licenses.find(licenseId)\n let licenseName: string | undefined = license ? license.title : undefined\n licenseName = licenseName?.replace(/\\s+license$/i, '')\n\n let licenseText = '## License\\n'\n if (licenseName && user?.name) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE) © ${user?.name}\\n`\n } else if (licenseName) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE)\\n`\n } else {\n licenseText = `${licenseText}\\nSee [LICENSE](LICENSE)`\n }\n\n return licenseText\n}\n\nexport function isDefaultGitHubReadme(readme: string) {\n if (!readme) {\n return false\n }\n\n const lines = readme.split('\\n', 20).filter(Boolean)\n\n // title + _optional_ description\n return lines.length <= 2 && lines[0].startsWith('#')\n}\n","import {createRequester} from 'get-it'\n\nimport pkg from '../../package.json'\n\nexport const requester = createRequester({\n headers: {'User-Agent': `${pkg.name}@${pkg.version}`},\n as: 'json',\n})\n","import {execSync} from 'child_process'\nimport path from 'path'\n\nimport {validate as isValidEmail} from 'email-validator'\nimport xdgBasedir from 'xdg-basedir'\n\nimport type {InjectOptions} from '../actions/inject'\nimport type {PackageJson} from '../actions/verify/types'\nimport {readJsonFile} from './files'\nimport {prompt} from './prompt'\nimport {requester} from './request'\n\nexport interface User {\n name: string\n email?: string\n}\n\nexport async function getUserInfo(\n {requireUserConfirmation, flags}: InjectOptions,\n pkg?: PackageJson,\n): Promise<User | undefined> {\n const userInfo =\n getPackageUserInfo({author: flags.author ?? pkg?.author}) ||\n (await getSanityUserInfo()) ||\n (await getGitUserInfo())\n if (requireUserConfirmation) {\n return promptForInfo(userInfo)\n }\n\n return userInfo\n}\n\nfunction getPackageUserInfo(pkg?: {\n author?:\n | string\n | {\n name: string\n email?: string\n }\n}): User | undefined {\n let author = pkg?.author\n if (!author) {\n return undefined\n }\n\n if (author && typeof author !== 'string') {\n return author\n } else if (!author.includes('@')) {\n return {name: author}\n }\n\n const [pre, ...post] = author.replace(/[<>[\\]]/g, '').split(/@/)\n const nameParts = pre.split(/\\s+/)\n const email = [nameParts[nameParts.length - 1], ...post].join('@')\n const name = nameParts.slice(0, -1).join(' ')\n return {name, email}\n}\n\nasync function promptForInfo(defValue?: User) {\n const name = await prompt('Author name', {\n filter: filterString,\n default: defValue && defValue.name,\n validate: requiredString,\n })\n\n const email = await prompt('Author email', {\n filter: filterString,\n default: defValue && defValue.email,\n validate: validOrEmptyEmail,\n })\n\n return {name, email}\n}\n\nasync function getSanityUserInfo(): Promise<User | undefined> {\n try {\n const data = await readJsonFile<{authToken?: string}>(\n path.join(xdgBasedir.config ?? '', 'sanity', 'config.json'),\n )\n const token = data?.authToken\n\n if (!token) {\n return undefined\n }\n\n const {body: user} = await requester<User>({\n url: 'https://api.sanity.io/v1/users/me',\n as: 'json',\n headers: {Authorization: `Bearer ${token}`},\n })\n\n if (!user) {\n return undefined\n }\n\n const {name, email} = user\n return {name, email}\n } catch {\n return undefined\n }\n}\n\nasync function getGitUserInfo(): Promise<User | undefined> {\n try {\n const name = execSync('git config user.name', {encoding: 'utf8'}).trim()\n const email = execSync('git config user.email', {encoding: 'utf8'}).trim()\n\n if (!name) {\n return undefined\n }\n\n return {name, email: email || undefined}\n } catch {\n return undefined\n }\n}\n\nfunction filterString(val: string) {\n return (val || '').trim()\n}\n\nfunction requiredString(value: string) {\n return value.length > 1 ? true : 'Required'\n}\n\nfunction validOrEmptyEmail(value: string): true | string {\n if (!value) {\n return true\n }\n\n return isValidEmail(value) ? true : 'Must either be a valid email or empty'\n}\n","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {type Injectable, type InjectOptions, writeAssets} from '../actions/inject'\nimport type {PackageJson} from '../actions/verify/types'\nimport {\n addPackageJsonScripts,\n addScript,\n getPackage,\n sortKeys,\n writePackageJsonDirect,\n} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {readFile, writeFile} from '../util/files'\nimport log from '../util/log'\nimport {developTestSnippet, getLicenseText, installationSnippet} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport type {Preset} from './presets'\n\nexport const semverWorkflowPreset: Preset = {\n name: 'semver-workflow',\n description:\n 'Files and dependencies for conventional-commits, github workflow and semantic-release.',\n apply: applyPreset,\n}\n\nconst info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(semverWorkflowFiles(), options)\n await addPrepareScript(options)\n await addDevDependencies(options)\n await updateReadme(options)\n}\n\nasync function addPrepareScript(options: InjectOptions) {\n const pkg = await getPackage(options)\n const didWrite = await addPackageJsonScripts(pkg, options, (scripts) => {\n scripts.prepare = addScript(`husky`, scripts.prepare)\n return scripts\n })\n info(didWrite, 'Added prepare script to package.json')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await semverWorkflowDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n\n log.info(\n chalk.green(\n outdent`\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(),\n ),\n )\n}\n\nasync function updateReadme(options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = (await readFile(readmePath, 'utf8').catch(errorToUndefined)) ?? ''\n\n const {install, usage, developTest, license, releaseSnippet} = await readmeSnippets(options)\n\n const prependSections = missingSections(readme, [install, usage])\n const appendSections = missingSections(readme, [license, developTest, releaseSnippet])\n\n if (prependSections.length || appendSections.length) {\n const updatedReadme = [...prependSections, readme, ...appendSections]\n .filter(Boolean)\n .join('\\n\\n')\n await writeFile(readmePath, updatedReadme, {encoding: 'utf8'})\n log.info('Updated README. Please review the changes.')\n }\n}\n\nasync function readmeSnippets(options: InjectOptions) {\n const pkg = await getPackage(options)\n const user = await getUserInfo(options, pkg)\n\n const bestEffortUrl = readmeBaseurl(pkg)\n\n const install = installationSnippet(pkg.name ?? 'unknown')\n\n const usage = outdent`\n ## Usage\n `\n\n const license = getLicenseText(typeof pkg.license === 'string' ? pkg.license : undefined, user)\n\n const releaseSnippet = outdent`\n ### Release new version\n\n Run [\"CI & Release\" workflow](${bestEffortUrl}/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 `\n\n return {\n install,\n usage,\n license,\n developTest: developTestSnippet(),\n releaseSnippet,\n }\n}\n\n/**\n * Returns sections that do not exist \"close enough\" in readme\n */\nexport function missingSections(readme: string, sections: string[]) {\n return sections.filter((section) => !closeEnough(section, readme))\n}\n\n/**\n * a and b are considered \"close enough\" if > 50% of a lines exist in b lines\n * @param a\n * @param b\n */\nfunction closeEnough(a: string, b: string) {\n const aLines = a.split('\\n')\n const bLines = b.split('\\n')\n\n const matchingLines = aLines.filter((line) => bLines.find((bLine) => bLine === line)).length\n const isCloseEnough = matchingLines >= aLines.length * 0.5\n return isCloseEnough\n}\n\nfunction semverWorkflowFiles(): Injectable[] {\n const base: Injectable[] = [\n {\n type: 'copy',\n from: ['.github', 'workflows', 'main.yml'],\n to: ['.github', 'workflows', 'main.yml'],\n },\n {type: 'copy', from: ['.husky', 'commit-msg'], to: ['.husky', 'commit-msg']},\n {type: 'copy', from: ['.husky', 'pre-commit'], to: ['.husky', 'pre-commit']},\n {type: 'copy', from: ['.releaserc.json'], to: '.releaserc.json'},\n {type: 'copy', from: ['commitlint.template.js'], to: 'commitlint.config.js'},\n {type: 'copy', from: ['lint-staged.template.js'], to: 'lint-staged.config.js'},\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['semver-workflow', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function semverWorkflowDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@commitlint/cli',\n '@commitlint/config-conventional',\n '@sanity/semantic-release-preset',\n 'husky',\n 'lint-staged',\n ])\n}\n\nexport function readmeBaseurl(pkg: PackageJson) {\n return ((pkg.repository?.url ?? pkg.homepage ?? 'TODO') as string)\n .replace(/.+:\\/\\//g, 'https://')\n .replace(/\\.git/g, '')\n .replace(/git@github.com\\//g, 'github.com/')\n .replace(/git@github.com:/g, 'https://github.com/')\n .replace(/#.+/g, '')\n}\n","import chalk from 'chalk'\n\nimport type {InjectOptions} from '../actions/inject'\nimport {forcedDevPackageVersions, forcedPackageVersions} from '../configs/forced-package-versions'\nimport {forceDependencyVersions, getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport log from '../util/log'\nimport type {Preset} from './presets'\n\nexport const ui: Preset = {\n name: 'ui',\n description: '`@sanity/ui` and dependencies',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await addDependencies(options)\n await addDevDependencies(options)\n\n log.info(chalk.green('ui preset injected'))\n}\n\nasync function addDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.dependencies,\n ...(await resolveDependencyList()),\n },\n forcedPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.dependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated dependencies.')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.devDependencies,\n ...(await resolveDevDependencyList()),\n },\n forcedDevPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.devDependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function resolveDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions(['@sanity/icons', '@sanity/ui'])\n}\n\nasync function resolveDevDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n // install the peer dependencies of `@sanity/ui` as dev dependencies\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import type {InjectOptions} from '../actions/inject'\nimport {renovatePreset} from './renovatebot'\nimport {semverWorkflowPreset} from './semver-workflow'\nimport {ui} from './ui'\n\nexport interface Preset {\n name: string\n description: string\n apply: (options: InjectOptions) => Promise<void>\n}\n\nconst presets: Preset[] = [semverWorkflowPreset, renovatePreset, ui]\nconst presetNames = presets.map((p) => p?.name)\n\nexport function presetHelpList(padStart: number) {\n return presets\n .map((p) => `${''.padStart(padStart)}${p.name.padEnd(20)}${p.description}`)\n .join('\\n')\n}\n\nexport async function injectPresets(options: InjectOptions) {\n if (options.flags.presetOnly && !options.flags.preset?.length) {\n throw new Error('--preset-only, but no --preset [preset-name] was provided.')\n }\n\n const applyPresets = presetsFromInput(options.flags.preset)\n for (const preset of applyPresets) {\n await preset.apply(options)\n }\n}\n\nfunction presetsFromInput(inputPresets: string[] | undefined): Preset[] {\n if (!inputPresets) {\n return []\n }\n const unknownPresets = inputPresets.filter((p) => !presetNames.includes(p))\n if (unknownPresets.length) {\n throw new Error(\n `Unknown --preset(s): [${unknownPresets.join(', ')}]. Must be one of: [${presetNames.join(\n ', ',\n )}]`,\n )\n }\n\n return inputPresets\n .filter(onlyUnique)\n .map((presetName) => presets.find((p) => p.name === presetName))\n .filter((p): p is Preset => !!p)\n}\n\nfunction onlyUnique(value: string, index: number, arr: string[]) {\n return arr.indexOf(value) === index\n}\n","import path from 'path'\nimport {fileURLToPath} from 'url'\n\nimport licenses from '@rexxars/choosealicense-list'\nimport gitRemoteOriginUrl from 'git-remote-origin-url'\n\nimport {gitignoreTemplate} from '../configs/git'\nimport {oxfmtConfigTemplate} from '../configs/oxfmt'\nimport {oxlintConfigTemplate} from '../configs/oxlint'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\nimport {tsconfigTemplateDist, tsconfigTemplate, tsconfigTemplateSettings} from '../configs/tsconfig'\nimport {addBuildScripts, getPackage, writePackageJson} from '../npm/package'\nimport {injectPresets} from '../presets/presets'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {\n copyFileWithOverwritePrompt,\n fileExists,\n readFile,\n writeFile,\n writeFileWithOverwritePrompt,\n} from '../util/files'\nimport log from '../util/log'\nimport {prompt, promptForPackageName, promptForRepoOrigin} from '../util/prompt'\nimport {generateReadme, isDefaultGitHubReadme} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport type {InitFlags} from './init'\nimport type {PackageJson} from './verify/types'\n\nconst bannedFields = ['login', 'description', 'projecturl', 'email']\nconst preferredLicenses = ['MIT', 'ISC', 'BSD-3-Clause']\nconst otherLicenses = Object.keys(licenses.list).filter((id) => {\n const license = licenses.list[id]\n return (\n !preferredLicenses.includes(id) &&\n !bannedFields.some((field) => license.body.includes(`[${field}]`))\n )\n})\n\nexport interface InjectCopyFromTo {\n type: 'copy'\n from: string | string[]\n to: string | string[]\n}\n\nexport interface InjectTemplate {\n type: 'template'\n to: string | string[]\n value: string\n force?: boolean\n}\n\nexport type Injectable = InjectCopyFromTo | InjectTemplate\n\nexport interface InjectOptions {\n basePath: string\n requireUserConfirmation?: boolean\n flags: InitFlags\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n validate?: boolean\n outDir: string\n}\n\nexport interface PackageData {\n user?: {name?: string; email?: string}\n pluginName?: string\n license?: {id: string; text: string}\n description?: string\n pkg?: PackageJson\n gitOrigin?: string\n}\n\nexport async function inject(options: InjectOptions) {\n if (options.flags.presetOnly) {\n log.info('Only apply presets, skipping default inject.')\n } else {\n await injectBase(options)\n }\n await injectPresets(options)\n}\n\nasync function injectBase(options: InjectOptions) {\n const {basePath, flags, requireUserConfirmation} = options\n const info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n // Gather data\n const pkg = await getPackage(options).catch(errorToUndefined)\n log.debug('Plugin has package.json: %s', pkg ? 'yes' : 'no')\n\n const user = await getUserInfo(options, pkg)\n log.debug('User information: %o', user)\n\n const pkgName = flags.name ?? pkg?.name\n const pluginName =\n requireUserConfirmation || !pkgName ? await promptForPackageName(options, pkgName) : pkgName\n\n log.debug('Plugin name: %s', pluginName)\n\n const license = await getLicense(flags, {user, pluginName, pkg, requireUserConfirmation})\n const licenseChanged = (pkg && pkg.license) !== (license && license.id)\n log.debug('License: %s', license ? license.id : '<none>')\n\n const description = await getProjectDescription(basePath, pkg, requireUserConfirmation)\n log.debug('Description: %s', description || '<none>')\n\n const repoUrl =\n flags.repo ??\n ((await gitRemoteOriginUrl(basePath).catch(errorToUndefined)) || pkg?.repository?.url)\n\n const gitOrigin = requireUserConfirmation ? await promptForRepoOrigin(options, repoUrl) : repoUrl\n\n log.debug('Remote origin: %s', gitOrigin || '<none>')\n\n // Output\n const data: PackageData = {user, pluginName, license, description, pkg, gitOrigin}\n let didWrite\n\n // Write package.json, if returns the original (data.pkg) if it was unchanged,\n // otherwise it returns the new object\n const newPkg = await writePackageJson(data, options)\n info(newPkg !== pkg, 'Wrote package.json')\n data.pkg = newPkg\n\n didWrite = await writeLicense(data, options, licenseChanged)\n info(didWrite, 'Wrote license file (LICENSE)')\n\n didWrite = await writeReadme(data, options)\n info(didWrite, 'Wrote readme file (README.md)')\n\n didWrite = await writeStaticAssets(options)\n info(didWrite.length > 0, 'Wrote static asset files: %s', didWrite.join(', '))\n\n didWrite = await addBuildScripts(newPkg, options)\n info(didWrite, 'Added build scripts to package.json')\n\n didWrite = await addCompileDirToGitIgnore(options)\n info(didWrite, 'Added compilation output directory to .gitignore')\n}\n\nasync function writeReadme(data: PackageData, options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8').catch(errorToUndefined)\n\n if (readme && !isDefaultGitHubReadme(readme)) {\n return false\n }\n\n await writeFileWithOverwritePrompt(readmePath, generateReadme(data), {\n encoding: 'utf8',\n force: options.flags.force,\n })\n return true\n}\n\nasync function writeLicense(\n {license}: PackageData,\n options: InjectOptions,\n licenseChanged: boolean,\n) {\n const {basePath, flags} = options\n\n if ((flags.license as unknown as boolean) === false || !license) {\n return false\n }\n\n // Prefer whatever path the user is currently using (LICENSE.md or LICENSE)\n const hasLicenseMdFile = await fileExists(path.join(basePath, 'LICENSE.md'))\n const licensePath = path.join(basePath, hasLicenseMdFile ? 'LICENSE.md' : 'LICENSE')\n\n await writeFileWithOverwritePrompt(licensePath, license.text, {\n encoding: 'utf8',\n default: licenseChanged,\n force: flags.force,\n })\n\n return true\n}\n\nasync function getLicense(\n flags: InitFlags,\n {\n user,\n pluginName,\n pkg,\n requireUserConfirmation,\n }: PackageData & {requireUserConfirmation?: boolean},\n) {\n const license = await getLicenseIdentifier(flags, pkg, requireUserConfirmation)\n if (!license) {\n return undefined\n }\n\n const text = license.body\n .replace(/\\[fullname\\]/g, user?.name ?? '')\n .replace(/\\[project\\]/g, pluginName ?? '')\n .replace(/\\[year\\]/g, String(new Date().getFullYear()))\n\n return {id: license.id, text}\n}\n\nasync function getLicenseIdentifier(\n flags: InitFlags,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n // --no-license\n if ((flags.license as unknown) === false) {\n return null\n }\n\n // --license becomes \"\", --license mit becomes \"mit\"\n if (typeof flags.license === 'string') {\n const license = licenses.find(`${flags.license}`)\n if (!license) {\n throw new Error(`License \"${flags.license}\" not found`)\n }\n return license\n }\n\n // no --license flag provided, do we have one in package already?\n if (pkg && pkg.license && !requireUserConfirmation) {\n const license = licenses.find(`${pkg.license}`)\n if (license) {\n return license\n }\n\n // Warn, then prompt the user\n log.warn(`package.json contains license \"${pkg.license}\", which is not recognized`)\n }\n\n const licenseId = await prompt('Which license do you want to use?', {\n default: pkg && pkg.license && licenses.find(pkg.license) ? pkg.license : preferredLicenses[0],\n choices: [\n prompt.separator(),\n ...preferredLicenses.map((value) => ({value, name: licenses.list[value].title})),\n prompt.separator(),\n ...otherLicenses.map((value) => ({value, name: licenses.list[value].title})),\n ],\n })\n\n return licenses.find(licenseId)\n}\n\nasync function getProjectDescription(\n basePath: string,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n let description = await resolveProjectDescription(basePath, pkg)\n if (requireUserConfirmation) {\n description = await prompt('Plugin description', {default: description || ''})\n }\n return description ?? ''\n}\n\nasync function resolveProjectDescription(basePath: string, pkg: PackageJson | undefined) {\n // Try to grab from package.json\n if (pkg && typeof pkg.description === 'string' && pkg.description.length > 5) {\n return pkg.description\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8')\n const [title, description] = readme.split('\\n').filter(Boolean)\n if (!title || !description || !title.match(/^#\\s+\\w+/)) {\n return null\n }\n\n // Naive, but this isn't too important\n const unlinked = description.replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n if (/^[^#]/.test(unlinked)) {\n return unlinked\n }\n\n return null\n } catch (err) {\n return errorToUndefined(err)\n }\n}\n\nexport async function writeAssets(injectables: Injectable[], {basePath, flags}: InjectOptions) {\n const assetsDir = await findAssetsDir()\n\n const from = (...segments: string[]) => path.join(assetsDir, 'inject', ...segments)\n const to = (...segments: string[]) => path.join(basePath, ...segments)\n\n const writes: string[] = []\n for (const injectable of injectables) {\n if (injectable.type === 'copy') {\n const fromPath = asArray(injectable.from)\n const toPath = asArray(injectable.to)\n if (await copyFileWithOverwritePrompt(from(...fromPath), to(...toPath), flags)) {\n writes.push(path.join(...toPath))\n }\n continue\n }\n\n if (injectable.type === 'template') {\n const toPath = asArray(injectable.to)\n\n await writeFileWithOverwritePrompt(to(...toPath), `${injectable.value.trim()}\\n`, {\n default: 'n',\n force: injectable.force || flags.force,\n })\n\n writes.push(path.join(...toPath))\n continue\n }\n\n throw new Error(`Unknown operation type \"${(injectable as any).type}\"`)\n }\n\n return writes\n}\n\nasync function writeStaticAssets(options: InjectOptions) {\n const {outDir, flags} = options\n\n const files: Injectable[] = [\n flags.oxlint && oxlintConfigTemplate({flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\n pkgConfigTemplate({outDir, flags: options.flags}),\n flags.gitignore && gitignoreTemplate(),\n flags.typescript && tsconfigTemplate({flags: options.flags}),\n flags.typescript && tsconfigTemplateDist({outDir, flags: options.flags}),\n flags.typescript && tsconfigTemplateSettings({outDir, flags: options.flags}),\n flags.oxfmt && oxfmtConfigTemplate({flags: options.flags}),\n ]\n .map((f) => (f ? (f as Injectable) : undefined))\n .filter((f): f is Injectable => !!f)\n\n const result = writeAssets(files, options)\n\n return result\n}\n\nfunction asArray(input: string | string[]): string[] {\n return typeof input === 'string' ? [input] : input\n}\n\n/**\n * assets dir might be in higher or lower in the dir hierarchy depending on\n * if we run from `dist` or `src`\n */\nasync function findAssetsDir(): Promise<string> {\n let maxBackpaddle = 3\n let currDir = path.dirname(fileURLToPath(import.meta.url))\n let assetsDir: string = ''\n while (!assetsDir && maxBackpaddle) {\n currDir = path.join(currDir, '..')\n const assets = path.join(currDir, 'assets')\n if (await fileExists(assets)) {\n assetsDir = assets\n } else {\n maxBackpaddle--\n }\n }\n\n if (!assetsDir) {\n throw new Error('Could not find assets directory!')\n }\n return assetsDir\n}\n\nasync function addCompileDirToGitIgnore(options: InjectOptions) {\n const gitIgnorePath = path.join(options.basePath, '.gitignore')\n const gitignore = await readFile(gitIgnorePath, 'utf8').catch(errorToUndefined)\n if (!gitignore) {\n return false\n }\n\n const ignore = options.outDir.replace(/^[./]+/, '').split('/')[0]\n if (!ignore) {\n return false\n }\n\n const lines = gitignore.trim().split('\\n')\n if (lines.includes(ignore)) {\n return false\n }\n\n lines.push('', '# Compiled plugin', ignore)\n\n await writeFile(gitIgnorePath, lines.join('\\n') + '\\n', {encoding: 'utf8'})\n return true\n}\n","import path from 'path'\n\nimport type {TypedFlags} from 'meow'\n\nimport {defaultSourceJs, defaultSourceTs} from '../configs/default-source'\nimport {defaultOutDir} from '../constants'\nimport {getPackage} from '../npm/package'\nimport sharedFlags from '../sharedFlags'\nimport {ensureDir, writeFile} from '../util/files'\nimport {inject} from './inject'\n\nexport const initFlags = {\n ...sharedFlags,\n scripts: {\n type: 'boolean',\n default: true,\n },\n oxlint: {\n type: 'boolean',\n default: true,\n },\n typescript: {\n type: 'boolean',\n default: true,\n },\n oxfmt: {\n type: 'boolean',\n default: true,\n },\n license: {\n type: 'string',\n },\n editorconfig: {\n type: 'boolean',\n default: true,\n },\n gitignore: {\n type: 'boolean',\n default: true,\n },\n force: {\n type: 'boolean',\n default: false,\n },\n install: {\n type: 'boolean',\n default: true,\n },\n name: {\n type: 'string',\n },\n author: {\n type: 'string',\n },\n repo: {\n type: 'string',\n },\n presetOnly: {\n type: 'boolean',\n default: false,\n },\n preset: {\n type: 'string',\n isMultiple: true,\n },\n} as const\n\nexport type InitFlags = TypedFlags<typeof initFlags>\n\nexport interface InitOptions {\n basePath: string\n flags: InitFlags\n}\n\nexport async function init(options: InitOptions) {\n let dependencies = {}\n let devDependencies = {}\n let peerDependencies = {}\n\n await inject({\n ...options,\n outDir: defaultOutDir,\n requireUserConfirmation: !options.flags.force,\n dependencies,\n devDependencies,\n peerDependencies,\n validate: false,\n })\n\n const packageJson = await getPackage({basePath: options.basePath, validate: false})\n const typescript = options.flags.typescript\n const source = typescript ? defaultSourceTs(packageJson) : defaultSourceJs(packageJson)\n const filename = typescript ? 'index.ts' : 'index.js'\n const srcDir = path.resolve(options.basePath, 'src')\n await ensureDir(srcDir)\n await writeFile(path.join(srcDir, filename), source, {encoding: 'utf8'})\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as cliName } from "./constants.js";
|
|
2
|
-
import { t as log_default } from "./log.js";
|
|
3
|
-
import { i as presetHelpList, n as initFlags, t as init } from "./init.js";
|
|
4
|
-
import { F as isEmptyish, N as ensureDir, V as prompt, d as hasSanityJson, u as findStudioV3Config } from "./package.js";
|
|
1
|
+
import { t as cliName } from "./constants-BLTUL_Wd.js";
|
|
2
|
+
import { t as log_default } from "./log-DgQL-Rv9.js";
|
|
3
|
+
import { i as presetHelpList, n as initFlags, t as init } from "./init-BDY7XRmJ.js";
|
|
4
|
+
import { F as isEmptyish, N as ensureDir, V as prompt, d as hasSanityJson, u as findStudioV3Config } from "./package-BrKrShA_.js";
|
|
5
5
|
import meow from "meow";
|
|
6
6
|
import path from "path";
|
|
7
7
|
import execa from "execa";
|
|
@@ -44,8 +44,8 @@ Usage
|
|
|
44
44
|
$ ${cliName} init [dir] [<args>]
|
|
45
45
|
|
|
46
46
|
Options
|
|
47
|
-
--no-
|
|
48
|
-
--no-
|
|
47
|
+
--no-oxlint Disables oxlint config and dependencies from being added
|
|
48
|
+
--no-oxfmt Disables oxfmt config and dependencies from being added
|
|
49
49
|
--no-typescript Disables typescript config and dependencies from being added
|
|
50
50
|
--no-license Disables LICENSE + package.json license field from being added
|
|
51
51
|
--no-editorconfig Disables .editorconfig from being added
|
|
@@ -70,8 +70,8 @@ Examples
|
|
|
70
70
|
# Initialize a plugin in the directory ~/my-plugin
|
|
71
71
|
$ ${cliName} init ~/my-plugin
|
|
72
72
|
|
|
73
|
-
# Don't add
|
|
74
|
-
$ ${cliName} init --no-
|
|
73
|
+
# Don't add oxlint or oxfmt
|
|
74
|
+
$ ${cliName} init --no-oxlint --no-oxfmt
|
|
75
75
|
`;
|
|
76
76
|
async function run({ argv }) {
|
|
77
77
|
let cli = meow(help, {
|
|
@@ -96,4 +96,4 @@ async function run({ argv }) {
|
|
|
96
96
|
}
|
|
97
97
|
export { run as default };
|
|
98
98
|
|
|
99
|
-
//# sourceMappingURL=
|
|
99
|
+
//# sourceMappingURL=init-v15fyisU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-v15fyisU.js","names":[],"sources":["../src/npm/manager.ts","../src/cmds/init.ts"],"sourcesContent":["import execa from 'execa'\n\nimport {prompt} from '../util/prompt'\n\nfunction npmIsAvailable() {\n return execa('npm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction yarnIsAvailable() {\n return execa('yarn', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction pnpmAvailable() {\n return execa('pnpm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nexport async function promptForPackageManager() {\n const [npm, yarn, pnpm] = await Promise.all([\n npmIsAvailable(),\n yarnIsAvailable(),\n pnpmAvailable(),\n ])\n\n const choices = [npm && 'npm', yarn && 'yarn', pnpm && 'pnpm'].filter(Boolean)\n if (choices.length < 2) {\n return choices[0] || 'npm'\n }\n\n return prompt('Which package manager do you prefer?', {\n choices: choices.map((value) => ({value, name: value})),\n default: choices[0],\n })\n}\n\nexport async function installDependencies(pm: string, {cwd}: {cwd?: string}) {\n const proc = execa(pm, ['install'], {cwd, stdio: 'inherit'})\n const {exitCode} = await proc\n return exitCode <= 0\n}\n","import path from 'path'\n\nimport meow from 'meow'\n\nimport {init, initFlags} from '../actions/init'\nimport {cliName} from '../constants'\nimport {installDependencies, promptForPackageManager} from '../npm/manager'\nimport {presetHelpList} from '../presets/presets'\nimport {findStudioV3Config, hasSanityJson} from '../sanity/manifest'\nimport {isEmptyish, ensureDir} from '../util/files'\nimport log from '../util/log'\nimport {prompt} from '../util/prompt'\n\nconst description = `Initialize a new Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} init [dir] [<args>]\n\nOptions\n --no-oxlint Disables oxlint config and dependencies from being added\n --no-oxfmt Disables oxfmt config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n --no-install Disables automatically running package manager install\n\n --name [package-name] Use the provided package-name\n --author [name] Use the provided author\n --repo [url] Use the provided repo url\n --license [spdx] Use the license with the given SPDX identifier\n --force No prompt when overwriting files\n\n --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.\n The following presets are available:\n${presetHelpList(30)}\n\nExamples\n # Initialize a new plugin in the current directory\n $ ${cliName} init\n\n # Initialize a plugin in the directory ~/my-plugin\n $ ${cliName} init ~/my-plugin\n\n # Don't add oxlint or oxfmt\n $ ${cliName} init --no-oxlint --no-oxfmt\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n\n const {exists, isRoot} = await hasSanityJson(basePath)\n if (exists && isRoot) {\n throw new Error(\n `sanity.json has a \"root\" property set to true - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n const {v3ConfigFile} = await findStudioV3Config(basePath)\n if (v3ConfigFile) {\n throw new Error(\n `${v3ConfigFile} exists - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n log.info('Initializing new plugin in \"%s\"', basePath)\n if (\n !cli.flags.force &&\n !(await isEmptyish(basePath)) &&\n !(await prompt('Directory is not empty, proceed?', {type: 'confirm', default: false}))\n ) {\n log.error('Directory is not empty. Cancelled.')\n return\n }\n\n await ensureDir(basePath)\n await init({basePath, flags: cli.flags})\n if (cli.flags.install) {\n if (await installDependencies(await promptForPackageManager(), {cwd: basePath})) {\n log.info('Done!')\n } else {\n log.error('Failed to install dependencies, try manually running `npm install`')\n }\n } else {\n log.info('Dependency installation skipped.')\n }\n}\n\nexport default run\n"],"mappings":";;;;;;;AAIA,SAAS,iBAAiB;CACxB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CACxB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,SAAS,kBAAkB;CACzB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,SAAS,gBAAgB;CACvB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,eAAsB,0BAA0B;CAC9C,IAAM,CAAC,KAAK,MAAM,QAAQ,MAAM,QAAQ,IAAI;EAC1C,eAAe;EACf,gBAAgB;EAChB,cAAc;CAChB,CAAC,GAEK,UAAU;EAAC,OAAO;EAAO,QAAQ;EAAQ,QAAQ;CAAM,CAAC,CAAC,OAAO,OAAO;CAK7E,OAJI,QAAQ,SAAS,IACZ,QAAQ,MAAM,QAGhB,OAAO,wCAAwC;EACpD,SAAS,QAAQ,KAAK,WAAW;GAAC;GAAO,MAAM;EAAK,EAAE;EACtD,SAAS,QAAQ;CACnB,CAAC;AACH;AAEA,eAAsB,oBAAoB,IAAY,EAAC,OAAsB;CAE3E,IAAM,EAAC,aAAY,MADN,MAAM,IAAI,CAAC,SAAS,GAAG;EAAC;EAAK,OAAO;CAAS,CAC9B;CAC5B,OAAO,YAAY;AACrB;AC/BA,MAEM,OAAO;;MAEP,QAAQ;;;;;;;;;;;;;;;;;;;;EAoBZ,eAAe,EAAE,EAAE;;;;MAIf,QAAQ;;;MAGR,QAAQ;;;MAGR,QAAQ;;AAGd,eAAe,IAAI,EAAC,QAAyB;CAC3C,IAAM,MAAM,KAAK,MAAM;EAAC,OAAO;EAAW;EAAM;CAAW,CAAC,GACtD,WAAW,KAAK,QAAQ,IAAI,MAAM,MAAM,QAAQ,IAAI,CAAC,GAErD,EAAC,QAAQ,WAAU,MAAM,cAAc,QAAQ;CACrD,IAAI,UAAU,QACZ,MAAU,MACR,6GACF;CAGF,IAAM,EAAC,iBAAgB,MAAM,mBAAmB,QAAQ;CACxD,IAAI,cACF,MAAU,MACR,GAAG,aAAa,oEAClB;CAIF,IADA,YAAI,KAAK,qCAAmC,QAAQ,GAElD,CAAC,IAAI,MAAM,SACX,CAAE,MAAM,WAAW,QAAQ,KAC3B,CAAE,MAAM,OAAO,oCAAoC;EAAC,MAAM;EAAW,SAAS;CAAK,CAAC,GACpF;EACA,YAAI,MAAM,oCAAoC;EAC9C;CACF;CAIA,AAFA,MAAM,UAAU,QAAQ,GACxB,MAAM,KAAK;EAAC;EAAU,OAAO,IAAI;CAAK,CAAC,GACnC,IAAI,MAAM,UACR,MAAM,oBAAoB,MAAM,wBAAwB,GAAG,EAAC,KAAK,SAAQ,CAAC,IAC5E,YAAI,KAAK,OAAO,IAEhB,YAAI,MAAM,oEAAoE,IAGhF,YAAI,KAAK,kCAAkC;AAE/C"}
|