@w5s/configurator-core 1.0.0-alpha.5 → 1.0.0-alpha.8

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/dist/index.cjs CHANGED
@@ -323,7 +323,7 @@ function jsonSync(options) {
323
323
  //#region src/meta.ts
324
324
  const meta = Object.freeze({
325
325
  name: "@w5s/configurator-core",
326
- version: "1.0.0-alpha.5",
326
+ version: "1.0.0-alpha.8",
327
327
  buildNumber: 1
328
328
  });
329
329
  //#endregion
@@ -399,7 +399,7 @@ function yarnConfigSync(options) {
399
399
  "config",
400
400
  "set",
401
401
  String(key),
402
- `${update == null ? "" : update(stdout)}`
402
+ String(update == null ? "" : update(stdout))
403
403
  ]);
404
404
  } else execSync("yarn", ["config", "unset"]);
405
405
  }
@@ -426,7 +426,7 @@ async function yarnConfig(options) {
426
426
  "config",
427
427
  "set",
428
428
  String(key),
429
- `${update == null ? "" : update(stdout)}`
429
+ String(update == null ? "" : update(stdout))
430
430
  ]);
431
431
  } else await exec("yarn", ["config", "unset"]);
432
432
  }
@@ -447,7 +447,7 @@ function yarnVersionSync(options) {
447
447
  if (state === "present") execSync("yarn", [
448
448
  "set",
449
449
  "version",
450
- `${update == null ? "berry" : update()}`
450
+ String(update == null ? "berry" : update())
451
451
  ]);
452
452
  else throw new Error("Not implemented");
453
453
  }
