@sanity/pkg-utils 9.2.3 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/_chunks-es/buildAction.js +151 -2
  2. package/dist/_chunks-es/buildAction.js.map +1 -1
  3. package/dist/_chunks-es/checkAction.js +183 -2
  4. package/dist/_chunks-es/checkAction.js.map +1 -1
  5. package/dist/_chunks-es/createApiExtractorConfig.js +52 -0
  6. package/dist/_chunks-es/createApiExtractorConfig.js.map +1 -0
  7. package/dist/_chunks-es/createTSDocConfig.js +31 -0
  8. package/dist/_chunks-es/createTSDocConfig.js.map +1 -0
  9. package/dist/_chunks-es/defaults.js +36 -0
  10. package/dist/_chunks-es/defaults.js.map +1 -0
  11. package/dist/_chunks-es/define.js +7 -0
  12. package/dist/_chunks-es/define.js.map +1 -0
  13. package/dist/_chunks-es/fileExists.js +12 -0
  14. package/dist/_chunks-es/fileExists.js.map +1 -0
  15. package/dist/_chunks-es/getExtractMessagesConfig.js +83 -0
  16. package/dist/_chunks-es/getExtractMessagesConfig.js.map +1 -0
  17. package/dist/_chunks-es/handleError.js +25 -1
  18. package/dist/_chunks-es/handleError.js.map +1 -1
  19. package/dist/_chunks-es/index.js +8 -212
  20. package/dist/_chunks-es/index.js.map +1 -1
  21. package/dist/_chunks-es/initAction.js +515 -2
  22. package/dist/_chunks-es/initAction.js.map +1 -1
  23. package/dist/_chunks-es/printExtractMessages.js +44 -0
  24. package/dist/_chunks-es/printExtractMessages.js.map +1 -0
  25. package/dist/_chunks-es/{consoleSpy.js → resolveBuildContext.js} +51 -167
  26. package/dist/_chunks-es/resolveBuildContext.js.map +1 -0
  27. package/dist/_chunks-es/resolveRolldownConfig.js +1 -1
  28. package/dist/_chunks-es/watchAction.js +108 -2
  29. package/dist/_chunks-es/watchAction.js.map +1 -1
  30. package/dist/cli.js +1 -1
  31. package/dist/index.d.ts +5 -208
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +3 -18
  34. package/dist/index.js.map +1 -1
  35. package/package.json +8 -14
  36. package/dist/_chunks-es/build.js +0 -150
  37. package/dist/_chunks-es/build.js.map +0 -1
  38. package/dist/_chunks-es/check.js +0 -189
  39. package/dist/_chunks-es/check.js.map +0 -1
  40. package/dist/_chunks-es/consoleSpy.js.map +0 -1
  41. package/dist/_chunks-es/init.js +0 -520
  42. package/dist/_chunks-es/init.js.map +0 -1
  43. package/dist/_chunks-es/isRecord.js +0 -37
  44. package/dist/_chunks-es/isRecord.js.map +0 -1
  45. package/dist/_chunks-es/watch.js +0 -109
  46. package/dist/_chunks-es/watch.js.map +0 -1
  47. package/tsconfig/isolated-declarations.json +0 -11
  48. package/tsconfig/recommended.json +0 -24
  49. package/tsconfig/strict.json +0 -15
  50. package/tsconfig/strictest.json +0 -16
