@w5s/configurator-core 1.0.0-alpha.1 → 1.0.0-alpha.11
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 +230 -133
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +149 -91
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +149 -91
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +204 -134
- package/dist/index.js.map +1 -1
- package/package.json +9 -17
- package/src/FileMode.ts +14 -14
- package/src/__exists.ts +1 -1
- package/src/__toMode.ts +8 -8
- package/src/block.ts +51 -51
- package/src/directory.ts +14 -12
- package/src/exec.ts +23 -23
- package/src/file.ts +17 -15
- package/src/ignoreFile.ts +58 -0
- package/src/index.ts +3 -1
- package/src/json.ts +18 -18
- package/src/meta.ts +2 -2
- package/src/testing/getTempPath.ts +1 -0
- package/src/testing/getTestPath.ts +2 -1
- package/src/yaml.ts +45 -0
- package/src/yarnConfig.ts +13 -13
- package/src/yarnVersion.ts +10 -10
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["constants","constants"],"sources":["../src/__exists.ts","../src/__toMode.ts","../src/__existsSync.ts","../src/directory.ts","../src/file.ts","../src/block.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 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","toFileOption","yaml","YAML"],"sources":["../src/__exists.ts","../src/__existsSync.ts","../src/__toMode.ts","../src/file.ts","../src/block.ts","../src/directory.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/yaml.ts","../src/exec.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"sourcesContent":["import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\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 { 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 type { FileMode, FilePermissionSet } from './FileMode.js';\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\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","import { chmodSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { chmod, readFile, rm, writeFile } from 'node:fs/promises';\n\nimport type { FileMode } from './FileMode.js';\n\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface FileOptions {\n /**\n * File encoding\n */\n readonly encoding?: BufferEncoding;\n\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n\n /**\n * File path\n */\n readonly path: string;\n\n /**\n * File target state\n */\n readonly state: 'absent' | 'present';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\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 { encoding = 'utf8', mode, path, state, update } = 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 { encoding = 'utf8', mode, path, state, update } = 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 { file, type FileOptions, fileSync } from './file.js';\n\nexport interface BlockOptions {\n /**\n * Block content to insert\n */\n block: string;\n\n /**\n * Insert position\n */\n insertPosition?: ['after', 'EndOfFile' | RegExp] | ['before', 'BeginningOfFile' | RegExp];\n\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 target state\n */\n state?: 'absent' | 'present';\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\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\nfunction toFileOptions(options: BlockOptions): FileOptions {\n const {\n block: blockName,\n insertPosition = ['after', EOF],\n marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`,\n path,\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 '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 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\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","import { chmodSync, mkdirSync, rmSync } from 'node:fs';\nimport { chmod, mkdir, rm } from 'node:fs/promises';\n\nimport type { FileMode } from './FileMode.js';\n\nimport { __exists } from './__exists.js';\nimport { __existsSync } from './__existsSync.js';\nimport { __toMode } from './__toMode.js';\n\nexport interface DirectoryOptions {\n /**\n * File permissions\n */\n readonly mode?: FileMode;\n\n /**\n * Directory path\n */\n readonly path: string;\n\n /**\n * Directory target state\n */\n readonly state: 'absent' | 'present';\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 { mode, path, state } = options;\n const isPresent = await __exists(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n await mkdir(path, { mode: newMode, recursive: true });\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 { mode, path, state } = options;\n const isPresent = __existsSync(path);\n if (state === 'present') {\n const newMode = __toMode(mode);\n if (!isPresent) {\n mkdirSync(path, { mode: newMode, recursive: true });\n }\n if (newMode != null && isPresent) {\n chmodSync(path, newMode);\n }\n } else if (isPresent) {\n rmSync(path, { recursive: true });\n }\n}\n","import { file, type FileOptions, 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: Array<string> | undefined) => Array<string> | undefined) | undefined;\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\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","import { file, type FileOptions, fileSync } from './file.js';\n\nexport interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: undefined | V) => undefined | V) | undefined;\n}\n\nexport type JSONValue = Array<JSONValue> | boolean | null | number | string | { [key: string]: JSONValue };\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\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","export const meta = Object.freeze({\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 // @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});\n","import YAML from 'yaml';\n\nimport { file, type FileOptions, fileSync } from './file.js';\n\nexport interface YAMLOption<V = YAMLValue> extends Omit<FileOptions, 'update'> {\n /**\n * File content mapping function\n */\n readonly update?: ((content: undefined | V) => undefined | V) | undefined;\n}\n\nexport type YAMLValue = Array<YAMLValue> | boolean | null | number | string | { [key: string]: YAMLValue };\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 yaml<Value>(options: YAMLOption<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 yamlSync<Value>(options: YAMLOption<Value>): void {\n return fileSync(toFileOption(options));\n}\n\nfunction toFileOption<Value>({ update, ...otherOptions }: YAMLOption<Value>): FileOptions {\n return {\n ...otherOptions,\n\n update:\n update == null\n ? update\n : (content) => {\n const yamlValue = content === '' ? undefined : (YAML.parse(content) as Value);\n\n return YAML.stringify(update(yamlValue));\n },\n };\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?: 'ignore' | 'inherit' | 'pipe';\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<{ stderr: string; stdout: 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({ stderr, stdout });\n });\n\n // Handle errors\n child.on('error', reject);\n });\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): { stderr: string; stdout: string } {\n const result = spawnSync(command, args, { ...options });\n const encoding = 'utf8';\n\n return { stderr: result.stderr.toString(encoding), stdout: result.stdout.toString(encoding) };\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: 'absent' | 'present';\n\n /**\n * File content mapping function\n *\n */\n readonly update?: ((content: string) => string | undefined) | undefined;\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\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","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: 'absent' | 'present';\n\n /**\n * Version mapping function\n *\n */\n readonly update?: (() => undefined | YarnVersionKind) | undefined;\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\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"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,23 +1,51 @@
|
|
|
1
|
-
//#region src/
|
|
2
|
-
interface
|
|
1
|
+
//#region src/block.d.ts
|
|
2
|
+
interface BlockOptions {
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Block content to insert
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
block: string;
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Insert position
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
insertPosition?: ['after', 'EndOfFile' | RegExp] | ['before', 'BeginningOfFile' | RegExp];
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* The marker builder function that will take either `markerBegin` or `markerEnd`
|
|
13
|
+
*
|
|
14
|
+
* @default '# ${mark} MANAGED BLOCK'
|
|
13
15
|
*/
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
interface FileMode {
|
|
16
|
+
marker?: (mark: 'Begin' | 'End') => string;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* File path
|
|
19
19
|
*/
|
|
20
|
-
|
|
20
|
+
path: string;
|
|
21
|
+
/**
|
|
22
|
+
* Block target state
|
|
23
|
+
*/
|
|
24
|
+
state?: 'absent' | 'present';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Replace asynchronously a block in file that follows pattern :
|
|
28
|
+
*
|
|
29
|
+
* marker(markerBegin)
|
|
30
|
+
* ...
|
|
31
|
+
* marker(markerEnd)
|
|
32
|
+
*
|
|
33
|
+
* @param options
|
|
34
|
+
*/
|
|
35
|
+
declare function block(options: BlockOptions): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Replace synchronously a block in file that follows pattern :
|
|
38
|
+
*
|
|
39
|
+
* marker(markerBegin)
|
|
40
|
+
* ...
|
|
41
|
+
* marker(markerEnd)
|
|
42
|
+
*
|
|
43
|
+
* @param options
|
|
44
|
+
*/
|
|
45
|
+
declare function blockSync(options: BlockOptions): void;
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/FileMode.d.ts
|
|
48
|
+
interface FileMode {
|
|
21
49
|
/**
|
|
22
50
|
* Group permissions
|
|
23
51
|
*/
|
|
@@ -26,10 +54,32 @@ interface FileMode {
|
|
|
26
54
|
* Other permissions
|
|
27
55
|
*/
|
|
28
56
|
readonly other?: FilePermissionSet;
|
|
57
|
+
/**
|
|
58
|
+
* Owner permissions
|
|
59
|
+
*/
|
|
60
|
+
readonly owner?: FilePermissionSet;
|
|
61
|
+
}
|
|
62
|
+
interface FilePermissionSet {
|
|
63
|
+
/**
|
|
64
|
+
* Execute permission
|
|
65
|
+
*/
|
|
66
|
+
readonly execute?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Read permission
|
|
69
|
+
*/
|
|
70
|
+
readonly read?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Write permission
|
|
73
|
+
*/
|
|
74
|
+
readonly write?: boolean;
|
|
29
75
|
}
|
|
30
76
|
//#endregion
|
|
31
77
|
//#region src/directory.d.ts
|
|
32
78
|
interface DirectoryOptions {
|
|
79
|
+
/**
|
|
80
|
+
* File permissions
|
|
81
|
+
*/
|
|
82
|
+
readonly mode?: FileMode;
|
|
33
83
|
/**
|
|
34
84
|
* Directory path
|
|
35
85
|
*/
|
|
@@ -37,11 +87,7 @@ interface DirectoryOptions {
|
|
|
37
87
|
/**
|
|
38
88
|
* Directory target state
|
|
39
89
|
*/
|
|
40
|
-
readonly state: '
|
|
41
|
-
/**
|
|
42
|
-
* File permissions
|
|
43
|
-
*/
|
|
44
|
-
readonly mode?: FileMode;
|
|
90
|
+
readonly state: 'absent' | 'present';
|
|
45
91
|
}
|
|
46
92
|
/**
|
|
47
93
|
* Ensure directory is present/absent
|
|
@@ -82,54 +128,16 @@ declare function directory(options: DirectoryOptions): Promise<void>;
|
|
|
82
128
|
*/
|
|
83
129
|
declare function directorySync(options: DirectoryOptions): void;
|
|
84
130
|
//#endregion
|
|
85
|
-
//#region src/
|
|
86
|
-
interface
|
|
87
|
-
/**
|
|
88
|
-
* The marker builder function that will take either `markerBegin` or `markerEnd`
|
|
89
|
-
*
|
|
90
|
-
* @default '# ${mark} MANAGED BLOCK'
|
|
91
|
-
*/
|
|
92
|
-
marker?: (mark: 'Begin' | 'End') => string;
|
|
93
|
-
/**
|
|
94
|
-
* File path
|
|
95
|
-
*/
|
|
96
|
-
path: string;
|
|
97
|
-
/**
|
|
98
|
-
* Block content to insert
|
|
99
|
-
*/
|
|
100
|
-
block: string;
|
|
131
|
+
//#region src/file.d.ts
|
|
132
|
+
interface FileOptions {
|
|
101
133
|
/**
|
|
102
|
-
*
|
|
134
|
+
* File encoding
|
|
103
135
|
*/
|
|
104
|
-
|
|
136
|
+
readonly encoding?: BufferEncoding;
|
|
105
137
|
/**
|
|
106
|
-
*
|
|
138
|
+
* File permissions
|
|
107
139
|
*/
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Replace asynchronously a block in file that follows pattern :
|
|
112
|
-
*
|
|
113
|
-
* marker(markerBegin)
|
|
114
|
-
* ...
|
|
115
|
-
* marker(markerEnd)
|
|
116
|
-
*
|
|
117
|
-
* @param options
|
|
118
|
-
*/
|
|
119
|
-
declare function block(options: BlockOptions): Promise<void>;
|
|
120
|
-
/**
|
|
121
|
-
* Replace synchronously a block in file that follows pattern :
|
|
122
|
-
*
|
|
123
|
-
* marker(markerBegin)
|
|
124
|
-
* ...
|
|
125
|
-
* marker(markerEnd)
|
|
126
|
-
*
|
|
127
|
-
* @param options
|
|
128
|
-
*/
|
|
129
|
-
declare function blockSync(options: BlockOptions): void;
|
|
130
|
-
//#endregion
|
|
131
|
-
//#region src/file.d.ts
|
|
132
|
-
interface FileOptions {
|
|
140
|
+
readonly mode?: FileMode;
|
|
133
141
|
/**
|
|
134
142
|
* File path
|
|
135
143
|
*/
|
|
@@ -137,20 +145,12 @@ interface FileOptions {
|
|
|
137
145
|
/**
|
|
138
146
|
* File target state
|
|
139
147
|
*/
|
|
140
|
-
readonly state: '
|
|
148
|
+
readonly state: 'absent' | 'present';
|
|
141
149
|
/**
|
|
142
150
|
* File content mapping function
|
|
143
151
|
*
|
|
144
152
|
*/
|
|
145
153
|
readonly update?: ((content: string) => string | undefined) | undefined;
|
|
146
|
-
/**
|
|
147
|
-
* File encoding
|
|
148
|
-
*/
|
|
149
|
-
readonly encoding?: BufferEncoding;
|
|
150
|
-
/**
|
|
151
|
-
* File permissions
|
|
152
|
-
*/
|
|
153
|
-
readonly mode?: FileMode;
|
|
154
154
|
}
|
|
155
155
|
/**
|
|
156
156
|
* Ensure file is present/absent with content initialized or modified with `update
|
|
@@ -193,16 +193,51 @@ declare function file(options: FileOptions): Promise<void>;
|
|
|
193
193
|
*/
|
|
194
194
|
declare function fileSync(options: FileOptions): void;
|
|
195
195
|
//#endregion
|
|
196
|
+
//#region src/ignoreFile.d.ts
|
|
197
|
+
interface IgnoreFileOptions extends Omit<FileOptions, 'update'> {
|
|
198
|
+
/**
|
|
199
|
+
* File content mapping function where content is represented as lines.
|
|
200
|
+
* When the file does not yet exist, the callback receives `undefined`.
|
|
201
|
+
*/
|
|
202
|
+
readonly update?: ((content: Array<string> | undefined) => Array<string> | undefined) | undefined;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Ensure file is present/absent asynchronously with content initialized or modified by line.
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* await ignoreFile({
|
|
210
|
+
* path: '.gitignore',
|
|
211
|
+
* update: (lines) => [...(lines ?? []), 'dist'],
|
|
212
|
+
* });
|
|
213
|
+
* ```
|
|
214
|
+
* @param options File target options.
|
|
215
|
+
*/
|
|
216
|
+
declare function ignoreFile(options: IgnoreFileOptions): Promise<void>;
|
|
217
|
+
/**
|
|
218
|
+
* Ensure file is present/absent synchronously with content initialized or modified by line.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```ts
|
|
222
|
+
* ignoreFileSync({
|
|
223
|
+
* path: '.gitignore',
|
|
224
|
+
* update: (lines) => [...(lines ?? []), 'dist'],
|
|
225
|
+
* });
|
|
226
|
+
* ```
|
|
227
|
+
* @param options File target options.
|
|
228
|
+
*/
|
|
229
|
+
declare function ignoreFileSync(options: IgnoreFileOptions): void;
|
|
230
|
+
//#endregion
|
|
196
231
|
//#region src/json.d.ts
|
|
197
|
-
type JSONValue = null | number | string | boolean | JSONValue[] | {
|
|
198
|
-
[key: string]: JSONValue;
|
|
199
|
-
};
|
|
200
232
|
interface JSONOption<V = JSONValue> extends Omit<FileOptions, 'update'> {
|
|
201
233
|
/**
|
|
202
234
|
* File content mapping function
|
|
203
235
|
*/
|
|
204
|
-
readonly update?: ((content:
|
|
236
|
+
readonly update?: ((content: undefined | V) => undefined | V) | undefined;
|
|
205
237
|
}
|
|
238
|
+
type JSONValue = Array<JSONValue> | boolean | null | number | string | {
|
|
239
|
+
[key: string]: JSONValue;
|
|
240
|
+
};
|
|
206
241
|
/**
|
|
207
242
|
* Ensure file is present/absent asynchronously with content value initialized or modified with `update`
|
|
208
243
|
*
|
|
@@ -218,11 +253,34 @@ declare function jsonSync<Value>(options: JSONOption<Value>): void;
|
|
|
218
253
|
//#endregion
|
|
219
254
|
//#region src/meta.d.ts
|
|
220
255
|
declare const meta: Readonly<{
|
|
256
|
+
buildNumber: number;
|
|
221
257
|
name: string;
|
|
222
258
|
version: string;
|
|
223
|
-
buildNumber: number;
|
|
224
259
|
}>;
|
|
225
260
|
//#endregion
|
|
261
|
+
//#region src/yaml.d.ts
|
|
262
|
+
interface YAMLOption<V = YAMLValue> extends Omit<FileOptions, 'update'> {
|
|
263
|
+
/**
|
|
264
|
+
* File content mapping function
|
|
265
|
+
*/
|
|
266
|
+
readonly update?: ((content: undefined | V) => undefined | V) | undefined;
|
|
267
|
+
}
|
|
268
|
+
type YAMLValue = Array<YAMLValue> | boolean | null | number | string | {
|
|
269
|
+
[key: string]: YAMLValue;
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Ensure file is present/absent asynchronously with content value initialized or modified with `update`
|
|
273
|
+
*
|
|
274
|
+
* @param options
|
|
275
|
+
*/
|
|
276
|
+
declare function yaml<Value>(options: YAMLOption<Value>): Promise<void>;
|
|
277
|
+
/**
|
|
278
|
+
* Ensure file is present/absent synchronously with content value initialized or modified with `update`
|
|
279
|
+
*
|
|
280
|
+
* @param options
|
|
281
|
+
*/
|
|
282
|
+
declare function yamlSync<Value>(options: YAMLOption<Value>): void;
|
|
283
|
+
//#endregion
|
|
226
284
|
//#region src/yarnConfig.d.ts
|
|
227
285
|
interface YarnConfigOptions {
|
|
228
286
|
/**
|
|
@@ -232,7 +290,7 @@ interface YarnConfigOptions {
|
|
|
232
290
|
/**
|
|
233
291
|
* Option target state
|
|
234
292
|
*/
|
|
235
|
-
readonly state: '
|
|
293
|
+
readonly state: 'absent' | 'present';
|
|
236
294
|
/**
|
|
237
295
|
* File content mapping function
|
|
238
296
|
*
|
|
@@ -240,29 +298,29 @@ interface YarnConfigOptions {
|
|
|
240
298
|
readonly update?: ((content: string) => string | undefined) | undefined;
|
|
241
299
|
}
|
|
242
300
|
/**
|
|
243
|
-
*
|
|
301
|
+
* Set/Unset yarn configuration value
|
|
244
302
|
*
|
|
245
303
|
* @param options
|
|
246
304
|
* @example
|
|
247
|
-
*
|
|
305
|
+
* await yarnConfig({
|
|
248
306
|
* key: 'nodeLinker',
|
|
249
307
|
* state: 'present',
|
|
250
308
|
* update: (content) => content.replace('node-modules', 'hoisted'),
|
|
251
309
|
* })
|
|
252
310
|
*/
|
|
253
|
-
declare function
|
|
311
|
+
declare function yarnConfig(options: YarnConfigOptions): Promise<void>;
|
|
254
312
|
/**
|
|
255
|
-
*
|
|
313
|
+
* Synchronous version of {@link yarnConfig}
|
|
256
314
|
*
|
|
257
315
|
* @param options
|
|
258
316
|
* @example
|
|
259
|
-
*
|
|
317
|
+
* yarnConfigSync({
|
|
260
318
|
* key: 'nodeLinker',
|
|
261
319
|
* state: 'present',
|
|
262
320
|
* update: (content) => content.replace('node-modules', 'hoisted'),
|
|
263
321
|
* })
|
|
264
322
|
*/
|
|
265
|
-
declare function
|
|
323
|
+
declare function yarnConfigSync(options: YarnConfigOptions): void;
|
|
266
324
|
//#endregion
|
|
267
325
|
//#region src/yarnVersion.d.ts
|
|
268
326
|
type YarnVersionKind = 'berry' | 'classic';
|
|
@@ -270,35 +328,35 @@ interface YarnVersionOptions {
|
|
|
270
328
|
/**
|
|
271
329
|
* Option target state
|
|
272
330
|
*/
|
|
273
|
-
readonly state: '
|
|
331
|
+
readonly state: 'absent' | 'present';
|
|
274
332
|
/**
|
|
275
333
|
* Version mapping function
|
|
276
334
|
*
|
|
277
335
|
*/
|
|
278
|
-
readonly update?: (() =>
|
|
336
|
+
readonly update?: (() => undefined | YarnVersionKind) | undefined;
|
|
279
337
|
}
|
|
280
338
|
/**
|
|
281
|
-
*
|
|
339
|
+
* Set/Unset yarn configuration value
|
|
282
340
|
*
|
|
283
341
|
* @param options
|
|
284
342
|
* @example
|
|
285
|
-
*
|
|
343
|
+
* await yarnVersion({
|
|
286
344
|
* state: 'present',
|
|
287
345
|
* update: () => 'berry', // or 'classic'
|
|
288
346
|
* })
|
|
289
347
|
*/
|
|
290
|
-
declare function
|
|
348
|
+
declare function yarnVersion(options: YarnVersionOptions): Promise<void>;
|
|
291
349
|
/**
|
|
292
|
-
*
|
|
350
|
+
* Synchronous version of {@link yarnVersion}
|
|
293
351
|
*
|
|
294
352
|
* @param options
|
|
295
353
|
* @example
|
|
296
|
-
*
|
|
354
|
+
* yarnVersionSync({
|
|
297
355
|
* state: 'present',
|
|
298
356
|
* update: () => 'berry', // or 'classic'
|
|
299
357
|
* })
|
|
300
358
|
*/
|
|
301
|
-
declare function
|
|
359
|
+
declare function yarnVersionSync(options: YarnVersionOptions): void;
|
|
302
360
|
//#endregion
|
|
303
|
-
export { BlockOptions, DirectoryOptions, FileOptions, JSONOption, JSONValue, YarnConfigOptions, YarnVersionKind, YarnVersionOptions, block, blockSync, directory, directorySync, file, fileSync, json, jsonSync, meta, yarnConfig, yarnConfigSync, yarnVersion, yarnVersionSync };
|
|
361
|
+
export { BlockOptions, DirectoryOptions, FileOptions, IgnoreFileOptions, JSONOption, JSONValue, YAMLOption, YAMLValue, YarnConfigOptions, YarnVersionKind, YarnVersionOptions, block, blockSync, directory, directorySync, file, fileSync, ignoreFile, ignoreFileSync, json, jsonSync, meta, yaml, yamlSync, yarnConfig, yarnConfigSync, yarnVersion, yarnVersionSync };
|
|
304
362
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/FileMode.ts","../src/directory.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/block.ts","../src/FileMode.ts","../src/directory.ts","../src/file.ts","../src/ignoreFile.ts","../src/json.ts","../src/meta.ts","../src/yaml.ts","../src/yarnConfig.ts","../src/yarnVersion.ts"],"mappings":"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"}
|