@sanity/pkg-utils 2.2.17 → 2.3.1
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 +16 -7
- package/dist/_chunks/{build-45e5ded8.cjs → build-0aed2000.cjs} +11 -8
- package/dist/_chunks/{build-45e5ded8.cjs.map → build-0aed2000.cjs.map} +1 -1
- package/dist/_chunks/{buildAction-afc0a1a6.cjs → buildAction-196fba7b.cjs} +2 -2
- package/dist/_chunks/{buildAction-afc0a1a6.cjs.map → buildAction-196fba7b.cjs.map} +1 -1
- package/dist/_chunks/{check-33e163bb.cjs → check-2deafe2a.cjs} +22 -19
- package/dist/_chunks/{check-33e163bb.cjs.map → check-2deafe2a.cjs.map} +1 -1
- package/dist/_chunks/{checkAction-6fd7b2bc.cjs → checkAction-7ac5a05e.cjs} +2 -2
- package/dist/_chunks/{checkAction-6fd7b2bc.cjs.map → checkAction-7ac5a05e.cjs.map} +1 -1
- package/dist/_chunks/{index-f3c22a05.cjs → index-984e18d1.cjs} +4 -2
- package/dist/_chunks/{index-f3c22a05.cjs.map → index-984e18d1.cjs.map} +1 -1
- package/dist/_chunks/init-ab36343b.cjs +469 -0
- package/dist/_chunks/init-ab36343b.cjs.map +1 -0
- package/dist/_chunks/initAction-d18cf4f2.cjs +16 -0
- package/dist/_chunks/initAction-d18cf4f2.cjs.map +1 -0
- package/dist/_chunks/logger-c593f06b.cjs +97 -0
- package/dist/_chunks/logger-c593f06b.cjs.map +1 -0
- package/dist/_chunks/{resolveBuildContext-6666f1ab.cjs → resolveBuildContext-5ef90110.cjs} +10 -91
- package/dist/_chunks/resolveBuildContext-5ef90110.cjs.map +1 -0
- package/dist/_chunks/{watch-2bff1357.cjs → watch-63a93eb0.cjs} +10 -7
- package/dist/_chunks/{watch-2bff1357.cjs.map → watch-63a93eb0.cjs.map} +1 -1
- package/dist/_chunks/{watchAction-39b0210b.cjs → watchAction-95c0b481.cjs} +2 -2
- package/dist/_chunks/{watchAction-39b0210b.cjs.map → watchAction-95c0b481.cjs.map} +1 -1
- package/dist/cli.cjs +14 -4
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +12 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +87 -0
- package/dist/index.js +449 -8
- package/dist/index.js.map +1 -1
- package/package.json +23 -15
- package/src/cli/index.ts +8 -0
- package/src/cli/initAction.ts +13 -0
- package/src/node/core/index.ts +1 -0
- package/src/node/core/pkg/types.ts +13 -0
- package/src/node/core/template/createFromTemplate.ts +85 -0
- package/src/node/core/template/define.ts +6 -0
- package/src/node/core/template/index.ts +3 -0
- package/src/node/core/template/types.ts +45 -0
- package/src/node/index.ts +1 -0
- package/src/node/init.ts +55 -0
- package/src/node/isEmptyDirectory.ts +5 -0
- package/src/node/templates/default/index.ts +1 -0
- package/src/node/templates/default/template.ts +553 -0
- package/src/node/templates/index.ts +1 -0
- package/dist/_chunks/resolveBuildContext-6666f1ab.cjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/pkg-utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "Simple utilities for modern npm packages.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity-io",
|
|
@@ -121,15 +121,15 @@
|
|
|
121
121
|
},
|
|
122
122
|
"dependencies": {
|
|
123
123
|
"@babel/core": "^7.22.1",
|
|
124
|
-
"@babel/preset-env": "^7.22.
|
|
125
|
-
"@babel/types": "^7.22.
|
|
126
|
-
"@microsoft/api-extractor": "^7.35.
|
|
124
|
+
"@babel/preset-env": "^7.22.4",
|
|
125
|
+
"@babel/types": "^7.22.4",
|
|
126
|
+
"@microsoft/api-extractor": "^7.35.1",
|
|
127
127
|
"@microsoft/tsdoc-config": "^0.16.2",
|
|
128
128
|
"@rollup/plugin-alias": "^5.0.0",
|
|
129
129
|
"@rollup/plugin-babel": "^6.0.3",
|
|
130
130
|
"@rollup/plugin-commonjs": "^25.0.0",
|
|
131
131
|
"@rollup/plugin-json": "^6.0.0",
|
|
132
|
-
"@rollup/plugin-node-resolve": "^15.0
|
|
132
|
+
"@rollup/plugin-node-resolve": "^15.1.0",
|
|
133
133
|
"@rollup/plugin-replace": "^5.0.2",
|
|
134
134
|
"@rollup/plugin-terser": "^0.4.3",
|
|
135
135
|
"browserslist": "^4.21.7",
|
|
@@ -139,12 +139,18 @@
|
|
|
139
139
|
"esbuild": "^0.17.19",
|
|
140
140
|
"esbuild-register": "^3.4.2",
|
|
141
141
|
"find-config": "^1.0.0",
|
|
142
|
+
"get-latest-version": "^5.0.1",
|
|
143
|
+
"git-url-parse": "^13.1.0",
|
|
142
144
|
"globby": "^11.1.0",
|
|
143
145
|
"jsonc-parser": "^3.2.0",
|
|
144
146
|
"mkdirp": "^3.0.1",
|
|
147
|
+
"outdent": "^0.8.0",
|
|
148
|
+
"parse-git-config": "^3.0.0",
|
|
145
149
|
"pkg-up": "^3.1.0",
|
|
146
150
|
"prettier": "^2.8.8",
|
|
151
|
+
"prettier-plugin-packagejson": "^2.4.3",
|
|
147
152
|
"pretty-bytes": "^5.6.0",
|
|
153
|
+
"prompts": "^2.4.2",
|
|
148
154
|
"recast": "^0.23.2",
|
|
149
155
|
"rimraf": "^5.0.1",
|
|
150
156
|
"rollup": "^3.23.0",
|
|
@@ -155,23 +161,26 @@
|
|
|
155
161
|
"zod": "^3.21.4"
|
|
156
162
|
},
|
|
157
163
|
"devDependencies": {
|
|
158
|
-
"@commitlint/cli": "^17.6.
|
|
159
|
-
"@commitlint/config-conventional": "^17.6.
|
|
164
|
+
"@commitlint/cli": "^17.6.5",
|
|
165
|
+
"@commitlint/config-conventional": "^17.6.5",
|
|
160
166
|
"@sanity/pkg-utils": "workspace:*",
|
|
161
167
|
"@sanity/semantic-release-preset": "4.1.1",
|
|
162
168
|
"@types/babel__core": "^7.20.1",
|
|
163
169
|
"@types/cpx": "^1.5.2",
|
|
164
170
|
"@types/find-config": "^1.0.1",
|
|
171
|
+
"@types/git-url-parse": "^9.0.1",
|
|
165
172
|
"@types/node": "^20.2.5",
|
|
166
|
-
"@types/
|
|
173
|
+
"@types/parse-git-config": "^3.0.1",
|
|
174
|
+
"@types/prettier": "^2.7.3",
|
|
175
|
+
"@types/prompts": "^2.4.4",
|
|
167
176
|
"@types/treeify": "^1.0.0",
|
|
168
177
|
"@types/uuid": "^9.0.1",
|
|
169
|
-
"@typescript-eslint/eslint-plugin": "^5.59.
|
|
170
|
-
"@typescript-eslint/parser": "^5.59.
|
|
178
|
+
"@typescript-eslint/eslint-plugin": "^5.59.8",
|
|
179
|
+
"@typescript-eslint/parser": "^5.59.8",
|
|
171
180
|
"commitizen": "^4.3.0",
|
|
172
181
|
"cpx": "^1.5.0",
|
|
173
182
|
"cz-conventional-changelog": "^3.3.0",
|
|
174
|
-
"eslint": "^8.
|
|
183
|
+
"eslint": "^8.42.0",
|
|
175
184
|
"eslint-config-prettier": "^8.8.0",
|
|
176
185
|
"eslint-plugin-import": "^2.27.5",
|
|
177
186
|
"eslint-plugin-prettier": "^4.2.1",
|
|
@@ -180,12 +189,11 @@
|
|
|
180
189
|
"lint-staged": "^13.2.2",
|
|
181
190
|
"npm-run-all": "^4.1.5",
|
|
182
191
|
"outdent": "^0.8.0",
|
|
183
|
-
"prettier-plugin-packagejson": "^2.4.3",
|
|
184
192
|
"rollup-plugin-visualizer": "^5.9.0",
|
|
185
|
-
"semantic-release": "^21.0.
|
|
193
|
+
"semantic-release": "^21.0.3",
|
|
186
194
|
"ts-node": "^10.9.1",
|
|
187
|
-
"typescript": "^5.
|
|
188
|
-
"vitest": "^0.31.
|
|
195
|
+
"typescript": "^5.1.3",
|
|
196
|
+
"vitest": "^0.31.4"
|
|
189
197
|
},
|
|
190
198
|
"peerDependencies": {
|
|
191
199
|
"typescript": "^4.7 || ^5"
|
package/src/cli/index.ts
CHANGED
|
@@ -26,6 +26,14 @@ cli
|
|
|
26
26
|
return buildAction(options)
|
|
27
27
|
})
|
|
28
28
|
|
|
29
|
+
cli.command('init [path]', 'Initialize package').action(async (p) => {
|
|
30
|
+
const {initAction} = await import('./initAction')
|
|
31
|
+
|
|
32
|
+
return initAction({
|
|
33
|
+
path: p,
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
|
|
29
37
|
cli
|
|
30
38
|
.command('watch', 'Watch package')
|
|
31
39
|
.option('--strict', 'Strict mode')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {init} from '../node/init'
|
|
2
|
+
import {handleError} from './handleError'
|
|
3
|
+
|
|
4
|
+
export async function initAction(options: {path: string}): Promise<void> {
|
|
5
|
+
try {
|
|
6
|
+
await init({
|
|
7
|
+
cwd: process.cwd(),
|
|
8
|
+
path: options.path,
|
|
9
|
+
})
|
|
10
|
+
} catch (err) {
|
|
11
|
+
handleError(err)
|
|
12
|
+
}
|
|
13
|
+
}
|
package/src/node/core/index.ts
CHANGED
|
@@ -3,7 +3,10 @@ export interface PackageJSON {
|
|
|
3
3
|
type?: 'commonjs' | 'module'
|
|
4
4
|
version: string
|
|
5
5
|
private?: boolean
|
|
6
|
+
author?: string | {name: string; email?: string; url?: string}
|
|
6
7
|
name: string
|
|
8
|
+
description?: string
|
|
9
|
+
keywords?: string[]
|
|
7
10
|
bin?: Record<string, string>
|
|
8
11
|
dependencies?: Record<string, string>
|
|
9
12
|
devDependencies?: Record<string, string>
|
|
@@ -34,5 +37,15 @@ export interface PackageJSON {
|
|
|
34
37
|
source?: string
|
|
35
38
|
module?: string
|
|
36
39
|
types?: string
|
|
40
|
+
files?: string[]
|
|
41
|
+
scripts?: Record<string, string>
|
|
37
42
|
browserslist?: string[]
|
|
43
|
+
engines?: {
|
|
44
|
+
node?: string
|
|
45
|
+
npm?: string
|
|
46
|
+
}
|
|
47
|
+
repository?: string | {type: 'git'; url: string}
|
|
48
|
+
bugs?: string | {url: string; email?: string}
|
|
49
|
+
homepage?: string
|
|
50
|
+
license?: string
|
|
38
51
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {writeFile} from 'fs/promises'
|
|
2
|
+
import {mkdirp} from 'mkdirp'
|
|
3
|
+
import {dirname, relative, resolve} from 'path'
|
|
4
|
+
import prompts from 'prompts'
|
|
5
|
+
|
|
6
|
+
import {Logger} from '../../logger'
|
|
7
|
+
import {PkgTemplate} from './types'
|
|
8
|
+
|
|
9
|
+
const promptsTypes = {
|
|
10
|
+
string: 'text' as const,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** @internal */
|
|
14
|
+
export async function createFromTemplate(options: {
|
|
15
|
+
cwd: string
|
|
16
|
+
logger: Logger
|
|
17
|
+
packagePath: string
|
|
18
|
+
template: PkgTemplate
|
|
19
|
+
}): Promise<void> {
|
|
20
|
+
const {cwd, logger, packagePath, template: templateOrResolver} = options
|
|
21
|
+
|
|
22
|
+
const template =
|
|
23
|
+
typeof templateOrResolver === 'function'
|
|
24
|
+
? await templateOrResolver({cwd, logger, packagePath})
|
|
25
|
+
: templateOrResolver
|
|
26
|
+
|
|
27
|
+
logger.log('create new package at', relative(cwd, packagePath))
|
|
28
|
+
|
|
29
|
+
const templateOptions: Record<string, string> = {}
|
|
30
|
+
|
|
31
|
+
for (const templateOption of template.options) {
|
|
32
|
+
const templateValidate = templateOption.validate
|
|
33
|
+
|
|
34
|
+
const res = await prompts(
|
|
35
|
+
{
|
|
36
|
+
type: promptsTypes[templateOption.type],
|
|
37
|
+
name: templateOption.name,
|
|
38
|
+
message: templateOption.description,
|
|
39
|
+
validate: templateValidate ? (prev) => templateValidate(prev) : undefined,
|
|
40
|
+
initial:
|
|
41
|
+
typeof templateOption.initial === 'function'
|
|
42
|
+
? templateOption.initial(templateOptions)
|
|
43
|
+
: templateOption.initial,
|
|
44
|
+
},
|
|
45
|
+
{onCancel: () => process.exit(0)}
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
templateOptions[templateOption.name] = templateOption.parse
|
|
49
|
+
? templateOption.parse(res[templateOption.name])
|
|
50
|
+
: res[templateOption.name]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const features: Record<string, boolean> = {}
|
|
54
|
+
|
|
55
|
+
for (const templateFeature of template.features) {
|
|
56
|
+
const res = templateFeature.optional
|
|
57
|
+
? await prompts(
|
|
58
|
+
{
|
|
59
|
+
type: 'confirm',
|
|
60
|
+
name: 'confirm',
|
|
61
|
+
message: `use ${templateFeature.name}?`,
|
|
62
|
+
initial: templateFeature.initial,
|
|
63
|
+
},
|
|
64
|
+
{onCancel: () => process.exit(0)}
|
|
65
|
+
)
|
|
66
|
+
: undefined
|
|
67
|
+
|
|
68
|
+
features[templateFeature.name] = res?.confirm || !templateFeature.optional
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const files = await template.getFiles(templateOptions, features)
|
|
72
|
+
|
|
73
|
+
files.sort((a, b) => {
|
|
74
|
+
return a.name.localeCompare(b.name)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
for (const file of files) {
|
|
78
|
+
const filePath = resolve(packagePath, file.name)
|
|
79
|
+
|
|
80
|
+
await mkdirp(dirname(filePath))
|
|
81
|
+
await writeFile(filePath, file.contents.trim() + '\n')
|
|
82
|
+
|
|
83
|
+
logger.success(`wrote ${relative(cwd, filePath)}`)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {Logger} from '../../logger'
|
|
2
|
+
|
|
3
|
+
/** @public */
|
|
4
|
+
export interface PkgTemplateFile {
|
|
5
|
+
name: string
|
|
6
|
+
contents: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** @public */
|
|
10
|
+
export interface PkgTemplateStringOption<T = string> {
|
|
11
|
+
name: string
|
|
12
|
+
type: 'string'
|
|
13
|
+
description: string
|
|
14
|
+
initial?: T | ((options: Record<string, any>) => T)
|
|
15
|
+
parse?: (v: string) => T | null
|
|
16
|
+
validate?: (v: string) => string | true
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** @public */
|
|
20
|
+
export type PkgTemplateOption<T = string> = PkgTemplateStringOption<T>
|
|
21
|
+
|
|
22
|
+
/** @public */
|
|
23
|
+
export interface PkgTemplateDefinition {
|
|
24
|
+
options: PkgTemplateStringOption<any>[]
|
|
25
|
+
features: {
|
|
26
|
+
name: string
|
|
27
|
+
optional: boolean
|
|
28
|
+
initial: boolean
|
|
29
|
+
}[]
|
|
30
|
+
getFiles: (
|
|
31
|
+
options: Record<string, any>,
|
|
32
|
+
features: Record<string, boolean>
|
|
33
|
+
) => Promise<PkgTemplateFile[]>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** @public */
|
|
37
|
+
export type PkgTemplateResolver = (options: {
|
|
38
|
+
cwd: string
|
|
39
|
+
/** @internal */
|
|
40
|
+
logger: Logger
|
|
41
|
+
packagePath: string
|
|
42
|
+
}) => PkgTemplateDefinition | Promise<PkgTemplateDefinition>
|
|
43
|
+
|
|
44
|
+
/** @public */
|
|
45
|
+
export type PkgTemplate = PkgTemplateDefinition | PkgTemplateResolver
|
package/src/node/index.ts
CHANGED
package/src/node/init.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {lstat} from 'fs/promises'
|
|
2
|
+
import {mkdirp} from 'mkdirp'
|
|
3
|
+
import {resolve} from 'path'
|
|
4
|
+
|
|
5
|
+
import {createFromTemplate} from './core/template'
|
|
6
|
+
import {fileExists} from './fileExists'
|
|
7
|
+
import {isEmptyDirectory} from './isEmptyDirectory'
|
|
8
|
+
import {createLogger} from './logger'
|
|
9
|
+
import {defaultTemplate} from './templates'
|
|
10
|
+
|
|
11
|
+
/** @public */
|
|
12
|
+
export async function init(options: {cwd: string; path: string}): Promise<void> {
|
|
13
|
+
if (!options.cwd) {
|
|
14
|
+
throw new Error('Missing required option: cwd')
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (!options.path) {
|
|
18
|
+
throw new Error('Missing required option: path')
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const logger = createLogger()
|
|
22
|
+
|
|
23
|
+
const packagePath = resolve(options.cwd, options.path)
|
|
24
|
+
|
|
25
|
+
await ensurePackagePath(packagePath)
|
|
26
|
+
|
|
27
|
+
await createFromTemplate({
|
|
28
|
+
cwd: options.cwd,
|
|
29
|
+
logger,
|
|
30
|
+
template: defaultTemplate,
|
|
31
|
+
packagePath,
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function ensurePackagePath(packagePath: string): Promise<void> {
|
|
36
|
+
const exists = fileExists(packagePath)
|
|
37
|
+
|
|
38
|
+
if (!exists) {
|
|
39
|
+
await mkdirp(packagePath)
|
|
40
|
+
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const dir = (await lstat(packagePath)).isDirectory()
|
|
45
|
+
|
|
46
|
+
if (!dir) {
|
|
47
|
+
throw new Error('the package path is a file, not a directory')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const empty = await isEmptyDirectory(packagePath)
|
|
51
|
+
|
|
52
|
+
if (!empty) {
|
|
53
|
+
throw new Error('the package directory is not empty')
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './template'
|