vbapm 0.6.3-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/lib/_commonjsHelpers-553b27b3.js +2 -0
  4. package/lib/_commonjsHelpers-553b27b3.js.map +1 -0
  5. package/lib/build-project-55e5df48.js +4 -0
  6. package/lib/build-project-55e5df48.js.map +1 -0
  7. package/lib/build-target-283e1e7d.js +10 -0
  8. package/lib/build-target-283e1e7d.js.map +1 -0
  9. package/lib/create-project-905598ca.js +11 -0
  10. package/lib/create-project-905598ca.js.map +1 -0
  11. package/lib/debug.js +2 -0
  12. package/lib/debug.js.map +1 -0
  13. package/lib/export-project-55168787.js +5 -0
  14. package/lib/export-project-55168787.js.map +1 -0
  15. package/lib/export-target-c9ddd2fa.js +5 -0
  16. package/lib/export-target-c9ddd2fa.js.map +1 -0
  17. package/lib/get-target-23b8cc04.js +12 -0
  18. package/lib/get-target-23b8cc04.js.map +1 -0
  19. package/lib/index-35cff1d5.js +38 -0
  20. package/lib/index-35cff1d5.js.map +1 -0
  21. package/lib/index-87f55e79.js +4 -0
  22. package/lib/index-87f55e79.js.map +1 -0
  23. package/lib/index-b49bd5b2.js +2 -0
  24. package/lib/index-b49bd5b2.js.map +1 -0
  25. package/lib/index-c97017db.js +2 -0
  26. package/lib/index-c97017db.js.map +1 -0
  27. package/lib/index-d9ba3ba0.js +6 -0
  28. package/lib/index-d9ba3ba0.js.map +1 -0
  29. package/lib/index-ffbba08f.js +3 -0
  30. package/lib/index-ffbba08f.js.map +1 -0
  31. package/lib/index.js +2 -0
  32. package/lib/index.js.map +1 -0
  33. package/lib/inherits-713f4554.js +2 -0
  34. package/lib/inherits-713f4554.js.map +1 -0
  35. package/lib/init-project-a62cb644.js +16 -0
  36. package/lib/init-project-a62cb644.js.map +1 -0
  37. package/lib/load-from-project-e6530a69.js +6 -0
  38. package/lib/load-from-project-e6530a69.js.map +1 -0
  39. package/lib/minimatch-3a1d1fa9.js +2 -0
  40. package/lib/minimatch-3a1d1fa9.js.map +1 -0
  41. package/lib/once-9eb67b4f.js +2 -0
  42. package/lib/once-9eb67b4f.js.map +1 -0
  43. package/lib/project-d43b4e0c.js +30 -0
  44. package/lib/project-d43b4e0c.js.map +1 -0
  45. package/lib/run-macro-f4aa7c14.js +2 -0
  46. package/lib/run-macro-f4aa7c14.js.map +1 -0
  47. package/lib/sat-solver-01d6409e.js +2 -0
  48. package/lib/sat-solver-01d6409e.js.map +1 -0
  49. package/lib/src/actions/build-project.d.ts +2 -0
  50. package/lib/src/actions/create-project.d.ts +8 -0
  51. package/lib/src/actions/export-project.d.ts +6 -0
  52. package/lib/src/actions/increment-version.d.ts +5 -0
  53. package/lib/src/actions/init-project.d.ts +9 -0
  54. package/lib/src/actions/run-macro.d.ts +8 -0
  55. package/lib/src/actions/test-project.d.ts +5 -0
  56. package/lib/src/addin.d.ts +36 -0
  57. package/lib/src/bin/vba-blocks-build.d.ts +2 -0
  58. package/lib/src/bin/vba-blocks-export.d.ts +2 -0
  59. package/lib/src/bin/vba-blocks-init.d.ts +2 -0
  60. package/lib/src/bin/vba-blocks-new.d.ts +2 -0
  61. package/lib/src/bin/vba-blocks-run.d.ts +2 -0
  62. package/lib/src/bin/vba-blocks-test.d.ts +2 -0
  63. package/lib/src/bin/vba-blocks-version.d.ts +2 -0
  64. package/lib/src/bin/vba-blocks.d.ts +2 -0
  65. package/lib/src/build/apply-changeset.d.ts +3 -0
  66. package/lib/src/build/build-graph.d.ts +18 -0
  67. package/lib/src/build/changeset.d.ts +14 -0
  68. package/lib/src/build/compare-build-graphs.d.ts +3 -0
  69. package/lib/src/build/component.d.ts +25 -0
  70. package/lib/src/build/index.d.ts +7 -0
  71. package/lib/src/build/load-from-export.d.ts +2 -0
  72. package/lib/src/build/load-from-project.d.ts +5 -0
  73. package/lib/src/build/stage-build-graph.d.ts +2 -0
  74. package/lib/src/build/transform-build-graph.d.ts +3 -0
  75. package/lib/src/build/transforms/editor-config.d.ts +3 -0
  76. package/lib/src/cache.d.ts +9 -0
  77. package/lib/src/config.d.ts +29 -0
  78. package/lib/src/debug.d.ts +2 -0
  79. package/lib/src/env.d.ts +21 -0
  80. package/lib/src/errors.d.ts +56 -0
  81. package/lib/src/index.d.ts +16 -0
  82. package/lib/src/installer.d.ts +3 -0
  83. package/lib/src/lockfile/index.d.ts +23 -0
  84. package/lib/src/lockfile/is-lockfile-valid.d.ts +10 -0
  85. package/lib/src/lockfile/lockfile.d.ts +26 -0
  86. package/lib/src/manifest/dependency.d.ts +25 -0
  87. package/lib/src/manifest/index.d.ts +34 -0
  88. package/lib/src/manifest/reference.d.ts +12 -0
  89. package/lib/src/manifest/source.d.ts +8 -0
  90. package/lib/src/manifest/target.d.ts +10 -0
  91. package/lib/src/manifest/version.d.ts +3 -0
  92. package/lib/src/messages.d.ts +22 -0
  93. package/lib/src/professional/sources/git-source.d.ts +7 -0
  94. package/lib/src/professional/workspace.d.ts +10 -0
  95. package/lib/src/project.d.ts +48 -0
  96. package/lib/src/reporter.d.ts +12 -0
  97. package/lib/src/resolve/dependency-graph.d.ts +4 -0
  98. package/lib/src/resolve/index.d.ts +6 -0
  99. package/lib/src/resolve/latest-solver.d.ts +8 -0
  100. package/lib/src/resolve/resolver.d.ts +23 -0
  101. package/lib/src/resolve/sat-solver.d.ts +7 -0
  102. package/lib/src/sources/index.d.ts +16 -0
  103. package/lib/src/sources/path-source.d.ts +7 -0
  104. package/lib/src/sources/registration.d.ts +17 -0
  105. package/lib/src/sources/registry-source.d.ts +32 -0
  106. package/lib/src/sources/source.d.ts +6 -0
  107. package/lib/src/targets/add-target.d.ts +8 -0
  108. package/lib/src/targets/build-target.d.ts +41 -0
  109. package/lib/src/targets/export-target.d.ts +15 -0
  110. package/lib/src/targets/get-target.d.ts +7 -0
  111. package/lib/src/targets/index.d.ts +3 -0
  112. package/lib/src/targets/project-info.d.ts +7 -0
  113. package/lib/src/targets/transform-target.d.ts +3 -0
  114. package/lib/src/targets/transforms/core-xml.d.ts +2 -0
  115. package/lib/src/targets/transforms/workbook-xml.d.ts +2 -0
  116. package/lib/src/utils/async-map.d.ts +4 -0
  117. package/lib/src/utils/download.d.ts +1 -0
  118. package/lib/src/utils/fs.d.ts +23 -0
  119. package/lib/src/utils/get-staging.d.ts +1 -0
  120. package/lib/src/utils/git.d.ts +4 -0
  121. package/lib/src/utils/github.d.ts +9 -0
  122. package/lib/src/utils/has.d.ts +1 -0
  123. package/lib/src/utils/hash.d.ts +8 -0
  124. package/lib/src/utils/interop.d.ts +1 -0
  125. package/lib/src/utils/is.d.ts +5 -0
  126. package/lib/src/utils/noop.d.ts +1 -0
  127. package/lib/src/utils/observable.d.ts +15 -0
  128. package/lib/src/utils/parallel.d.ts +6 -0
  129. package/lib/src/utils/path.d.ts +7 -0
  130. package/lib/src/utils/pipe.d.ts +5 -0
  131. package/lib/src/utils/run.d.ts +17 -0
  132. package/lib/src/utils/stdout-file.d.ts +3 -0
  133. package/lib/src/utils/text.d.ts +4 -0
  134. package/lib/src/utils/toml.d.ts +4 -0
  135. package/lib/src/utils/unique.d.ts +1 -0
  136. package/lib/src/utils/without.d.ts +1 -0
  137. package/lib/src/utils/xml.d.ts +10 -0
  138. package/lib/src/utils/zip.d.ts +17 -0
  139. package/lib/test-project-d4f237d1.js +2 -0
  140. package/lib/test-project-d4f237d1.js.map +1 -0
  141. package/lib/text-ba532b40.js +10 -0
  142. package/lib/text-ba532b40.js.map +1 -0
  143. package/lib/tmp-bc08ebcf.js +10 -0
  144. package/lib/tmp-bc08ebcf.js.map +1 -0
  145. package/lib/toml-patch.es-6bd2145d.js +4 -0
  146. package/lib/toml-patch.es-6bd2145d.js.map +1 -0
  147. package/lib/vba-blocks-build-a717fcdb.js +10 -0
  148. package/lib/vba-blocks-build-a717fcdb.js.map +1 -0
  149. package/lib/vba-blocks-export-7e2c75cc.js +8 -0
  150. package/lib/vba-blocks-export-7e2c75cc.js.map +1 -0
  151. package/lib/vba-blocks-init-54531020.js +17 -0
  152. package/lib/vba-blocks-init-54531020.js.map +1 -0
  153. package/lib/vba-blocks-new-3210d92c.js +18 -0
  154. package/lib/vba-blocks-new-3210d92c.js.map +1 -0
  155. package/lib/vba-blocks-run-ab9d4ad4.js +11 -0
  156. package/lib/vba-blocks-run-ab9d4ad4.js.map +1 -0
  157. package/lib/vba-blocks-test-da5dba90.js +16 -0
  158. package/lib/vba-blocks-test-da5dba90.js.map +1 -0
  159. package/lib/vba-blocks-version-e1b3c35a.js +9 -0
  160. package/lib/vba-blocks-version-e1b3c35a.js.map +1 -0
  161. package/lib/vba-blocks.js +43 -0
  162. package/lib/vba-blocks.js.map +1 -0
  163. package/lib/workbook-xml-69fff4ae.js +3 -0
  164. package/lib/workbook-xml-69fff4ae.js.map +1 -0
  165. package/package.json +116 -0
  166. package/run-scripts/run.applescript +78 -0
  167. package/run-scripts/run.ps1 +211 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-d43b4e0c.js","sources":["../src/utils/unique.ts","../src/resolve/latest-solver.ts","../src/manifest/dependency.ts","../src/professional/sources/git-source.ts","../src/utils/toml.ts","../src/manifest/reference.ts","../src/manifest/source.ts","../src/manifest/target.ts","../src/manifest/version.ts","../src/manifest/index.ts","../src/sources/registration.ts","../src/sources/path-source.ts","../src/utils/git.ts","../src/utils/zip.ts","../src/utils/interop.ts","../src/sources/registry-source.ts","../src/utils/download.ts","../src/sources/index.ts","../src/resolve/resolver.ts","../src/resolve/index.ts","../src/lockfile/is-lockfile-valid.ts","../src/lockfile/index.ts","../src/resolve/dependency-graph.ts","../src/config.ts","../src/professional/workspace.ts","../src/project.ts","../src/lockfile/lockfile.ts"],"sourcesContent":["export function unique<T>(values: Iterable<T>): T[] {\n\treturn Array.from(new Set(values));\n}\n","import { satisfies } from \"semver\";\nimport { Dependency } from \"../manifest/dependency\";\nimport { Workspace } from \"../professional/workspace\";\nimport { Registration } from \"../sources/registration\";\nimport { unique } from \"../utils/unique\";\nimport { DependencyGraph } from \"./dependency-graph\";\nimport { Resolver, Resolution } from \"./resolver\";\n\nexport async function solveLatest(\n\tworkspace: Workspace,\n\tresolver: Resolver\n): Promise<DependencyGraph> {\n\tconst dependencies = workspace.root.dependencies.concat(workspace.root.devDependencies);\n\tawait resolveDependencies(dependencies, resolver);\n\n\tconst graph = [];\n\tconst errors = [];\n\tfor (const [name, resolution] of resolver) {\n\t\tconst matching = getMatching(resolution);\n\n\t\tif (!matching) {\n\t\t\terrors.push(resolution);\n\t\t} else {\n\t\t\tgraph.push(matching);\n\t\t}\n\t}\n\n\tif (errors.length) {\n\t\t// TODO\n\t\tthrow new Error(\"Unable to resolve dependency graph for given manifest\");\n\t}\n\n\treturn graph;\n}\n\nexport async function resolveDependencies(\n\tdependencies: Dependency[],\n\tresolver: Resolver\n): Promise<void> {\n\tconst resolved = await Promise.all(dependencies.map(dependency => resolver.get(dependency)));\n\n\tfor (const resolution of resolved) {\n\t\tconst { registered } = resolution;\n\t\tconst latest = getMatching(resolution) || registered[registered.length - 1];\n\n\t\tawait resolveDependencies(latest.dependencies, resolver);\n\t}\n}\n\nexport function getMatching(resolution: Resolution): Registration | undefined {\n\tconst range = unique(resolution.range).join(\" \");\n\tconst registered = resolution.registered.slice().reverse();\n\n\treturn !range\n\t\t? registered[0]\n\t\t: registered.find(registration => satisfies(registration.version, range));\n}\n","import { manifestOk } from \"../errors\";\nimport { has } from \"../utils/has\";\nimport { isString } from \"../utils/is\";\nimport { extname, join, relative, trailing } from \"../utils/path\";\nimport { Version } from \"./version\";\n\n/*\n # Dependency\n\n Three types of dependencies: registry, path, and git\n\n - registry: version | { version, registry? }\n\n Registry (default = \"vba-blocks\"):\n index + packages are loading in config and used for resolve and fetching\n\n - path: path\n - git: { git, branch?, tag?, rev? }\n\n Where git is path to git remote and revision is pulled from\n master, branch, tag, or rev\n*/\n\nexport interface DependencyDetails {\n\tname: string;\n\tversion?: Version;\n}\n\nexport interface RegistryDependency extends DependencyDetails {\n\tregistry: string;\n\tversion: Version;\n}\n\nexport interface PathDependency extends DependencyDetails {\n\tpath: string;\n}\n\nexport interface GitDependency extends DependencyDetails {\n\tgit: string;\n\ttag?: string;\n\tbranch?: string;\n\trev?: string;\n}\n\nexport type Dependency = RegistryDependency | PathDependency | GitDependency;\n\nconst EXAMPLE = `Example vba-block.toml:\n\n [dependencies]\n a = \"^1.0.0\"\n b = { version = \"^0.1.0\" }\n c = { path = \"packages/c\" }\n d = { git = \"https://github.com/author/d\" }\n e = { git = \"https://github.com/author/e\", branch = \"next\" }\n f = { git = \"https://github.com/author/f\", tag = \"v1.0.0\" }\n g = { git = \"https://github.com/author/g\", rev = \"a1b2c3d4\" }\n\n [dependencies.h]\n version = \"^2.0.0\"`;\n\nexport function parseDependencies(value: any, dir: string): Dependency[] {\n\treturn Object.entries(value).map(([name, value]) => parseDependency(name, value, dir));\n}\n\nexport function parseDependency(name: string, value: Version | any, dir: string): Dependency {\n\tif (isString(value)) value = { version: value };\n\n\tlet {\n\t\tregistry = \"vba-blocks\",\n\t\tversion,\n\t\tpath,\n\t\tgit,\n\t\ttag,\n\t\tbranch = \"master\",\n\t\trev\n\t}: {\n\t\tregistry?: string;\n\t\tversion?: string;\n\t\tpath?: string;\n\t\tgit?: string;\n\t\ttag?: string;\n\t\tbranch?: string;\n\t\trev?: string;\n\t} = value;\n\n\tmanifestOk(\n\t\tversion || path || git,\n\t\t`Invalid dependency \"${name}\", no version, path, or git specified. \\n\\n${EXAMPLE}`\n\t);\n\n\tif (version) {\n\t\treturn { name, registry, version };\n\t} else if (path) {\n\t\treturn { name, path: trailing(join(dir, path)) };\n\t} else {\n\t\tgit = ensureGitUrl(git!);\n\n\t\tif (rev) return { name, git, rev };\n\t\telse if (tag) return { name, git, tag };\n\t\telse return { name, git, branch };\n\t}\n}\n\nexport function isRegistryDependency(dependency: Dependency): dependency is RegistryDependency {\n\treturn has(dependency, \"registry\");\n}\n\nexport function isPathDependency(dependency: Dependency): dependency is PathDependency {\n\treturn has(dependency, \"path\");\n}\n\nexport function isGitDependency(dependency: Dependency): dependency is GitDependency {\n\treturn has(dependency, \"git\");\n}\n\nexport function formatDependencies(dependencies: Dependency[], dir: string): object {\n\tconst value: { [name: string]: any } = {};\n\tdependencies.forEach(dependency => {\n\t\tif (isRegistryDependency(dependency)) {\n\t\t\tconst { name, registry, version } = dependency;\n\t\t\tvalue[name] = registry !== \"vba-blocks\" ? { version, registry } : version;\n\t\t} else if (isPathDependency(dependency)) {\n\t\t\tlet { name, path } = dependency;\n\t\t\tpath = relative(dir, path);\n\n\t\t\tvalue[name] = { path };\n\t\t} else {\n\t\t\tconst { name, git, tag, branch, rev } = dependency;\n\t\t\tvalue[name] = { name, git };\n\t\t\tif (tag) value[name].tag = tag;\n\t\t\tif (branch) value[name].branch = branch;\n\t\t\tif (rev) value[name].rev = rev;\n\t\t}\n\t});\n\n\treturn value;\n}\n\nfunction ensureGitUrl(value: string): string {\n\tif (extname(value!) === \".git\") return value;\n\n\treturn `${value}.git`;\n}\n","import dedent from \"@timhall/dedent\";\nimport { CliError, ErrorCode } from \"../../errors\";\nimport { Dependency } from \"../../manifest/dependency\";\nimport { Registration } from \"../../sources/registration\";\nimport { Source } from \"../../sources/source\";\n\nconst message = dedent`\n git dependencies are not currently supported.\n\n Upgrade to Professional Edition (coming soon) for git dependencies and more.\n`;\n\nexport class GitSource implements Source {\n\tresolve(_dependency: Dependency): Registration[] {\n\t\tthrow new CliError(ErrorCode.SourceUnsupported, message);\n\t}\n\tfetch(_registration: Registration): string {\n\t\tthrow new CliError(ErrorCode.SourceUnsupported, message);\n\t}\n}\n","import { isBoolean, isDate, isNumber, isObject, isString } from \"./is\";\n\nexport async function parse(value: string): Promise<any> {\n\tconst { parse: parseToml } = await import(\"@decimalturn/toml-patch\");\n\treturn parseToml(value);\n}\n\nexport async function convert(value: any): Promise<string> {\n\tconst { stringify } = await import(\"@decimalturn/toml-patch\");\n\treturn stringify(value);\n}\n\nexport async function patch(existing: string, updated: any): Promise<string> {\n\tconst { patch: patchTOML } = await import(\"@decimalturn/toml-patch\");\n\treturn patchTOML(existing, updated);\n}\n\nexport function toLockfile(value: any, level = 0): string {\n\tif (isString(value)) {\n\t\treturn `\"${value}\"`;\n\t} else if (isNumber(value)) {\n\t\treturn `${value}`;\n\t} else if (isBoolean(value)) {\n\t\treturn value ? \"true\" : \"false\";\n\t} else if (isDate(value)) {\n\t\treturn value.toISOString();\n\t} else if (isObject(value)) {\n\t\tlet converted = \"\";\n\n\t\tif (level === 0) {\n\t\t\t// For top level, use [key] / [[key]] approach\n\t\t\tfor (const [key, item] of Object.entries(value)) {\n\t\t\t\tif (Array.isArray(item)) {\n\t\t\t\t\titem.forEach(subitem => {\n\t\t\t\t\t\tconverted += `[[${key}]]\\n${toLockfile(subitem, level + 1)}\\n`;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconverted += `[${key}]\\n${toLockfile(item, level + 1)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (level === 1) {\n\t\t\t// For next level, use key = value appraoch\n\t\t\tfor (const [key, item] of Object.entries(value)) {\n\t\t\t\tif (Array.isArray(item)) {\n\t\t\t\t\tconst empty = item.length === 0;\n\t\t\t\t\tconverted += `${key} = [\\n`;\n\t\t\t\t\tconverted += item.map(subitem => ` ${toLockfile(subitem, level + 1)}`).join(\",\\n\");\n\t\t\t\t\tconverted += empty ? \"]\\n\" : \",\\n]\\n\";\n\t\t\t\t} else {\n\t\t\t\t\tconverted += `${key} = ${toLockfile(item, level + 1)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO (not used by lockfile)\n\t\t}\n\n\t\treturn converted;\n\t} else {\n\t\tthrow new Error(\n\t\t\t`Unsupported type passed to toLockfile. Only String, Number, Boolean, Date, Array, and Object are supported`\n\t\t);\n\t}\n}\n","import { manifestOk } from \"../errors\";\n\n/*\n # Reference\n\n To add reference, guid, major version, and minor version are required\n\n reference: { guid, version }\n\n Where version is \"MAJOR.MINOR\"\n*/\n\nexport interface ReferenceDetails {\n\tdependency?: string;\n}\n\nexport interface Reference {\n\tname: string;\n\tguid: string;\n\tmajor: number;\n\tminor: number;\n}\n\nconst VERSION_REGEX = /^(\\d+)\\.(\\d+)$/;\nconst GUID_REGEX = /\\{.{8}-.{4}-.{4}-.{4}-.{12}\\}/;\n\nconst isVersion = (value: string) => VERSION_REGEX.test(value);\nconst isGuid = (value: string) => GUID_REGEX.test(value);\n\nconst toInt = (value: string) => parseInt(value, 10);\nconst getMajorMinor = (version: string) => {\n\tconst [major, minor] = version.split(\".\", 2).map(toInt);\n\n\treturn { major, minor };\n};\n\nconst EXAMPLE = `Example vba-block.toml:\n\n [references.Scripting]\n version = \"1.0\"\n guid = \"{420B2830-E718-11CF-893D-00A0C9054228}\"`;\n\nexport function parseReferences(value: any): Reference[] {\n\treturn Object.entries(value).map(([name, value]) => parseReference(name, value));\n}\n\nexport function parseReference(name: string, value: any): Reference {\n\tconst { version, guid } = value;\n\n\tmanifestOk(\n\t\tisVersion(version),\n\t\t`Reference \"${name}\" has an invalid version \"${version}\". \\n\\n${EXAMPLE}.`\n\t);\n\tmanifestOk(isGuid(guid), `Reference \"${name}\" has an invalid guid \"${guid}\". \\n\\n${EXAMPLE}'`);\n\n\tconst { major, minor } = getMajorMinor(version);\n\n\treturn { name, guid, major, minor };\n}\n\nexport function formatReferences(references: Reference[]): object {\n\tconst value: { [name: string]: object } = {};\n\treferences.forEach(reference => {\n\t\tconst { name, guid, major, minor } = reference;\n\t\tconst version = `${major}.${minor}`;\n\t\tvalue[name] = { version, guid };\n\t});\n\n\treturn value;\n}\n","import { manifestOk } from \"../errors\";\nimport { isString } from \"../utils/is\";\nimport { join, relative } from \"../utils/path\";\n\n/*\n # Source\n\n A source file to be imported\n\n source: path | { path }\n*/\n\nexport interface Source {\n\tname: string;\n\tpath: string;\n\tbinary?: string;\n}\n\nconst EXAMPLE = `Example vba-block.toml:\n\n [src]\n A = \"src/a.bas\"\n B = { path = \"src/b.cls\" }`;\n\nexport function parseSrc(value: any, dir: string): Source[] {\n\treturn Object.entries(value).map(([name, value]) => parseSource(name, value, dir));\n}\n\nexport function parseSource(name: string, value: string | any, dir: string): Source {\n\tif (isString(value)) value = { path: value };\n\tconst { path: relativePath, binary } = value;\n\n\tmanifestOk(relativePath, `src \"${name}\" is missing path. \\n\\n${EXAMPLE}`);\n\tconst path = join(dir, relativePath);\n\n\tconst source: Source = { name, path };\n\tif (binary) source.binary = join(dir, binary);\n\n\treturn source;\n}\n\nexport function formatSrc(src: Source[], dir: string): object {\n\tconst value: { [name: string]: string } = {};\n\tsrc.forEach(source => {\n\t\tlet { name, path } = source;\n\t\tpath = relative(dir, path);\n\t\tvalue[name] = path;\n\t});\n\n\treturn value;\n}\n","import { manifestOk } from \"../errors\";\nimport { has } from \"../utils/has\";\nimport { isString } from \"../utils/is\";\nimport { join, relative, sanitize } from \"../utils/path\";\n\n/*\n # Target\n\n target: type | { type, name?, path? }\n\n By default \"target\" is used for path\n*/\n\nexport type TargetType = \"xlsx\" | \"xlsm\" | \"xlam\";\n\nexport interface Target {\n\tname: string;\n\ttype: TargetType;\n\tpath: string;\n\tfilename: string;\n}\n\nconst TARGET_TYPES = [\"xlsx\", \"xlsm\", \"xlam\"];\n\nconst EXAMPLE = `Example vba-block.toml:\n\n [project]\n target = \"xlsm\"\n\nExample vba-block.toml with alternative path:\n\n [project]\n target = { type = \"xlsm\", path = \"target/xlsm\" }`;\n\nexport function parseTarget(value: any, pkgName: string, dir: string): Target {\n\tif (isString(value)) value = { type: value };\n\tif (!has(value, \"name\")) value = { name: pkgName, ...value };\n\tconst { type, name, path: relativePath = \"target\" } = value;\n\n\tmanifestOk(isString(type), `Target is missing \"type\". \\n\\n${EXAMPLE}.`);\n\tmanifestOk(\n\t\tisSupportedTargetType(type),\n\t\t`Unsupported target type \"${type}\". Only \"xlsx\", \"xlsm\", and \"xlam\" are supported currently.`\n\t);\n\n\tconst path = join(dir, relativePath);\n\tconst filename = `${sanitize(name)}.${type}`;\n\n\treturn { name, type, path, filename };\n}\n\nexport function isSupportedTargetType(type: string): type is TargetType {\n\treturn isString(type) && TARGET_TYPES.includes(type);\n}\n\nexport function formatTarget(target: Target, defaultName: string, dir: string): string | object {\n\tlet { name, type: targetType, path } = target;\n\tpath = relative(dir, path);\n\n\tlet value: string | { type: string; name?: string; path?: string };\n\tif (name !== defaultName || path !== \"target\") {\n\t\tvalue = { type: targetType };\n\t\tif (name !== defaultName) value.name = name;\n\t\tif (path !== \"target\") value.path = path;\n\t} else {\n\t\tvalue = targetType;\n\t}\n\n\treturn value;\n}\n","import { validRange } from \"semver\";\n\nexport type Version = string;\n\nexport const DEFAULT_VERSION = \"UNVERSIONED\";\n\nexport function isValid(value: string): value is Version {\n\treturn !!value && validRange(value) != null;\n}\n","import dedent from \"@timhall/dedent\";\nimport { CliError, ErrorCode, manifestOk } from \"../errors\";\nimport { pathExists, readFile, writeFile } from \"../utils/fs\";\nimport { join, normalize } from \"../utils/path\";\nimport { convert as convertToToml, parse as parseToml, patch as patchToml } from \"../utils/toml\";\nimport { Dependency, formatDependencies, parseDependencies } from \"./dependency\";\nimport { formatReferences, parseReferences, Reference } from \"./reference\";\nimport { formatSrc, parseSrc, Source } from \"./source\";\nimport { formatTarget, parseTarget, Target } from \"./target\";\nimport { DEFAULT_VERSION, Version } from \"./version\";\n\n/**\n * Snapshot is the minimal manifest needed to support both Manifest\n * and info loaded during dependency resolution\n */\nexport interface Snapshot {\n\tname: string;\n\tversion: Version;\n\tdependencies: Dependency[];\n}\n\nexport type ManifestType = \"package\" | \"project\";\n\n/*\n # Manifest\n\n The parsed vba-block.toml manifest.\n package/project, src, dependencies, etc are all parsed and put in a consistent form\n\n ```toml\n [package]\n name = \"package-name\"\n version = \"1.0.0\"\n authors = [\"Tim Hall <tim.hall.engr@gmail.com> (https://github.com/timhall)\"]\n\n [src]\n A = \"src/a.bas\"\n B = { path = \"src/b.cls\" }\n\n [dependencies]\n dictionary = \"^1\"\n from-path = { path = \"packages/from-path\" }\n```\n*/\nexport interface Metadata {\n\tauthors?: string[];\n\tpublish?: boolean;\n\t[name: string]: any;\n}\n\nexport interface Manifest extends Snapshot {\n\ttype: ManifestType;\n\tmetadata: Metadata;\n\tsrc: Source[];\n\treferences: Reference[];\n\tdevSrc: Source[];\n\tdevDependencies: Dependency[];\n\tdevReferences: Reference[];\n\ttarget?: Target;\n}\n\nconst EXAMPLE = `Example vba-block.toml for a package (e.g. library to be shared):\n\n [package]\n name = \"my-package\"\n version = \"0.0.0\"\n authors = [\"...\"]\n\nExample vba-block.toml for a project (e.g. workbook, document, etc.):\n\n [project]\n name = \"my-project\"\n target = \"xlsm\"`;\n\nexport function parseManifest(value: any, dir: string): Manifest {\n\tmanifestOk(\n\t\tvalue && (value.package || value.project),\n\t\t`A [package] or [project] section is required. \\n\\n${EXAMPLE}`\n\t);\n\n\tlet type: ManifestType;\n\tlet name: string;\n\tlet version: string;\n\tlet authors: string[] | undefined;\n\tlet publish: boolean | undefined;\n\tlet target: Target | undefined;\n\n\tif (value.project) {\n\t\ttype = \"project\";\n\t\tname = value.project.name;\n\t\tversion = value.project.version || DEFAULT_VERSION;\n\t\tauthors = value.project.authors;\n\n\t\tmanifestOk(name, `[project] name is a required field. \\n\\n${EXAMPLE}`);\n\t\tmanifestOk(value.project.target, `[project] target is a required field. \\n\\n${EXAMPLE}`);\n\n\t\ttarget = parseTarget(value.project.target, name, dir);\n\t} else {\n\t\ttype = \"package\";\n\t\tname = value.package.name;\n\t\tversion = value.package.version;\n\t\tauthors = value.package.authors;\n\t\tpublish = value.package.publish;\n\n\t\tmanifestOk(name, `[package] name is a required field. \\n\\n${EXAMPLE}`);\n\t\tmanifestOk(version, `[package] version is a required field. \\n\\n${EXAMPLE}`);\n\t\tmanifestOk(authors, `[package] authors is a required field. \\n\\n${EXAMPLE}`);\n\n\t\ttarget = value.package.target && parseTarget(value.package.target, name, dir);\n\t}\n\n\tconst src = parseSrc(value.src || {}, dir);\n\tconst dependencies = parseDependencies(value.dependencies || {}, dir);\n\tconst references = parseReferences(value.references || {});\n\n\tconst devSrc = parseSrc(value[\"dev-src\"] || {}, dir);\n\tconst devDependencies = parseDependencies(value[\"dev-dependencies\"] || {}, dir);\n\tconst devReferences = parseReferences(value[\"dev-references\"] || {});\n\n\treturn {\n\t\ttype,\n\t\tname,\n\t\tversion,\n\t\tmetadata: { authors, publish },\n\t\tsrc,\n\t\tdependencies,\n\t\treferences,\n\t\tdevSrc,\n\t\tdevDependencies,\n\t\tdevReferences,\n\t\ttarget\n\t};\n}\n\nexport async function loadManifest(dir: string): Promise<Manifest> {\n\tconst file = join(dir, \"vba-block.toml\");\n\n\tif (!(await pathExists(file))) {\n\t\tthrow new CliError(\n\t\t\tErrorCode.ManifestNotFound,\n\t\t\tdedent`\n vba-blocks.toml not found in \"${dir}\".\n\n Try \"vba-blocks init\" to start a new project in this directory\n or \"cd YOUR_PROJECTS_DIRECTORY\" to change to a folder that contains an existing project.\n `\n\t\t);\n\t}\n\n\tconst raw = await readFile(file);\n\n\tlet parsed;\n\ttry {\n\t\tparsed = await parseToml(raw.toString());\n\t} catch (err) {\n\t\t//@ts-ignore\n\t\tlet line = err.line;\n\t\t//@ts-ignore\n\t\tlet column = err.column;\n\t\t//@ts-ignore\n\t\tlet message = err.message;\n\t\tthrow new CliError(\n\t\t\tErrorCode.ManifestInvalid,\n\n\t\t\tdedent`\n\t\t\t\tvba-blocks.toml is invalid:\n\n\t\t\t\tSyntax Error: ${file} (${line}:${column})\\n\\n${message}\n\t\t\t`\n\t\t);\n\t}\n\n\tconst manifest = parseManifest(parsed, normalize(dir));\n\n\treturn manifest;\n}\n\nexport async function writeManifest(manifest: Manifest, dir: string) {\n\tconst value = formatManifest(manifest, dir);\n\tconst path = join(dir, \"vba-block.toml\");\n\tlet toml: string;\n\n\tif (await pathExists(path)) {\n\t\tconst existing = await readFile(path, \"utf8\");\n\t\ttoml = await patchToml(existing, value);\n\t} else {\n\t\ttoml = await convertToToml(value);\n\t}\n\n\tawait writeFile(path, toml);\n}\n\nexport function formatManifest(manifest: Manifest, dir: string): object {\n\tconst {\n\t\ttype,\n\t\tname,\n\t\tversion,\n\t\tmetadata: { authors, publish, ...metadata }\n\t} = manifest;\n\n\tconst values: any = { name };\n\tif (version !== DEFAULT_VERSION) values.version = version;\n\tif (authors != null) values.authors = authors;\n\tif (publish != null) values.publish = publish;\n\tObject.assign(values, metadata);\n\n\tconst value: any = {\n\t\t[type]: values\n\t};\n\n\tif (manifest.target) {\n\t\tvalue[type].target = formatTarget(manifest.target, manifest.name, dir);\n\t}\n\n\tvalue.src = formatSrc(manifest.src, dir);\n\n\tif (manifest.dependencies.length) {\n\t\tvalue.dependencies = formatDependencies(manifest.dependencies, dir);\n\t}\n\tif (manifest.references.length) {\n\t\tvalue.references = formatReferences(manifest.references);\n\t}\n\n\tif (manifest.devSrc.length) {\n\t\tvalue[\"dev-src\"] = formatSrc(manifest.devSrc, dir);\n\t}\n\tif (manifest.devDependencies.length) {\n\t\tvalue[\"dev-dependencies\"] = formatDependencies(manifest.devDependencies, dir);\n\t}\n\tif (manifest.devReferences.length) {\n\t\tvalue[\"dev-references\"] = formatReferences(manifest.devReferences);\n\t}\n\n\treturn value;\n}\n","import dedent from \"@timhall/dedent\";\nimport { parse as parseQuerystring } from \"querystring\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport { Snapshot } from \"../manifest\";\nimport { Dependency } from \"../manifest/dependency\";\nimport { has } from \"../utils/has\";\nimport { isString } from \"../utils/is\";\n\nexport interface Registration extends Snapshot {\n\tid: string;\n\tsource: string;\n}\n\nexport function fromSnapshot(snapshot: Snapshot, source: string): Registration {\n\tconst { name, version, dependencies } = snapshot;\n\n\treturn {\n\t\tid: getRegistrationId(snapshot),\n\t\tsource,\n\t\tname,\n\t\tversion,\n\t\tdependencies\n\t};\n}\n\nexport function getRegistrationId(name: Snapshot): string;\nexport function getRegistrationId(name: string, version: string): string;\nexport function getRegistrationId(name: string | Snapshot, version?: string): string {\n\tif (!isString(name)) {\n\t\tversion = name.version;\n\t\tname = name.name;\n\t}\n\n\treturn `${name}@${version}`;\n}\n\nexport function getRegistrationSource(type: string, value: string, details?: string): string {\n\tlet source = `${type}+${value}`;\n\tif (details) {\n\t\tsource += `#${details}`;\n\t}\n\n\treturn source;\n}\n\nexport function getSourceParts(\n\tsource: string\n): { type: string; value: string; details: string | undefined } {\n\tconst [info, ...details] = source.split(\"#\");\n\tconst [type, ...value] = info.split(\"+\");\n\n\treturn { type, value: value.join(\"+\"), details: details.join(\"#\") };\n}\n\nexport function toDependency(registration: Registration): Dependency {\n\tconst { name, version, source } = registration;\n\tconst { type, value, details } = getSourceParts(source);\n\n\tif (type === \"registry\") {\n\t\treturn { name, version, registry: value };\n\t} else if (type === \"git\") {\n\t\t// For git, tag / branch and/or rev are encoded as querystring\n\t\tconst gitDetails = parseQuerystring(details!);\n\t\treturn { name, git: value, ...gitDetails };\n\t} else if (type === \"path\") {\n\t\treturn { name, path: value, version };\n\t} else {\n\t\tthrow new CliError(\n\t\t\tErrorCode.SourceUnrecognizedType,\n\t\t\tdedent`\n Unrecognized source type \"${type}\" in registration.\n (\"registry\", \"path\", and \"git\" are supported)\n `\n\t\t);\n\t}\n}\n\nexport function isRegistration(value: Registration | Dependency): value is Registration {\n\treturn has(value, \"source\");\n}\n","import { CliError, ErrorCode } from \"../errors\";\nimport { loadManifest } from \"../manifest\";\nimport { Dependency, PathDependency } from \"../manifest/dependency\";\nimport { pathExists } from \"../utils/fs\";\nimport {\n\tgetRegistrationId,\n\tgetRegistrationSource,\n\tgetSourceParts,\n\tRegistration\n} from \"./registration\";\nimport { Source } from \"./source\";\n\nexport class PathSource implements Source {\n\tasync resolve(dependency: Dependency): Promise<Registration[]> {\n\t\tconst { name, path } = <PathDependency>dependency;\n\t\tif (!pathExists(path)) {\n\t\t\tthrow new CliError(\n\t\t\t\tErrorCode.DependencyPathNotFound,\n\t\t\t\t`Path not found for dependency \"${name}\" (${path}).`\n\t\t\t);\n\t\t}\n\n\t\t// Load registration details (version and dependencies) from manifest directly\n\t\tconst manifest = await loadManifest(path);\n\t\tconst { version, dependencies } = manifest;\n\n\t\tconst registration: Registration = {\n\t\t\tid: getRegistrationId(manifest),\n\t\t\tsource: getRegistrationSource(\"path\", path),\n\t\t\tname,\n\t\t\tversion,\n\t\t\tdependencies\n\t\t};\n\n\t\treturn [registration];\n\t}\n\n\tasync fetch(registration: Registration): Promise<string> {\n\t\t// Path dependency is already \"fetched\", simply return path\n\t\tconst { value } = getSourceParts(registration.source);\n\t\treturn value;\n\t}\n}\n","import * as fs from \"fs\";\nimport { env } from \"../env\";\nimport { pathExists } from \"./fs\";\nimport { join } from \"./path\";\n\nconst debug = env.debug(\"vba-blocks:git\");\n\ninterface LoadedGit {\n\tgit: typeof import(\"isomorphic-git\");\n\thttp: typeof import(\"isomorphic-git/http/node\")[\"default\"];\n}\n\nasync function loadGit(): Promise<LoadedGit> {\n\tconst fetch = await import(\"node-fetch\");\n\t(global as any).fetch = fetch.default;\n\n\tconst git = await import(\"isomorphic-git\");\n\tconst http = await import(\"isomorphic-git/http/node\");\n\n\treturn { git, http: http.default };\n}\n\nexport async function clone(remote: string, name: string, cwd: string) {\n\tconst { git, http } = await loadGit();\n\tconst dir = join(cwd, name);\n\n\tdebug(`clone: ${remote} to ${dir}`);\n\tawait git.clone({ fs, http, dir, url: remote, depth: 1 });\n}\n\nexport async function pull(local: string) {\n\tconst { git, http } = await loadGit();\n\n\tdebug(`pull: ${local}`);\n\tawait git.pull({ fs, http, dir: local });\n}\n\nexport async function init(dir: string) {\n\tconst { git } = await loadGit();\n\n\tdebug(`init: ${dir}`);\n\tawait git.init({ fs, dir });\n}\n\nexport async function isGitRepository(dir: string): Promise<boolean> {\n\treturn await pathExists(join(dir, \".git\"));\n}\n","import { createWriteStream } from \"fs\";\nimport { getDefault } from \"./interop\";\n\nexport async function zip(dir: string, file: string): Promise<void> {\n\tconst { create: createArchive } = (await import(\"archiver\")).default;\n\n\treturn new Promise<void>((resolve, reject) => {\n\t\ttry {\n\t\t\tconst output = createWriteStream(file);\n\t\t\tconst archive = createArchive(\"zip\");\n\n\t\t\toutput.on(\"close\", () => resolve());\n\t\t\toutput.on(\"error\", reject);\n\n\t\t\tarchive.pipe(output);\n\t\t\tarchive.on(\"error\", reject);\n\n\t\t\tarchive.directory(dir, \"/\");\n\t\t\tarchive.finalize();\n\t\t} catch (err) {\n\t\t\treject(err);\n\t\t}\n\t});\n}\n\nexport interface UnzipOptions {\n\tfilter?: (file: UnzipFile, index: number, files: UnzipFile[]) => boolean;\n\tmap?: (file: UnzipFile, index: number, files: UnzipFile[]) => UnzipFile;\n\tplugins?: UnzipPlugin[];\n\tstrip?: number;\n}\nexport type UnzipPlugin = (buffer: Buffer) => Promise<UnzipFile[]>;\n\nexport interface UnzipFile {\n\tdata: Buffer;\n\tmode: number;\n\tmtime: string;\n\tpath: string;\n\ttype: string;\n}\n\nexport async function unzip(file: string, dest: string, options?: UnzipOptions): Promise<void> {\n\tconst decompress = getDefault(await import(\"decompress\"));\n\n\tawait decompress(file, dest, options);\n}\n","export function getDefault(exports: any) {\n\treturn \"default\" in exports ? exports.default : exports;\n}\n","import dedent from \"@timhall/dedent\";\nimport { env } from \"../env\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport { Dependency, RegistryDependency } from \"../manifest/dependency\";\nimport { Message } from \"../messages\";\nimport { download } from \"../utils/download\";\nimport {\n\tchecksum as getChecksum,\n\tensureDir,\n\tmove,\n\tpathExists,\n\treadFile,\n\ttmpFile\n} from \"../utils/fs\";\nimport { clone, isGitRepository, pull } from \"../utils/git\";\nimport { basename, dirname, join, sanitize } from \"../utils/path\";\nimport { unzip } from \"../utils/zip\";\nimport { getRegistrationId, getRegistrationSource, Registration } from \"./registration\";\nimport { Source } from \"./source\";\n\nconst debug = env.debug(\"vba-blocks:registry-source\");\n\nexport interface RegistryOptions {\n\tname: string;\n\tindex: string;\n\tpackages: string;\n}\n\nexport class RegistrySource implements Source {\n\tname: string;\n\tlocal: { index: string; packages: string };\n\tremote: { index: string; packages: string };\n\tprivate sources: string;\n\tprivate pulling?: Promise<void>;\n\tprivate upToDate: boolean;\n\n\tconstructor({ name, index, packages }: RegistryOptions) {\n\t\tthis.name = name;\n\t\tthis.local = {\n\t\t\tindex: join(env.registry, name),\n\t\t\tpackages: join(env.packages, name)\n\t\t};\n\t\tthis.remote = { index, packages };\n\n\t\tthis.sources = join(env.sources, name);\n\t\tthis.upToDate = false;\n\t}\n\n\tasync resolve(dependency: Dependency): Promise<Registration[]> {\n\t\tif (!this.upToDate) await this.pull();\n\n\t\tconst { name } = <RegistryDependency>dependency;\n\t\tconst path = getPath(this.local.index, name);\n\n\t\tif (!(await pathExists(path))) {\n\t\t\tthrow new CliError(\n\t\t\t\tErrorCode.DependencyNotFound,\n\t\t\t\t`Dependency \"${name}\" not found in registry \"${this.name}\".`\n\t\t\t);\n\t\t}\n\n\t\tconst data = await readFile(path, \"utf8\");\n\t\tconst registrations: Registration[] = data\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line: string) => !!line)\n\t\t\t.map((line: string) => JSON.parse(line))\n\t\t\t.filter((value: any) => value && !value.yanked)\n\t\t\t.map((value: string) => parseRegistration(this.name, value));\n\n\t\treturn registrations;\n\t}\n\n\tasync fetch(registration: Registration): Promise<string> {\n\t\tconst url = getRemotePackage(this.remote.packages, registration);\n\t\tconst file = getLocalPackage(this.local.packages, registration);\n\n\t\tconst [_, checksum] = registration.source.split(\"#\", 2);\n\t\tconst [algorithm, hash] = checksum.split(\"-\");\n\n\t\tif (!(await pathExists(file))) {\n\t\t\tconst unverifiedFile = await tmpFile();\n\t\t\ttry {\n\t\t\t\tawait download(url, unverifiedFile);\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\t\tthrow new CliError(\n\t\t\t\t\tErrorCode.SourceDownloadFailed,\n\t\t\t\t\t`Failed to download \"${registration.source}\".`,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst comparison = await getChecksum(unverifiedFile, algorithm);\n\t\t\tif (comparison !== hash) {\n\t\t\t\tdebug(`Checksum failed for ${unverifiedFile}`);\n\t\t\t\tdebug(`Expected ${hash} (${algorithm}), received ${comparison}`);\n\n\t\t\t\tthrow new CliError(\n\t\t\t\t\tErrorCode.DependencyInvalidChecksum,\n\t\t\t\t\tdedent`\n Dependency \"${registration.name}\" failed validation.\n\n The downloaded file signature for ${registration.id}\n does not match the signature in the registry.\n `\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait move(unverifiedFile, file);\n\t\t}\n\n\t\tconst src = getSource(this.sources, registration);\n\t\tawait ensureDir(src);\n\t\tawait unzip(file, src);\n\n\t\treturn src;\n\t}\n\n\tasync pull() {\n\t\tif (this.pulling) return this.pulling;\n\n\t\tthis.pulling = pullIndex(this.local.index, this.remote.index);\n\t\tawait this.pulling;\n\n\t\tthis.upToDate = true;\n\t\tthis.pulling = undefined;\n\t}\n}\n\nexport async function pullIndex(local: string, remote: string) {\n\tconst hasLocalDirectory = await pathExists(local);\n\tif (hasLocalDirectory && !isGitRepository(local)) {\n\t\t// For local registry, skip clone + pull\n\t\t// if directory exists without git repository\n\t\tenv.reporter.log(\n\t\t\tMessage.RegistrySourceLocalOnly,\n\t\t\t\"(local registry is not a git repository, skipping pull)\"\n\t\t);\n\t\treturn;\n\t}\n\n\tif (!hasLocalDirectory) {\n\t\tawait ensureDir(dirname(local));\n\n\t\ttry {\n\t\t\tawait clone(remote, basename(local), dirname(local));\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tthrow new CliError(\n\t\t\t\tErrorCode.RegistryCloneFailed,\n\t\t\t\t`Failed to clone registry from ${remote}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\ttry {\n\t\tawait pull(local);\n\t} catch (err) {\n\t\tdebug(\"Pull failed\", err);\n\n\t\t// If pull fails (but repository exists)\n\t\t// treat as offline and still attempt to resolve\n\t\tenv.reporter.log(\n\t\t\tMessage.RegistrySourceSkipPull,\n\t\t\t\"(failed to update local registry, resolving with previously loaded values)\"\n\t\t);\n\t}\n}\n\nexport function parseRegistration(registry: string, value: any): Registration {\n\tconst { name, vers: version, cksum: checksum } = value;\n\n\tconst dependencies: RegistryDependency[] = value.deps.map((dep: any) => {\n\t\tconst { name, req } = dep;\n\t\tconst dependency: RegistryDependency = {\n\t\t\tname,\n\t\t\tregistry,\n\t\t\tversion: req\n\t\t};\n\n\t\treturn dependency;\n\t});\n\n\treturn {\n\t\tid: getRegistrationId(name, version),\n\t\tsource: getRegistrationSource(\"registry\", registry, checksum),\n\t\tname,\n\t\tversion,\n\t\tdependencies\n\t};\n}\n\nexport function sanitizePackageName(name: string): string {\n\treturn sanitize(name.replace(\"/\", \"--\"));\n}\n\nfunction getPath(index: string, name: string): string {\n\treturn join(index, sanitizePackageName(name));\n}\n\nexport function getRemotePackage(packages: string, registration: Registration): string {\n\tconst { name, version } = registration;\n\treturn `${packages}/${sanitizePackageName(name)}-v${version}.block`;\n}\n\nexport function getLocalPackage(packages: string, registration: Registration): string {\n\tconst { name, version } = registration;\n\treturn join(packages, `${sanitizePackageName(name)}-v${version}.block`);\n}\n\nexport function getSource(sources: string, registration: Registration): string {\n\tconst { name, version } = registration;\n\treturn join(sources, `${sanitizePackageName(name)}-v${version}`);\n}\n","import { createWriteStream } from \"fs\";\nimport fetch from \"node-fetch\";\nimport { ensureDir } from \"./fs\";\nimport { dirname } from \"./path\";\n\nexport async function download(url: string, dest: string): Promise<void> {\n\tawait ensureDir(dirname(dest));\n\n\treturn fetch(url).then(response => {\n\t\tconst file = createWriteStream(dest);\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tresponse.body\n\t\t\t\t.pipe(file)\n\t\t\t\t.on(\"finish\", () => resolve())\n\t\t\t\t.on(\"error\", reject);\n\t\t});\n\t});\n}\n","import dedent from \"@timhall/dedent\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport {\n\tDependency,\n\tisGitDependency,\n\tisPathDependency,\n\tisRegistryDependency\n} from \"../manifest/dependency\";\nimport { GitSource } from \"../professional/sources/git-source\";\nimport { PathSource } from \"./path-source\";\nimport { getSourceParts, Registration } from \"./registration\";\nimport { RegistrySource } from \"./registry-source\";\nimport { Source } from \"./source\";\n\nexport { RegistrySource, PathSource, GitSource };\n\nexport interface Sources {\n\tregistry: { [name: string]: Source };\n\tgit: Source;\n\tpath: Source;\n}\n\nexport async function resolve(sources: Sources, dependency: Dependency): Promise<Registration[]> {\n\tif (isRegistryDependency(dependency)) {\n\t\tconst { registry } = dependency;\n\t\tconst source = sources.registry[registry];\n\t\tif (!source) throw sourceMisconfiguredRegistry(registry);\n\n\t\treturn source.resolve(dependency);\n\t} else if (isPathDependency(dependency)) {\n\t\treturn sources.path.resolve(dependency);\n\t} else if (isGitDependency(dependency)) {\n\t\treturn sources.git.resolve(dependency);\n\t}\n\n\tthrow new CliError(\n\t\tErrorCode.DependencyUnknownSource,\n\t\t`No source matches dependency \"${(dependency as Dependency).name}\".`\n\t);\n}\n\nexport async function fetch(sources: Sources, registration: Registration): Promise<string> {\n\tconst { type, value } = getSourceParts(registration.source);\n\n\tif (type === \"registry\") {\n\t\tconst source = sources.registry[value];\n\t\tif (!source) throw sourceMisconfiguredRegistry(value);\n\n\t\treturn sources.registry[value].fetch(registration);\n\t} else if (type === \"path\") {\n\t\treturn sources.path.fetch(registration);\n\t} else if (type === \"git\") {\n\t\treturn sources.git.fetch(registration);\n\t}\n\n\tthrow new CliError(\n\t\tErrorCode.SourceNoneMatching,\n\t\tdedent`\n No source matches given registration type \"${type}\"\n (source = \"${registration.source}\").\n `\n\t);\n}\n\nfunction sourceMisconfiguredRegistry(registry: string) {\n\treturn new CliError(\n\t\tErrorCode.SourceMisconfiguredRegistry,\n\t\t`No matching registry configured for \"${registry}\".`\n\t);\n}\n","import { Config } from \"../config\";\nimport { Dependency, isRegistryDependency } from \"../manifest/dependency\";\nimport { resolve } from \"../sources\";\nimport { Registration } from \"../sources/registration\";\nimport { DependencyGraph } from \"./dependency-graph\";\n\nexport interface Resolution {\n\tname: string;\n\trange: string[];\n\tpreferred?: Registration;\n\tregistered: Registration[];\n}\nexport type ResolutionGraph = Map<string, Resolution>;\nexport type ResolutionGraphEntry = [string, Resolution];\n\nexport class Resolver implements Iterable<ResolutionGraphEntry> {\n\tconfig: Config;\n\tgraph: ResolutionGraph;\n\tloading: Map<string, Promise<Registration[]>>;\n\tpreferred: Map<string, Registration>;\n\n\tconstructor(config: Config) {\n\t\tthis.config = config;\n\t\tthis.graph = new Map();\n\t\tthis.loading = new Map();\n\t\tthis.preferred = new Map();\n\t}\n\n\tasync get(dependency: Dependency): Promise<Resolution> {\n\t\tconst { name } = dependency;\n\n\t\tif (this.loading.has(name)) await this.loading.get(name);\n\t\tlet resolution: Resolution | undefined = this.graph.get(name);\n\n\t\tif (!resolution) {\n\t\t\tconst loading = resolve(this.config.sources, dependency);\n\t\t\tthis.loading.set(name, loading);\n\n\t\t\tconst registered = await loading;\n\t\t\tresolution = {\n\t\t\t\tname,\n\t\t\t\trange: [],\n\t\t\t\tregistered\n\t\t\t};\n\n\t\t\tif (this.preferred.has(name)) {\n\t\t\t\tresolution.preferred = this.preferred.get(name);\n\t\t\t}\n\n\t\t\tthis.loading.delete(name);\n\t\t\tthis.graph.set(name, resolution);\n\t\t}\n\n\t\tif (isRegistryDependency(dependency)) {\n\t\t\tresolution.range.push(dependency.version);\n\t\t}\n\n\t\treturn resolution;\n\t}\n\n\tgetRegistration(id: string): Registration | undefined {\n\t\tconst [name, version] = id.split(\"@\", 2);\n\t\tif (!this.graph.has(name)) return;\n\t\tconst { registered } = this.graph.get(name)!;\n\t\treturn registered.find(registration => registration.version === version);\n\t}\n\n\tprefer(preferred: DependencyGraph) {\n\t\tfor (const registration of preferred) {\n\t\t\tthis.preferred.set(registration.name, registration);\n\t\t}\n\t}\n\n\t[Symbol.iterator]() {\n\t\treturn this.graph.entries();\n\t}\n}\n","import dedent from \"@timhall/dedent\";\nimport { Config } from \"../config\";\nimport { env } from \"../env\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport { Message } from \"../messages\";\nimport { Workspace } from \"../professional/workspace\";\nimport { DependencyGraph, getRegistration } from \"./dependency-graph\";\nimport { solveLatest } from \"./latest-solver\";\nimport { Resolver } from \"./resolver\";\n\nconst debug = env.debug(\"vba-blocks:resolve\");\n\nexport { getRegistration, Resolver };\n\nexport default async function resolve(\n\tconfig: Config,\n\tworkspace: Workspace,\n\tpreferred: DependencyGraph = []\n): Promise<DependencyGraph> {\n\tenv.reporter.log(Message.DependenciesResolving, `Resolving dependencies`);\n\n\t// Load, update, and seed resolver\n\tconst resolver = new Resolver(config);\n\tresolver.prefer(preferred);\n\n\t// Attempt latest solver, saving errors for recommendations on failure\n\ttry {\n\t\treturn await solveLatest(workspace, resolver);\n\t} catch (err) {\n\t\tdebug(`solveLatest failed with ${err}`);\n\t\t// TODO extract conflicts from latest solver error\n\t}\n\n\t// Fallback to SAT solver\n\ttry {\n\t\tconst { solveSat } = await import(\"./sat-solver\");\n\t\treturn await solveSat(workspace, resolver);\n\t} catch (err) {\n\t\tdebug(`solveSat failed with ${err}`);\n\t\t// No useful information from SAT solver failure, ignore\n\t}\n\n\t// TODO Include conflicts with error\n\tthrow new CliError(\n\t\tErrorCode.ResolveFailed,\n\t\tdedent`\n Unable to resolve dependency graph for project.\n\n There are dependencies that cannot be satisfied.\n `\n\t);\n}\n","import { satisfies } from \"semver\";\nimport { loadManifest, Manifest } from \"../manifest\";\nimport {\n\tDependency,\n\tisGitDependency,\n\tisPathDependency,\n\tisRegistryDependency\n} from \"../manifest/dependency\";\nimport { Workspace } from \"../professional/workspace\";\nimport { has } from \"../utils/has\";\nimport { Lockfile, LOCKFILE_VERSION, MinimalSnapshot } from \"./lockfile\";\n\n/**\n * ## Is lockfile valid?\n *\n * - [ ] Lockfile version has not changed\n * - [ ] Workspace root manifest has not changed\n * - [ ] Workspace members have not changed\n */\nexport default async function isLockfileValid(\n\tlockfile: Lockfile,\n\tworkspace: Workspace\n): Promise<boolean> {\n\tif (!lockfile.metadata || lockfile.metadata.version !== LOCKFILE_VERSION) return false;\n\n\tif (!(await hasManifestChanged(workspace.root, lockfile.workspace.root))) return false;\n\n\tif (lockfile.workspace.members.length !== workspace.members.length) return false;\n\n\tconst membersByName: { [name: string]: Manifest } = {};\n\tworkspace.members.forEach(member => (membersByName[member.name] = member));\n\n\tfor (const lockedMember of lockfile.workspace.members) {\n\t\tconst currentMember = membersByName[lockedMember.name];\n\t\tif (!currentMember) return false;\n\t\tif (!(await hasManifestChanged(currentMember, lockedMember))) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * ## Has manifest changed?\n *\n * - [ ] Has name changed?\n * - [ ] Have dependencies been added or removed?\n * - [ ] Are dependencies satisfied by lockfile versions?\n */\nasync function hasManifestChanged(current: Manifest, locked: MinimalSnapshot): Promise<boolean> {\n\tif (current.name !== locked.name) return false;\n\n\treturn await haveDependenciesChanged(current, locked);\n}\n\nasync function haveDependenciesChanged(\n\tcurrent: Manifest,\n\tlocked: MinimalSnapshot\n): Promise<boolean> {\n\tconst dependencies = current.dependencies.concat(current.devDependencies);\n\n\tif (dependencies.length !== locked.dependencies.length) return false;\n\n\tconst dependenciesByName: { [name: string]: Dependency } = {};\n\tdependencies.forEach(dependency => {\n\t\tdependenciesByName[dependency.name] = dependency;\n\t});\n\n\tfor (const lockedDependency of locked.dependencies) {\n\t\tconst currentDependency = dependenciesByName[lockedDependency.name];\n\t\tif (!currentDependency) return false;\n\t\tif (!(await isDependencySatisfied(currentDependency, lockedDependency))) return false;\n\t}\n\n\treturn true;\n}\n\nasync function isDependencySatisfied(current: Dependency, locked: Dependency): Promise<boolean> {\n\tif (isRegistryDependency(locked)) {\n\t\t// Note: lockfile value is more specific\n\t\t// -> compare locked to current manifest's value\n\t\treturn isRegistryDependency(current) && satisfies(locked.version, current.version);\n\t} else if (isPathDependency(locked)) {\n\t\tif (!isPathDependency(current)) return false;\n\t\tif (current.path !== locked.path) return false;\n\n\t\t// Load current version from manifest of path dependency\n\t\tconst manifest = await loadManifest(current.path);\n\t\treturn manifest.version === locked.version!;\n\t} else if (isGitDependency(locked)) {\n\t\tif (!isGitDependency(current)) return false;\n\n\t\tif (has(current, \"rev\") && has(locked, \"rev\")) return current.rev === locked.rev;\n\t\tif (has(current, \"tag\") && has(locked, \"tag\")) return current.tag === locked.tag;\n\t\tif (has(current, \"branch\") && has(locked, \"branch\")) return current.branch === locked.branch;\n\t}\n\n\treturn false;\n}\n","import { ok } from \"assert\";\nimport { env } from \"../env\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport { Manifest } from \"../manifest\";\nimport { Dependency } from \"../manifest/dependency\";\nimport { Project } from \"../project.js\";\nimport { getRegistration } from \"../resolve\";\nimport { DependencyGraph } from \"../resolve/dependency-graph\";\nimport {\n\tgetRegistrationId,\n\tgetRegistrationSource,\n\tgetSourceParts,\n\tRegistration,\n\ttoDependency\n} from \"../sources/registration\";\nimport { pathExists, readFile, writeFile } from \"../utils/fs\";\nimport { has } from \"../utils/has\";\nimport { join, relative, trailing } from \"../utils/path\";\nimport { parse as parseToml, toLockfile as convertToLockfileToml } from \"../utils/toml\";\nimport { Lockfile, LOCKFILE_VERSION, MinimalSnapshot } from \"./lockfile\";\n\nconst debug = env.debug(\"vba-blocks:lockfile\");\n\ntype DependencyByName = Map<string, Dependency>;\n\nexport { default as isLockfileValid } from \"./is-lockfile-valid\";\n\n/**\n * Read lockfile at given dir (if present)\n * (for invalid lockfile, errors are ignored and treated as no lockfile)\n */\nexport async function readLockfile(dir: string): Promise<Lockfile | null> {\n\tconst file = join(dir, \"vba-block.lock\");\n\tdebug(`Reading lockfile from ${file}`);\n\n\tif (!(await pathExists(file))) {\n\t\tdebug(`Not found`);\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst toml = await readFile(file, \"utf8\");\n\t\treturn await fromToml(toml, dir);\n\t} catch (err) {\n\t\tdebug(`Error reading/parsing`);\n\t\tdebug(err);\n\n\t\treturn null;\n\t}\n}\n\n/**\n * Write lockfile for project to given dir\n *\n * @throws LockfileWriteFailed\n */\nexport async function writeLockfile(dir: string, project: Project): Promise<void> {\n\tconst file = join(dir, \"vba-block.lock\");\n\tdebug(`Writing lockfile to ${file}`);\n\n\ttry {\n\t\tconst toml = toToml(project, dir);\n\t\tawait writeFile(file, toml);\n\t} catch (err) {\n\t\tdebug(\"Error converting/writing\");\n\t\tdebug(err);\n\n\t\tthrow new CliError(ErrorCode.LockfileWriteFailed, `Failed to write lockfile to \"${file}\".`);\n\t}\n}\n\n/**\n * Convert project to lockfile toml, alphabetized and with trailing commas\n * (should be suitable for VCS)\n */\nexport function toToml(project: Project, dir: string): string {\n\tconst root = toLockfileManifest(project.workspace.root, project.packages, dir);\n\tconst members: any[] = project.workspace.members.map(member =>\n\t\ttoLockfileManifest(member, project.packages, dir)\n\t);\n\n\tconst packages: any[] = project.packages.sort(byPackageName).map((registration: Registration) => {\n\t\tconst { name, version, source } = registration;\n\t\tconst dependencies = registration.dependencies.map(dependency =>\n\t\t\ttoDependencyId(dependency, project.packages, dir)\n\t\t);\n\n\t\treturn {\n\t\t\tname,\n\t\t\tversion,\n\t\t\tsource: toLockfileSource(source, dir),\n\t\t\tdependencies\n\t\t};\n\t});\n\n\tconst metadata = { version: LOCKFILE_VERSION };\n\tconst toml = convertToLockfileToml({ metadata, root, members, packages });\n\n\treturn `${toml}`;\n}\n\n/**\n * Load lockfile from toml (including \"hydrating\" dependencies from packages)\n */\nexport async function fromToml(toml: string, dir: string): Promise<Lockfile> {\n\tconst parsed = await parseToml(toml);\n\tok(has(parsed, \"root\"), \"vba-block.lock is missing [root] field\");\n\n\tconst metadata = parsed.metadata;\n\n\t// First pass through packages to load high-level information\n\t// (needed to map dependencies to parsed packages)\n\tconst byName: DependencyByName = new Map();\n\tconst packages = (parsed.packages || []).map((value: any) => {\n\t\tconst { name, version, source, dependencies } = value;\n\t\tok(name && version && source && Array.isArray(dependencies), \"Invalid package in lockfile\");\n\n\t\tconst registration = {\n\t\t\tid: getRegistrationId(name, version),\n\t\t\tname,\n\t\t\tversion,\n\t\t\tsource: toSource(source, dir),\n\t\t\tdependencies\n\t\t};\n\n\t\tbyName.set(name, toDependency(registration));\n\n\t\treturn registration;\n\t});\n\n\t// Hydrate dependencies of packages\n\tpackages.forEach((registration: any) => {\n\t\tregistration.dependencies = registration.dependencies.map((id: string) =>\n\t\t\tgetDependency(id, byName)\n\t\t);\n\t});\n\n\t// Load manifests for workspace\n\tconst root = toMinimalSnapshot(parsed.root, byName);\n\tconst members: MinimalSnapshot[] = (parsed.members || []).map((member: any) =>\n\t\ttoMinimalSnapshot(member, byName)\n\t);\n\n\treturn { metadata, workspace: { root, members }, packages };\n}\n\n/**\n * Convert raw toml value to manifest\n */\nfunction toMinimalSnapshot(value: any, dependencyByName: DependencyByName): MinimalSnapshot {\n\tconst { name } = value;\n\tok(name && Array.isArray(value.dependencies), \"Invalid manifest in lockfile\");\n\n\t// \"Hydrate\" dependencies from ids\n\tconst dependencies = value.dependencies.map((id: string) => getDependency(id, dependencyByName));\n\n\treturn {\n\t\tname,\n\t\tdependencies\n\t};\n}\n\ninterface LockfileManifest {\n\tname: string;\n\tdependencies: string[];\n}\n\n/**\n * Get toml from manifest\n */\nfunction toLockfileManifest(\n\tmanifest: Manifest,\n\tpackages: DependencyGraph,\n\tdir: string\n): LockfileManifest {\n\tconst { name, version } = manifest;\n\n\t// Convert dependencies and dev-dependencies to ids\n\tconst all_dependencies = manifest.dependencies.concat(manifest.devDependencies);\n\tconst dependencies = all_dependencies.map(dependency =>\n\t\ttoDependencyId(dependency, packages, dir)\n\t);\n\n\treturn {\n\t\tname,\n\t\tdependencies\n\t};\n}\n\n/**\n * Get toml from source string\n * (Convert full path to relative to root dir)\n */\nfunction toLockfileSource(source: string, dir: string): string {\n\tconst { type, value, details } = getSourceParts(source);\n\tif (type !== \"path\") return source;\n\n\tconst relativePath = trailing(relative(dir, value));\n\treturn getRegistrationSource(type, relativePath, details);\n}\n\n/**\n * \"Hydrate\" registration source from raw toml\n * (Convert relative paths to absolute)\n */\nfunction toSource(source: string, dir: string): string {\n\tconst { type, value, details } = getSourceParts(source);\n\tif (type !== \"path\") return source;\n\n\tconst absolutePath = join(dir, value);\n\treturn getRegistrationSource(type, absolutePath, details);\n}\n\n/**\n * Convert dependency to unique id\n *\n * Minimum information needed for lockfile:\n * \"{name} {version} {source}\"\n */\nfunction toDependencyId(dependency: Dependency, packages: DependencyGraph, dir: string) {\n\tconst registration = getRegistration(packages, dependency);\n\tok(registration, `No package found for dependency \"${dependency.name}\"`);\n\n\tlet { version, source } = registration!;\n\tconst { type, value, details } = getSourceParts(source);\n\n\tif (type === \"path\") {\n\t\tconst relativePath = trailing(relative(dir, value));\n\t\tsource = getRegistrationSource(type, relativePath, details);\n\t}\n\n\treturn `${dependency.name} ${version} ${source}`;\n}\n\nfunction getDependency(id: string, dependencyByName: DependencyByName): Dependency {\n\tconst [name] = id.split(\" \", 1);\n\tconst dependency = dependencyByName.get(name);\n\n\tok(dependency, `Package not found in lockfile, \"${id}\"`);\n\n\treturn dependency!;\n}\n\nfunction byPackageName(a: Registration, b: Registration) {\n\tif (a.name < b.name) return -1;\n\tif (a.name > b.name) return 1;\n\treturn 0;\n}\n","import { Dependency } from \"../manifest/dependency\";\nimport { Registration } from \"../sources/registration\";\n\nexport type DependencyGraph = Registration[];\n\nexport function getRegistration(\n\tgraph: DependencyGraph,\n\tdependency: Dependency\n): Registration | undefined {\n\treturn graph.find(value => value.name === dependency.name);\n}\n","import { env } from \"./env\";\nimport { GitSource, PathSource, RegistrySource, Sources } from \"./sources\";\nimport { pathExists, readFile } from \"./utils/fs\";\nimport { join } from \"./utils/path\";\nimport { parse as parseToml } from \"./utils/toml\";\n\nexport type Registry = {} | { [name: string]: { index: string; packages: string } };\n\nexport interface Flags {}\n\nexport interface Config {\n\tregistry: Registry;\n\tflags: Flags;\n\tsources: Sources;\n}\n\nexport interface ConfigValue {\n\tregistry?: Registry;\n\tflags?: Flags;\n}\n\nconst empty: ConfigValue = { registry: {}, flags: {} };\nconst defaults: ConfigValue = {\n\tregistry: {\n\t\t\"vba-blocks\": {\n\t\t\tindex: \"https://github.com/vba-blocks/registry\",\n\t\t\tpackages: \"https://packages.vba-blocks.com\"\n\t\t}\n\t},\n\tflags: {}\n};\n\n/**\n * Load config, from local, user, and environment values\n *\n * - env:config/config.toml (user)\n * - Search for .vba-blocks/config.toml up from cwd (local)\n * - Load VBA_BLOCKS_* from environment (override)\n */\nexport async function loadConfig(): Promise<Config> {\n\tconst user: ConfigValue = {\n\t\t...empty,\n\t\t...((await readConfig(env.config)) || {})\n\t};\n\n\tconst dir = await findConfig(env.cwd);\n\tconst local: ConfigValue = {\n\t\t...empty,\n\t\t...(dir ? await readConfig(dir) : {})\n\t};\n\n\tconst override = loadConfigFromEnv();\n\n\tconst registry: Registry = {\n\t\t...defaults.registry,\n\t\t...user.registry,\n\t\t...local.registry,\n\t\t...override.registry\n\t};\n\tconst flags: Flags = {\n\t\t...defaults.flags,\n\t\t...user.flags,\n\t\t...local.flags,\n\t\t...override.flags\n\t};\n\n\tconst sources: Sources = {\n\t\tregistry: {},\n\t\tgit: new GitSource(),\n\t\tpath: new PathSource()\n\t};\n\n\tfor (const [name, { index, packages }] of Object.entries(registry)) {\n\t\tsources.registry[name] = new RegistrySource({\n\t\t\tname,\n\t\t\tindex,\n\t\t\tpackages\n\t\t});\n\t}\n\n\treturn { registry, flags, sources };\n}\n\n// Read config from dir (if present)\nexport async function readConfig(dir: string): Promise<ConfigValue | undefined> {\n\tconst file = join(dir, \"config.toml\");\n\tif (!(await pathExists(file))) return {};\n\n\tconst raw = await readFile(file);\n\tconst parsed = await parseToml(raw.toString());\n\n\treturn parsed;\n}\n\n// Find config up from and including given dir\n// (looking for .vba-blocks/config.toml)\nexport async function findConfig(dir: string): Promise<string | undefined> {\n\t// TODO Search for .vba-blocks/config.toml starting at cwd\n\treturn;\n}\n\n// Load config values from environment\nexport function loadConfigFromEnv(): ConfigValue {\n\t// TODO Load override config from VBA_BLOCKS_* env variables\n\treturn {};\n}\n","import { Manifest } from \"../manifest\";\n\nexport interface Workspace {\n\tpaths: {\n\t\troot: string;\n\t\tmembers: string[];\n\t};\n\troot: Manifest;\n\tmembers: Manifest[];\n}\n\nexport async function loadWorkspace(manifest: Manifest, dir: string): Promise<Workspace> {\n\treturn {\n\t\tpaths: {\n\t\t\troot: dir,\n\t\t\tmembers: []\n\t\t},\n\t\troot: manifest,\n\t\tmembers: []\n\t};\n}\n","import { Config, loadConfig } from \"./config\";\nimport { env } from \"./env\";\nimport { isLockfileValid, readLockfile } from \"./lockfile\";\nimport { loadManifest, Manifest } from \"./manifest\";\nimport { loadWorkspace, Workspace } from \"./professional/workspace\";\nimport resolve from \"./resolve\";\nimport { DependencyGraph } from \"./resolve/dependency-graph\";\nimport { fetch } from \"./sources\";\nimport { tmpFolder } from \"./utils/fs\";\nimport { parallel } from \"./utils/parallel\";\nimport { join, normalize } from \"./utils/path\";\n\nconst debug = env.debug(\"vba-blocks:project\");\n\nexport interface Project {\n\tmanifest: Manifest;\n\tworkspace: Workspace;\n\tpackages: DependencyGraph;\n\n\tconfig: Config;\n\tpaths: {\n\t\troot: string;\n\t\tdir: string;\n\t\tbuild: string;\n\t\tbackup: string;\n\t\tstaging: string;\n\t};\n\thasDirtyLockfile: boolean;\n}\n\n/**\n * Load project from given directory / cwd\n *\n * 1. Load manifest in dir\n * 2. Load workspace from manifest\n * 3. Load lockfile\n * 4. Resolve dependencies\n */\nexport async function loadProject(dir: string = env.cwd): Promise<Project> {\n\tconst manifest = await loadManifest(dir);\n\n\tconst config = await loadConfig();\n\tconst workspace = await loadWorkspace(manifest, dir);\n\tconst lockfile = await readLockfile(workspace.paths.root);\n\n\t// Resolve packages from lockfile or from sources\n\tconst hasDirtyLockfile = !lockfile || !(await isLockfileValid(lockfile, workspace));\n\tdebug(!hasDirtyLockfile ? \"Loading packages from lockfile\" : \"Resolving packages\");\n\n\tconst packages = !hasDirtyLockfile\n\t\t? lockfile!.packages\n\t\t: await resolve(config, workspace, lockfile ? lockfile.packages : []);\n\n\tconst paths = {\n\t\troot: workspace.paths.root,\n\t\tdir,\n\t\tbuild: join(dir, \"build\"),\n\t\tbackup: join(dir, \"build\", \".backup\"),\n\t\tstaging: await tmpFolder({ dir: env.staging })\n\t};\n\n\treturn {\n\t\tmanifest,\n\t\tworkspace,\n\t\tpackages,\n\t\tconfig,\n\t\tpaths,\n\t\thasDirtyLockfile: hasDirtyLockfile\n\t};\n}\n\nexport interface FetchProject {\n\tmanifest: Manifest;\n\tpackages: DependencyGraph;\n\tconfig: Config;\n}\n\n/**\n * Fetch all dependencies for project\n * (based on already resolved project.packages)\n *\n * After sources complete fetches, manifests are loaded and returned for each package\n */\nexport async function fetchDependencies(project: FetchProject): Promise<Manifest[]> {\n\tconst manifests = await parallel(\n\t\tproject.packages,\n\t\tasync registration => {\n\t\t\tconst path = await fetch(project.config.sources, registration);\n\t\t\tconst manifest = await loadManifest(path);\n\n\t\t\treturn manifest;\n\t\t},\n\t\t{ progress: env.reporter.progress(\"Fetching dependencies\") }\n\t);\n\n\treturn manifests;\n}\n\nexport interface ProjectOptions {\n\ttype?: \"project\" | \"package\";\n}\n\n/**\n * Initialize new project\n *\n * Minimum requirements: name and dir\n */\nexport async function initProject(\n\tname: string,\n\tdir: string,\n\toptions: ProjectOptions = {}\n): Promise<Project> {\n\tdir = normalize(dir);\n\tconst { type = \"project\" } = options;\n\n\tconst config = await loadConfig();\n\n\t// TODO load defaults from config\n\tconst version = \"0.0.0\";\n\tconst authors: string[] = [];\n\tconst license = \"UNLICENSED\";\n\n\t// Manually generate manifest and project\n\t// (may be included in project in the future)\n\tconst manifest: Manifest = {\n\t\ttype,\n\t\tname,\n\t\tversion,\n\t\tmetadata: {\n\t\t\tauthors,\n\t\t\tlicense\n\t\t},\n\t\tsrc: [],\n\t\tdependencies: [],\n\t\treferences: [],\n\t\tdevSrc: [],\n\t\tdevDependencies: [],\n\t\tdevReferences: []\n\t};\n\n\tconst workspace = await loadWorkspace(manifest, dir);\n\n\tconst project: Project = {\n\t\tmanifest,\n\t\tworkspace,\n\t\tpackages: [],\n\t\tconfig,\n\t\tpaths: {\n\t\t\troot: workspace.paths.root,\n\t\t\tdir,\n\t\t\tbuild: join(dir, \"build\"),\n\t\t\tbackup: join(dir, \"build\", \".backup\"),\n\t\t\tstaging: await tmpFolder({ dir: env.staging })\n\t\t},\n\t\thasDirtyLockfile: true\n\t};\n\n\treturn project;\n}\n","import { Dependency } from \"../manifest/dependency\";\nimport { DependencyGraph } from \"../resolve/dependency-graph\";\n\nexport interface MinimalSnapshot {\n\tname: string;\n\tdependencies: Dependency[];\n}\n\nexport const LOCKFILE_VERSION = \"1\";\n\n/**\n * ## Lockfile\n *\n * Save resolved dependency graph and workspace information\n * for precisely rebuilding dependency graph if the workspace hasn't changed\n *\n * Version the lockfile separately from vba-blocks to allow the lockfile format to change over time,\n * while staying isolated from the more-frequent changes to the vba-blocks version.\n */\nexport interface Lockfile {\n\tmetadata?: { version: string };\n\tworkspace: {\n\t\troot: MinimalSnapshot;\n\t\tmembers: MinimalSnapshot[];\n\t};\n\tpackages: DependencyGraph;\n}\n"],"names":["unique","values","Array","from","Set","async","solveLatest","workspace","resolver","dependencies","root","concat","devDependencies","resolveDependencies","graph","errors","name","resolution","matching","getMatching","push","length","Error","resolved","Promise","all","map","dependency","get","registered","latest","range","join","slice","reverse","find","registration","satisfies","version","EXAMPLE","parseDependencies","value","dir","Object","entries","isString","registry","path","git","tag","branch","rev","manifestOk","trailing","ensureGitUrl","parseDependency","isRegistryDependency","has","isPathDependency","isGitDependency","formatDependencies","forEach","relative","extname","message","dedent","GitSource","resolve","_dependency","CliError","ErrorCode","SourceUnsupported","fetch","_registration","parse","parseToml","then","require","toLockfile","level","isNumber","isBoolean","isDate","toISOString","isObject","converted","key","item","isArray","subitem","empty","VERSION_REGEX","GUID_REGEX","toInt","parseInt","parseReferences","guid","test","isVersion","isGuid","major","minor","split","getMajorMinor","parseReference","formatReferences","references","reference","parseSrc","relativePath","binary","source","parseSource","formatSrc","src","TARGET_TYPES","parseTarget","pkgName","type","includes","isSupportedTargetType","filename","sanitize","DEFAULT_VERSION","parseManifest","authors","publish","target","package","project","metadata","devSrc","devReferences","loadManifest","file","pathExists","ManifestNotFound","raw","readFile","parsed","toString","err","line","column","ManifestInvalid","normalize","getRegistrationId","getRegistrationSource","details","getSourceParts","info","toDependency","parseQuerystring","SourceUnrecognizedType","PathSource","DependencyPathNotFound","manifest","id","debug","env","loadGit","global","default","http","unzip","dest","options","decompress","exports","getDefault","n","index","RegistrySource","constructor","packages","this","local","remote","sources","upToDate","pull","sanitizePackageName","getPath","DependencyNotFound","registrations","filter","JSON","yanked","vers","cksum","checksum","deps","dep","req","parseRegistration","url","getRemotePackage","getLocalPackage","_","algorithm","hash","unverifiedFile","tmpFile","ensureDir","dirname","response","createWriteStream","reject","body","pipe","on","download","error","String","SourceDownloadFailed","comparison","getChecksum","DependencyInvalidChecksum","move","move_1","getSource","pulling","hasLocalDirectory","isGitRepository","reporter","log","Message","RegistrySourceLocalOnly","cwd","clone","fs","depth","basename","RegistryCloneFailed","RegistrySourceSkipPull","pullIndex","undefined","replace","sourceMisconfiguredRegistry","DependencyUnknownSource","SourceNoneMatching","SourceMisconfiguredRegistry","Resolver","config","Map","loading","preferred","set","delete","getRegistration","prefer","Symbol","iterator","DependenciesResolving","solveSat","ResolveFailed","hasManifestChanged","current","locked","dependenciesByName","lockedDependency","currentDependency","isDependencySatisfied","haveDependenciesChanged","semver","readLockfile","toml","ok","byName","toSource","getDependency","toMinimalSnapshot","members","member","fromToml","dependencyByName","toLockfileManifest","toDependencyId","toLockfileSource","byPackageName","a","b","flags","defaults","loadConfig","user","readConfig","findConfig","override","loadWorkspace","paths","manifests","parallel","progress","init","license","build","backup","staging","tmpFolder","hasDirtyLockfile","lockfile","membersByName","lockedMember","currentMember","isLockfileValid","sort","convertToLockfileToml","toToml","writeFile","LockfileWriteFailed","assign","defaultName","targetType","formatTarget","formatManifest","existing","updated","patch","patchTOML","patchToml","stringify","convertToToml","create","createArchive","output","archive","directory","finalize"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var r=require("./workbook-xml-69fff4ae.js"),e=require("./text-ba532b40.js"),o=require("./project-d43b4e0c.js");require("assert"),require("fs");var i=require("./get-target-23b8cc04.js"),t=require("path");exports.runMacro=async function(a){let{target:s,file:n,macro:c,args:u=[""]}=a;if(!n){const r=await o.loadProject(),{target:t}=i.getTarget(r,s);n=e.join(r.paths.dir,"build",t.filename)}if(!n)throw new e.CliError(e.ErrorCode.RunMissingFile,"file is required for vba-blocks run (e.g. vba-blocks run --file FILE <macro> <arg>...).");if(!c)throw new e.CliError(e.ErrorCode.RunMissingMacro,"macro is required for vba-blocks run (e.g. vba-blocks run --file FILE <macro> <arg>...).");const l=r.extensionToApplication(t.extname(n)),f=await e.run(l,e.resolve(n),c,u),{stdout:g}=f;return g&&g.trim().length&&console.log(g),f};
2
+ //# sourceMappingURL=run-macro-f4aa7c14.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-macro-f4aa7c14.js","sources":["../src/actions/run-macro.ts"],"sourcesContent":["import { extensionToApplication } from \"../addin\";\nimport { CliError, ErrorCode } from \"../errors\";\nimport { loadProject } from \"../project\";\nimport { getTarget } from \"../targets\";\nimport { extname, join, resolve } from \"../utils/path\";\nimport { run, RunResult } from \"../utils/run\";\n\nexport interface RunOptions {\n\ttarget?: string;\n\tfile?: string;\n\tmacro: string;\n\targs: string[];\n}\n\nexport async function runMacro(options: RunOptions): Promise<RunResult> {\n\tlet { target: targetType, file, macro, args = [\"\"] } = options;\n\n\tif (!file) {\n\t\tconst project = await loadProject();\n\t\tconst { target } = getTarget(project, targetType);\n\n\t\tfile = join(project.paths.dir, \"build\", target.filename);\n\t}\n\n\tif (!file) {\n\t\tthrow new CliError(\n\t\t\tErrorCode.RunMissingFile,\n\t\t\t`file is required for vba-blocks run (e.g. vba-blocks run --file FILE <macro> <arg>...).`\n\t\t);\n\t}\n\tif (!macro) {\n\t\tthrow new CliError(\n\t\t\tErrorCode.RunMissingMacro,\n\t\t\t`macro is required for vba-blocks run (e.g. vba-blocks run --file FILE <macro> <arg>...).`\n\t\t);\n\t}\n\n\tconst application = extensionToApplication(extname(file));\n\tconst result = await run(application, resolve(file), macro, args);\n\tconst { stdout } = result;\n\n\tif (stdout && stdout.trim().length) console.log(stdout);\n\n\treturn result;\n}\n"],"names":["async","options","target","targetType","file","macro","args","project","loadProject","getTarget","join","paths","dir","filename","CliError","ErrorCode","RunMissingFile","RunMissingMacro","application","extensionToApplication","extname","result","run","resolve","stdout","trim","length","console","log"],"mappings":"yOAcOA,eAAwBC,GAC9B,IAAMC,OAAQC,EAAUC,KAAEA,EAAIC,MAAEA,EAAKC,KAAEA,EAAO,CAAC,KAAQL,EAEvD,IAAKG,EAAM,CACV,MAAMG,QAAgBC,EAAAA,eAChBN,OAAEA,GAAWO,EAASA,UAACF,EAASJ,GAEtCC,EAAOM,EAAAA,KAAKH,EAAQI,MAAMC,IAAK,QAASV,EAAOW,SAC/C,CAED,IAAKT,EACJ,MAAM,IAAIU,EAAQA,SACjBC,EAASA,UAACC,eACV,2FAGF,IAAKX,EACJ,MAAM,IAAIS,EAAQA,SACjBC,EAASA,UAACE,gBACV,4FAIF,MAAMC,EAAcC,EAAsBA,uBAACC,UAAQhB,IAC7CiB,QAAeC,EAAAA,IAAIJ,EAAaK,EAAOA,QAACnB,GAAOC,EAAOC,IACtDkB,OAAEA,GAAWH,EAInB,OAFIG,GAAUA,EAAOC,OAAOC,QAAQC,QAAQC,IAAIJ,GAEzCH,CACR"}