@@ -1,5 +1,518 @@
1
- import { init } from "./init.js";
2
- import { handleError } from "./handleError.js";
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 { fileExists } from "./fileExists.js";
6
+ import { isRecord, createLogger, handleError } from "./handleError.js";
7
+ import { execSync } from "node:child_process";
8
+ import getLatestVersion from "get-latest-version";
9
+ import gitUrlParse from "git-url-parse";
10
+ import { outdent } from "outdent";
11
+ import { format } from "prettier";
12
+ import { defineTemplateOption } from "./define.js";
13
+ const promptsTypes = {
14
+ string: "text"
15
+ };
16
+ async function createFromTemplate(options) {
17
+ const { cwd, logger, packagePath, template: templateOrResolver } = options, template = typeof templateOrResolver == "function" ? await templateOrResolver({ cwd, logger, packagePath }) : templateOrResolver;
18
+ logger.log("create new package at", relative(cwd, packagePath));
19
+ const templateOptions = {};
20
+ for (const templateOption of template.options) {
21
+ const templateValidate = templateOption.validate, res = await prompts(
22
+ {
23
+ type: promptsTypes[templateOption.type],
24
+ name: templateOption.name,
25
+ message: templateOption.description,
26
+ validate: templateValidate ? (prev) => templateValidate(prev) : void 0,
27
+ initial: typeof templateOption.initial == "function" ? templateOption.initial(templateOptions) : templateOption.initial
28
+ },
29
+ { onCancel: () => process.exit(0) }
30
+ );
31
+ templateOptions[templateOption.name] = templateOption.parse ? templateOption.parse(res[templateOption.name]) : res[templateOption.name];
32
+ }
33
+ const features = {};
34
+ for (const templateFeature of template.features) {
35
+ const res = templateFeature.optional ? await prompts(
36
+ {
37
+ type: "confirm",
38
+ name: "confirm",
39
+ message: `use ${templateFeature.name}?`,
40
+ initial: templateFeature.initial
41
+ },
42
+ { onCancel: () => process.exit(0) }
43
+ ) : void 0;
44
+ features[templateFeature.name] = res?.confirm || !templateFeature.optional;
45
+ }
46
+ const files = await template.getFiles(templateOptions, features);
47
+ files.sort((a, b) => a.name.localeCompare(b.name));
48
+ for (const file of files) {
49
+ const filePath = resolve(packagePath, file.name);
50
+ await mkdirp(dirname(filePath)), await writeFile(filePath, file.contents.trim() + `
51
+ `), logger.success(`wrote ${relative(cwd, filePath)}`);
52
+ }
53
+ }
54
+ async function isEmptyDirectory(dirPath) {
55
+ return (await readdir(dirPath)).length === 0;
56
+ }
57
+ const overridableDefaults = {
58
+ endOfLine: "lf",
59
+ tabWidth: 2,
60
+ useTabs: !1
61
+ }, json5 = {
62
+ files: ["*.json5"],
63
+ options: {
64
+ quoteProps: "preserve",
65
+ singleQuote: !1
66
+ }
67
+ }, yaml = {
68
+ files: ["*.yml"],
69
+ options: {
70
+ singleQuote: !1
71
+ }
72
+ }, config = {
73
+ ...overridableDefaults,
74
+ printWidth: 100,
75
+ semi: !1,
76
+ singleQuote: !0,
77
+ quoteProps: "consistent",
78
+ bracketSpacing: !1,
79
+ plugins: ["prettier-plugin-packagejson"],
80
+ overrides: [json5, yaml]
81
+ }, RE_NAME = /^(?:@(?:[a-z0-9-*~][a-z0-9-*._~]*)\/)?[a-z0-9-~][a-z0-9-._~]*$/i, defaultTemplate = async ({ cwd, logger, packagePath }) => {
82
+ const gitConfig = getGitUserConfig(cwd);
83
+ return {
84
+ options: [
85
+ defineTemplateOption({
86
+ name: "repo",
87
+ type: "string",
88
+ description: "git url",
89
+ validate: (v) => {
90
+ if (!v) return !0;
91
+ try {
92
+ return gitUrlParse(v), !0;
93
+ } catch {
94
+ return "invalid git url";
95
+ }
96
+ },
97
+ parse: (v) => {
98
+ if (!v) return null;
99
+ const result = gitUrlParse(v);
100
+ return { source: result.source, owner: result.owner, name: result.name };
101
+ }
102
+ }),
103
+ defineTemplateOption({
104
+ name: "pkgName",
105
+ type: "string",
106
+ description: "package name",
107
+ initial: (options) => options.repo?.name || void 0,
108
+ validate: (v) => v ? RE_NAME.exec(v) ? !0 : "invalid package name" : "package name is required",
109
+ parse: (v) => {
110
+ if (!v)
111
+ throw new Error("package name is required");
112
+ if (!RE_NAME.exec(v))
113
+ throw new Error("invalid package name");
114
+ const [scope, name] = v.split("/");
115
+ return { scope, name, fullName: v };
116
+ }
117
+ }),
118
+ defineTemplateOption({
119
+ name: "description",
120
+ type: "string",
121
+ description: "package description"
122
+ }),
123
+ defineTemplateOption({
124
+ name: "authorName",
125
+ type: "string",
126
+ description: "package author name",
127
+ initial: gitConfig.user
128
+ }),
129
+ defineTemplateOption({
130
+ name: "authorEmail",
131
+ type: "string",
132
+ description: "package author email",
133
+ initial: gitConfig.email
134
+ }),
135
+ defineTemplateOption({
136
+ name: "license",
137
+ type: "string",
138
+ description: "package license",
139
+ initial: "MIT",
140
+ validate: (v) => v ? !0 : "license is required"
141
+ })
142
+ ],
143
+ features: [
144
+ {
145
+ name: "eslint",
146
+ optional: !0,
147
+ initial: !0
148
+ },
149
+ {
150
+ name: "prettier",
151
+ optional: !0,
152
+ initial: !0
153
+ },
154
+ {
155
+ name: "typescript",
156
+ optional: !0,
157
+ initial: !0
158
+ }
159
+ ],
160
+ async getFiles(options, features) {
161
+ const { pkgName, repo } = options, { fullName: name } = pkgName, author = [options.authorName, options.authorEmail && `<${options.authorEmail}>`].filter(Boolean).join(" ") ?? void 0, pkgJson = {
162
+ name,
163
+ version: "0.0.0",
164
+ description: options.description ?? void 0,
165
+ keywords: [],
166
+ homepage: void 0,
167
+ bugs: void 0,
168
+ repository: void 0,
169
+ license: options.license,
170
+ author,
171
+ sideEffects: !1,
172
+ type: "module",
173
+ exports: {
174
+ ".": {
175
+ source: features.typescript ? "./src/index.ts" : "./src/index.js",
176
+ require: "./dist/index.cjs",
177
+ default: "./dist/index.js"
178
+ },
179
+ "./package.json": "./package.json"
180
+ },
181
+ main: "./dist/index.cjs",
182
+ module: "./dist/index.js",
183
+ types: void 0,
184
+ files: ["dist", "src"],
185
+ scripts: {
186
+ build: "pkg build --strict --clean --check",
187
+ format: features.prettier ? "prettier --write --cache --ignore-unknown ." : void 0
188
+ },
189
+ "lint-staged": features.prettier ? {
190
+ "*": ["prettier --write --cache --ignore-unknown"]
191
+ } : void 0,
192
+ browserslist: "extends @sanity/browserslist-config",
193
+ prettier: features.prettier ? "@sanity/prettier-config" : void 0,
194
+ dependencies: {},
195
+ devDependencies: {
196
+ "@sanity/tsconfig": features.typescript ? "^1" : void 0,
197
+ "@sanity/pkg-utils": "^9",
198
+ "@sanity/prettier-config": features.prettier ? "^1" : void 0,
199
+ "@typescript-eslint/eslint-plugin": void 0,
200
+ "@typescript-eslint/parser": void 0,
201
+ eslint: void 0,
202
+ "eslint-config-prettier": void 0,
203
+ "eslint-plugin-import": void 0,
204
+ "eslint-plugin-prettier": void 0,
205
+ "eslint-plugin-simple-import-sort": void 0,
206
+ "lint-staged": "^15",
207
+ prettier: features.prettier ? "^3" : void 0,
208
+ typescript: void 0
209
+ },
210
+ engines: {
211
+ node: ">=20.19 <22 || >=22.12"
212
+ }
213
+ }, files = [];
214
+ if (files.push({
215
+ name: ".editorconfig",
216
+ contents: outdent`
217
+ root = true
218
+
219
+ [*]
220
+ charset = utf-8
221
+ indent_style = space
222
+ indent_size = 2
223
+ end_of_line = lf
224
+ insert_final_newline = true
225
+ trim_trailing_whitespace = true
226
+ `
227
+ }), files.push({
228
+ name: ".gitignore",
229
+ contents: outdent`
230
+ *.local
231
+ *.log
232
+ *.tgz
233
+
234
+ .DS_Store
235
+ dist
236
+ etc
237
+ node_modules
238
+ `
239
+ }), features.prettier && files.push({
240
+ name: ".prettierignore",
241
+ contents: outdent`
242
+ dist
243
+ pnpm-lock.yaml
244
+ `
245
+ }), repo && (pkgJson.repository = {
246
+ type: "git",
247
+ url: `git+ssh://git@${repo.source}/${repo.owner}/${repo.name}.git`
248
+ }, pkgJson.bugs = {
249
+ url: `https://${repo.source}/${repo.owner}/${repo.name}/issues`
250
+ }, pkgJson.homepage = `https://${repo.source}/${repo.owner}/${repo.name}#readme`), features.typescript) {
251
+ pkgJson.types = "./dist/index.d.ts", pkgJson.scripts = {
252
+ ...pkgJson.scripts,
253
+ "ts:check": "tsc --noEmit"
254
+ };
255
+ const devDependencies = pkgJson.devDependencies;
256
+ isRecord(devDependencies) && (devDependencies.typescript = "^5.9");
257
+ }
258
+ if (features.eslint) {
259
+ const eslintConfig = {
260
+ root: !0,
261
+ env: {
262
+ browser: !0,
263
+ es6: !0,
264
+ node: !0
265
+ },
266
+ extends: [
267
+ "eslint:recommended",
268
+ features.prettier ? "plugin:prettier/recommended" : void 0
269
+ ].filter(Boolean),
270
+ parserOptions: {
271
+ ecmaVersion: 2020,
272
+ sourceType: "module"
273
+ },
274
+ plugins: [
275
+ "import",
276
+ "simple-import-sort",
277
+ features.prettier ? "prettier" : void 0
278
+ ].filter(Boolean),
279
+ rules: {
280
+ "no-console": "error",
281
+ "no-shadow": "error",
282
+ "no-warning-comments": ["warn", { location: "start", terms: ["todo", "fixme"] }],
283
+ "quote-props": ["warn", "consistent-as-needed"],
284
+ "simple-import-sort/exports": "warn",
285
+ "simple-import-sort/imports": "warn",
286
+ strict: ["warn", "global"]
287
+ }
288
+ };
289
+ if (files.push({
290
+ name: ".eslintignore",
291
+ contents: outdent`
292
+ dist
293
+ `
294
+ }), pkgJson.scripts = {
295
+ ...pkgJson.scripts,
296
+ lint: features.typescript ? "eslint . --ext .cjs,.js,.ts,.tsx" : "eslint . --ext .cjs,.js"
297
+ }, pkgJson.devDependencies = {
298
+ ...pkgJson.devDependencies,
299
+ eslint: "^8",
300
+ "eslint-config-prettier": features.prettier ? "^9" : void 0,
301
+ "eslint-plugin-import": "^2",
302
+ "eslint-plugin-prettier": features.prettier ? "^5" : void 0,
303
+ "eslint-plugin-simple-import-sort": "^12"
304
+ }, features.typescript) {
305
+ pkgJson.devDependencies = {
306
+ ...pkgJson.devDependencies,
307
+ "@typescript-eslint/eslint-plugin": "^7",
308
+ "@typescript-eslint/parser": "^7"
309
+ };
310
+ const eslintConfigOverride = {
311
+ files: ["**/*.ts", "**/*.tsx"],
312
+ parser: "@typescript-eslint/parser",
313
+ parserOptions: {
314
+ project: ["./tsconfig.json"]
315
+ },
316
+ extends: [
317
+ "eslint:recommended",
318
+ features.prettier ? "plugin:prettier/recommended" : void 0,
319
+ "plugin:@typescript-eslint/eslint-recommended",
320
+ "plugin:@typescript-eslint/recommended"
321
+ ].filter(Boolean),
322
+ plugins: [
323
+ "import",
324
+ "@typescript-eslint",
325
+ "simple-import-sort",
326
+ features.prettier ? "prettier" : void 0
327
+ ].filter(Boolean),
328
+ rules: {
329
+ "@typescript-eslint/explicit-module-boundary-types": "error",
330
+ "@typescript-eslint/interface-name-prefix": "off",
331
+ "@typescript-eslint/member-delimiter-style": "off",
332
+ "@typescript-eslint/no-empty-interface": "off"
333
+ }
334
+ };
335
+ eslintConfig.overrides = [eslintConfigOverride];
336
+ }
337
+ files.push({
338
+ name: ".eslintrc.cjs",
339
+ contents: await prettierFormat(
340
+ resolve(packagePath, ".eslintrc.cjs"),
341
+ outdent`
342
+ 'use strict'
343
+
344
+ /** @type import('eslint').Linter.Config */
345
+ module.exports = ${JSON.stringify(eslintConfig, null, 2)}
346
+ `,
347
+ config
348
+ )
349
+ });
350
+ }
351
+ features.typescript && (files.push({
352
+ name: "tsconfig.settings.json",
353
+ contents: await prettierFormat(
354
+ resolve(packagePath, "tsconfig.settings.json"),
355
+ outdent`
356
+ {
357
+ "extends": "@sanity/tsconfig/strictest",
358
+ "compilerOptions": {
359
+ "rootDir": ".",
360
+ "outDir": "./dist"
361
+ }
362
+ }
363
+ `,
364
+ config
365
+ )
366
+ }), files.push({
367
+ name: "tsconfig.dist.json",
368
+ contents: await prettierFormat(
369
+ resolve(packagePath, "tsconfig.dist.json"),
370
+ outdent`
371
+ {
372
+ "extends": "./tsconfig.settings",
373
+ "include": ["./src"],
374
+ "exclude": ["./src/**/*.test.ts"]
375
+ }
376
+ `,
377
+ config
378
+ )
379
+ }), files.push({
380
+ name: "tsconfig.json",
381
+ contents: await prettierFormat(
382
+ resolve(packagePath, "tsconfig.json"),
383
+ outdent`
384
+ {
385
+ "extends": "./tsconfig.settings",
386
+ "include": ["./**/*.cjs", "./**/*.ts", "./**/*.tsx"],
387
+ "exclude": ["./node_modules"]
388
+ }
389
+ `,
390
+ config
391
+ )
392
+ })), features.typescript ? (files.push({
393
+ name: "package.config.ts",
394
+ contents: await prettierFormat(
395
+ resolve(packagePath, "package.config.ts"),
396
+ outdent`
397
+ import {defineConfig} from '@sanity/pkg-utils'
398
+
399
+ // https://github.com/sanity-io/pkg-utils#configuration
400
+ export default defineConfig({
401
+ // the path to the tsconfig file for distributed builds
402
+ tsconfig: 'tsconfig.dist.json',
403
+ })
404
+ `,
405
+ config
406
+ )
407
+ }), files.push({
408
+ name: "src/index.ts",
409
+ contents: await prettierFormat(
410
+ resolve(packagePath, "src/index.ts"),
411
+ outdent`
412
+ /** @public */
413
+ export function main(): void {
414
+ //
415
+ }
416
+ `,
417
+ config
418
+ )
419
+ })) : (files.push({
420
+ name: "package.config.js",
421
+ contents: await prettierFormat(
422
+ resolve(packagePath, "package.config.js"),
423
+ outdent`
424
+ import {defineConfig} from '@sanity/pkg-utils'
425
+
426
+ export default defineConfig({
427
+ extract: {
428
+ rules: {
429
+ // do not require internal members to be prefixed with \`_\`
430
+ 'ae-internal-missing-underscore': 'off',
431
+ },
432
+ },
433
+ })
434
+ `,
435
+ config
436
+ )
437
+ }), files.push({
438
+ name: "src/index.js",
439
+ contents: await prettierFormat(
440
+ resolve(packagePath, "src/index.js"),
441
+ outdent`
442
+ /** @public */
443
+ export function main() {
444
+ //
445
+ }
446
+ `,
447
+ config
448
+ )
449
+ }));
450
+ try {
451
+ pkgJson.dependencies = await resolveLatestDeps(pkgJson.dependencies ?? {});
452
+ } catch (error) {
453
+ logger.warn(error instanceof Error ? error.message : error);
454
+ }
455
+ try {
456
+ pkgJson.devDependencies = await resolveLatestDeps(pkgJson.devDependencies ?? {});
457
+ } catch (error) {
458
+ logger.warn(error instanceof Error ? error.message : error);
459
+ }
460
+ return files.push({
461
+ name: "package.json",
462
+ contents: await prettierFormat(
463
+ resolve(packagePath, "package.json"),
464
+ JSON.stringify(pkgJson, null, 2),
465
+ config
466
+ )
467
+ }), files;
468
+ }
469
+ };
470
+ };
471
+ function prettierFormat(filepath, input, prettierOptions) {
472
+ return format(input, { ...prettierOptions, plugins: [], filepath });
473
+ }
474
+ async function resolveLatestDeps(deps) {
475
+ const depsEntries = Object.entries(deps), latestDeps = {};
476
+ for (const entry of depsEntries) {
477
+ const [name, version] = entry;
478
+ if (version) {
479
+ const latestVersion = await getLatestVersion(name, version);
480
+ latestDeps[name] = latestVersion ? `^${latestVersion}` : version;
481
+ }
482
+ }
483
+ return latestDeps;
484
+ }
485
+ function getGitUserConfig(cwd) {
486
+ let user, email;
487
+ try {
488
+ user = execSync("git config user.name", { encoding: "utf8", cwd }).trim() || void 0, email = execSync("git config user.email", { encoding: "utf8", cwd }).trim() || void 0;
489
+ } catch {
490
+ }
491
+ return { user, email };
492
+ }
493
+ async function init(options) {
494
+ if (!options.cwd)
495
+ throw new Error("Missing required option: cwd");
496
+ if (!options.path)
497
+ throw new Error("Missing required option: path");
498
+ const logger = createLogger(), packagePath = resolve(options.cwd, options.path);
499
+ await ensurePackagePath(packagePath), await createFromTemplate({
500
+ cwd: options.cwd,
501
+ logger,
502
+ template: defaultTemplate,
503
+ packagePath
504
+ });
505
+ }
506
+ async function ensurePackagePath(packagePath) {
507
+ if (!fileExists(packagePath)) {
508
+ await mkdirp(packagePath);
509
+ return;
510
+ }
511
+ if (!(await lstat(packagePath)).isDirectory())
512
+ throw new Error("the package path is a file, not a directory");
513
+ if (!await isEmptyDirectory(packagePath))
514
+ throw new Error("the package directory is not empty");
515
+ }
3
516
  async function initAction(options) {
4
517
  try {
5
518
  await init({
@@ -1 +1 @@
1
- {"version":3,"file":"initAction.js","sources":["../../src/cli/initAction.ts"],"sourcesContent":["import {init} from '../node/init.ts'\nimport {handleError} from './handleError.ts'\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;AACvE,MAAI;AACF,UAAM,KAAK;AAAA,MACT,KAAK,QAAQ,IAAA;AAAA,MACb,MAAM,QAAQ;AAAA,IAAA,CACf;AAAA,EACH,SAAS,KAAK;AACZ,gBAAY,GAAG;AAAA,EACjB;AACF;"}
1
+ {"version":3,"file":"initAction.js","sources":["../../src/node/core/template/createFromTemplate.ts","../../src/node/isEmptyDirectory.ts","../../../../../node_modules/.pnpm/@sanity+prettier-config@1.0.6_prettier@3.7.3/node_modules/@sanity/prettier-config/dist/index.js","../../src/node/templates/default/template.ts","../../src/node/init.ts","../../src/cli/initAction.ts"],"sourcesContent":["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.ts'\nimport type {PkgTemplate} from './types.ts'\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}, json5 = {\n files: [\"*.json5\"],\n options: {\n quoteProps: \"preserve\",\n singleQuote: !1\n }\n}, yaml = {\n files: [\"*.yml\"],\n options: {\n singleQuote: !1\n }\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: [json5, yaml]\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 type {PackageJSON} from '@sanity/parse-package-json'\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.ts'\nimport {defineTemplateOption} from '../../core/template/define.ts'\nimport {type PkgTemplate, type PkgTemplateFile} from '../../core/template/types.ts'\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/tsconfig': features['typescript'] ? '^1' : undefined,\n '@sanity/pkg-utils': '^9',\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: '>=20.19 <22 || >=22.12',\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.9'\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/tsconfig/strictest\",\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 | undefined; email: string | undefined} {\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/index.ts'\nimport {fileExists} from './fileExists.ts'\nimport {isEmptyDirectory} from './isEmptyDirectory.ts'\nimport {createLogger} from './logger.ts'\nimport {defaultTemplate} from './templates/default/template.ts'\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","import {init} from '../node/init.ts'\nimport {handleError} from './handleError.ts'\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":["prettierConfig"],"mappings":"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","x_google_ignoreList":[2]}
@@ -0,0 +1,44 @@
1
+ import path from "node:path";
2
+ import { ExtractorLogLevel } from "@microsoft/api-extractor";
3
+ import chalk from "chalk";
4
+ function printExtractMessages(ctx, messages) {
5
+ const { cwd, logger } = ctx, warnings = messages.filter((msg) => msg.logLevel === ExtractorLogLevel.Warning);
6
+ warnings.length && logger.log();
7
+ for (const msg of warnings) {
8
+ const sourceFilePath = msg.sourceFilePath && path.relative(cwd, msg.sourceFilePath);
9
+ msg.messageId !== "TS6307" && logger.log(
10
+ [
11
+ chalk.cyan(sourceFilePath || "?"),
12
+ `:${chalk.yellow(msg.sourceFileLine)}:${chalk.yellow(msg.sourceFileColumn)}`,
13
+ ` - ${chalk.yellow("warning")} ${chalk.gray(msg.messageId)}
14
+ `,
15
+ msg.text,
16
+ `
17
+ `
18
+ ].join("")
19
+ );
20
+ }
21
+ const errors = messages.filter(
22
+ (msg) => msg.logLevel === ExtractorLogLevel.Error
23
+ );
24
+ !warnings.length && errors.length && logger.log("");
25
+ for (const msg of errors) {
26
+ const sourceFilePath = msg.sourceFilePath && path.relative(cwd, msg.sourceFilePath);
27
+ logger.log(
28
+ [
29
+ chalk.cyan(sourceFilePath || "?"),
30
+ `:${chalk.yellow(msg.sourceFileLine)}:${chalk.yellow(msg.sourceFileColumn)}`,
31
+ ` - ${chalk.red("error")} ${chalk.gray(msg.messageId)}
32
+ `,
33
+ msg.text,
34
+ `
35
+ `
36
+ ].join("")
37
+ );
38
+ }
39
+ errors.length && process.exit(1);
40
+ }
41
+ export {
42
+ printExtractMessages
43
+ };
44
+ //# sourceMappingURL=printExtractMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printExtractMessages.js","sources":["../../src/node/printExtractMessages.ts"],"sourcesContent":["import path from 'node:path'\nimport {ExtractorLogLevel, type ExtractorMessage} from '@microsoft/api-extractor'\nimport chalk from 'chalk'\nimport type {BuildContext} from './core/contexts/buildContext.ts'\n\nexport function printExtractMessages(ctx: BuildContext, messages: ExtractorMessage[]): void {\n const {cwd, logger} = ctx\n\n const warnings = messages.filter((msg) => msg.logLevel === ExtractorLogLevel.Warning)\n\n if (warnings.length) {\n logger.log()\n }\n\n for (const msg of warnings) {\n const sourceFilePath = msg.sourceFilePath && path.relative(cwd, msg.sourceFilePath)\n\n if (msg.messageId === 'TS6307') {\n // Ignore this warning:\n // > TS6307: <filename> is not in project file list.\n // > Projects must list all files or use an 'include' pattern.\n continue\n }\n\n logger.log(\n [\n chalk.cyan(sourceFilePath || '?'),\n `:${chalk.yellow(msg.sourceFileLine)}:${chalk.yellow(msg.sourceFileColumn)}`,\n ` - ${chalk.yellow('warning')} ${chalk.gray(msg.messageId)}\\n`,\n msg.text,\n '\\n',\n ].join(''),\n )\n }\n\n const errors: ExtractorMessage[] = messages.filter(\n (msg) => msg.logLevel === ExtractorLogLevel.Error,\n )\n\n if (!warnings.length && errors.length) {\n logger.log('')\n }\n\n for (const msg of errors) {\n const sourceFilePath = msg.sourceFilePath && path.relative(cwd, msg.sourceFilePath)\n\n logger.log(\n [\n chalk.cyan(sourceFilePath || '?'),\n `:${chalk.yellow(msg.sourceFileLine)}:${chalk.yellow(msg.sourceFileColumn)}`,\n ` - ${chalk.red('error')} ${chalk.gray(msg.messageId)}\\n`,\n msg.text,\n '\\n',\n ].join(''),\n )\n }\n\n if (errors.length) {\n process.exit(1)\n }\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,qBAAqB,KAAmB,UAAoC;AAC1F,QAAM,EAAC,KAAK,WAAU,KAEhB,WAAW,SAAS,OAAO,CAAC,QAAQ,IAAI,aAAa,kBAAkB,OAAO;AAEhF,WAAS,UACX,OAAO,IAAA;AAGT,aAAW,OAAO,UAAU;AAC1B,UAAM,iBAAiB,IAAI,kBAAkB,KAAK,SAAS,KAAK,IAAI,cAAc;AAE9E,QAAI,cAAc,YAOtB,OAAO;AAAA,MACL;AAAA,QACE,MAAM,KAAK,kBAAkB,GAAG;AAAA,QAChC,IAAI,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,MAAM,OAAO,IAAI,gBAAgB,CAAC;AAAA,QAC1E,MAAM,MAAM,OAAO,SAAS,CAAC,IAAI,MAAM,KAAK,IAAI,SAAS,CAAC;AAAA;AAAA,QAC1D,IAAI;AAAA,QACJ;AAAA;AAAA,MAAA,EACA,KAAK,EAAE;AAAA,IAAA;AAAA,EAEb;AAEA,QAAM,SAA6B,SAAS;AAAA,IAC1C,CAAC,QAAQ,IAAI,aAAa,kBAAkB;AAAA,EAAA;AAG1C,GAAC,SAAS,UAAU,OAAO,UAC7B,OAAO,IAAI,EAAE;AAGf,aAAW,OAAO,QAAQ;AACxB,UAAM,iBAAiB,IAAI,kBAAkB,KAAK,SAAS,KAAK,IAAI,cAAc;AAElF,WAAO;AAAA,MACL;AAAA,QACE,MAAM,KAAK,kBAAkB,GAAG;AAAA,QAChC,IAAI,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,MAAM,OAAO,IAAI,gBAAgB,CAAC;AAAA,QAC1E,MAAM,MAAM,IAAI,OAAO,CAAC,IAAI,MAAM,KAAK,IAAI,SAAS,CAAC;AAAA;AAAA,QACrD,IAAI;AAAA,QACJ;AAAA;AAAA,MAAA,EACA,KAAK,EAAE;AAAA,IAAA;AAAA,EAEb;AAEI,SAAO,UACT,QAAQ,KAAK,CAAC;AAElB;"}