@sanity/pkg-utils 7.3.0 → 7.4.0-canary.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/bin/pkg-utils.js +2 -0
- package/dist/_chunks-cjs/index.cjs +1498 -43
- package/dist/_chunks-cjs/index.cjs.map +1 -1
- package/dist/_chunks-cjs/resolveRolldownConfig.cjs +2 -2
- package/dist/_chunks-cjs/resolveRolldownConfig.cjs.map +1 -1
- package/dist/{_chunks-cjs/build.cjs → _chunks-es/build.js} +28 -26
- package/dist/_chunks-es/build.js.map +1 -0
- package/dist/{_chunks-cjs/buildAction.cjs → _chunks-es/buildAction.js} +8 -6
- package/dist/_chunks-es/buildAction.js.map +1 -0
- package/dist/{_chunks-cjs/check.cjs → _chunks-es/check.js} +30 -26
- package/dist/_chunks-es/check.js.map +1 -0
- package/dist/_chunks-es/checkAction.js +17 -0
- package/dist/_chunks-es/checkAction.js.map +1 -0
- package/dist/{_chunks-cjs/consoleSpy.cjs → _chunks-es/consoleSpy.js} +105 -96
- package/dist/_chunks-es/consoleSpy.js.map +1 -0
- package/dist/_chunks-es/handleError.js +8 -0
- package/dist/_chunks-es/handleError.js.map +1 -0
- package/dist/_chunks-es/index.js +42 -1516
- package/dist/_chunks-es/index.js.map +1 -1
- package/dist/{_chunks-cjs/init.cjs → _chunks-es/init.js} +53 -47
- package/dist/_chunks-es/init.js.map +1 -0
- package/dist/_chunks-es/initAction.js +16 -0
- package/dist/_chunks-es/initAction.js.map +1 -0
- package/dist/_chunks-es/isRecord.js +37 -0
- package/dist/_chunks-es/isRecord.js.map +1 -0
- package/dist/_chunks-es/resolveRolldownConfig.js +1 -1
- package/dist/_chunks-es/watch.js +146 -0
- package/dist/_chunks-es/watch.js.map +1 -0
- package/dist/_chunks-es/watchAction.js +17 -0
- package/dist/_chunks-es/watchAction.js.map +1 -0
- package/dist/{cli.cjs → cli.js} +9 -19
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +16 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/bin/pkg-utils.cjs +0 -2
- package/dist/_chunks-cjs/build.cjs.map +0 -1
- package/dist/_chunks-cjs/buildAction.cjs.map +0 -1
- package/dist/_chunks-cjs/check.cjs.map +0 -1
- package/dist/_chunks-cjs/checkAction.cjs +0 -15
- package/dist/_chunks-cjs/checkAction.cjs.map +0 -1
- package/dist/_chunks-cjs/consoleSpy.cjs.map +0 -1
- package/dist/_chunks-cjs/handleError.cjs +0 -11
- package/dist/_chunks-cjs/handleError.cjs.map +0 -1
- package/dist/_chunks-cjs/init.cjs.map +0 -1
- package/dist/_chunks-cjs/initAction.cjs +0 -14
- package/dist/_chunks-cjs/initAction.cjs.map +0 -1
- package/dist/_chunks-cjs/isRecord.cjs +0 -39
- package/dist/_chunks-cjs/isRecord.cjs.map +0 -1
- package/dist/_chunks-cjs/watch.cjs +0 -157
- package/dist/_chunks-cjs/watch.cjs.map +0 -1
- package/dist/_chunks-cjs/watchAction.cjs +0 -15
- package/dist/_chunks-cjs/watchAction.cjs.map +0 -1
- package/dist/cli.cjs.map +0 -1
- /package/dist/{cli.d.cts → cli.d.ts} +0 -0
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
1
|
+
import { writeFile, readdir, lstat } from "node:fs/promises";
|
|
2
|
+
import { relative, resolve, dirname } from "node:path";
|
|
3
|
+
import { mkdirp } from "mkdirp";
|
|
4
|
+
import prompts from "prompts";
|
|
5
|
+
import { isRecord, fileExists, createLogger } from "./isRecord.js";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
7
|
+
import getLatestVersion from "get-latest-version";
|
|
8
|
+
import gitUrlParse from "git-url-parse";
|
|
9
|
+
import { outdent } from "outdent";
|
|
10
|
+
import { format } from "prettier";
|
|
7
11
|
function defineTemplateOption(option) {
|
|
8
12
|
return option;
|
|
9
13
|
}
|
|
@@ -12,10 +16,10 @@ const promptsTypes = {
|
|
|
12
16
|
};
|
|
13
17
|
async function createFromTemplate(options) {
|
|
14
18
|
const { cwd, logger, packagePath, template: templateOrResolver } = options, template = typeof templateOrResolver == "function" ? await templateOrResolver({ cwd, logger, packagePath }) : templateOrResolver;
|
|
15
|
-
logger.log("create new package at",
|
|
19
|
+
logger.log("create new package at", relative(cwd, packagePath));
|
|
16
20
|
const templateOptions = {};
|
|
17
21
|
for (const templateOption of template.options) {
|
|
18
|
-
const templateValidate = templateOption.validate, res = await
|
|
22
|
+
const templateValidate = templateOption.validate, res = await prompts(
|
|
19
23
|
{
|
|
20
24
|
type: promptsTypes[templateOption.type],
|
|
21
25
|
name: templateOption.name,
|
|
@@ -29,7 +33,7 @@ async function createFromTemplate(options) {
|
|
|
29
33
|
}
|
|
30
34
|
const features = {};
|
|
31
35
|
for (const templateFeature of template.features) {
|
|
32
|
-
const res = templateFeature.optional ? await
|
|
36
|
+
const res = templateFeature.optional ? await prompts(
|
|
33
37
|
{
|
|
34
38
|
type: "confirm",
|
|
35
39
|
name: "confirm",
|
|
@@ -43,13 +47,13 @@ async function createFromTemplate(options) {
|
|
|
43
47
|
const files = await template.getFiles(templateOptions, features);
|
|
44
48
|
files.sort((a, b) => a.name.localeCompare(b.name));
|
|
45
49
|
for (const file of files) {
|
|
46
|
-
const filePath =
|
|
47
|
-
await mkdirp
|
|
48
|
-
`), logger.success(`wrote ${
|
|
50
|
+
const filePath = resolve(packagePath, file.name);
|
|
51
|
+
await mkdirp(dirname(filePath)), await writeFile(filePath, file.contents.trim() + `
|
|
52
|
+
`), logger.success(`wrote ${relative(cwd, filePath)}`);
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
55
|
async function isEmptyDirectory(dirPath) {
|
|
52
|
-
return (await
|
|
56
|
+
return (await readdir(dirPath)).length === 0;
|
|
53
57
|
}
|
|
54
58
|
const overridableDefaults = {
|
|
55
59
|
endOfLine: "lf",
|
|
@@ -89,14 +93,14 @@ const overridableDefaults = {
|
|
|
89
93
|
validate: (v) => {
|
|
90
94
|
if (!v) return !0;
|
|
91
95
|
try {
|
|
92
|
-
return
|
|
96
|
+
return gitUrlParse(v), !0;
|
|
93
97
|
} catch {
|
|
94
98
|
return "invalid git url";
|
|
95
99
|
}
|
|
96
100
|
},
|
|
97
101
|
parse: (v) => {
|
|
98
102
|
if (!v) return null;
|
|
99
|
-
const result =
|
|
103
|
+
const result = gitUrlParse(v);
|
|
100
104
|
return { source: result.source, owner: result.owner, name: result.name };
|
|
101
105
|
}
|
|
102
106
|
},
|
|
@@ -212,7 +216,7 @@ const overridableDefaults = {
|
|
|
212
216
|
}, files = [];
|
|
213
217
|
if (files.push({
|
|
214
218
|
name: ".editorconfig",
|
|
215
|
-
contents: outdent
|
|
219
|
+
contents: outdent`
|
|
216
220
|
root = true
|
|
217
221
|
|
|
218
222
|
[*]
|
|
@@ -225,7 +229,7 @@ const overridableDefaults = {
|
|
|
225
229
|
`
|
|
226
230
|
}), files.push({
|
|
227
231
|
name: ".gitignore",
|
|
228
|
-
contents: outdent
|
|
232
|
+
contents: outdent`
|
|
229
233
|
*.local
|
|
230
234
|
*.log
|
|
231
235
|
*.tgz
|
|
@@ -237,7 +241,7 @@ const overridableDefaults = {
|
|
|
237
241
|
`
|
|
238
242
|
}), features.prettier && files.push({
|
|
239
243
|
name: ".prettierignore",
|
|
240
|
-
contents: outdent
|
|
244
|
+
contents: outdent`
|
|
241
245
|
dist
|
|
242
246
|
pnpm-lock.yaml
|
|
243
247
|
`
|
|
@@ -252,7 +256,7 @@ const overridableDefaults = {
|
|
|
252
256
|
"ts:check": "tsc --noEmit"
|
|
253
257
|
};
|
|
254
258
|
const devDependencies = pkgJson.devDependencies;
|
|
255
|
-
isRecord
|
|
259
|
+
isRecord(devDependencies) && (devDependencies.typescript = "^5.4");
|
|
256
260
|
}
|
|
257
261
|
if (features.eslint) {
|
|
258
262
|
const eslintConfig = {
|
|
@@ -287,7 +291,7 @@ const overridableDefaults = {
|
|
|
287
291
|
};
|
|
288
292
|
if (files.push({
|
|
289
293
|
name: ".eslintignore",
|
|
290
|
-
contents: outdent
|
|
294
|
+
contents: outdent`
|
|
291
295
|
dist
|
|
292
296
|
`
|
|
293
297
|
}), pkgJson.scripts = {
|
|
@@ -336,8 +340,8 @@ const overridableDefaults = {
|
|
|
336
340
|
files.push({
|
|
337
341
|
name: ".eslintrc.cjs",
|
|
338
342
|
contents: await prettierFormat(
|
|
339
|
-
|
|
340
|
-
outdent
|
|
343
|
+
resolve(packagePath, ".eslintrc.cjs"),
|
|
344
|
+
outdent`
|
|
341
345
|
'use strict'
|
|
342
346
|
|
|
343
347
|
/** @type import('eslint').Linter.Config */
|
|
@@ -350,8 +354,8 @@ const overridableDefaults = {
|
|
|
350
354
|
features.typescript && (files.push({
|
|
351
355
|
name: "tsconfig.settings.json",
|
|
352
356
|
contents: await prettierFormat(
|
|
353
|
-
|
|
354
|
-
outdent
|
|
357
|
+
resolve(packagePath, "tsconfig.settings.json"),
|
|
358
|
+
outdent`
|
|
355
359
|
{
|
|
356
360
|
"extends": "@sanity/pkg-utils/tsconfig/strictest.json",
|
|
357
361
|
"compilerOptions": {
|
|
@@ -365,8 +369,8 @@ const overridableDefaults = {
|
|
|
365
369
|
}), files.push({
|
|
366
370
|
name: "tsconfig.dist.json",
|
|
367
371
|
contents: await prettierFormat(
|
|
368
|
-
|
|
369
|
-
outdent
|
|
372
|
+
resolve(packagePath, "tsconfig.dist.json"),
|
|
373
|
+
outdent`
|
|
370
374
|
{
|
|
371
375
|
"extends": "./tsconfig.settings",
|
|
372
376
|
"include": ["./src"],
|
|
@@ -378,8 +382,8 @@ const overridableDefaults = {
|
|
|
378
382
|
}), files.push({
|
|
379
383
|
name: "tsconfig.json",
|
|
380
384
|
contents: await prettierFormat(
|
|
381
|
-
|
|
382
|
-
outdent
|
|
385
|
+
resolve(packagePath, "tsconfig.json"),
|
|
386
|
+
outdent`
|
|
383
387
|
{
|
|
384
388
|
"extends": "./tsconfig.settings",
|
|
385
389
|
"include": ["./**/*.cjs", "./**/*.ts", "./**/*.tsx"],
|
|
@@ -391,8 +395,8 @@ const overridableDefaults = {
|
|
|
391
395
|
})), features.typescript ? (files.push({
|
|
392
396
|
name: "package.config.ts",
|
|
393
397
|
contents: await prettierFormat(
|
|
394
|
-
|
|
395
|
-
outdent
|
|
398
|
+
resolve(packagePath, "package.config.ts"),
|
|
399
|
+
outdent`
|
|
396
400
|
import {defineConfig} from '@sanity/pkg-utils'
|
|
397
401
|
|
|
398
402
|
// https://github.com/sanity-io/pkg-utils#configuration
|
|
@@ -406,8 +410,8 @@ const overridableDefaults = {
|
|
|
406
410
|
}), files.push({
|
|
407
411
|
name: "src/index.ts",
|
|
408
412
|
contents: await prettierFormat(
|
|
409
|
-
|
|
410
|
-
outdent
|
|
413
|
+
resolve(packagePath, "src/index.ts"),
|
|
414
|
+
outdent`
|
|
411
415
|
/** @public */
|
|
412
416
|
export function main(): void {
|
|
413
417
|
//
|
|
@@ -418,8 +422,8 @@ const overridableDefaults = {
|
|
|
418
422
|
})) : (files.push({
|
|
419
423
|
name: "package.config.js",
|
|
420
424
|
contents: await prettierFormat(
|
|
421
|
-
|
|
422
|
-
outdent
|
|
425
|
+
resolve(packagePath, "package.config.js"),
|
|
426
|
+
outdent`
|
|
423
427
|
import {defineConfig} from '@sanity/pkg-utils'
|
|
424
428
|
|
|
425
429
|
export default defineConfig({
|
|
@@ -436,8 +440,8 @@ const overridableDefaults = {
|
|
|
436
440
|
}), files.push({
|
|
437
441
|
name: "src/index.js",
|
|
438
442
|
contents: await prettierFormat(
|
|
439
|
-
|
|
440
|
-
outdent
|
|
443
|
+
resolve(packagePath, "src/index.js"),
|
|
444
|
+
outdent`
|
|
441
445
|
/** @public */
|
|
442
446
|
export function main() {
|
|
443
447
|
//
|
|
@@ -459,7 +463,7 @@ const overridableDefaults = {
|
|
|
459
463
|
return files.push({
|
|
460
464
|
name: "package.json",
|
|
461
465
|
contents: await prettierFormat(
|
|
462
|
-
|
|
466
|
+
resolve(packagePath, "package.json"),
|
|
463
467
|
JSON.stringify(pkgJson, null, 2),
|
|
464
468
|
config
|
|
465
469
|
)
|
|
@@ -468,14 +472,14 @@ const overridableDefaults = {
|
|
|
468
472
|
};
|
|
469
473
|
};
|
|
470
474
|
function prettierFormat(filepath, input, prettierOptions) {
|
|
471
|
-
return
|
|
475
|
+
return format(input, { ...prettierOptions, plugins: [], filepath });
|
|
472
476
|
}
|
|
473
477
|
async function resolveLatestDeps(deps) {
|
|
474
478
|
const depsEntries = Object.entries(deps), latestDeps = {};
|
|
475
479
|
for (const entry of depsEntries) {
|
|
476
480
|
const [name, version] = entry;
|
|
477
481
|
if (version) {
|
|
478
|
-
const latestVersion = await
|
|
482
|
+
const latestVersion = await getLatestVersion(name, version);
|
|
479
483
|
latestDeps[name] = latestVersion ? `^${latestVersion}` : version;
|
|
480
484
|
}
|
|
481
485
|
}
|
|
@@ -484,7 +488,7 @@ async function resolveLatestDeps(deps) {
|
|
|
484
488
|
function getGitUserConfig(cwd) {
|
|
485
489
|
let user, email;
|
|
486
490
|
try {
|
|
487
|
-
user =
|
|
491
|
+
user = execSync("git config user.name", { encoding: "utf8", cwd }).trim() || void 0, email = execSync("git config user.email", { encoding: "utf8", cwd }).trim() || void 0;
|
|
488
492
|
} catch {
|
|
489
493
|
}
|
|
490
494
|
return { user, email };
|
|
@@ -494,7 +498,7 @@ async function init(options) {
|
|
|
494
498
|
throw new Error("Missing required option: cwd");
|
|
495
499
|
if (!options.path)
|
|
496
500
|
throw new Error("Missing required option: path");
|
|
497
|
-
const logger =
|
|
501
|
+
const logger = createLogger(), packagePath = resolve(options.cwd, options.path);
|
|
498
502
|
await ensurePackagePath(packagePath), await createFromTemplate({
|
|
499
503
|
cwd: options.cwd,
|
|
500
504
|
logger,
|
|
@@ -503,15 +507,17 @@ async function init(options) {
|
|
|
503
507
|
});
|
|
504
508
|
}
|
|
505
509
|
async function ensurePackagePath(packagePath) {
|
|
506
|
-
if (!
|
|
507
|
-
await mkdirp
|
|
510
|
+
if (!fileExists(packagePath)) {
|
|
511
|
+
await mkdirp(packagePath);
|
|
508
512
|
return;
|
|
509
513
|
}
|
|
510
|
-
if (!(await
|
|
514
|
+
if (!(await lstat(packagePath)).isDirectory())
|
|
511
515
|
throw new Error("the package path is a file, not a directory");
|
|
512
516
|
if (!await isEmptyDirectory(packagePath))
|
|
513
517
|
throw new Error("the package directory is not empty");
|
|
514
518
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
519
|
+
export {
|
|
520
|
+
defineTemplateOption,
|
|
521
|
+
init
|
|
522
|
+
};
|
|
523
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sources":["../../src/node/core/template/define.ts","../../src/node/core/template/createFromTemplate.ts","../../src/node/isEmptyDirectory.ts","../../node_modules/.pnpm/@sanity+prettier-config@1.0.4_prettier@3.5.3/node_modules/@sanity/prettier-config/dist/index.js","../../src/node/templates/default/template.ts","../../src/node/init.ts"],"sourcesContent":["import type {PkgTemplateOption} from './types'\n\n/** @public */\nexport function defineTemplateOption<T>(option: PkgTemplateOption<T>): PkgTemplateOption<T> {\n return option\n}\n","import {writeFile} from 'node:fs/promises'\nimport {dirname, relative, resolve} from 'node:path'\nimport {mkdirp} from 'mkdirp'\nimport prompts from 'prompts'\nimport type {Logger} from '../../logger'\nimport type {PkgTemplate} from './types'\n\nconst promptsTypes = {\n string: 'text' as const,\n}\n\n/** @internal */\nexport async function createFromTemplate(options: {\n cwd: string\n logger: Logger\n packagePath: string\n template: PkgTemplate\n}): Promise<void> {\n const {cwd, logger, packagePath, template: templateOrResolver} = options\n\n const template =\n typeof templateOrResolver === 'function'\n ? await templateOrResolver({cwd, logger, packagePath})\n : templateOrResolver\n\n logger.log('create new package at', relative(cwd, packagePath))\n\n const templateOptions: Record<string, string> = {}\n\n for (const templateOption of template.options) {\n const templateValidate = templateOption.validate\n\n const res = await prompts(\n {\n type: promptsTypes[templateOption.type],\n name: templateOption.name,\n message: templateOption.description,\n validate: templateValidate ? (prev) => templateValidate(prev) : undefined,\n initial:\n typeof templateOption.initial === 'function'\n ? templateOption.initial(templateOptions)\n : templateOption.initial,\n },\n {onCancel: () => process.exit(0)},\n )\n\n templateOptions[templateOption.name] = templateOption.parse\n ? templateOption.parse(res[templateOption.name])\n : res[templateOption.name]\n }\n\n const features: Record<string, boolean> = {}\n\n for (const templateFeature of template.features) {\n const res = templateFeature.optional\n ? await prompts(\n {\n type: 'confirm',\n name: 'confirm',\n message: `use ${templateFeature.name}?`,\n initial: templateFeature.initial,\n },\n {onCancel: () => process.exit(0)},\n )\n : undefined\n\n features[templateFeature.name] = res?.confirm || !templateFeature.optional\n }\n\n const files = await template.getFiles(templateOptions, features)\n\n files.sort((a, b) => {\n return a.name.localeCompare(b.name)\n })\n\n for (const file of files) {\n const filePath = resolve(packagePath, file.name)\n\n await mkdirp(dirname(filePath))\n await writeFile(filePath, file.contents.trim() + '\\n')\n\n logger.success(`wrote ${relative(cwd, filePath)}`)\n }\n}\n","import {readdir} from 'node:fs/promises'\n\nexport async function isEmptyDirectory(dirPath: string): Promise<boolean> {\n return (await readdir(dirPath)).length === 0\n}\n","const overridableDefaults = {\n endOfLine: \"lf\",\n tabWidth: 2,\n useTabs: !1\n}, config = {\n ...overridableDefaults,\n printWidth: 100,\n semi: !1,\n singleQuote: !0,\n quoteProps: \"consistent\",\n bracketSpacing: !1,\n plugins: [\"prettier-plugin-packagejson\"],\n overrides: [\n {\n files: [\"*.json5\"],\n options: {\n quoteProps: \"preserve\",\n singleQuote: !1\n }\n },\n {\n files: [\"*.yml\"],\n options: {\n singleQuote: !1\n }\n }\n ]\n};\nexport {\n config as default\n};\n//# sourceMappingURL=index.js.map\n","import {execSync} from 'node:child_process'\nimport {resolve} from 'node:path'\nimport prettierConfig from '@sanity/prettier-config'\nimport getLatestVersion from 'get-latest-version'\nimport gitUrlParse from 'git-url-parse'\nimport {outdent} from 'outdent'\nimport {format, type Config as PrettierConfig} from 'prettier'\nimport {isRecord} from '../../core/isRecord'\nimport type {PackageJSON} from '../../core/pkg/types'\nimport {defineTemplateOption} from '../../core/template/define'\nimport {type PkgTemplate, type PkgTemplateFile} from '../../core/template/types'\n\nconst RE_NAME = /^(?:@(?:[a-z0-9-*~][a-z0-9-*._~]*)\\/)?[a-z0-9-~][a-z0-9-._~]*$/i\n\nexport const defaultTemplate: PkgTemplate = async ({cwd, logger, packagePath}) => {\n const gitConfig = getGitUserConfig(cwd)\n\n return {\n options: [\n defineTemplateOption<{owner: string; name: string}>({\n name: 'repo',\n type: 'string',\n description: 'git url',\n validate: (v) => {\n if (!v) return true\n\n try {\n gitUrlParse(v)\n\n return true\n } catch {\n return 'invalid git url'\n }\n },\n parse: (v) => {\n if (!v) return null\n\n const result = gitUrlParse(v)\n\n return {source: result.source, owner: result.owner, name: result.name}\n },\n }),\n defineTemplateOption({\n name: 'pkgName',\n type: 'string',\n description: 'package name',\n initial: (options) => options['repo']?.name || undefined,\n validate: (v) => {\n if (!v) return 'package name is required'\n\n const match = RE_NAME.exec(v)\n\n if (!match) {\n return 'invalid package name'\n }\n\n return true\n },\n parse: (v) => {\n if (!v) {\n throw new Error('package name is required')\n }\n\n const match = RE_NAME.exec(v)\n\n if (!match) {\n throw new Error('invalid package name')\n }\n\n const [scope, name] = v.split('/')\n\n return {scope, name, fullName: v}\n },\n }),\n defineTemplateOption({\n name: 'description',\n type: 'string',\n description: 'package description',\n }),\n defineTemplateOption({\n name: 'authorName',\n type: 'string',\n description: 'package author name',\n initial: gitConfig.user,\n }),\n defineTemplateOption({\n name: 'authorEmail',\n type: 'string',\n description: 'package author email',\n initial: gitConfig.email,\n }),\n defineTemplateOption({\n name: 'license',\n type: 'string',\n description: 'package license',\n initial: 'MIT',\n validate: (v) => {\n if (!v) return 'license is required'\n\n return true\n },\n }),\n ],\n\n features: [\n {\n name: 'eslint',\n optional: true,\n initial: true,\n },\n {\n name: 'prettier',\n optional: true,\n initial: true,\n },\n {\n name: 'typescript',\n optional: true,\n initial: true,\n },\n ],\n\n async getFiles(options, features) {\n const {pkgName, repo} = options\n const {fullName: name} = pkgName\n\n const author =\n [options['authorName'], options['authorEmail'] && `<${options['authorEmail']}>`]\n .filter(Boolean)\n .join(' ') ?? undefined\n\n const pkgJson: PackageJSON & {\n prettier?: '@sanity/prettier-config'\n ['lint-staged']?: Record<string, string[]>\n } = {\n name,\n 'version': '0.0.0',\n 'description': options['description'] ?? undefined,\n 'keywords': [],\n 'homepage': undefined,\n 'bugs': undefined,\n 'repository': undefined,\n 'license': options['license'],\n author,\n 'sideEffects': false,\n 'type': 'module',\n 'exports': {\n '.': {\n source: features['typescript'] ? './src/index.ts' : './src/index.js',\n require: './dist/index.cjs',\n default: './dist/index.js',\n },\n './package.json': './package.json',\n },\n 'main': './dist/index.cjs',\n 'module': './dist/index.js',\n 'types': undefined,\n 'files': ['dist', 'src'],\n 'scripts': {\n build: 'pkg build --strict --clean --check',\n format: features['prettier'] ? 'prettier --write --cache --ignore-unknown .' : undefined,\n },\n 'lint-staged': features['prettier']\n ? {\n '*': ['prettier --write --cache --ignore-unknown'],\n }\n : undefined,\n 'browserslist': 'extends @sanity/browserslist-config',\n 'prettier': features['prettier'] ? '@sanity/prettier-config' : undefined,\n 'dependencies': {},\n 'devDependencies': {\n '@sanity/pkg-utils': '^6',\n '@sanity/prettier-config': features['prettier'] ? '^1' : undefined,\n '@typescript-eslint/eslint-plugin': undefined,\n '@typescript-eslint/parser': undefined,\n 'eslint': undefined,\n 'eslint-config-prettier': undefined,\n 'eslint-plugin-import': undefined,\n 'eslint-plugin-prettier': undefined,\n 'eslint-plugin-simple-import-sort': undefined,\n 'lint-staged': '^15',\n 'prettier': features['prettier'] ? '^3' : undefined,\n 'typescript': undefined,\n },\n 'engines': {\n node: '>=18.0.0',\n },\n }\n\n const files: PkgTemplateFile[] = []\n\n // .editorconfig\n files.push({\n name: '.editorconfig',\n contents: outdent`\n root = true\n\n [*]\n charset = utf-8\n indent_style = space\n indent_size = 2\n end_of_line = lf\n insert_final_newline = true\n trim_trailing_whitespace = true\n `,\n })\n\n // .gitignore\n files.push({\n name: '.gitignore',\n contents: outdent`\n *.local\n *.log\n *.tgz\n\n .DS_Store\n dist\n etc\n node_modules\n `,\n })\n\n if (features['prettier']) {\n files.push({\n name: '.prettierignore',\n contents: outdent`\n dist\n pnpm-lock.yaml\n `,\n })\n }\n\n if (repo) {\n pkgJson.repository = {\n type: 'git',\n url: `git+ssh://git@${repo.source}/${repo.owner}/${repo.name}.git`,\n }\n pkgJson.bugs = {\n url: `https://${repo.source}/${repo.owner}/${repo.name}/issues`,\n }\n pkgJson.homepage = `https://${repo.source}/${repo.owner}/${repo.name}#readme`\n }\n\n if (features['typescript']) {\n pkgJson.types = './dist/index.d.ts'\n\n pkgJson.scripts = {\n ...pkgJson.scripts,\n ['ts:check']: 'tsc --noEmit',\n }\n\n const devDependencies = pkgJson.devDependencies\n\n if (isRecord(devDependencies)) {\n devDependencies['typescript'] = '^5.4'\n }\n }\n\n if (features['eslint']) {\n const eslintConfig: any = {\n root: true,\n env: {\n browser: true,\n es6: true,\n node: true,\n },\n extends: [\n 'eslint:recommended',\n features['prettier'] ? 'plugin:prettier/recommended' : undefined,\n ].filter(Boolean),\n parserOptions: {\n ecmaVersion: 2020,\n sourceType: 'module',\n },\n plugins: [\n 'import',\n 'simple-import-sort',\n features['prettier'] ? 'prettier' : undefined,\n ].filter(Boolean),\n rules: {\n 'no-console': 'error',\n 'no-shadow': 'error',\n 'no-warning-comments': ['warn', {location: 'start', terms: ['todo', 'fixme']}],\n 'quote-props': ['warn', 'consistent-as-needed'],\n 'simple-import-sort/exports': 'warn',\n 'simple-import-sort/imports': 'warn',\n 'strict': ['warn', 'global'],\n },\n }\n\n files.push({\n name: '.eslintignore',\n contents: outdent`\n dist\n `,\n })\n\n pkgJson.scripts = {\n ...pkgJson.scripts,\n lint: features['typescript']\n ? 'eslint . --ext .cjs,.js,.ts,.tsx'\n : 'eslint . --ext .cjs,.js',\n }\n\n pkgJson.devDependencies = {\n ...pkgJson.devDependencies,\n 'eslint': '^8',\n 'eslint-config-prettier': features['prettier'] ? '^9' : undefined,\n 'eslint-plugin-import': '^2',\n 'eslint-plugin-prettier': features['prettier'] ? '^5' : undefined,\n 'eslint-plugin-simple-import-sort': '^12',\n }\n\n if (features['typescript']) {\n pkgJson.devDependencies = {\n ...pkgJson.devDependencies,\n '@typescript-eslint/eslint-plugin': '^7',\n '@typescript-eslint/parser': '^7',\n }\n\n const eslintConfigOverride: any = {\n files: ['**/*.ts', '**/*.tsx'],\n parser: '@typescript-eslint/parser',\n parserOptions: {\n project: ['./tsconfig.json'],\n },\n extends: [\n 'eslint:recommended',\n features['prettier'] ? 'plugin:prettier/recommended' : undefined,\n 'plugin:@typescript-eslint/eslint-recommended',\n 'plugin:@typescript-eslint/recommended',\n ].filter(Boolean),\n plugins: [\n 'import',\n '@typescript-eslint',\n 'simple-import-sort',\n features['prettier'] ? 'prettier' : undefined,\n ].filter(Boolean),\n rules: {\n '@typescript-eslint/explicit-module-boundary-types': 'error',\n '@typescript-eslint/interface-name-prefix': 'off',\n '@typescript-eslint/member-delimiter-style': 'off',\n '@typescript-eslint/no-empty-interface': 'off',\n },\n }\n\n eslintConfig.overrides = [eslintConfigOverride]\n }\n\n files.push({\n name: '.eslintrc.cjs',\n contents: await prettierFormat(\n resolve(packagePath, '.eslintrc.cjs'),\n outdent`\n 'use strict'\n\n /** @type import('eslint').Linter.Config */\n module.exports = ${JSON.stringify(eslintConfig, null, 2)}\n `,\n prettierConfig,\n ),\n })\n }\n\n if (features['typescript']) {\n files.push({\n name: 'tsconfig.settings.json',\n contents: await prettierFormat(\n resolve(packagePath, 'tsconfig.settings.json'),\n outdent`\n {\n \"extends\": \"@sanity/pkg-utils/tsconfig/strictest.json\",\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"outDir\": \"./dist\"\n }\n }\n `,\n prettierConfig,\n ),\n })\n\n files.push({\n name: 'tsconfig.dist.json',\n contents: await prettierFormat(\n resolve(packagePath, 'tsconfig.dist.json'),\n outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\"],\n \"exclude\": [\"./src/**/*.test.ts\"]\n }\n `,\n prettierConfig,\n ),\n })\n\n files.push({\n name: 'tsconfig.json',\n contents: await prettierFormat(\n resolve(packagePath, 'tsconfig.json'),\n outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./**/*.cjs\", \"./**/*.ts\", \"./**/*.tsx\"],\n \"exclude\": [\"./node_modules\"]\n }\n `,\n prettierConfig,\n ),\n })\n }\n\n // source file\n if (features['typescript']) {\n files.push({\n name: 'package.config.ts',\n contents: await prettierFormat(\n resolve(packagePath, 'package.config.ts'),\n outdent`\n import {defineConfig} from '@sanity/pkg-utils'\n\n // https://github.com/sanity-io/pkg-utils#configuration\n export default defineConfig({\n // the path to the tsconfig file for distributed builds\n tsconfig: 'tsconfig.dist.json',\n })\n `,\n prettierConfig,\n ),\n })\n\n files.push({\n name: 'src/index.ts',\n contents: await prettierFormat(\n resolve(packagePath, 'src/index.ts'),\n outdent`\n /** @public */\n export function main(): void {\n //\n }\n `,\n prettierConfig,\n ),\n })\n } else {\n files.push({\n name: 'package.config.js',\n contents: await prettierFormat(\n resolve(packagePath, 'package.config.js'),\n outdent`\n import {defineConfig} from '@sanity/pkg-utils'\n\n export default defineConfig({\n extract: {\n rules: {\n // do not require internal members to be prefixed with \\`_\\`\n 'ae-internal-missing-underscore': 'off',\n },\n },\n })\n `,\n prettierConfig,\n ),\n })\n\n files.push({\n name: 'src/index.js',\n contents: await prettierFormat(\n resolve(packagePath, 'src/index.js'),\n outdent`\n /** @public */\n export function main() {\n //\n }\n `,\n prettierConfig,\n ),\n })\n }\n\n // Resolve latest dependencies\n try {\n pkgJson.dependencies = await resolveLatestDeps(pkgJson.dependencies ?? {})\n } catch (error) {\n logger.warn(error instanceof Error ? error.message : error)\n }\n\n // Resolve latest devDependencies\n try {\n pkgJson.devDependencies = await resolveLatestDeps(pkgJson.devDependencies ?? {})\n } catch (error) {\n logger.warn(error instanceof Error ? error.message : error)\n }\n\n files.push({\n name: 'package.json',\n contents: await prettierFormat(\n resolve(packagePath, 'package.json'),\n JSON.stringify(pkgJson, null, 2),\n prettierConfig,\n ),\n })\n\n return files\n },\n }\n}\n\nfunction prettierFormat(\n filepath: string,\n input: string,\n prettierOptions: PrettierConfig | undefined,\n) {\n return format(input, {...prettierOptions, plugins: [], filepath})\n}\n\nasync function resolveLatestDeps(deps: Record<string, string | undefined>) {\n const depsEntries = Object.entries(deps)\n const latestDeps: Record<string, string> = {}\n\n for (const entry of depsEntries) {\n const [name, version] = entry\n\n if (version) {\n const latestVersion = await getLatestVersion(name, version)\n\n latestDeps[name] = latestVersion ? `^${latestVersion}` : version\n }\n }\n\n return latestDeps\n}\n\nfunction getGitUserConfig(cwd: string): {user?: string; email?: string} {\n let user: string | undefined\n let email: string | undefined\n\n try {\n user = execSync('git config user.name', {encoding: 'utf8', cwd}).trim() || undefined\n email = execSync('git config user.email', {encoding: 'utf8', cwd}).trim() || undefined\n } catch {\n /* ignore */\n }\n\n return {user, email}\n}\n","import {lstat} from 'node:fs/promises'\nimport {resolve} from 'node:path'\nimport {mkdirp} from 'mkdirp'\nimport {createFromTemplate} from './core/template'\nimport {fileExists} from './fileExists'\nimport {isEmptyDirectory} from './isEmptyDirectory'\nimport {createLogger} from './logger'\nimport {defaultTemplate} from './templates/default/template'\n\n/** @public */\nexport async function init(options: {cwd: string; path: string}): Promise<void> {\n if (!options.cwd) {\n throw new Error('Missing required option: cwd')\n }\n\n if (!options.path) {\n throw new Error('Missing required option: path')\n }\n\n const logger = createLogger()\n\n const packagePath = resolve(options.cwd, options.path)\n\n await ensurePackagePath(packagePath)\n\n await createFromTemplate({\n cwd: options.cwd,\n logger,\n template: defaultTemplate,\n packagePath,\n })\n}\n\nasync function ensurePackagePath(packagePath: string): Promise<void> {\n const exists = fileExists(packagePath)\n\n if (!exists) {\n await mkdirp(packagePath)\n\n return\n }\n\n const dir = (await lstat(packagePath)).isDirectory()\n\n if (!dir) {\n throw new Error('the package path is a file, not a directory')\n }\n\n const empty = await isEmptyDirectory(packagePath)\n\n if (!empty) {\n throw new Error('the package directory is not empty')\n }\n}\n"],"names":["prettierConfig"],"mappings":"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","x_google_ignoreList":[3]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { init } from "./init.js";
|
|
2
|
+
import { handleError } from "./handleError.js";
|
|
3
|
+
async function initAction(options) {
|
|
4
|
+
try {
|
|
5
|
+
await init({
|
|
6
|
+
cwd: process.cwd(),
|
|
7
|
+
path: options.path
|
|
8
|
+
});
|
|
9
|
+
} catch (err) {
|
|
10
|
+
handleError(err);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
initAction
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=initAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initAction.js","sources":["../../src/cli/initAction.ts"],"sourcesContent":["import {init} from '../node/init'\nimport {handleError} from './handleError'\n\nexport async function initAction(options: {path: string}): Promise<void> {\n try {\n await init({\n cwd: process.cwd(),\n path: options.path,\n })\n } catch (err) {\n handleError(err)\n }\n}\n"],"names":[],"mappings":";;AAGA,eAAsB,WAAW,SAAwC;AACnE,MAAA;AACF,UAAM,KAAK;AAAA,MACT,KAAK,QAAQ,IAAI;AAAA,MACjB,MAAM,QAAQ;AAAA,IAAA,CACf;AAAA,WACM,KAAK;AACZ,gBAAY,GAAG;AAAA,EAAA;AAEnB;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { statSync } from "node:fs";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
function fileExists(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
return statSync(filePath), !0;
|
|
6
|
+
} catch {
|
|
7
|
+
return !1;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function createLogger() {
|
|
11
|
+
return {
|
|
12
|
+
log: (...args) => {
|
|
13
|
+
console.log(...args);
|
|
14
|
+
},
|
|
15
|
+
info: (...args) => {
|
|
16
|
+
console.log(chalk.blue("[info]"), ...args);
|
|
17
|
+
},
|
|
18
|
+
warn: (...args) => {
|
|
19
|
+
console.log(chalk.yellow("[warning]"), ...args);
|
|
20
|
+
},
|
|
21
|
+
error: (...args) => {
|
|
22
|
+
console.log(chalk.red("[error]"), ...args);
|
|
23
|
+
},
|
|
24
|
+
success: (...args) => {
|
|
25
|
+
console.log(chalk.green("[success]"), ...args);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isRecord(value) {
|
|
30
|
+
return !!value && !Array.isArray(value) && typeof value == "object";
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
createLogger,
|
|
34
|
+
fileExists,
|
|
35
|
+
isRecord
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=isRecord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isRecord.js","sources":["../../src/node/fileExists.ts","../../src/node/logger.ts","../../src/node/core/isRecord.ts"],"sourcesContent":["import {statSync} from 'node:fs'\n\n/** @internal */\nexport function fileExists(filePath: string): boolean {\n try {\n statSync(filePath)\n\n return true\n } catch {\n return false\n }\n}\n","// oxlint-disable no-console\nimport chalk from 'chalk'\n\n/** @alpha */\nexport interface Logger {\n log: (...args: unknown[]) => void\n info: (...args: unknown[]) => void\n warn: (...args: unknown[]) => void\n error: (...args: unknown[]) => void\n success: (...args: unknown[]) => void\n}\n\n/** @alpha */\nexport function createLogger(): Logger {\n return {\n log: (...args) => {\n console.log(...args)\n },\n info: (...args) => {\n console.log(chalk.blue('[info]'), ...args)\n },\n warn: (...args) => {\n console.log(chalk.yellow('[warning]'), ...args)\n },\n error: (...args) => {\n console.log(chalk.red('[error]'), ...args)\n },\n success: (...args) => {\n console.log(chalk.green('[success]'), ...args)\n },\n }\n}\n","/** @internal */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && !Array.isArray(value) && typeof value === 'object'\n}\n"],"names":[],"mappings":";;AAGO,SAAS,WAAW,UAA2B;AAChD,MAAA;AACF,WAAA,SAAS,QAAQ,GAEV;AAAA,EAAA,QACD;AACC,WAAA;AAAA,EAAA;AAEX;ACEO,SAAS,eAAuB;AAC9B,SAAA;AAAA,IACL,KAAK,IAAI,SAAS;AACR,cAAA,IAAI,GAAG,IAAI;AAAA,IACrB;AAAA,IACA,MAAM,IAAI,SAAS;AACjB,cAAQ,IAAI,MAAM,KAAK,QAAQ,GAAG,GAAG,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,IAAI,SAAS;AACjB,cAAQ,IAAI,MAAM,OAAO,WAAW,GAAG,GAAG,IAAI;AAAA,IAChD;AAAA,IACA,OAAO,IAAI,SAAS;AAClB,cAAQ,IAAI,MAAM,IAAI,SAAS,GAAG,GAAG,IAAI;AAAA,IAC3C;AAAA,IACA,SAAS,IAAI,SAAS;AACpB,cAAQ,IAAI,MAAM,MAAM,WAAW,GAAG,GAAG,IAAI;AAAA,IAAA;AAAA,EAEjD;AACF;AC9BO,SAAS,SAAS,OAAkD;AAClE,SAAA,CAAA,CAAQ,SAAU,CAAC,MAAM,QAAQ,KAAK,KAAK,OAAO,SAAU;AACrE;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { dts } from "rolldown-plugin-dts";
|
|
3
|
-
import { pkgExtMap } from "./
|
|
3
|
+
import { pkgExtMap } from "./consoleSpy.js";
|
|
4
4
|
function resolveRolldownConfig(ctx, buildTask) {
|
|
5
5
|
const { format, runtime, target } = buildTask, { config, cwd, exports: _exports, external, distPath, logger, pkg, ts } = ctx, outputExt = pkgExtMap[pkg.type || "commonjs"][format], outDir = path.relative(cwd, distPath), pathAliases = Object.fromEntries(
|
|
6
6
|
Object.entries(ts.config?.options.paths || {}).map(([key, val]) => [key, path.resolve(cwd, ts.config?.options.baseUrl || ".", val[0])])
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { Observable, switchMap } from "rxjs";
|
|
3
|
+
import { getTargetPaths, loadConfig, loadPkgWithReporting, resolveBuildContext } from "./consoleSpy.js";
|
|
4
|
+
import { createLogger } from "./isRecord.js";
|
|
5
|
+
import { watchTaskHandlers } from "./index.js";
|
|
6
|
+
import { scan, startWith, distinctUntilChanged } from "rxjs/operators";
|
|
7
|
+
import globby from "globby";
|
|
8
|
+
import * as chokidar from "chokidar";
|
|
9
|
+
function resolveWatchTasks(ctx) {
|
|
10
|
+
const { pkg, target } = ctx, tasks = [], exports = Object.entries(ctx.exports || {}).map(
|
|
11
|
+
([_path, exp]) => ({ _path, ...exp })
|
|
12
|
+
), dtsTask = {
|
|
13
|
+
type: "watch:dts",
|
|
14
|
+
entries: []
|
|
15
|
+
}, rollupTasks = {};
|
|
16
|
+
function addRollupTaskEntry(format, runtime, entry) {
|
|
17
|
+
const buildId = `${format}:${runtime}`;
|
|
18
|
+
rollupTasks[buildId] ? rollupTasks[buildId].entries.push(entry) : rollupTasks[buildId] = {
|
|
19
|
+
type: "watch:js",
|
|
20
|
+
buildId,
|
|
21
|
+
entries: [entry],
|
|
22
|
+
runtime,
|
|
23
|
+
format,
|
|
24
|
+
target: target[runtime]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
for (const exp of exports) {
|
|
28
|
+
const importId = path.join(pkg.name, exp._path);
|
|
29
|
+
exp.source?.endsWith(".ts") && dtsTask.entries.push({
|
|
30
|
+
importId,
|
|
31
|
+
exportPath: exp._path,
|
|
32
|
+
sourcePath: exp.source,
|
|
33
|
+
targetPaths: getTargetPaths(pkg.type, exp)
|
|
34
|
+
}), exp.browser?.source?.endsWith(".ts") && dtsTask.entries.push({
|
|
35
|
+
importId,
|
|
36
|
+
exportPath: exp._path,
|
|
37
|
+
sourcePath: exp.browser.source,
|
|
38
|
+
targetPaths: getTargetPaths(pkg.type, exp.browser)
|
|
39
|
+
}), exp.node?.source?.endsWith(".ts") && dtsTask.entries.push({
|
|
40
|
+
importId,
|
|
41
|
+
exportPath: exp._path,
|
|
42
|
+
sourcePath: exp.node.source,
|
|
43
|
+
targetPaths: getTargetPaths(pkg.type, exp.node)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
for (const exp of exports) {
|
|
47
|
+
const output = exp.require;
|
|
48
|
+
output && addRollupTaskEntry("commonjs", ctx.runtime, {
|
|
49
|
+
path: exp._path,
|
|
50
|
+
source: exp.source,
|
|
51
|
+
output
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
for (const exp of exports) {
|
|
55
|
+
const output = exp.browser?.require;
|
|
56
|
+
output && addRollupTaskEntry("commonjs", "browser", {
|
|
57
|
+
path: exp._path,
|
|
58
|
+
source: exp.browser?.source || exp.source,
|
|
59
|
+
output
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
for (const exp of exports) {
|
|
63
|
+
const output = exp.import;
|
|
64
|
+
output && addRollupTaskEntry("esm", ctx.runtime, {
|
|
65
|
+
path: exp._path,
|
|
66
|
+
source: exp.source,
|
|
67
|
+
output
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
for (const exp of exports) {
|
|
71
|
+
const output = exp.browser?.import;
|
|
72
|
+
output && addRollupTaskEntry("esm", "browser", {
|
|
73
|
+
path: exp._path,
|
|
74
|
+
source: exp.browser?.source || exp.source,
|
|
75
|
+
output
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return dtsTask.entries.length && tasks.push(dtsTask), tasks.push(...Object.values(rollupTasks)), tasks;
|
|
79
|
+
}
|
|
80
|
+
function globFiles(patterns) {
|
|
81
|
+
return globby(patterns.map((pattern) => pattern.split(path.sep).join(path.posix.sep)));
|
|
82
|
+
}
|
|
83
|
+
function watchFiles(patterns) {
|
|
84
|
+
return new Observable((observer) => {
|
|
85
|
+
const watcher = chokidar.watch(patterns, {
|
|
86
|
+
ignoreInitial: !0
|
|
87
|
+
});
|
|
88
|
+
function handleFileEvent(type, file) {
|
|
89
|
+
type === "error" || file instanceof Error ? observer.error(file) : observer.next({ type, file });
|
|
90
|
+
}
|
|
91
|
+
return watcher.on("all", handleFileEvent), () => {
|
|
92
|
+
watcher.off("all", handleFileEvent), watcher.close();
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function watchConfigFiles(options) {
|
|
97
|
+
const { cwd, logger } = options, initialFiles = await globFiles([
|
|
98
|
+
path.resolve(cwd, "package.json"),
|
|
99
|
+
path.resolve(cwd, "package.config.cjs"),
|
|
100
|
+
path.resolve(cwd, "package.config.js"),
|
|
101
|
+
path.resolve(cwd, "package.config.ts")
|
|
102
|
+
]);
|
|
103
|
+
return watchFiles([
|
|
104
|
+
path.resolve(cwd, "package.json"),
|
|
105
|
+
path.resolve(cwd, "package.config.cjs"),
|
|
106
|
+
path.resolve(cwd, "package.config.js"),
|
|
107
|
+
path.resolve(cwd, "package.config.ts")
|
|
108
|
+
]).pipe(
|
|
109
|
+
scan((files, fileEvent) => fileEvent.type === "add" ? files.concat(fileEvent.file) : fileEvent.type === "unlink" ? files.filter((f) => f !== fileEvent.file) : fileEvent.type === "change" ? (logger.log(
|
|
110
|
+
"--------------------------------------------------------------------------------"
|
|
111
|
+
), logger.info(path.relative(cwd, fileEvent.file), "changed"), logger.log(""), files.slice(0)) : files, initialFiles),
|
|
112
|
+
startWith(initialFiles),
|
|
113
|
+
distinctUntilChanged()
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
async function watch(options) {
|
|
117
|
+
const { cwd, strict = !1, tsconfig: tsconfigOption } = options, logger = createLogger();
|
|
118
|
+
(await watchConfigFiles({ cwd, logger })).pipe(
|
|
119
|
+
switchMap(async (configFiles) => {
|
|
120
|
+
if (!configFiles.map((f) => path.relative(cwd, f)).find((f) => f === "package.json"))
|
|
121
|
+
throw new Error("missing package.json");
|
|
122
|
+
const config = await loadConfig({ cwd }), pkg = await loadPkgWithReporting({ cwd, logger, strict }), tsconfig = tsconfigOption || config?.tsconfig || "tsconfig.json";
|
|
123
|
+
return resolveBuildContext({ config, cwd, logger, pkg, strict, tsconfig });
|
|
124
|
+
})
|
|
125
|
+
).subscribe(async (ctx) => {
|
|
126
|
+
const watchTasks = resolveWatchTasks(ctx);
|
|
127
|
+
for (const task of watchTasks) {
|
|
128
|
+
const handler = watchTaskHandlers[task.type];
|
|
129
|
+
handler.exec(ctx, task).subscribe({
|
|
130
|
+
error: (err) => {
|
|
131
|
+
ctx.logger.error(err), ctx.logger.log(), process.exit(1);
|
|
132
|
+
},
|
|
133
|
+
next: (result) => {
|
|
134
|
+
handler.complete(ctx, task, result);
|
|
135
|
+
},
|
|
136
|
+
complete: () => {
|
|
137
|
+
ctx.logger.success(handler.name(ctx, task)), ctx.logger.log();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
watch
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sources":["../../src/node/resolveWatchTasks.ts","../../src/node/globFiles.ts","../../src/node/watchFiles.ts","../../src/node/watchConfigFiles.ts","../../src/node/watch.ts"],"sourcesContent":["import path from 'node:path'\nimport type {PkgExport, PkgFormat, PkgRuntime} from './core/config/types'\nimport type {BuildContext} from './core/contexts/buildContext'\nimport {getTargetPaths} from './tasks/dts/getTargetPaths'\nimport type {DtsWatchTask} from './tasks/dts/types'\nimport type {RollupTaskEntry, RollupWatchTask, WatchTask} from './tasks/types'\n\n/** @internal */\nexport function resolveWatchTasks(ctx: BuildContext): WatchTask[] {\n const {pkg, target} = ctx\n const tasks: WatchTask[] = []\n\n const exports = Object.entries(ctx.exports || {}).map(\n ([_path, exp]) => ({_path, ...exp}) as PkgExport & {_path: string},\n )\n\n const dtsTask: DtsWatchTask = {\n type: 'watch:dts',\n entries: [],\n }\n\n const rollupTasks: Record<string, RollupWatchTask> = {}\n\n function addRollupTaskEntry(format: PkgFormat, runtime: PkgRuntime, entry: RollupTaskEntry) {\n const buildId = `${format}:${runtime}`\n\n if (rollupTasks[buildId]) {\n rollupTasks[buildId].entries.push(entry)\n } else {\n rollupTasks[buildId] = {\n type: 'watch:js',\n buildId,\n entries: [entry],\n runtime,\n format,\n target: target[runtime],\n }\n }\n }\n\n // Parse `dts` tasks\n for (const exp of exports) {\n const importId = path.join(pkg.name, exp._path)\n\n if (exp.source?.endsWith('.ts')) {\n dtsTask.entries.push({\n importId,\n exportPath: exp._path,\n sourcePath: exp.source,\n targetPaths: getTargetPaths(pkg.type, exp),\n })\n }\n\n if (exp.browser?.source?.endsWith('.ts')) {\n dtsTask.entries.push({\n importId,\n exportPath: exp._path,\n sourcePath: exp.browser.source,\n targetPaths: getTargetPaths(pkg.type, exp.browser),\n })\n }\n\n if (exp.node?.source?.endsWith('.ts')) {\n dtsTask.entries.push({\n importId,\n exportPath: exp._path,\n sourcePath: exp.node.source,\n targetPaths: getTargetPaths(pkg.type, exp.node),\n })\n }\n }\n\n // Parse rollup:commonjs:* tasks\n for (const exp of exports) {\n const output = exp.require\n\n if (!output) continue\n\n addRollupTaskEntry('commonjs', ctx.runtime, {\n path: exp._path,\n source: exp.source,\n output,\n })\n }\n\n // Parse rollup:commonjs:browser tasks\n for (const exp of exports) {\n const output = exp.browser?.require\n\n if (!output) continue\n\n addRollupTaskEntry('commonjs', 'browser', {\n path: exp._path,\n source: exp.browser?.source || exp.source,\n output,\n })\n }\n\n // Parse rollup:esm:* tasks\n for (const exp of exports) {\n const output = exp.import\n\n if (!output) continue\n\n addRollupTaskEntry('esm', ctx.runtime, {\n path: exp._path,\n source: exp.source,\n output,\n })\n }\n\n // Parse rollup:esm:browser tasks\n for (const exp of exports) {\n const output = exp.browser?.import\n\n if (!output) continue\n\n addRollupTaskEntry('esm', 'browser', {\n path: exp._path,\n source: exp.browser?.source || exp.source,\n output,\n })\n }\n\n if (dtsTask.entries.length) {\n tasks.push(dtsTask)\n }\n\n tasks.push(...Object.values(rollupTasks))\n\n return tasks\n}\n","import path from 'node:path'\nimport globby from 'globby'\n\nexport function globFiles(patterns: string[]): Promise<string[]> {\n return globby(patterns.map((pattern) => pattern.split(path.sep).join(path.posix.sep)))\n}\n","import * as chokidar from 'chokidar'\nimport type {EventName} from 'chokidar/handler.js'\nimport {Observable} from 'rxjs'\n\nexport interface FileEvent {\n type: EventName\n file: string\n}\n\nexport function watchFiles(patterns: string[]): Observable<FileEvent> {\n return new Observable((observer) => {\n const watcher = chokidar.watch(patterns, {\n ignoreInitial: true,\n })\n\n function handleFileEvent(type: EventName, file: string | Error) {\n if (type === 'error' || file instanceof Error) {\n observer.error(file)\n } else {\n observer.next({type, file})\n }\n }\n\n watcher.on('all', handleFileEvent)\n\n return () => {\n watcher.off('all', handleFileEvent)\n watcher.close()\n }\n })\n}\n","import path from 'node:path'\nimport type {Observable} from 'rxjs'\nimport {distinctUntilChanged, scan, startWith} from 'rxjs/operators'\nimport {globFiles} from './globFiles'\nimport type {Logger} from './logger'\nimport {watchFiles} from './watchFiles'\n\nexport async function watchConfigFiles(options: {\n cwd: string\n logger: Logger\n}): Promise<Observable<string[]>> {\n const {cwd, logger} = options\n\n const initialFiles = await globFiles([\n path.resolve(cwd, 'package.json'),\n path.resolve(cwd, 'package.config.cjs'),\n path.resolve(cwd, 'package.config.js'),\n path.resolve(cwd, 'package.config.ts'),\n ])\n\n const fileEvent$ = watchFiles([\n path.resolve(cwd, 'package.json'),\n path.resolve(cwd, 'package.config.cjs'),\n path.resolve(cwd, 'package.config.js'),\n path.resolve(cwd, 'package.config.ts'),\n ])\n\n return fileEvent$.pipe(\n scan((files, fileEvent) => {\n if (fileEvent.type === 'add') {\n return files.concat(fileEvent.file)\n }\n\n if (fileEvent.type === 'unlink') {\n return files.filter((f) => f !== fileEvent.file)\n }\n\n if (fileEvent.type === 'change') {\n logger.log(\n '--------------------------------------------------------------------------------',\n )\n logger.info(path.relative(cwd, fileEvent.file), 'changed')\n logger.log('')\n\n return files.slice(0) // trigger update\n }\n\n return files\n }, initialFiles),\n startWith(initialFiles),\n distinctUntilChanged(),\n )\n}\n","import path from 'node:path'\nimport {switchMap} from 'rxjs'\nimport {loadConfig} from './core/config/loadConfig'\nimport {loadPkgWithReporting} from './core/pkg/loadPkgWithReporting'\nimport {createLogger} from './logger'\nimport {resolveBuildContext} from './resolveBuildContext'\nimport {resolveWatchTasks} from './resolveWatchTasks'\nimport {watchTaskHandlers} from './tasks'\nimport {type TaskHandler, type WatchTask} from './tasks/types'\nimport {watchConfigFiles} from './watchConfigFiles'\n\n/** @public */\nexport async function watch(options: {\n cwd: string\n strict?: boolean\n tsconfig?: string\n}): Promise<void> {\n const {cwd, strict = false, tsconfig: tsconfigOption} = options\n\n const logger = createLogger()\n\n const configFiles$ = await watchConfigFiles({cwd, logger})\n\n const ctx$ = configFiles$.pipe(\n switchMap(async (configFiles) => {\n const files = configFiles.map((f) => path.relative(cwd, f))\n\n const packageJsonPath = files.find((f) => f === 'package.json')\n\n if (!packageJsonPath) {\n throw new Error('missing package.json')\n }\n\n const config = await loadConfig({cwd})\n const pkg = await loadPkgWithReporting({cwd, logger, strict})\n const tsconfig = tsconfigOption || config?.tsconfig || 'tsconfig.json'\n\n return resolveBuildContext({config, cwd, logger, pkg, strict, tsconfig})\n }),\n )\n\n ctx$.subscribe(async (ctx) => {\n const watchTasks = resolveWatchTasks(ctx)\n\n for (const task of watchTasks) {\n const handler = watchTaskHandlers[task.type] as TaskHandler<WatchTask, unknown>\n const result$ = handler.exec(ctx, task)\n\n result$.subscribe({\n error: (err) => {\n ctx.logger.error(err)\n ctx.logger.log()\n\n process.exit(1)\n },\n next: (result) => {\n handler.complete(ctx, task, result)\n },\n complete: () => {\n ctx.logger.success(handler.name(ctx, task))\n ctx.logger.log()\n },\n })\n }\n })\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { watch } from "./watch.js";
|
|
2
|
+
import { handleError } from "./handleError.js";
|
|
3
|
+
async function watchAction(options) {
|
|
4
|
+
try {
|
|
5
|
+
await watch({
|
|
6
|
+
cwd: process.cwd(),
|
|
7
|
+
strict: options.strict,
|
|
8
|
+
tsconfig: options.tsconfig
|
|
9
|
+
});
|
|
10
|
+
} catch (err) {
|
|
11
|
+
handleError(err);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
watchAction
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=watchAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watchAction.js","sources":["../../src/cli/watchAction.ts"],"sourcesContent":["import {watch} from '../node/watch'\nimport {handleError} from './handleError'\n\nexport async function watchAction(options: {strict?: boolean; tsconfig?: string}): Promise<void> {\n try {\n await watch({\n cwd: process.cwd(),\n strict: options.strict,\n tsconfig: options.tsconfig,\n })\n } catch (err) {\n handleError(err)\n }\n}\n"],"names":[],"mappings":";;AAGA,eAAsB,YAAY,SAA+D;AAC3F,MAAA;AACF,UAAM,MAAM;AAAA,MACV,KAAK,QAAQ,IAAI;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,IAAA,CACnB;AAAA,WACM,KAAK;AACZ,gBAAY,GAAG;AAAA,EAAA;AAEnB;"}
|