@@ -466,7 +466,7 @@ async function yarnVersion(options) {
466
466
  if (state === "present") await exec("yarn", [
467
467
  "set",
468
468
  "version",
469
- `${update == null ? "berry" : update()}`
469
+ String(update == null ? "berry" : update())
470
470
  ]);
471
471
  else throw new Error("Not implemented");
472
472
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["constants","constants","toFileOption"],"sources":["../src/__exists.ts","../src/__toMode.ts","../src/__existsSync.ts","../src/directory.ts","../src/file.ts","../src/block.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/exec.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"sourcesContent":["import { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\n\nexport async function __exists(path: string) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { FileMode, FilePermissionSet } from './FileMode.js';\n\nfunction toModeFlag(permissionSet: FilePermissionSet | undefined, read: number, write: number, execute: number): number {\n return (\n (permissionSet?.read === true ? read : 0)\n | (permissionSet?.write === true ? write : 0)\n | (permissionSet?.execute === true ? execute : 0)\n );\n}\n\nexport function __toMode(mode: FileMode | undefined): number | undefined {\n return mode == null\n ? mode\n : (\n toModeFlag(mode.owner, 0o400, 0o200, 0o100)\n | toModeFlag(mode.group, 0o040, 0o020, 0o010)\n | toModeFlag(mode.other, 0o004, 0o002, 0o001)\n );\n}\n","import { accessSync, constants } from 'node:fs';\n\nexport function __existsSync(path: string) {\n try {\n accessSync(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { chmodSync, mkdirSync, rmSync } from 'node:fs';\nimport { chmod, mkdir, rm } from 'node:fs/promises';\nimport { __exists } from './__exists.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\nimport { __existsSync } from './__existsSync.js';\n\nexport interface DirectoryOptions {\n /**\n * Directory path\n */\n readonly path: string;\n\n /**\n * Directory target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * await directory({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function directory(options: DirectoryOptions): Promise<void> {\n const { path, state, mode } = options;\n const isPresent = await __exists(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n await mkdir(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n await chmod(path, newMode);\n }\n } else if (isPresent) {\n await rm(path, { recursive: true });\n }\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * directorySync({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function directorySync(options: DirectoryOptions): void {\n const { path, state, mode } = options;\n const isPresent = __existsSync(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n mkdirSync(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n chmodSync(path, newMode);\n }\n } else if (isPresent) {\n rmSync(path, { recursive: true });\n }\n}\n","import { chmod, readFile, rm, writeFile } from 'node:fs/promises';\nimport { chmodSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface FileOptions {\n /**\n * File path\n */\n readonly path: string;\n\n /**\n * File target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n\n /**\n * File encoding\n */\n readonly encoding?: BufferEncoding;\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * await file({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function file(options: FileOptions): Promise<void> {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = await __exists(path);\n const previousContent = isPresent ? await readFile(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n await writeFile(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n await chmod(path, newMode);\n }\n } else {\n await rm(path, { force: true });\n }\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * fileSync({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function fileSync(options: FileOptions): void {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = __existsSync(path);\n const previousContent = isPresent ? readFileSync(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n writeFileSync(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n chmodSync(path, newMode);\n }\n } else {\n rmSync(path, { force: true });\n }\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface BlockOptions {\n /**\n * The marker builder function that will take either `markerBegin` or `markerEnd`\n *\n * @default '# ${mark} MANAGED BLOCK'\n */\n marker?: (mark: 'Begin' | 'End') => string;\n\n /**\n * File path\n */\n path: string;\n\n /**\n * Block content to insert\n */\n block: string;\n\n /**\n * Insert position\n */\n insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];\n\n /**\n * Block target state\n */\n state?: 'present' | 'absent';\n}\n\nconst EOF = 'EndOfFile';\nconst BOF = 'BeginningOfFile';\nconst insertAt = (str: string, index: number, toInsert: string) => str.slice(0, index) + toInsert + str.slice(index);\nconst matchLast = (string: string, regexp: RegExp) => {\n const matcher = new RegExp(regexp.source, `${regexp.flags}g`);\n let firstIndex = -1;\n let lastIndex = -1;\n let matches;\n\n while (true) {\n matches = matcher.exec(string);\n if (matches == null) {\n break;\n }\n firstIndex = matches.index;\n lastIndex = matcher.lastIndex;\n }\n return { firstIndex, lastIndex };\n};\n\nfunction toFileOptions(options: BlockOptions): FileOptions {\n const {\n marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`,\n path,\n block: blockName,\n insertPosition = ['after', EOF],\n state = 'present',\n } = options;\n\n const EOL = '\\n';\n const beginBlock = marker('Begin');\n const endBlock = marker('End');\n\n /**\n * @param content\n */\n function findBlock(content: string) {\n const startIndex = content.indexOf(beginBlock);\n const endIndex = content.indexOf(endBlock) + endBlock.length;\n\n return {\n endIndex,\n exists: startIndex !== -1 && endIndex >= 0,\n startIndex,\n };\n }\n\n function apply(fullContent: string, blockContent: string) {\n const found = findBlock(fullContent);\n const remove = state === 'absent';\n const replaceBlock = remove ? '' : beginBlock + EOL + blockContent + EOL + endBlock;\n const [positionDirection, positionAnchor] = insertPosition;\n\n if (found.exists) {\n return fullContent.slice(0, found.startIndex) + replaceBlock + fullContent.slice(found.endIndex);\n }\n if (remove) {\n return fullContent;\n }\n switch (positionDirection) {\n case 'before': {\n if (positionAnchor !== BOF) {\n const { firstIndex } = matchLast(fullContent, positionAnchor);\n if (firstIndex >= 0) {\n return insertAt(fullContent, firstIndex, replaceBlock + EOL);\n }\n }\n\n // Beginning of file\n return replaceBlock + EOL + fullContent;\n }\n case 'after': {\n // insert\n if (positionAnchor !== EOF) {\n const { lastIndex } = matchLast(fullContent, positionAnchor);\n if (lastIndex >= 0) {\n return insertAt(fullContent, lastIndex, EOL + replaceBlock);\n }\n }\n\n // end of file\n return fullContent + EOL + replaceBlock;\n }\n\n default: {\n throw new Error(`Unsupported position ${String(positionDirection)}`);\n }\n }\n }\n\n return {\n path,\n state: 'present',\n update: (sourceContent) => apply(sourceContent, blockName),\n };\n}\n\n/**\n * Replace asynchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function block(options: BlockOptions) {\n return file(toFileOptions(options));\n}\n\n/**\n * Replace synchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function blockSync(options: BlockOptions) {\n return fileSync(toFileOptions(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface IgnoreFileOptions extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function where content is represented as lines.\n * When the file does not yet exist, the callback receives `undefined`.\n */\n readonly update?: ((content: string[] | undefined) => string[] | undefined) | undefined;\n}\n\nfunction toFileOption({ update, ...otherOptions }: IgnoreFileOptions): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = content === '' ? undefined : content.split(eol);\n const updatedLines = update(lines);\n\n return updatedLines == null ? undefined : updatedLines.join(eol);\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * await ignoreFile({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport async function ignoreFile(options: IgnoreFileOptions): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * ignoreFileSync({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport function ignoreFileSync(options: IgnoreFileOptions): void {\n return fileSync(toFileOption(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport type JSONValue = null | number | string | boolean | JSONValue[] | { [key: string]: JSONValue };\n\nexport interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: V | undefined) => V | undefined) | undefined;\n}\n\nfunction toFileOption<Value>({ update, ...otherOptions }: JSONOption<Value>): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const jsonValue = content === '' ? undefined : (JSON.parse(content) as Value);\n\n return JSON.stringify(update(jsonValue));\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport async function json<Value>(options: JSONOption<Value>): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport function jsonSync<Value>(options: JSONOption<Value>): void {\n return fileSync(toFileOption(options));\n}\n","export const meta = Object.freeze({\n // @ts-ignore - these variables are injected at build time\n name: (typeof __PACKAGE_NAME__ === 'undefined' ? '' : __PACKAGE_NAME__) as string,\n // @ts-ignore - these variables are injected at build time\n version: (typeof __PACKAGE_VERSION__ === 'undefined' ? '' : __PACKAGE_VERSION__) as string,\n // @ts-ignore - these variables are injected at build time\n buildNumber: 1 as number, // (typeof __PACKAGE_BUILD_NUMBER__ === 'undefined' ? 0 : __PACKAGE_BUILD_NUMBER__) as number,\n});\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ExecOptions {\n /**\n * Current working directory\n */\n cwd?: string;\n\n /**\n * Stdio options\n */\n stdio?: 'inherit' | 'pipe' | 'ignore';\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n * @returns A promise that resolves with an object like `{ stdout: string, stderr: string }`\n */\nexport function execSync(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): { stdout: string; stderr: string } {\n const result = spawnSync(command, args, { ...options });\n const encoding = 'utf8';\n\n return { stdout: result.stdout.toString(encoding), stderr: result.stderr.toString(encoding) };\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n */\nexport async function exec(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const encoding = 'utf8';\n const child = spawn(command, args, { ...options });\n let stdout = '';\n let stderr = '';\n\n // Capture the stdout and stderr streams\n if (child.stdout != null) {\n child.stdout.on('data', (data) => {\n stdout += data.toString(encoding);\n });\n }\n if (child.stderr != null) {\n child.stderr.on('data', (data) => {\n stderr += data.toString(encoding);\n });\n }\n // Handle process exit\n child.on('close', (_code) => {\n resolve({ stdout, stderr });\n });\n\n // Handle errors\n child.on('error', reject);\n });\n}\n","import { exec, execSync } from './exec.js';\n\nexport interface YarnConfigOptions {\n /**\n * Configuration key\n */\n readonly key: string;\n\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnConfig}\n *\n * @param options\n * @example\n * yarnConfigSync({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport function yarnConfigSync(options: YarnConfigOptions) {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = execSync('yarn', ['config', 'get', String(key)]);\n execSync('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);\n } else {\n execSync('yarn', ['config', 'unset']);\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnConfig({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport async function yarnConfig(options: YarnConfigOptions): Promise<void> {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = await exec('yarn', ['config', 'get', String(key)]);\n await exec('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);\n } else {\n await exec('yarn', ['config', 'unset']);\n }\n}\n","import { exec, execSync } from './exec.js';\n\nexport type YarnVersionKind = 'berry' | 'classic';\n\nexport interface YarnVersionOptions {\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * Version mapping function\n *\n */\n readonly update?: (() => YarnVersionKind | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnVersion}\n *\n * @param options\n * @example\n * yarnVersionSync({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport function yarnVersionSync(options: YarnVersionOptions) {\n const { state, update } = options;\n if (state === 'present') {\n execSync('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnVersion({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport async function yarnVersion(options: YarnVersionOptions): Promise<void> {\n const { state, update } = options;\n if (state === 'present') {\n await exec('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["constants","constants","toFileOption"],"sources":["../src/__exists.ts","../src/__toMode.ts","../src/__existsSync.ts","../src/directory.ts","../src/file.ts","../src/block.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/exec.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"sourcesContent":["import { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\n\nexport async function __exists(path: string) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { FileMode, FilePermissionSet } from './FileMode.js';\n\nfunction toModeFlag(permissionSet: FilePermissionSet | undefined, read: number, write: number, execute: number): number {\n return (\n (permissionSet?.read === true ? read : 0)\n | (permissionSet?.write === true ? write : 0)\n | (permissionSet?.execute === true ? execute : 0)\n );\n}\n\nexport function __toMode(mode: FileMode | undefined): number | undefined {\n return mode == null\n ? mode\n : (\n toModeFlag(mode.owner, 0o400, 0o200, 0o100)\n | toModeFlag(mode.group, 0o040, 0o020, 0o010)\n | toModeFlag(mode.other, 0o004, 0o002, 0o001)\n );\n}\n","import { accessSync, constants } from 'node:fs';\n\nexport function __existsSync(path: string) {\n try {\n accessSync(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { chmodSync, mkdirSync, rmSync } from 'node:fs';\nimport { chmod, mkdir, rm } from 'node:fs/promises';\nimport { __exists } from './__exists.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\nimport { __existsSync } from './__existsSync.js';\n\nexport interface DirectoryOptions {\n /**\n * Directory path\n */\n readonly path: string;\n\n /**\n * Directory target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * await directory({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function directory(options: DirectoryOptions): Promise<void> {\n const { path, state, mode } = options;\n const isPresent = await __exists(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n await mkdir(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n await chmod(path, newMode);\n }\n } else if (isPresent) {\n await rm(path, { recursive: true });\n }\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * directorySync({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function directorySync(options: DirectoryOptions): void {\n const { path, state, mode } = options;\n const isPresent = __existsSync(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n mkdirSync(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n chmodSync(path, newMode);\n }\n } else if (isPresent) {\n rmSync(path, { recursive: true });\n }\n}\n","import { chmod, readFile, rm, writeFile } from 'node:fs/promises';\nimport { chmodSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface FileOptions {\n /**\n * File path\n */\n readonly path: string;\n\n /**\n * File target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n\n /**\n * File encoding\n */\n readonly encoding?: BufferEncoding;\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * await file({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function file(options: FileOptions): Promise<void> {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = await __exists(path);\n const previousContent = isPresent ? await readFile(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n await writeFile(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n await chmod(path, newMode);\n }\n } else {\n await rm(path, { force: true });\n }\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * fileSync({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function fileSync(options: FileOptions): void {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = __existsSync(path);\n const previousContent = isPresent ? readFileSync(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n writeFileSync(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n chmodSync(path, newMode);\n }\n } else {\n rmSync(path, { force: true });\n }\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface BlockOptions {\n /**\n * The marker builder function that will take either `markerBegin` or `markerEnd`\n *\n * @default '# ${mark} MANAGED BLOCK'\n */\n marker?: (mark: 'Begin' | 'End') => string;\n\n /**\n * File path\n */\n path: string;\n\n /**\n * Block content to insert\n */\n block: string;\n\n /**\n * Insert position\n */\n insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];\n\n /**\n * Block target state\n */\n state?: 'present' | 'absent';\n}\n\nconst EOF = 'EndOfFile';\nconst BOF = 'BeginningOfFile';\nconst insertAt = (str: string, index: number, toInsert: string) => str.slice(0, index) + toInsert + str.slice(index);\nconst matchLast = (string: string, regexp: RegExp) => {\n const matcher = new RegExp(regexp.source, `${regexp.flags}g`);\n let firstIndex = -1;\n let lastIndex = -1;\n let matches;\n\n while (true) {\n matches = matcher.exec(string);\n if (matches == null) {\n break;\n }\n firstIndex = matches.index;\n lastIndex = matcher.lastIndex;\n }\n return { firstIndex, lastIndex };\n};\n\nfunction toFileOptions(options: BlockOptions): FileOptions {\n const {\n marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`,\n path,\n block: blockName,\n insertPosition = ['after', EOF],\n state = 'present',\n } = options;\n\n const EOL = '\\n';\n const beginBlock = marker('Begin');\n const endBlock = marker('End');\n\n /**\n * @param content\n */\n function findBlock(content: string) {\n const startIndex = content.indexOf(beginBlock);\n const endIndex = content.indexOf(endBlock) + endBlock.length;\n\n return {\n endIndex,\n exists: startIndex !== -1 && endIndex >= 0,\n startIndex,\n };\n }\n\n function apply(fullContent: string, blockContent: string) {\n const found = findBlock(fullContent);\n const remove = state === 'absent';\n const replaceBlock = remove ? '' : beginBlock + EOL + blockContent + EOL + endBlock;\n const [positionDirection, positionAnchor] = insertPosition;\n\n if (found.exists) {\n return fullContent.slice(0, found.startIndex) + replaceBlock + fullContent.slice(found.endIndex);\n }\n if (remove) {\n return fullContent;\n }\n switch (positionDirection) {\n case 'before': {\n if (positionAnchor !== BOF) {\n const { firstIndex } = matchLast(fullContent, positionAnchor);\n if (firstIndex >= 0) {\n return insertAt(fullContent, firstIndex, replaceBlock + EOL);\n }\n }\n\n // Beginning of file\n return replaceBlock + EOL + fullContent;\n }\n case 'after': {\n // insert\n if (positionAnchor !== EOF) {\n const { lastIndex } = matchLast(fullContent, positionAnchor);\n if (lastIndex >= 0) {\n return insertAt(fullContent, lastIndex, EOL + replaceBlock);\n }\n }\n\n // end of file\n return fullContent + EOL + replaceBlock;\n }\n\n default: {\n throw new Error(`Unsupported position ${String(positionDirection)}`);\n }\n }\n }\n\n return {\n path,\n state: 'present',\n update: (sourceContent) => apply(sourceContent, blockName),\n };\n}\n\n/**\n * Replace asynchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function block(options: BlockOptions) {\n return file(toFileOptions(options));\n}\n\n/**\n * Replace synchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function blockSync(options: BlockOptions) {\n return fileSync(toFileOptions(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface IgnoreFileOptions extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function where content is represented as lines.\n * When the file does not yet exist, the callback receives `undefined`.\n */\n readonly update?: ((content: string[] | undefined) => string[] | undefined) | undefined;\n}\n\nfunction toFileOption({ update, ...otherOptions }: IgnoreFileOptions): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = content === '' ? undefined : content.split(eol);\n const updatedLines = update(lines);\n\n return updatedLines == null ? undefined : updatedLines.join(eol);\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * await ignoreFile({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport async function ignoreFile(options: IgnoreFileOptions): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * ignoreFileSync({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport function ignoreFileSync(options: IgnoreFileOptions): void {\n return fileSync(toFileOption(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport type JSONValue = null | number | string | boolean | JSONValue[] | { [key: string]: JSONValue };\n\nexport interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: V | undefined) => V | undefined) | undefined;\n}\n\nfunction toFileOption<Value>({ update, ...otherOptions }: JSONOption<Value>): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const jsonValue = content === '' ? undefined : (JSON.parse(content) as Value);\n\n return JSON.stringify(update(jsonValue));\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport async function json<Value>(options: JSONOption<Value>): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport function jsonSync<Value>(options: JSONOption<Value>): void {\n return fileSync(toFileOption(options));\n}\n","export const meta = Object.freeze({\n // @ts-ignore - these variables are injected at build time\n name: (typeof __PACKAGE_NAME__ === 'undefined' ? '' : __PACKAGE_NAME__) as string,\n // @ts-ignore - these variables are injected at build time\n version: (typeof __PACKAGE_VERSION__ === 'undefined' ? '' : __PACKAGE_VERSION__) as string,\n // @ts-ignore - these variables are injected at build time\n buildNumber: 1 as number, // (typeof __PACKAGE_BUILD_NUMBER__ === 'undefined' ? 0 : __PACKAGE_BUILD_NUMBER__) as number,\n});\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ExecOptions {\n /**\n * Current working directory\n */\n cwd?: string;\n\n /**\n * Stdio options\n */\n stdio?: 'inherit' | 'pipe' | 'ignore';\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n * @returns A promise that resolves with an object like `{ stdout: string, stderr: string }`\n */\nexport function execSync(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): { stdout: string; stderr: string } {\n const result = spawnSync(command, args, { ...options });\n const encoding = 'utf8';\n\n return { stdout: result.stdout.toString(encoding), stderr: result.stderr.toString(encoding) };\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n */\nexport async function exec(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const encoding = 'utf8';\n const child = spawn(command, args, { ...options });\n let stdout = '';\n let stderr = '';\n\n // Capture the stdout and stderr streams\n if (child.stdout != null) {\n child.stdout.on('data', (data) => {\n stdout += data.toString(encoding);\n });\n }\n if (child.stderr != null) {\n child.stderr.on('data', (data) => {\n stderr += data.toString(encoding);\n });\n }\n // Handle process exit\n child.on('close', (_code) => {\n resolve({ stdout, stderr });\n });\n\n // Handle errors\n child.on('error', reject);\n });\n}\n","import { exec, execSync } from './exec.js';\n\nexport interface YarnConfigOptions {\n /**\n * Configuration key\n */\n readonly key: string;\n\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnConfig}\n *\n * @param options\n * @example\n * yarnConfigSync({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport function yarnConfigSync(options: YarnConfigOptions) {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = execSync('yarn', ['config', 'get', String(key)]);\n execSync('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);\n } else {\n execSync('yarn', ['config', 'unset']);\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnConfig({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport async function yarnConfig(options: YarnConfigOptions): Promise<void> {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = await exec('yarn', ['config', 'get', String(key)]);\n await exec('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);\n } else {\n await exec('yarn', ['config', 'unset']);\n }\n}\n","import { exec, execSync } from './exec.js';\n\nexport type YarnVersionKind = 'berry' | 'classic';\n\nexport interface YarnVersionOptions {\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * Version mapping function\n *\n */\n readonly update?: (() => YarnVersionKind | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnVersion}\n *\n * @param options\n * @example\n * yarnVersionSync({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport function yarnVersionSync(options: YarnVersionOptions) {\n const { state, update } = options;\n if (state === 'present') {\n execSync('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnVersion({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport async function yarnVersion(options: YarnVersionOptions): Promise<void> {\n const { state, update } = options;\n if (state === 'present') {\n await exec('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/FileMode.ts","../src/directory.ts","../src/block.ts","../src/file.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"mappings":";UAAiB,iBAAA;EAAA;;;EAAA,SAIN,IAAA;EAAA;;;EAAA,SAKA,KAAA;EAKO;AAGlB;;EAHkB,SAAP,OAAA;AAAA;AAAA,UAGM,QAAA;EAcE;;;EAAA,SAVR,KAAA,GAAQ,iBAAA;EAAA;;;EAAA,SAKR,KAAA,GAAQ,iBAAA;EAKA;;AAAiB;EAAjB,SAAR,KAAA,GAAQ,iBAAA;AAAA;;;UCxBF,gBAAA;EDPiB;;;EAAA,SCWvB,IAAA;EDFA;;;EAAA,SCOA,KAAA;EDCM;;;EAAA,SCIN,IAAA,GAAO,QAAQ;AAAA;;;;;;;;;;;ADUU;;;;ACxBpC;;;;iBAmCsB,SAAA,CAAU,OAAA,EAAS,gBAAA,GAAmB,OAAO;;;;;AArBzC;AAqB1B;;;;;;;;AAAmE;AAkCnE;;;;iBAAgB,aAAA,CAAc,OAAyB,EAAhB,gBAAgB;;;UC1EtC,YAAA;EFFA;;;;;EEQf,MAAA,IAAU,IAAA;EFMD;;AAAO;EEDhB,IAAA;EFIuB;;;EECvB,KAAA;EFaiB;;;EERjB,cAAA,kCAAgD,MAAA,4BAAkC,MAAM;EFFvE;;;EEOjB,KAAA;AAAA;;AFGkC;;;;ACxBpC;;;;iBCkIgB,KAAA,CAAM,OAAA,EAAS,YAAA,GAAY,OAAA;;;;;ADpHjB;AAqB1B;;;;iBC4GgB,SAAA,CAAU,OAAqB,EAAZ,YAAY;;;UC/I9B,WAAA;EHPiB;;;EAAA,SGWvB,IAAA;EHFA;;;EAAA,SGOA,KAAA;EHCM;;;;EAAA,SGKN,MAAA,KAAW,OAAA;EHSH;;;EAAA,SGJR,QAAA,GAAW,cAAA;EHNH;;;EAAA,SGWR,IAAA,GAAO,QAAQ;AAAA;;AHDU;;;;ACxBpC;;;;;;;;;AAc0B;AAqB1B;;;;iBEYsB,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAO;;;;AFZU;AAkCnE;;;;AAAuD;;;;AC1EvD;;;;;;;iBCyFgB,QAAA,CAAS,OAAoB,EAAX,WAAW;;;UCzF5B,iBAAA,SAA0B,IAAI,CAAC,WAAA;EJFd;;;;EAAA,SIOvB,MAAA,KAAW,OAAA;AAAA;;AJOJ;AAGlB;;;;;;;;;;iBIsBsB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAoB,OAAO;;;;;AJRjC;;;;ACxBpC;;;;iBGgDgB,cAAA,CAAe,OAA0B,EAAjB,iBAAiB;;;KCrD7C,SAAA,sCAA+C,SAAA;EAAA,CAAiB,GAAA,WAAc,SAAS;AAAA;AAAA,UAElF,UAAA,KAAe,SAAA,UAAmB,IAAA,CAAK,WAAA;ELA7C;;;EAAA,SKIA,MAAA,KAAW,OAAA,EAAS,CAAA,iBAAkB,CAAA;AAAA;ALSjD;;;;;AAAA,iBKcsB,IAAA,QAAY,OAAA,EAAS,UAAA,CAAW,KAAA,IAAS,OAAA;;;;;;iBAS/C,QAAA,QAAgB,OAAA,EAAS,UAAU,CAAC,KAAA;;;cCxCvC,IAAA,EAAI,QAAA;;;;;;;UCEA,iBAAA;EPFA;;;EAAA,SOMN,GAAA;EPFA;;;EAAA,SOOA,KAAA;EPGO;AAGlB;;;EAHkB,SOGP,MAAA,KAAW,OAAA;AAAA;;;;;;;;;;;APcc;iBOApB,cAAA,CAAe,OAA0B,EAAjB,iBAAiB;;;ANxBzD;;;;;;;;;iBM6CsB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAoB,OAAO;;;KClDzD,eAAA;AAAA,UAEK,kBAAA;ERJiB;;;EAAA,SQQvB,KAAA;ERCA;;;AAKO;EALP,SQKA,MAAA,UAAgB,eAAe;AAAA;;;;;;;;;;;iBAa1B,eAAA,CAAgB,OAA2B,EAAlB,kBAAkB;;;ARIvB;;;;ACxBpC;;;;iBOwCsB,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,OAAO"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/FileMode.ts","../src/directory.ts","../src/block.ts","../src/file.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"mappings":";UAAiB,iBAAA;EAAA;;;EAAA,SAIN,IAAA;EAAA;;;EAAA,SAKA,KAAA;EAKO;AAGlB;;EAHkB,SAAP,OAAA;AAAA;AAAA,UAGM,QAAA;EAcE;;;EAAA,SAVR,KAAA,GAAQ,iBAAA;EAAA;;;EAAA,SAKR,KAAA,GAAQ,iBAAA;EAKA;;AAAiB;EAAjB,SAAR,KAAA,GAAQ,iBAAA;AAAA;;;UCxBF,gBAAA;EDPiB;;;EAAA,SCWvB,IAAA;EDFA;;;EAAA,SCOA,KAAA;EDCM;;;EAAA,SCIN,IAAA,GAAO,QAAQ;AAAA;;;;;;;;;;;ADUU;;;;ACxBpC;;;;iBAmCsB,SAAA,CAAU,OAAA,EAAS,gBAAA,GAAmB,OAAO;;;;;AArBzC;AAqB1B;;;;;;;;AAAmE;AAkCnE;;;;iBAAgB,aAAA,CAAc,OAAyB,EAAhB,gBAAgB;;;UC1EtC,YAAA;EFFA;;;;;EEQf,MAAA,IAAU,IAAA;EFMD;;AAAO;EEDhB,IAAA;EFIuB;;;EECvB,KAAA;EFaiB;;;EERjB,cAAA,kCAAgD,MAAA,4BAAkC,MAAM;EFFvE;;;EEOjB,KAAA;AAAA;;AFGkC;;;;ACxBpC;;;;iBCkIgB,KAAA,CAAM,OAAA,EAAS,YAAA,GAAY,OAAA;;;;;ADpHjB;AAqB1B;;;;iBC4GgB,SAAA,CAAU,OAAqB,EAAZ,YAAY;;;UC/I9B,WAAA;EHPiB;;;EAAA,SGWvB,IAAA;EHFA;;;EAAA,SGOA,KAAA;EHCM;;;;EAAA,SGKN,MAAA,KAAW,OAAA;EHSH;;;EAAA,SGJR,QAAA,GAAW,cAAA;EHNH;;;EAAA,SGWR,IAAA,GAAO,QAAQ;AAAA;;AHDU;;;;ACxBpC;;;;;;;;;AAc0B;AAqB1B;;;;iBEYsB,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAO;;;;AFZU;AAkCnE;;;;AAAuD;;;;AC1EvD;;;;;;;iBCyFgB,QAAA,CAAS,OAAoB,EAAX,WAAW;;;UCzF5B,iBAAA,SAA0B,IAAI,CAAC,WAAA;EJFd;;;;EAAA,SIOvB,MAAA,KAAW,OAAA;AAAA;;AJOJ;AAGlB;;;;;;;;;;iBIsBsB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAoB,OAAO;;;;;AJRjC;;;;ACxBpC;;;;iBGgDgB,cAAA,CAAe,OAA0B,EAAjB,iBAAiB;;;KCrD7C,SAAA,sCAA+C,SAAA;EAAA,CAAiB,GAAA,WAAc,SAAS;AAAA;AAAA,UAElF,UAAA,KAAe,SAAA,UAAmB,IAAA,CAAK,WAAA;ELA7C;;;EAAA,SKIA,MAAA,KAAW,OAAA,EAAS,CAAA,iBAAkB,CAAA;AAAA;ALSjD;;;;;AAAA,iBKcsB,IAAA,QAAY,OAAA,EAAS,UAAA,CAAW,KAAA,IAAS,OAAA;;;;;;iBAS/C,QAAA,QAAgB,OAAA,EAAS,UAAU,CAAC,KAAA;;;cCxCvC,IAAA,EAAI,QAAA;;;;;;;UCEA,iBAAA;EPFA;;;EAAA,SOMN,GAAA;EPFA;;;EAAA,SOOA,KAAA;EPGO;AAGlB;;;EAHkB,SOGP,MAAA,KAAW,OAAA;AAAA;;;;;;;;;;;APcc;iBOApB,cAAA,CAAe,OAA0B,EAAjB,iBAAiB;;;ANxBzD;;;;;;;;;iBM6CsB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAoB,OAAO;;;KClDzD,eAAA;AAAA,UAEK,kBAAA;ERJiB;;;EAAA,SQQvB,KAAA;ERCA;;;AAKO;EALP,SQKA,MAAA,UAAgB,eAAe;AAAA;;;;;;;;;;;iBAa1B,eAAA,CAAgB,OAA2B,EAAlB,kBAAkB;;;ARIvB;;;;ACxBpC;;;;iBOwCsB,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,OAAO"}
package/dist/index.js CHANGED
@@ -322,7 +322,7 @@ function jsonSync(options) {
322
322
  //#region src/meta.ts
323
323
  const meta = Object.freeze({
324
324
  name: "@w5s/configurator-core",
325
- version: "1.0.0-alpha.5",
325
+ version: "1.0.0-alpha.8",
326
326
  buildNumber: 1
327
327
  });
328
328
  //#endregion
@@ -398,7 +398,7 @@ function yarnConfigSync(options) {
398
398
  "config",
399
399
  "set",
400
400
  String(key),
401
- `${update == null ? "" : update(stdout)}`
401
+ String(update == null ? "" : update(stdout))
402
402
  ]);
403
403
  } else execSync("yarn", ["config", "unset"]);
404
404
  }
@@ -425,7 +425,7 @@ async function yarnConfig(options) {
425
425
  "config",
426
426
  "set",
427
427
  String(key),
428
- `${update == null ? "" : update(stdout)}`
428
+ String(update == null ? "" : update(stdout))
429
429
  ]);
430
430
  } else await exec("yarn", ["config", "unset"]);
431
431
  }
@@ -446,7 +446,7 @@ function yarnVersionSync(options) {
446
446
  if (state === "present") execSync("yarn", [
447
447
  "set",
448
448
  "version",
449
- `${update == null ? "berry" : update()}`
449
+ String(update == null ? "berry" : update())
450
450
  ]);
451
451
  else throw new Error("Not implemented");
452
452
  }
@@ -465,7 +465,7 @@ async function yarnVersion(options) {
465
465
  if (state === "present") await exec("yarn", [
466
466
  "set",
467
467
  "version",
468
- `${update == null ? "berry" : update()}`
468
+ String(update == null ? "berry" : update())
469
469
  ]);
470
470
  else throw new Error("Not implemented");
471
471
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["toFileOption"],"sources":["../src/__exists.ts","../src/__toMode.ts","../src/__existsSync.ts","../src/directory.ts","../src/file.ts","../src/block.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/exec.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"sourcesContent":["import { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\n\nexport async function __exists(path: string) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { FileMode, FilePermissionSet } from './FileMode.js';\n\nfunction toModeFlag(permissionSet: FilePermissionSet | undefined, read: number, write: number, execute: number): number {\n return (\n (permissionSet?.read === true ? read : 0)\n | (permissionSet?.write === true ? write : 0)\n | (permissionSet?.execute === true ? execute : 0)\n );\n}\n\nexport function __toMode(mode: FileMode | undefined): number | undefined {\n return mode == null\n ? mode\n : (\n toModeFlag(mode.owner, 0o400, 0o200, 0o100)\n | toModeFlag(mode.group, 0o040, 0o020, 0o010)\n | toModeFlag(mode.other, 0o004, 0o002, 0o001)\n );\n}\n","import { accessSync, constants } from 'node:fs';\n\nexport function __existsSync(path: string) {\n try {\n accessSync(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { chmodSync, mkdirSync, rmSync } from 'node:fs';\nimport { chmod, mkdir, rm } from 'node:fs/promises';\nimport { __exists } from './__exists.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\nimport { __existsSync } from './__existsSync.js';\n\nexport interface DirectoryOptions {\n /**\n * Directory path\n */\n readonly path: string;\n\n /**\n * Directory target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * await directory({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function directory(options: DirectoryOptions): Promise<void> {\n const { path, state, mode } = options;\n const isPresent = await __exists(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n await mkdir(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n await chmod(path, newMode);\n }\n } else if (isPresent) {\n await rm(path, { recursive: true });\n }\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * directorySync({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function directorySync(options: DirectoryOptions): void {\n const { path, state, mode } = options;\n const isPresent = __existsSync(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n mkdirSync(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n chmodSync(path, newMode);\n }\n } else if (isPresent) {\n rmSync(path, { recursive: true });\n }\n}\n","import { chmod, readFile, rm, writeFile } from 'node:fs/promises';\nimport { chmodSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface FileOptions {\n /**\n * File path\n */\n readonly path: string;\n\n /**\n * File target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n\n /**\n * File encoding\n */\n readonly encoding?: BufferEncoding;\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * await file({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function file(options: FileOptions): Promise<void> {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = await __exists(path);\n const previousContent = isPresent ? await readFile(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n await writeFile(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n await chmod(path, newMode);\n }\n } else {\n await rm(path, { force: true });\n }\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * fileSync({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function fileSync(options: FileOptions): void {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = __existsSync(path);\n const previousContent = isPresent ? readFileSync(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n writeFileSync(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n chmodSync(path, newMode);\n }\n } else {\n rmSync(path, { force: true });\n }\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface BlockOptions {\n /**\n * The marker builder function that will take either `markerBegin` or `markerEnd`\n *\n * @default '# ${mark} MANAGED BLOCK'\n */\n marker?: (mark: 'Begin' | 'End') => string;\n\n /**\n * File path\n */\n path: string;\n\n /**\n * Block content to insert\n */\n block: string;\n\n /**\n * Insert position\n */\n insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];\n\n /**\n * Block target state\n */\n state?: 'present' | 'absent';\n}\n\nconst EOF = 'EndOfFile';\nconst BOF = 'BeginningOfFile';\nconst insertAt = (str: string, index: number, toInsert: string) => str.slice(0, index) + toInsert + str.slice(index);\nconst matchLast = (string: string, regexp: RegExp) => {\n const matcher = new RegExp(regexp.source, `${regexp.flags}g`);\n let firstIndex = -1;\n let lastIndex = -1;\n let matches;\n\n while (true) {\n matches = matcher.exec(string);\n if (matches == null) {\n break;\n }\n firstIndex = matches.index;\n lastIndex = matcher.lastIndex;\n }\n return { firstIndex, lastIndex };\n};\n\nfunction toFileOptions(options: BlockOptions): FileOptions {\n const {\n marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`,\n path,\n block: blockName,\n insertPosition = ['after', EOF],\n state = 'present',\n } = options;\n\n const EOL = '\\n';\n const beginBlock = marker('Begin');\n const endBlock = marker('End');\n\n /**\n * @param content\n */\n function findBlock(content: string) {\n const startIndex = content.indexOf(beginBlock);\n const endIndex = content.indexOf(endBlock) + endBlock.length;\n\n return {\n endIndex,\n exists: startIndex !== -1 && endIndex >= 0,\n startIndex,\n };\n }\n\n function apply(fullContent: string, blockContent: string) {\n const found = findBlock(fullContent);\n const remove = state === 'absent';\n const replaceBlock = remove ? '' : beginBlock + EOL + blockContent + EOL + endBlock;\n const [positionDirection, positionAnchor] = insertPosition;\n\n if (found.exists) {\n return fullContent.slice(0, found.startIndex) + replaceBlock + fullContent.slice(found.endIndex);\n }\n if (remove) {\n return fullContent;\n }\n switch (positionDirection) {\n case 'before': {\n if (positionAnchor !== BOF) {\n const { firstIndex } = matchLast(fullContent, positionAnchor);\n if (firstIndex >= 0) {\n return insertAt(fullContent, firstIndex, replaceBlock + EOL);\n }\n }\n\n // Beginning of file\n return replaceBlock + EOL + fullContent;\n }\n case 'after': {\n // insert\n if (positionAnchor !== EOF) {\n const { lastIndex } = matchLast(fullContent, positionAnchor);\n if (lastIndex >= 0) {\n return insertAt(fullContent, lastIndex, EOL + replaceBlock);\n }\n }\n\n // end of file\n return fullContent + EOL + replaceBlock;\n }\n\n default: {\n throw new Error(`Unsupported position ${String(positionDirection)}`);\n }\n }\n }\n\n return {\n path,\n state: 'present',\n update: (sourceContent) => apply(sourceContent, blockName),\n };\n}\n\n/**\n * Replace asynchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function block(options: BlockOptions) {\n return file(toFileOptions(options));\n}\n\n/**\n * Replace synchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function blockSync(options: BlockOptions) {\n return fileSync(toFileOptions(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface IgnoreFileOptions extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function where content is represented as lines.\n * When the file does not yet exist, the callback receives `undefined`.\n */\n readonly update?: ((content: string[] | undefined) => string[] | undefined) | undefined;\n}\n\nfunction toFileOption({ update, ...otherOptions }: IgnoreFileOptions): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = content === '' ? undefined : content.split(eol);\n const updatedLines = update(lines);\n\n return updatedLines == null ? undefined : updatedLines.join(eol);\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * await ignoreFile({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport async function ignoreFile(options: IgnoreFileOptions): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * ignoreFileSync({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport function ignoreFileSync(options: IgnoreFileOptions): void {\n return fileSync(toFileOption(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport type JSONValue = null | number | string | boolean | JSONValue[] | { [key: string]: JSONValue };\n\nexport interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: V | undefined) => V | undefined) | undefined;\n}\n\nfunction toFileOption<Value>({ update, ...otherOptions }: JSONOption<Value>): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const jsonValue = content === '' ? undefined : (JSON.parse(content) as Value);\n\n return JSON.stringify(update(jsonValue));\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport async function json<Value>(options: JSONOption<Value>): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport function jsonSync<Value>(options: JSONOption<Value>): void {\n return fileSync(toFileOption(options));\n}\n","export const meta = Object.freeze({\n // @ts-ignore - these variables are injected at build time\n name: (typeof __PACKAGE_NAME__ === 'undefined' ? '' : __PACKAGE_NAME__) as string,\n // @ts-ignore - these variables are injected at build time\n version: (typeof __PACKAGE_VERSION__ === 'undefined' ? '' : __PACKAGE_VERSION__) as string,\n // @ts-ignore - these variables are injected at build time\n buildNumber: 1 as number, // (typeof __PACKAGE_BUILD_NUMBER__ === 'undefined' ? 0 : __PACKAGE_BUILD_NUMBER__) as number,\n});\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ExecOptions {\n /**\n * Current working directory\n */\n cwd?: string;\n\n /**\n * Stdio options\n */\n stdio?: 'inherit' | 'pipe' | 'ignore';\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n * @returns A promise that resolves with an object like `{ stdout: string, stderr: string }`\n */\nexport function execSync(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): { stdout: string; stderr: string } {\n const result = spawnSync(command, args, { ...options });\n const encoding = 'utf8';\n\n return { stdout: result.stdout.toString(encoding), stderr: result.stderr.toString(encoding) };\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n */\nexport async function exec(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const encoding = 'utf8';\n const child = spawn(command, args, { ...options });\n let stdout = '';\n let stderr = '';\n\n // Capture the stdout and stderr streams\n if (child.stdout != null) {\n child.stdout.on('data', (data) => {\n stdout += data.toString(encoding);\n });\n }\n if (child.stderr != null) {\n child.stderr.on('data', (data) => {\n stderr += data.toString(encoding);\n });\n }\n // Handle process exit\n child.on('close', (_code) => {\n resolve({ stdout, stderr });\n });\n\n // Handle errors\n child.on('error', reject);\n });\n}\n","import { exec, execSync } from './exec.js';\n\nexport interface YarnConfigOptions {\n /**\n * Configuration key\n */\n readonly key: string;\n\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnConfig}\n *\n * @param options\n * @example\n * yarnConfigSync({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport function yarnConfigSync(options: YarnConfigOptions) {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = execSync('yarn', ['config', 'get', String(key)]);\n execSync('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);\n } else {\n execSync('yarn', ['config', 'unset']);\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnConfig({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport async function yarnConfig(options: YarnConfigOptions): Promise<void> {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = await exec('yarn', ['config', 'get', String(key)]);\n await exec('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);\n } else {\n await exec('yarn', ['config', 'unset']);\n }\n}\n","import { exec, execSync } from './exec.js';\n\nexport type YarnVersionKind = 'berry' | 'classic';\n\nexport interface YarnVersionOptions {\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * Version mapping function\n *\n */\n readonly update?: (() => YarnVersionKind | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnVersion}\n *\n * @param options\n * @example\n * yarnVersionSync({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport function yarnVersionSync(options: YarnVersionOptions) {\n const { state, update } = options;\n if (state === 'present') {\n execSync('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnVersion({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport async function yarnVersion(options: YarnVersionOptions): Promise<void> {\n const { state, update } = options;\n if (state === 'present') {\n await exec('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["toFileOption"],"sources":["../src/__exists.ts","../src/__toMode.ts","../src/__existsSync.ts","../src/directory.ts","../src/file.ts","../src/block.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/exec.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"sourcesContent":["import { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\n\nexport async function __exists(path: string) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { FileMode, FilePermissionSet } from './FileMode.js';\n\nfunction toModeFlag(permissionSet: FilePermissionSet | undefined, read: number, write: number, execute: number): number {\n return (\n (permissionSet?.read === true ? read : 0)\n | (permissionSet?.write === true ? write : 0)\n | (permissionSet?.execute === true ? execute : 0)\n );\n}\n\nexport function __toMode(mode: FileMode | undefined): number | undefined {\n return mode == null\n ? mode\n : (\n toModeFlag(mode.owner, 0o400, 0o200, 0o100)\n | toModeFlag(mode.group, 0o040, 0o020, 0o010)\n | toModeFlag(mode.other, 0o004, 0o002, 0o001)\n );\n}\n","import { accessSync, constants } from 'node:fs';\n\nexport function __existsSync(path: string) {\n try {\n accessSync(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { chmodSync, mkdirSync, rmSync } from 'node:fs';\nimport { chmod, mkdir, rm } from 'node:fs/promises';\nimport { __exists } from './__exists.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\nimport { __existsSync } from './__existsSync.js';\n\nexport interface DirectoryOptions {\n /**\n * Directory path\n */\n readonly path: string;\n\n /**\n * Directory target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * await directory({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function directory(options: DirectoryOptions): Promise<void> {\n const { path, state, mode } = options;\n const isPresent = await __exists(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n await mkdir(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n await chmod(path, newMode);\n }\n } else if (isPresent) {\n await rm(path, { recursive: true });\n }\n}\n\n/**\n * Ensure directory is present/absent\n *\n * @example\n * ```ts\n * directorySync({\n * path: 'foo/bar',\n * state: 'present',\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function directorySync(options: DirectoryOptions): void {\n const { path, state, mode } = options;\n const isPresent = __existsSync(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n mkdirSync(path, { recursive: true, mode: newMode });\n }\n if (newMode != null && isPresent) {\n chmodSync(path, newMode);\n }\n } else if (isPresent) {\n rmSync(path, { recursive: true });\n }\n}\n","import { chmod, readFile, rm, writeFile } from 'node:fs/promises';\nimport { chmodSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport type { FileMode } from './FileMode.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface FileOptions {\n /**\n * File path\n */\n readonly path: string;\n\n /**\n * File target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n\n /**\n * File encoding\n */\n readonly encoding?: BufferEncoding;\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * await file({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport async function file(options: FileOptions): Promise<void> {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = await __exists(path);\n const previousContent = isPresent ? await readFile(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n await writeFile(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n await chmod(path, newMode);\n }\n } else {\n await rm(path, { force: true });\n }\n}\n\n/**\n * Ensure file is present/absent with content initialized or modified with `update\n *\n * @example\n * ```ts\n * fileSync({\n * path: 'foo/bar',\n * state: 'present',\n * update: (content) => content + '_test', // This will append '_test' after current content\n * mode: {\n * owner: { read: true, write: true, execute: true },\n * group: { read: true, write: true, execute: true },\n * other: { read: true, write: true, execute: true },\n * },\n * })\n * ```\n *\n * @param options\n */\nexport function fileSync(options: FileOptions): void {\n const { path, state, update, encoding = 'utf8', mode } = options;\n if (state === 'present') {\n const isPresent = __existsSync(path);\n const previousContent = isPresent ? readFileSync(path, encoding) : '';\n const newContent = update == null ? (isPresent ? undefined : '') : update(previousContent);\n const newMode = __toMode(mode);\n if (newContent != null) {\n writeFileSync(path, newContent, { encoding, mode: newMode });\n }\n if (newMode != null && (isPresent || newContent != null)) {\n chmodSync(path, newMode);\n }\n } else {\n rmSync(path, { force: true });\n }\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface BlockOptions {\n /**\n * The marker builder function that will take either `markerBegin` or `markerEnd`\n *\n * @default '# ${mark} MANAGED BLOCK'\n */\n marker?: (mark: 'Begin' | 'End') => string;\n\n /**\n * File path\n */\n path: string;\n\n /**\n * Block content to insert\n */\n block: string;\n\n /**\n * Insert position\n */\n insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];\n\n /**\n * Block target state\n */\n state?: 'present' | 'absent';\n}\n\nconst EOF = 'EndOfFile';\nconst BOF = 'BeginningOfFile';\nconst insertAt = (str: string, index: number, toInsert: string) => str.slice(0, index) + toInsert + str.slice(index);\nconst matchLast = (string: string, regexp: RegExp) => {\n const matcher = new RegExp(regexp.source, `${regexp.flags}g`);\n let firstIndex = -1;\n let lastIndex = -1;\n let matches;\n\n while (true) {\n matches = matcher.exec(string);\n if (matches == null) {\n break;\n }\n firstIndex = matches.index;\n lastIndex = matcher.lastIndex;\n }\n return { firstIndex, lastIndex };\n};\n\nfunction toFileOptions(options: BlockOptions): FileOptions {\n const {\n marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`,\n path,\n block: blockName,\n insertPosition = ['after', EOF],\n state = 'present',\n } = options;\n\n const EOL = '\\n';\n const beginBlock = marker('Begin');\n const endBlock = marker('End');\n\n /**\n * @param content\n */\n function findBlock(content: string) {\n const startIndex = content.indexOf(beginBlock);\n const endIndex = content.indexOf(endBlock) + endBlock.length;\n\n return {\n endIndex,\n exists: startIndex !== -1 && endIndex >= 0,\n startIndex,\n };\n }\n\n function apply(fullContent: string, blockContent: string) {\n const found = findBlock(fullContent);\n const remove = state === 'absent';\n const replaceBlock = remove ? '' : beginBlock + EOL + blockContent + EOL + endBlock;\n const [positionDirection, positionAnchor] = insertPosition;\n\n if (found.exists) {\n return fullContent.slice(0, found.startIndex) + replaceBlock + fullContent.slice(found.endIndex);\n }\n if (remove) {\n return fullContent;\n }\n switch (positionDirection) {\n case 'before': {\n if (positionAnchor !== BOF) {\n const { firstIndex } = matchLast(fullContent, positionAnchor);\n if (firstIndex >= 0) {\n return insertAt(fullContent, firstIndex, replaceBlock + EOL);\n }\n }\n\n // Beginning of file\n return replaceBlock + EOL + fullContent;\n }\n case 'after': {\n // insert\n if (positionAnchor !== EOF) {\n const { lastIndex } = matchLast(fullContent, positionAnchor);\n if (lastIndex >= 0) {\n return insertAt(fullContent, lastIndex, EOL + replaceBlock);\n }\n }\n\n // end of file\n return fullContent + EOL + replaceBlock;\n }\n\n default: {\n throw new Error(`Unsupported position ${String(positionDirection)}`);\n }\n }\n }\n\n return {\n path,\n state: 'present',\n update: (sourceContent) => apply(sourceContent, blockName),\n };\n}\n\n/**\n * Replace asynchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function block(options: BlockOptions) {\n return file(toFileOptions(options));\n}\n\n/**\n * Replace synchronously a block in file that follows pattern :\n *\n * marker(markerBegin)\n * ...\n * marker(markerEnd)\n *\n * @param options\n */\nexport function blockSync(options: BlockOptions) {\n return fileSync(toFileOptions(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport interface IgnoreFileOptions extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function where content is represented as lines.\n * When the file does not yet exist, the callback receives `undefined`.\n */\n readonly update?: ((content: string[] | undefined) => string[] | undefined) | undefined;\n}\n\nfunction toFileOption({ update, ...otherOptions }: IgnoreFileOptions): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = content === '' ? undefined : content.split(eol);\n const updatedLines = update(lines);\n\n return updatedLines == null ? undefined : updatedLines.join(eol);\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * await ignoreFile({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport async function ignoreFile(options: IgnoreFileOptions): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content initialized or modified by line.\n *\n * @example\n * ```ts\n * ignoreFileSync({\n * path: '.gitignore',\n * update: (lines) => [...(lines ?? []), 'dist'],\n * });\n * ```\n * @param options File target options.\n */\nexport function ignoreFileSync(options: IgnoreFileOptions): void {\n return fileSync(toFileOption(options));\n}\n","import { type FileOptions, file, fileSync } from './file.js';\n\nexport type JSONValue = null | number | string | boolean | JSONValue[] | { [key: string]: JSONValue };\n\nexport interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: V | undefined) => V | undefined) | undefined;\n}\n\nfunction toFileOption<Value>({ update, ...otherOptions }: JSONOption<Value>): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const jsonValue = content === '' ? undefined : (JSON.parse(content) as Value);\n\n return JSON.stringify(update(jsonValue));\n },\n };\n}\n\n/**\n * Ensure file is present/absent asynchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport async function json<Value>(options: JSONOption<Value>): Promise<void> {\n return file(toFileOption(options));\n}\n\n/**\n * Ensure file is present/absent synchronously with content value initialized or modified with `update`\n *\n * @param options\n */\nexport function jsonSync<Value>(options: JSONOption<Value>): void {\n return fileSync(toFileOption(options));\n}\n","export const meta = Object.freeze({\n // @ts-ignore - these variables are injected at build time\n name: (typeof __PACKAGE_NAME__ === 'undefined' ? '' : __PACKAGE_NAME__) as string,\n // @ts-ignore - these variables are injected at build time\n version: (typeof __PACKAGE_VERSION__ === 'undefined' ? '' : __PACKAGE_VERSION__) as string,\n // @ts-ignore - these variables are injected at build time\n buildNumber: 1 as number, // (typeof __PACKAGE_BUILD_NUMBER__ === 'undefined' ? 0 : __PACKAGE_BUILD_NUMBER__) as number,\n});\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ExecOptions {\n /**\n * Current working directory\n */\n cwd?: string;\n\n /**\n * Stdio options\n */\n stdio?: 'inherit' | 'pipe' | 'ignore';\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n * @returns A promise that resolves with an object like `{ stdout: string, stderr: string }`\n */\nexport function execSync(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): { stdout: string; stderr: string } {\n const result = spawnSync(command, args, { ...options });\n const encoding = 'utf8';\n\n return { stdout: result.stdout.toString(encoding), stderr: result.stderr.toString(encoding) };\n}\n\n/**\n * Runs a command in a shell and returns a promise that resolves with an object\n * containing the stdout and stderr strings.\n *\n * @param command The command to run\n * @param args The arguments to pass to the command\n * @param options\n */\nexport async function exec(\n command: string,\n args: ReadonlyArray<string>,\n options?: ExecOptions,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const encoding = 'utf8';\n const child = spawn(command, args, { ...options });\n let stdout = '';\n let stderr = '';\n\n // Capture the stdout and stderr streams\n if (child.stdout != null) {\n child.stdout.on('data', (data) => {\n stdout += data.toString(encoding);\n });\n }\n if (child.stderr != null) {\n child.stderr.on('data', (data) => {\n stderr += data.toString(encoding);\n });\n }\n // Handle process exit\n child.on('close', (_code) => {\n resolve({ stdout, stderr });\n });\n\n // Handle errors\n child.on('error', reject);\n });\n}\n","import { exec, execSync } from './exec.js';\n\nexport interface YarnConfigOptions {\n /**\n * Configuration key\n */\n readonly key: string;\n\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnConfig}\n *\n * @param options\n * @example\n * yarnConfigSync({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport function yarnConfigSync(options: YarnConfigOptions) {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = execSync('yarn', ['config', 'get', String(key)]);\n execSync('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);\n } else {\n execSync('yarn', ['config', 'unset']);\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnConfig({\n * key: 'nodeLinker',\n * state: 'present',\n * update: (content) => content.replace('node-modules', 'hoisted'),\n * })\n */\nexport async function yarnConfig(options: YarnConfigOptions): Promise<void> {\n const { key, state, update } = options;\n if (state === 'present') {\n const { stdout } = await exec('yarn', ['config', 'get', String(key)]);\n await exec('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);\n } else {\n await exec('yarn', ['config', 'unset']);\n }\n}\n","import { exec, execSync } from './exec.js';\n\nexport type YarnVersionKind = 'berry' | 'classic';\n\nexport interface YarnVersionOptions {\n /**\n * Option target state\n */\n readonly state: 'present' | 'absent';\n\n /**\n * Version mapping function\n *\n */\n readonly update?: (() => YarnVersionKind | undefined) | undefined;\n}\n\n/**\n * Synchronous version of {@link yarnVersion}\n *\n * @param options\n * @example\n * yarnVersionSync({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport function yarnVersionSync(options: YarnVersionOptions) {\n const { state, update } = options;\n if (state === 'present') {\n execSync('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n\n/**\n * Set/Unset yarn configuration value\n *\n * @param options\n * @example\n * await yarnVersion({\n * state: 'present',\n * update: () => 'berry', // or 'classic'\n * })\n */\nexport async function yarnVersion(options: YarnVersionOptions): Promise<void> {\n const { state, update } = options;\n if (state === 'present') {\n await exec('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);\n } else {\n // TODO: remove yarn.lock\n throw new Error('Not implemented');\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w5s/configurator-core",
3
- "version": "1.0.0-alpha.5",
3
+ "version": "1.0.0-alpha.8",
4
4
  "description": "Core library for @w5s/configurator-core",
5
5
  "keywords": [
6
6
  "config",
@@ -22,16 +22,7 @@
22
22
  "type": "module",
23
23
  "exports": {
24
24
  "./package.json": "./package.json",
25
- ".": {
26
- "require": {
27
- "types": "./dist/index.d.cts",
28
- "default": "./dist/index.cjs"
29
- },
30
- "import": {
31
- "types": "./dist/index.d.ts",
32
- "default": "./dist/index.js"
33
- }
34
- },
25
+ ".": "./dist/index.js",
35
26
  "./internal/*": null
36
27
  },
37
28
  "files": [
@@ -39,7 +30,6 @@
39
30
  "src/",
40
31
  "index.js",
41
32
  "index.d.ts",
42
- "!*.d.ts.map",
43
33
  "!**/*.spec.*",
44
34
  "!**/__tests__/**"
45
35
  ],
@@ -54,5 +44,5 @@
54
44
  "access": "public"
55
45
  },
56
46
  "sideEffect": false,
57
- "gitHead": "0fc09427b8a0c77dcc4adb9530e1d74a7fbf1d15"
47
+ "gitHead": "fcde4af12d29afdb46ed396ef832c36a399ed057"
58
48
  }
package/src/yarnConfig.ts CHANGED
@@ -33,7 +33,7 @@ export function yarnConfigSync(options: YarnConfigOptions) {
33
33
  const { key, state, update } = options;
34
34
  if (state === 'present') {
35
35
  const { stdout } = execSync('yarn', ['config', 'get', String(key)]);
36
- execSync('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);
36
+ execSync('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);
37
37
  } else {
38
38
  execSync('yarn', ['config', 'unset']);
39
39
  }
@@ -54,7 +54,7 @@ export async function yarnConfig(options: YarnConfigOptions): Promise<void> {
54
54
  const { key, state, update } = options;
55
55
  if (state === 'present') {
56
56
  const { stdout } = await exec('yarn', ['config', 'get', String(key)]);
57
- await exec('yarn', ['config', 'set', String(key), `${update == null ? '' : update(stdout)}`]);
57
+ await exec('yarn', ['config', 'set', String(key), String(update == null ? '' : update(stdout))]);
58
58
  } else {
59
59
  await exec('yarn', ['config', 'unset']);
60
60
  }
@@ -28,7 +28,7 @@ export interface YarnVersionOptions {
28
28
  export function yarnVersionSync(options: YarnVersionOptions) {
29
29
  const { state, update } = options;
30
30
  if (state === 'present') {
31
- execSync('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);
31
+ execSync('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);
32
32
  } else {
33
33
  // TODO: remove yarn.lock
34
34
  throw new Error('Not implemented');
@@ -48,7 +48,7 @@ export function yarnVersionSync(options: YarnVersionOptions) {
48
48
  export async function yarnVersion(options: YarnVersionOptions): Promise<void> {
49
49
  const { state, update } = options;
50
50
  if (state === 'present') {
51
- await exec('yarn', ['set', 'version', `${update == null ? 'berry' : update()}`]);
51
+ await exec('yarn', ['set', 'version', String(update == null ? 'berry' : update())]);
52
52
  } else {
53
53
  // TODO: remove yarn.lock
54
54
  throw new Error('Not implemented');