Repository: esy/pesy Branch: master Commit: 0f29cb3885f4 Files: 182 Total size: 1.1 MB Directory structure: gitextract_x9up97r8/ ├── .ci/ │ ├── build-platform.yml │ ├── checksum.js │ ├── cross-release.yml │ ├── esy-build-steps.yml │ ├── opam-build-steps.yml │ ├── pipelines-release.js │ ├── release-platform-setup.yml │ ├── release-postinstall.js │ └── utils/ │ ├── create-docs.yml │ ├── publish-build-cache.yml │ ├── restore-build-cache.yml │ ├── use-cache-esy.yml │ ├── use-cache-npm.yml │ ├── use-cache-yarn.yml │ ├── use-esy.yml │ └── use-node.yml ├── .gitignore ├── .npmignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── ORIGIN.md ├── PesyE2E.opam ├── README.html ├── azure-pipelines.yml ├── bin/ │ ├── Pesy.re │ └── dune ├── dune ├── dune-project ├── e2e-tests/ │ ├── .TestPesyConfigure.re.swp │ ├── .gitignore │ ├── Rimraf.re │ ├── Runner.re │ ├── Utils.re │ ├── dune │ └── pending-tests.re ├── errors/ │ ├── Errors.re │ └── dune ├── lib/ │ ├── Common.re │ ├── Common.rei │ ├── DuneFile.re │ ├── DuneFile.rei │ ├── DuneProject.re │ ├── DuneProject.rei │ ├── EsyCommand.re │ ├── Executable.re │ ├── Executable.rei │ ├── ImportsParser.re │ ├── Lexer.mll │ ├── Lib.re │ ├── Library.re │ ├── Library.rei │ ├── Mode.re │ ├── Parser.mly │ ├── PesyConf.re │ ├── PesyModule.re │ ├── Stanza.re │ ├── Stanza.rei │ ├── Stubs.re │ ├── Stubs.rei │ ├── Test.re │ ├── Test.rei │ └── dune ├── notes/ │ ├── benchmarking.md │ ├── checksum-verification.md │ ├── compiler-support.org │ ├── e2e.org │ └── release.org ├── npm-cli/ │ ├── .gitignore │ ├── .npmignore │ ├── .vscode/ │ │ └── tasks.json │ ├── README.md │ ├── __tests__/ │ │ └── utils_test.re │ ├── bsconfig.json │ ├── esy.json │ ├── package.json │ ├── pesy │ ├── pesy.bundle.js.minisig │ ├── pesy.js │ ├── rollup.config.js │ ├── scripts/ │ │ └── vendor-template.js │ ├── src/ │ │ ├── AzurePipelines.re │ │ ├── Bindings.re │ │ ├── Bootstrapper.re │ │ ├── Bootstrapper.rei │ │ ├── Cmd.re │ │ ├── DefaultTemplate.re │ │ ├── Dir.re │ │ ├── Dir.rei │ │ ├── Esy.re │ │ ├── Esy.rei │ │ ├── EsyLock.re │ │ ├── EsyLock.rei │ │ ├── EsyStatus.re │ │ ├── EsyStatus.rei │ │ ├── Path.re │ │ ├── Path.rei │ │ ├── Pesy.re │ │ ├── Pesy.rei │ │ ├── PesyConfig.re │ │ ├── PesyConfig.rei │ │ ├── Project.re │ │ ├── Project.rei │ │ ├── Readline.re │ │ ├── Result.re │ │ ├── ResultPromise.re │ │ ├── ResultPromise.rei │ │ ├── Spinner.re │ │ ├── Spinner.rei │ │ ├── Template.re │ │ ├── Template.rei │ │ ├── Utils.re │ │ └── Warmup.re │ ├── stubs/ │ │ ├── crypto.js │ │ ├── fs.js │ │ └── resolve.js │ ├── templates/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── ci/ │ │ │ ├── .ci/ │ │ │ │ ├── build-docker.yml │ │ │ │ ├── build-platform.yml │ │ │ │ ├── cross-release.yml │ │ │ │ ├── esy-build-steps.yml │ │ │ │ ├── opam-build-steps.yml │ │ │ │ ├── pipelines-release.js │ │ │ │ ├── release-platform-setup.yml │ │ │ │ ├── release-postinstall.js │ │ │ │ └── utils/ │ │ │ │ ├── create-docs.yml │ │ │ │ ├── publish-build-cache.yml │ │ │ │ ├── publish-sources.yml │ │ │ │ ├── restore-build-cache.yml │ │ │ │ ├── use-cache-esy.yml │ │ │ │ ├── use-cache-yarn.yml │ │ │ │ ├── use-esy.yml │ │ │ │ └── use-node.yml │ │ │ └── azure-pipelines-template.yml │ │ └── docker/ │ │ └── docker/ │ │ ├── DevImage.Dockerfile │ │ └── ProdImage.Dockerfile │ └── v0.4.4/ │ ├── LICENSE │ ├── ORIGIN.md │ ├── README.md │ ├── azure-ci-template/ │ │ ├── azure-pipelines.yml │ │ ├── esy-build-steps.template.yml │ │ ├── publish-build-cache.yml │ │ └── restore-build-cache.yml │ ├── esy-peasy │ ├── notes/ │ │ └── benchmarking.md │ ├── pesy │ ├── pesy-JSON.sh │ ├── pesy-README.template.md │ ├── pesy-create.sh │ ├── pesy-footer.template.sh │ ├── pesy-genBin.template.sh │ ├── pesy-genLib.template.sh │ ├── pesy-gitignore.template │ ├── pesy-header.sh │ ├── pesy-name-utils.sh │ └── pesy-package.template.json ├── package.json ├── pesy--esy-pesy.opam ├── scripts/ │ ├── bootstrap.sh │ ├── run.bat │ ├── run.sh │ ├── simulate-latest.js │ └── verdaccio.yaml ├── site/ │ ├── ORIGINS.md │ ├── Reload.js │ ├── fonts/ │ │ ├── CodingFont.css │ │ ├── LICENSE-Fira │ │ ├── LICENSE-Roboto │ │ └── WordFont.css │ ├── index.dev.html │ ├── package.json │ └── theme-white/ │ ├── theme.js │ └── theme.styl.html ├── unit-tests/ │ └── runner/ │ ├── Lib.re │ ├── RunUnitTests.re │ ├── Utils.re │ └── dune └── utils/ ├── FieldTypes.re ├── JSON.re ├── JSON.rei ├── Utils.re └── dune ================================================ FILE CONTENTS ================================================ ================================================ FILE: .ci/build-platform.yml ================================================ parameters: platform: "macOS" vmImage: "macOS-latest" jobs: - job: ${{ parameters.platform }} pool: vmImage: ${{ parameters.vmImage }} demands: node.js timeoutInMinutes: 120 # This is mostly for Windows steps: - powershell: $Env:Path continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print env in powershell" # Needed so that the mingw tar doesn't shadow the system tar. See # pipelines.yaml. We need windows bsdtar from system32, not the mingw # one. Note powershell doesn't need escaping of backslashes. - powershell: Write-Host "##vso[task.setvariable variable=PATH;]C:\Program Files\Git\bin;C:\Windows\system32;${env:PATH}" continueOnError: true condition: eq(variables['AGENT.OS'], 'Windows_NT') displayName: "Make sure C:/Program Files/Git/bin and windows/system32 is at front of path if windows" - powershell: $Env:Path continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print env in powershell" - powershell: get-command tar continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print where tar is located" - powershell: tar --help continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print tar help" - powershell: Write-Host "##vso[task.setvariable variable=HOME;]D:\" continueOnError: true condition: eq(variables['AGENT.OS'], 'Windows_NT') displayName: "Make sure $HOME is same is Agent.BuildDirectory" - bash: | # COMPUTE THE ESY INSTALL CACHE LOCATION AHEAD OF TIME DESIRED_LEN="86" # Note: This will need to change when upgrading esy version # that reenables long paths on windows. # if [ "$AGENT_OS" == "Windows_NT" ]; then # DESIRED_LEN="33" # fi HOME_ESY3="$HOME/.esy/3" HOME_ESY3_LEN=${#HOME_ESY3} NUM_UNDERS=$(echo "$(($DESIRED_LEN-$HOME_ESY3_LEN))") UNDERS=$(printf "%-${NUM_UNDERS}s" "_") UNDERS="${UNDERS// /_}" THE_ESY__CACHE_INSTALL_PATH=${HOME_ESY3}${UNDERS}/i if [ "$AGENT_OS" == "Windows_NT" ]; then THE_ESY__CACHE_INSTALL_PATH=$( cygpath --mixed --absolute "$THE_ESY__CACHE_INSTALL_PATH") fi echo "THE_ESY__CACHE_INSTALL_PATH: $THE_ESY__CACHE_INSTALL_PATH" # This will be exposed as an env var ESY__CACHE_INSTALL_PATH, or an # Azure var esy__cache_install_path echo "##vso[task.setvariable variable=esy__cache_install_path]$THE_ESY__CACHE_INSTALL_PATH" # - bash: | # which esy # echo "$( which esy )" # echo "##vso[task.setvariable variable=esy_bin_location]$(which esy)" # displayName: "Find esy binary" # - bash: echo ${ESY_BIN_LOCATION} # displayName: "Print esy bin location" - bash: env displayName: "Print environment" - template: esy-build-steps.yml # - task: PublishBuildArtifacts@1 # displayName: "Publish Artifact: ${{ parameters.platform }}" # inputs: # PathtoPublish: "_release" # ArtifactName: ${{ parameters.platform }} ================================================ FILE: .ci/checksum.js ================================================ let crypto = require("crypto"), path = require("path"), fs = require("fs"); let algorithm = "sha1", shasum = crypto.createHash(algorithm); let cwd = process.cwd(); let pkg = require(path.join(cwd, "package.json")), s = fs.ReadStream( path.join( cwd, "_release", `${pkg.name.replace("@", "").replace("/", "-")}-${pkg.version}.tgz` ) ); s.on("data", function(data) { shasum.update(data); }); s.on("end", function() { var hash = shasum.digest("hex"); console.log(`SHA1: ${hash}`); }); ================================================ FILE: .ci/cross-release.yml ================================================ steps: - script: echo "No release steps. They are disabled" displayName: "[Disabled] Release steps" # - template: utils/use-node.yml # - script: "mkdir _release" # displayName: "Create _release dir" # - template: release-platform-setup.yml # parameters: # platform: "Linux" # folder: "platform-linux" # - template: release-platform-setup.yml # parameters: # platform: "macOS" # folder: "platform-darwin" # - template: release-platform-setup.yml # parameters: # platform: "Windows" # folder: "platform-windows-x64" # - script: "node .ci/pipelines-release.js" # displayName: "node .ci/pipelines-release.js" # continueOnError: true # - script: "npm pack ." # displayName: "npm pack" # workingDirectory: "_release" # - bash: "node .ci/checksum.js _release/pesy-0.1.0-dev.21.tgz" # displayName: "Calculating sha1" # - task: PublishBuildArtifacts@1 # displayName: "Publish Artifact: Release" # inputs: # PathtoPublish: "_release" # ArtifactName: Release ================================================ FILE: .ci/esy-build-steps.yml ================================================ # Cross-platform set of build steps for building esy projects steps: - template: utils/use-node.yml - template: utils/use-cache-yarn.yml - template: utils/use-esy.yml - template: utils/use-cache-esy.yml - script: "esy install" displayName: "esy install" - template: utils/restore-build-cache.yml # Run this to make sure cached prebuilts work. - script: "esy b dune build --only-packages pesy--esy-pesy,PesyE2E" displayName: "esy build" - bash: "ls -lR _build" displayName: "Contents of _build" - template: utils/create-docs.yml - script: mkdir $(System.DefaultWorkingDirectory)\..\tests-tmp-dir displayName: 'Creating temporary workspace for tests' condition: eq(variables['Agent.OS'], 'Windows_NT') - script: .\_build\default\e2e-tests\Runner.exe displayName: 'Running e2e tests' condition: eq(variables['Agent.OS'], 'Windows_NT') env: OCAMLRUNPARAM: 'b' PESY_CLONE_PATH: $(Build.SourcesDirectory) TEMP: $(System.DefaultWorkingDirectory)\..\tests-tmp-dir - script: ./_build/default/e2e-tests/Runner.exe displayName: 'Running e2e tests' condition: ne(variables['Agent.OS'], 'Windows_NT') env: PESY_CLONE_PATH: $(Build.SourcesDirectory) OCAMLRUNPARAM: 'b' - task: PublishBuildArtifacts@1 displayName: 'Upload sources' condition: eq(variables['Agent.OS'], 'Linux') inputs: pathToPublish: './npm-cli/pesy-0.5.0-dev.23.tgz' artifactName: 'pesy-npm-cli-source' parallel: true parallelCount: 8 # - script: "esy release" # displayName: "esy release" - script: "esy test" displayName: "Test command" - bash: rm -rf ~/.esy/3/b displayName: 'Emptying ~/.esy/3/b to clear up space' - template: utils/publish-build-cache.yml # Run tests or any additional steps here # - script: esy b dune runtest ================================================ FILE: .ci/opam-build-steps.yml ================================================ # Shared steps for building OPAM projects steps: - task: NodeTool@0 inputs: versionSpec: '8.9' - script: brew install gpatch displayName: 'brew install gpatch' - script: brew install opam displayName: 'brew install opam' - script: opam --version displayName: 'Check opam version' - script: opam init --auto-setup --dot-profile=~/.bash_profile displayName: 'opam init' - script: opam remote add ocamlorg https://opam.ocaml.org || true displayName: 'opam remote add ocamlorg' - script: opam remove default || true displayName: 'opam remove default' - script: opam update displayName: 'opam update' - script: opam switch create $(OCAML_VERSION) displayName: 'Use OCaml version: $(OCAML_VERSION)' - script: opam install -y dune displayName: 'opam install -y dune' - script: opam install -y menhir displayName: 'opam install -y menhir' - script: opam install -y utop displayName: 'opam install -y utop' - script: make clean-for-ci displayName: 'make clean-for-ci' - script: opam pin add -y reason . displayName: "opam pin add -y reason ." - script: opam pin add -y rtop . displayName: "opam pin add -y rtop ." - script: eval $(opam env); make test-ci displayName: "make test-ci" - script: git diff --exit-code displayName: "Check git is clean" ================================================ FILE: .ci/pipelines-release.js ================================================ const fs = require("fs"); const path = require("path"); console.log("Creating package.json"); // From the project root pwd const mainPackageJsonPath = fs.existsSync('esy.json') ? 'esy.json' : 'package.json'; const exists = fs.existsSync(mainPackageJsonPath); if (!exists) { console.error("No package.json or esy.json at " + mainPackageJsonPath); process.exit(1); } // Now require from this script's location. const mainPackageJson = require(path.join('..', mainPackageJsonPath)); const bins = Array.isArray(mainPackageJson.esy.release.bin) ? mainPackageJson.esy.release.bin.reduce( (acc, curr) => Object.assign({ [curr]: "bin/" + curr }, acc), {} ) : Object.keys(mainPackageJson.esy.release.bin).reduce( (acc, currKey) => Object.assign({ [currKey]: "bin/" + mainPackageJson.esy.release.bin[currKey] }, acc), {} ); const rewritePrefix = mainPackageJson.esy && mainPackageJson.esy.release && mainPackageJson.esy.release.rewritePrefix; const packageJson = JSON.stringify( { name: mainPackageJson.name, version: mainPackageJson.version, license: mainPackageJson.license, description: mainPackageJson.description, repository: mainPackageJson.repository, scripts: { postinstall: rewritePrefix ? "ESY_RELEASE_REWRITE_PREFIX=true node ./postinstall.js" : "node ./postinstall.js" }, bin: bins, files: [ "_export/", "bin/", "postinstall.js", "esyInstallRelease.js", "platform-linux/", "platform-darwin/", "platform-windows-x64/" ] }, null, 2 ); fs.writeFileSync( path.join(__dirname, "..", "_release", "package.json"), packageJson, { encoding: "utf8" } ); try { console.log("Copying LICENSE"); fs.copyFileSync( path.join(__dirname, "..", "LICENSE"), path.join(__dirname, "..", "_release", "LICENSE") ); } catch (e) { console.warn("No LICENSE found"); } console.log("Copying README.md"); fs.copyFileSync( path.join(__dirname, "..", "README.md"), path.join(__dirname, "..", "_release", "README.md") ); console.log("Copying postinstall.js"); fs.copyFileSync( path.join(__dirname, "release-postinstall.js"), path.join(__dirname, "..", "_release", "postinstall.js") ); console.log("Creating placeholder files"); const placeholderFile = `:; echo "You need to have postinstall enabled"; exit $? @ECHO OFF ECHO You need to have postinstall enabled`; fs.mkdirSync(path.join(__dirname, "..", "_release", "bin")); Object.keys(bins).forEach( name => { if(bins[name]) { const binPath = path.join( __dirname, "..", "_release", bins[name] ); fs.writeFileSync(binPath, placeholderFile); fs.chmodSync(binPath, 0777); } else { console.log("bins[name] name=" + name + " was empty. Weird."); console.log(bins); } } ); ================================================ FILE: .ci/release-platform-setup.yml ================================================ parameters: platform: "macOS" folder: "platform-darwin" steps: - task: DownloadBuildArtifacts@0 displayName: "Download ${{ parameters.platform }} Artifacts" inputs: artifactName: ${{ parameters.platform }} downloadPath: $(Build.StagingDirectory) - script: "mkdir _release/${{ parameters.folder }}" displayName: "Create _release/${{ parameters.folder }}" - script: "cp -r $(Build.StagingDirectory)/${{ parameters.platform }}/ _release/${{ parameters.folder }}" displayName: "cp ${{ parameters.platform }}" ================================================ FILE: .ci/release-postinstall.js ================================================ /** * release-postinstall.js * * XXX: We want to keep this script installable at least with node 4.x. * * This script is bundled with the `npm` package and executed on release. * Since we have a 'fat' NPM package (with all platform binaries bundled), * this postinstall script extracts them and puts the current platform's * bits in the right place. */ var path = require("path"); var cp = require("child_process"); var fs = require("fs"); var os = require("os"); var platform = process.platform; var packageJson = require("./package.json"); var binariesToCopy = Object.keys(packageJson.bin) .map(function(name) { return packageJson.bin[name]; }) .concat(["esyInstallRelease.js"]); var foldersToCopy = ["bin", "_export"]; function copyRecursive(srcDir, dstDir) { var results = []; var list = fs.readdirSync(srcDir); var src, dst; list.forEach(function(file) { src = path.join(srcDir, file); dst = path.join(dstDir, file); var stat = fs.statSync(src); if (stat && stat.isDirectory()) { try { fs.mkdirSync(dst); } catch (e) { console.log("directory already exists: " + dst); console.error(e); } results = results.concat(copyRecursive(src, dst)); } else { try { fs.writeFileSync(dst, fs.readFileSync(src)); } catch (e) { console.log("could't copy file: " + dst); console.error(e); } results.push(src); } }); return results; } /** * Since os.arch returns node binary's target arch, not * the system arch. * Credits: https://github.com/feross/arch/blob/af080ff61346315559451715c5393d8e86a6d33c/index.js#L10-L58 */ function arch() { /** * The running binary is 64-bit, so the OS is clearly 64-bit. */ if (process.arch === "x64") { return "x64"; } /** * All recent versions of Mac OS are 64-bit. */ if (process.platform === "darwin") { return "x64"; } /** * On Windows, the most reliable way to detect a 64-bit OS from within a 32-bit * app is based on the presence of a WOW64 file: %SystemRoot%\SysNative. * See: https://twitter.com/feross/status/776949077208510464 */ if (process.platform === "win32") { var useEnv = false; try { useEnv = !!( process.env.SYSTEMROOT && fs.statSync(process.env.SYSTEMROOT) ); } catch (err) {} var sysRoot = useEnv ? process.env.SYSTEMROOT : "C:\\Windows"; // If %SystemRoot%\SysNative exists, we are in a WOW64 FS Redirected application. var isWOW64 = false; try { isWOW64 = !!fs.statSync(path.join(sysRoot, "sysnative")); } catch (err) {} return isWOW64 ? "x64" : "x86"; } /** * On Linux, use the `getconf` command to get the architecture. */ if (process.platform === "linux") { var output = cp.execSync("getconf LONG_BIT", { encoding: "utf8" }); return output === "64\n" ? "x64" : "x86"; } /** * If none of the above, assume the architecture is 32-bit. */ return "x86"; } // implementing it b/c we don't want to depend on fs.copyFileSync which appears // only in node@8.x function copyFileSync(sourcePath, destPath) { var data; try { data = fs.readFileSync(sourcePath); } catch (e) { console.log("Couldn't find " + sourcePath + " trying with .exe"); data = fs.readFileSync(sourcePath + ".exe"); sourcePath = sourcePath + ".exe"; } var stat = fs.statSync(sourcePath); fs.writeFileSync(destPath, data); fs.chmodSync(destPath, stat.mode); } var copyPlatformBinaries = platformPath => { var platformBuildPath = path.join(__dirname, "platform-" + platformPath); foldersToCopy.forEach(folderPath => { var sourcePath = path.join(platformBuildPath, folderPath); var destPath = path.join(__dirname, folderPath); copyRecursive(sourcePath, destPath); }); binariesToCopy.forEach(binaryPath => { var sourcePath = path.join(platformBuildPath, binaryPath); var destPath = path.join(__dirname, binaryPath); if (fs.existsSync(destPath)) { fs.unlinkSync(destPath); } copyFileSync(sourcePath, destPath); fs.chmodSync(destPath, 0777); }); }; try { fs.mkdirSync("_export"); } catch (e) { console.log("Could not create _export folder"); } switch (platform) { case "win32": if (arch() !== "x64") { console.warn("error: x86 is currently not supported on Windows"); process.exit(1); } copyPlatformBinaries("windows-x64"); break; case "linux": case "darwin": copyPlatformBinaries(platform); break; default: console.warn("error: no release built for the " + platform + " platform"); process.exit(1); } require("./esyInstallRelease"); ================================================ FILE: .ci/utils/create-docs.yml ================================================ # These steps are only run on Linux steps: - script: "esy doc" displayName: "Build docs" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) - script: echo '##vso[task.setvariable variable=docsPath]'$(esy echo '_build/default/_doc/_html') displayName: "Save docsPath in variable" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: Docs" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) inputs: PathtoPublish: $(docsPath) ArtifactName: Docs ================================================ FILE: .ci/utils/publish-build-cache.yml ================================================ # Steps for publishing project cache steps: - bash: 'mkdir -p $(Build.StagingDirectory)' condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) displayName: '[Cache][Publish] Create cache directory' # continueOnError because on windows it has a permission denied error but the # export succeeds. - script: "esy export-dependencies" continueOnError: true condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) displayName: "esy export-dependencies" - bash: pwd && ls _export/* && mv _export '$(Build.StagingDirectory)' && ls '$(Build.StagingDirectory)/_export/' condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) displayName: '[Cache][Publish] move export to staging dir' # - bash: cd $ESY__CACHE_INSTALL_PATH && tar -czf $(Build.StagingDirectory)/esy-cache.tar . # workingDirectory: '' # condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) # displayName: '[Cache][Publish] Tar esy cache directory' # - bash: 'cd $(ESY__NPM_ROOT) && tar -czf $(Build.StagingDirectory)/npm-cache.tar .' # condition: and(succeeded(), eq(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])) # displayName: '[Cache][Publish] Tar npm cache directory' - task: PublishBuildArtifacts@1 displayName: '[Cache][Publish] Upload tarball' condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) # TODO: The CI Build caches are pulled down by the last successful buildID # for the target branch. inputs: pathToPublish: '$(Build.StagingDirectory)' artifactName: 'cache-$(Agent.OS)-install-$(esy__ci_cache_version)' parallel: true parallelCount: 8 ================================================ FILE: .ci/utils/restore-build-cache.yml ================================================ # Steps for restoring project cache steps: - bash: 'mkdir -p $(Build.StagingDirectory)' condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Publish] Create cache directory' # TODO: This can be done in parallel with installing node, and esy # (which would save a bunch of time on windows) - task: Bash@3 condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Restore] Restoring build cache using REST API' continueOnError: true inputs: targetType: 'inline' # Optional. Options: filePath, inline script: | # If org name is reasonml then REST_BASE will be: https://dev.azure.com/reasonml/ REST_BASE="${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}" PROJ="$SYSTEM_TEAMPROJECT" ART_NAME="cache-${AGENT_OS}-install-${ESY__CI_CACHE_VERSION}" fetchLatestBuild() { PREFIX="branchName=refs%2Fheads%2F" BRANCH=${PREFIX}${SYSTEM_PULLREQUEST_TARGETBRANCH} FILTER='deletedFilter=excludeDeleted&statusFilter=completed&resultFilter=succeeded' LATEST='queryOrder=finishTimeDescending&$top=1' REST_BUILDS="$REST_BASE/$PROJ/_apis/build/builds?${FILTER}&${BRANCH}&${LATEST}&api-version=4.1" echo "Rest call for builds: $REST_BUILDS" REST_BUILDS_RESP=$(curl "$REST_BUILDS") if [[ $REST_BUILDS_RESP =~ (\"web\":\{\"href\":\")([^\"]*) ]]; then LATEST_BUILD_PAGE="${BASH_REMATCH[2]}"; else LATEST_BUILD_PAGE=""; fi if [[ $REST_BUILDS_RESP =~ (\"badge\":\{\"href\":\")([^\"]*) ]]; then LATEST_BUILD_BADGE="${BASH_REMATCH[2]}"; else LATEST_BUILD_BADGE=""; fi if [[ $REST_BUILDS_RESP =~ (\"id\":)([^,]*) ]]; then LATEST_BUILD_ID="${BASH_REMATCH[2]}"; else LATEST_BUILD_ID=""; fi } fetchLatestBuild fetchArtifactURL() { REST_ART="$REST_BASE/$PROJ/_apis/build/builds/$LATEST_BUILD_ID/artifacts?artifactName=$ART_NAME&api-version=4.1" echo "Rest call for artifacts: $REST_ART" if [[ $(curl $REST_ART) =~ (downloadUrl\":\")([^\"]*) ]]; then LATEST_ART_URL="${BASH_REMATCH[2]}"; else LATEST_ART_URL=""; fi } downloadArtifactAndContinue() { if [ -z "$LATEST_ART_URL" ] then echo "No latest artifact for merge-target branch found at URL $REST_ART" else curl "$LATEST_ART_URL" > "${BUILD_STAGINGDIRECTORY}/$ART_NAME.zip" PROJECT_DIR=$PWD cd $BUILD_STAGINGDIRECTORY unzip "$ART_NAME.zip" echo "Using Dependency cache for buildID: $LATEST_BUILD_ID" echo "Build log for build that produced the cache: $LATEST_BUILD_PAGE" echo "Build badge for build that produced the cache: $LATEST_BUILD_BADGE" echo "Build artifact from build that produced the cache: $LATEST_ART_URL" echo "Restoring build cache into:" mkdir -p $ESY__CACHE_INSTALL_PATH echo $ESY__CACHE_INSTALL_PATH echo "##vso[task.setvariable variable=esy_export_dir_to_import]${BUILD_STAGINGDIRECTORY}/${ART_NAME}/_export" if [[ -d ${ART_NAME}/_export ]]; then mv ${ART_NAME}/_export ${PROJECT_DIR}/_import cd $PROJECT_DIR echo "Cached builds to import" ls ./_import # import-build allows importing before esy install runs. # unlike import-dependencies echo "Going to import builds from ${PROJECT_DIR}/_import in the next build step" if [ "$AGENT_OS" == "Windows_NT" ]; then echo "Trying the cmd" # Have to import the builds one by one in windows because # there is some file locking issue in esy on windows only when # importing many in parallel. cd ./_import FILES=* for f in $FILES do echo "Trying to import $f" esy.cmd import-build "$f" done cd $PROJECT_DIR else esy import-dependencies "_import" fi else echo "No _export directory to import from build cache" echo "Here's the contents of build cache:" find ${BUILD_STAGINGDIRECTORY} fi fi } fetchArtifactURL downloadArtifactAndContinue - bash: 'rm -rf _import' continueOnError: true condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: 'Remove import directory' - bash: 'rm -rf *' continueOnError: true workingDirectory: '$(Build.StagingDirectory)' condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Restore] Clean up staging dir' ================================================ FILE: .ci/utils/use-cache-esy.yml ================================================ steps: - task: Cache@2 condition: and(eq(variables['Build.Reason'], 'PullRequest'), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])) inputs: key: 'v1 | esy-install-cache | "$(Agent.OS)" | "$(Build.SourcesDirectory)/esy.lock/index.json"' # vPrimary, here, is just a way to bust cache during debugging. Inspired from https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#can-i-clear-a-cache" path: $(ESY__CACHE_INSTALL_PATH) cacheHitVar: ESY_INSTALL_CACHE_RESTORED displayName: "Caching $(ESY__CACHE_INSTALL_PATH)" - task: Cache@2 condition: and(eq(variables['Build.Reason'], 'PullRequest'), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])) inputs: key: 'v1 | esy-sources | "$(Agent.OS)" | "$(Build.SourcesDirectory)/esy.lock/index.json"' # vPrimary, here, is just a way to bust cache during debugging. Inspired from https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#can-i-clear-a-cache" path: "$(ESY__CACHE_INSTALL_PATH)/../../source" cacheHitVar: ESY_SOURCE_CACHE_RESTORED displayName: "Caching $(ESY__CACHE_INSTALL_PATH)/../../source" ================================================ FILE: .ci/utils/use-cache-npm.yml ================================================ steps: - task: Cache@2 inputs: key: 'npm | "$(Agent.OS)" | "$(Build.SourcesDirectory)/npm-cli/package-lock.json"' restoreKeys: | npm | "$(Agent.OS)" npm path: $(HOME)/.npm displayName: Cache npm condition: ne(variables['AGENT.OS'], 'Windows_NT') - task: Cache@2 inputs: key: 'npm | "$(Agent.OS)" | "$(Build.SourcesDirectory)/npm-cli/package-lock.json"' restoreKeys: | npm | "$(Agent.OS)" npm path: $(AppData)/npm-cache displayName: Cache npm condition: eq(variables['AGENT.OS'], 'Windows_NT') ================================================ FILE: .ci/utils/use-cache-yarn.yml ================================================ steps: - bash: | YARN_CACHE_DIR=$(yarn cache dir) echo "##vso[task.setvariable variable=YARN_CACHE_DIR]$YARN_CACHE_DIR" - task: Cache@2 inputs: key: 'yarn | "$(Agent.OS)" | "$(Build.SourcesDirectory)/npm-cli/yarn.lock"' restoreKeys: | yarn | "$(Agent.OS)" yarn path: $(YARN_CACHE_DIR) displayName: Cache yarn ================================================ FILE: .ci/utils/use-esy.yml ================================================ # steps to install @esy-nightly/esy globally steps: - script: "sudo npm install --prefix /usr/local --unsafe-perm -g @esy-nightly/esy" displayName: "install @esy-nightly/esy" condition: ne(variables['Agent.OS'], 'Windows_NT') - script: "npm install -g @esy-nightly/esy" displayName: "install @esy-nightly/esy" condition: eq(variables['Agent.OS'], 'Windows_NT') ================================================ FILE: .ci/utils/use-node.yml ================================================ # steps to use node on agent steps: - task: NodeTool@0 displayName: "Use Node 10.x" inputs: versionSpec: 10.x ================================================ FILE: .gitignore ================================================ .DS_Store npm-debug.log .merlin yarn-error.log node_modules/ _build _esy _release pesy.install .DS_Store *.install *~ scripts/storage vendor coverage/ *.bs.js site/index.html site/index.rendered.html ================================================ FILE: .npmignore ================================================ .DS_Store npm-debug.log .merlin yarn-error.log node_modules/ _build _esy _release pesy.install .DS_Store *.install *~ scripts/storage vendor coverage/ *.bs.js npm-cli/ esy.lock/ site/ images/ azure-pipelines.yml .ci/ scripts/ ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at prometheansacrifice@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: ORIGIN.md ================================================ - Includes vendored copy of [JSON.sh](https://github.com/dominictarr/JSON.sh) (under MIT LICENSE) which has been renamed to `pesy-JSON.sh` to avoid name collisions. ================================================ FILE: PesyE2E.opam ================================================ ================================================ FILE: README.html ================================================ [ vim: set filetype=Markdown: ]: # () # pesy `pesy` is a command line tool to assist with your native Reason/OCaml workflow using the package.json itself. 1. Quickly bootstrap a new Reason project 2. Configure your builds ## Installation `npm install -g pesy@next` ## Why pesy? `esy` is driven by a package.json to bring the familiar NPM workflow to the native world of Reason/OCaml. `pesy` takes this further by adopting NPM conventions to configure the build.`esy`'s package.json first approach in creating developer sandboxes brings interesting possibilities to the table. `pesy` leverages on those features to make native development both convenient and familiar. `pesy` provides 1. A bootstrapper script to quickly create a project template 2. An alternative JSON syntax around Dune that is NPM like 3. Built in tasks that take full advantages of esy's capabilities ## Getting started ### Creating a new project `pesy` can quickly bootstrap a basic native Reason/OCaml project. ```sh cd my-new-project/ pesy ``` ### Adding project dependencies Say, we need `@opam/yojson` and `@reason-native/console` in `App.re`. Place `App.re` in a folder (say, `bin/`?) and add the following to you package.json. ```json "buildDirs": { "bin": { "imports": [ "Json = require('@opam/yojson')", "Console = require('@reason-native/console/lib')" ] } } ``` Run `esy pesy` (once). Run `esy` after that to create builds. `pesy` abstracts library identifiers (in this case `yojson` and `console.lib`) in file paths conceptually. Use native dependencies from OCaml like you did with NPM! ### Where pesy shines However, `pesy`'s is truly useful for frameworks that need a lot dependencies and configuration. Ex: Morph and Revery ```sh pesy --template pesy/template-revery --directory my-new-project ``` If you are authoring a framework, create a template like [`pesy/template-revery`](https://github.com/pesy/template-revery) and run the project on the CI with a setup that `pesy` creates for you. You users get cached CI artifacts that will let can hydrate their local `esy` cache avoid long wait times! See [Templates](#pesy-templates-experimental-creating-your-own-template) to see how to create such templates. ### Looking for a tutorial? Checkout [A simple native Reason project with pesy](#pesy-simple-native-example) to get an idea of what developing with `pesy` feels like. ## Relation to Dune Pesy as accepts package.json as input and producing dune files as output. ``` +--------+ package.json ---> | pesy | +---> dune files +--------+ ``` Note that not all of Dune's features are supported in pesy (PRs welcome). `pesy` doesn't intend to duplicate Dune's efforts - it's meant to compliment it. For simple use cases, `pesy` wants to provide a NPM friendly interface to Dune so that newcomers can quickly get started, without confusing themselves with the library vs packages nuances. ## Namespacing Every library, as we know, exposes a namespace/module under which it's APIs are available. However, as package authors, it can hard to make sure one is not using a namespace already taken by another package (Otherwise it could lead to collisions). Pesy works around this by assigning the library the upper camelcase of the root package name and directory the library/sub-package resides in. Example: if a package.json looks like this ```json { "name": "@myscope/foo", "buildDirs": { "library": { ... } } } ``` Then, subpackage `library` takes a namespace of `MyScopeFooLibrary`. As a user, however, you shouldn't have to worry much about yourself, since you can specify how you'd like to import subpackages (and packages). In the above example, another subpackage would consume it as follows ```json { "name": "@myscope/foo", "buildDirs": { "library": { ... }, "anotherLibrary": { "imports": [ "ThatOtherLibrary = require('@myscope/foo/library')" ] } } } ``` And if you were consuming this package (after having published to npm), you can import it as follows: ```json { "name": "bar", "buildDirs": { "library": { "imports": [ "ThatFooLibrary = require('@myscope/foo/library')" ] } } ``` With the new NPM like conventions, pesy automatically handles the namespace for you so that we don't have to worry about the nuances of a package and a library during development. ## Dune files `pesy` generates dune files on fly behind the scenes. And to be able to so, it needs a static dune file that looks like the following ```sexp (* -*- tuareg -*- *) open Jbuild_plugin.V1 let () = run_and_read_lines ("pesy dune-file " ^ Sys.getcwd ()) |> String.concat "\n" |> send ``` These have to created only once - after that they never change (unless you decide to eject). Every bootstrapped project has them already and you dont have to create them. In case, you need to re-generate them, run `esy pesy` (or `esy @mysandbox pesy` if you are using `esy` sandboxes). A common need for running `esy pesy` is when you add a new folder to your project. #### Ejecting: It is always possible to eject out of pesy config by running `esy pesy eject ./subpackage-path` ## CI & local cache Warming up Compilation artifacts built on the CI can be downloaded by `pesy warmup`. At the moment, we only support Azure Pipelines can be configured as follows. ```json { "pesy": { "azure-project": "/", "github": "/" } } ``` This will fetch appropriate artifacts compiled for the current machine. Note however, the best way to get this feature to work is to use cache publish and restore mechanism provided bootstrapped files. `pesy` assumes that the artifact zip file names and/or paths haven't changed. #### How it works Compilation artifacts created by `esy` are relocatable - since `esy` sandboxes isolated, all the dependencies are accounted for and each dependency is loaded from a path with a fixed-length prefix. Such artifacts can be built on one machine and used on other provided the prefixes are rewritten to reflect the updated path on the new machine. And `esy` provides all the low level command to do this out of the box. `pesy` simply provides a convenient wrapper that drives them. When the project is bootstrapped for the first time, it is identical to a copy that is run on the server. This is where the first set of cached builds come from, which is why the `azure-project` in the pesy config is set to `esy-dev/esy` and `github` to `esy/pesy-reason-template`. Once the project sees changes, you most probably would add more dependencies (or remove some) which could change the build sandbox state. It is recommended that you run the provided CI setup to cache builds on your own Azure Pipelines instance and update `github` and `azure-project` accordingly. ## Publishing and Consuming from NPM #### Publishing libraries Easiest way to get started with distributing you library is to publish the source to NPM. Let's take a look at an example. Consider a base package `foo` that you created and distributed on NPM. And let's assume, `bar` is the package that consumes `foo`. ```sh $ pesy --directory foo-lib ``` This would have bootstrapped a project with the default template with `Util.re` in the `library/` folder. Let's publish it ```sh $ npm publish ``` #### Consuming `foo-lib` Let quickly create a new project, `bar` and add `foo`. ```sh $ pesy --directory bar $ esy add foo-lib ``` We can now require `foo` ```diff "buildDirs": { "library": { "imports": [ + "FooLib = require('foo-lib/library')" ] } } ``` And then edit Utils.re ```reason let foo = () => { FooLib.Util.foo(); print_endline("This is from bar"); }; ``` ```sh $ esy $ esy start Hello from foo! This is from bar ``` ## Templates [experimental] #### Usage To use a custom template run `pesy --template=github:your-name/your-pesy-template` #### Creating your own template *This is a experimental feature that could see a lot of churn. We request you to watch the issue tracker for updates.* It works by downloading a git repo and then replacing special strings in filenames and files inside the repo. The special strings are currently these: ###### In file names: | In filename | Replaced with | | -------------------------------- | ---------------------------- | | `__PACKAGE_NAME__` | `package_name` | | `__PACKAGE_NAME_FULL__` | `package_name` | | `__PACKAGE_NAME_UPPER_CAMEL__` | `PackageName` | ###### In file content: | In contents | Replaced with | | ---------------------------- | ---------------------------- | | `` | `package_name` | | `` | `package_name` | | `` | `PackageName` | | `` | `version` | | `` | `package_name/library` | | `` | `package_name/test` | Best way to get started creating a new template is to download https://github.com/esy/pesy-reason-template and work on it. Any changes can be tested with `pesy test-template`. ## Supported Dune Config This is reference guide explaining the config `pesy` supports. ### Binaries Configuration that applies to subpackages that create binary executables. Note that these executables can be ocaml bytecode or native binaries (ELF/Mach/PE) #### bin : `string` A subpackage produces binary when it contains a `bin` property. ```json { "buildDirs": { "src": { "bin": "Main.re" } } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/simple-bin/package.json) #### modes : `array(string)` An array of [advanced linking modes](https://dune.readthedocs.io/en/latest/dune-files.html?highlight=modules_without_implementation#linking-modes). Each string should be of the form "`compilation-mode` `binary-kind`" where `compilation-mode` is one byte, native or best and `binary-kind` is one of c, exe, object, shared_object. ```json { "buildDirs": { "src": { "bin": "Foo.re", "modes": [ "native", "exe"] } } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/bin-modes/package.json) #### name (override) : `string` A string that maps to Dune's `public_name`. Usually unnecessary (as `bin` property takes care of it) and must only be used to override. #### main (override) : `string` A string that maps to Dune's `name`. Usually unnecessary (as `bin` property takes care of it) and must only be used to override the entry point. ### Libraries #### modes : `array(string)` `modes` can be used to configure the compilation target - [native](https://caml.inria.fr/pub/docs/manual-ocaml/native.html) or [bytecode](https://caml.inria.fr/pub/docs/manual-ocaml/comp.html) An array of string, any of `byte`, `native`, `best` ##### `"byte"` This mode generates byte code output ##### `"native"` This mode generates native output ##### `"best"` Sometimes it may not be obvious if native compilation is supported on a machine. In such circumstances, use `"best"` and `"native"` will be picked for you if it's available. Else, it'll be `"byte"` #### cNames : `array(string)` When writing C stubs to FFI into a library, simply mention the file name (without the `.c` extension) in the `cNames` field. ```json { "buildDirs": { "src": { "cNames": ["my-stub1", "my-stub-2"] } } } ``` #### foreignStubs : `list(ForeignStub)` From dune version 2.0 onwards the cNames field was removed and foreignStubs field was introduced to provide the FFI functionality, foreignStubs is a list of objects, where each foreignStub object should specify `language`, `names` & `flags`. Incase `names` & `flags` is not specified or empty, their default value will be considered [Refer this for default values for names & flags](https://dune.readthedocs.io/en/stable/concepts.html#foreign-stubs) ```json { "buildDirs": { "src": { "foreignStubs": [ { "language": "c", "names": ["my-stub1", "my-stub-2"], "flags": ["-verbose"] } ] } } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/cNames/package.json) ### Config supported by both libraries and binaries #### imports : `array(string)` `imports` can be used to import a library (from a subpackage or an external npm/opam package) and utilise the namespace of the imported library. ```json { "buildDirs": { "src": { "imports": [ "Console = require('console')" ] } } } ``` The above config makes a namespace `Console` available inside the subpackage `src`. Now any `.re` file inside `src` can use the `console` library. ```reason // src/SomeFile.re let foo = () => Console.log("Hello, world") ``` We can also import a package/subpackage under a different namespace ```json { "buildDirs": { "src": { "imports": [ "NotConsole = require('console')" ] } } } ``` And we can import (oddly confusing) `NotConsole` from in `src` ```reason // src/SomeFile.re let foo = () => NotConsole.log("Hello, world"); ``` We can also import other subpackages in the project. ```json { "buildDirs": { "src": { "bin": "Main.re", "imports": [ "FooConsole = require('console/lib')", "MyOwnLibrary = require('../my-own-lib')" ] }, "my-own-lib": {} } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/imports/package.json) #### Compiler flags ###### All of type *list(string)* - `flags` - These flags will be passed to both the bytecode compiler and native compiler - `ocamlcFlags` - These will be passed to `ocamlc` - the bytecode compiler - `ocamloptFlags` - These will be passed to `ocamlopt` - the native compiler - `jsooFlags` - These will be passed to `jsoo` compiler - the [javascript compiler](http://ocsigen.org/js_of_ocaml/3.5.1/manual/overview). *Note: This is unrelated to [Bucklescript](https://bucklescript.github.io/)* #### Preprocessor flags : `list(string)` `preprocess` accepts options needed to pass the source files via a preprocessor first. When using custom syntax not natively supported in the compiler, we pass the sources in a subpackage via a preprocessor first. For example, suppose we'd like to use `let%lwt` syntax for our `Lwt` promises ```reason let%lwt foo = Lwt.return("foo"); print_endline(foo); // instead of Lwt.return >>= (foo => print_endline(foo); Lwt.return()) ``` We specify `lwt_ppx` in `pps preprocess` ```json { "buildDirs": { "src": { "bin": "Main.re", "preprocess": ["pps", "lwt_ppx"] } } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/preprocess/package.json) #### includeSubdirs : `string = "no"|"unqualified"` Default is "no", and changing to "unqualified" will compile modules at deeper directories. #### Escape hatches for unsupported Dune config It's always possible that there are features Dune offers are needed and the options above are not enough. Use `rawBuildConfig` to add options in a given library or binary. Use `rawBuildConfigFooter` to add config to the footer. ##### rawBuildConfig : `list(string)` Example ```json { "src": { "rawBuildConfig": [ "(libraries unix)" ], "bin": "Main.re" } } ``` ##### rawBuildConfigFooter : `list(string)` Example ```json { "src": { "rawBuildConfigFooter": [ "(install (section share_root) (files (plaintext.txt as asset.txt)))" ] } } ``` Here is a [complete, working example](https://github.com/prometheansacrifice/pesy-samples/blob/master/raw/package.json) ## Tutorials #### Simple native example #### CLI Apps #### Web Development with Morph ## Development Clone the repo and run `esy` on it. #### e2e tests `./_build/install/default/bin` would contain (after running `esy`) `Runner.exe`. `Runner.exe` looks for `PESY_CLONE_PATH` variable in the environment to find `pesy` source. Set it to the path where the project was cloned. To test if simple workflows work as expected. They assume both `esy` and `pesy` are installed globally (as on user's machines). ## Changelog **version 0.4.0 (12/21/2018)** - Allow `buildDirs` to contain deeper directories such as `"path/to/my-lib": {...}"`. - Added support for `wrapped` property on libraries. - Added support for `virtualModules` and `implements` - properties for Dune virtual libraries. (This will only be supported if you mark your project as Dune 1.7 - not yet released). - Stopped using `ignore_subdirs` in new projects, instead using `(dirs (:standard \ _esy))` which only works in Dune `1.6.0+`, so made new projects have a lower bound of Dune `1.6.0`. - Support new properties `rawBuildConfig` which will be inserted at the bottom of the _target_ being configured (library/executable). - It expects an array of strings, each string being a separate line in the generated config. - Support new properties `rawBuildConfigFooter` which will be inserted at the bottom of the entire Dune file for the _target_ being configured. - It expects an array of strings, each string being a separate line in the generated config. - Support new properties `modes` for binaries and libraries `list(string)`. ================================================ FILE: azure-pipelines.yml ================================================ name: Build npm release variables: esy__ci_cache_version: v1 trigger: branches: include: - master - releases/* paths: exclude: - README.html - notes/* - "*.md" - LICENSE jobs: - template: .ci/build-platform.yml parameters: platform: Linux vmImage: ubuntu-latest - template: .ci/build-platform.yml parameters: platform: macOS vmImage: macOS-latest # Need windows-2019 to do esy import/export-dependencies # which assumes you have bsdtar (tar.exe) in your system # otherwise it will end up using the esy-bash tar which doesn't # understand drives like D:/ (thinks it's an scp path). - template: .ci/build-platform.yml parameters: platform: Windows vmImage: windows-2019 # This job is kept here as we want to have the platform names in the same file - job: Release displayName: Release dependsOn: - Linux - macOS - Windows pool: vmImage: macOS-latest demands: node.js steps: - template: .ci/cross-release.yml ================================================ FILE: bin/Pesy.re ================================================ module Lib = PesyEsyPesyLib.Lib; module Utils = PesyEsyPesyUtils.Utils; open Lib; open Utils; open Printf; open Cmdliner; open PesyEsyPesyErrors.Errors; exception BootstrappingError(unit); exception LsLibsError(string); module EnvVars = { let rootPackageConfigPath = Sys.getenv_opt("ESY__ROOT_PACKAGE_CONFIG_PATH"); }; let getManifestFile = projectRoot => { switch (EnvVars.rootPackageConfigPath) { | Some(x) => x | None => Path.(projectRoot / "package.json") }; }; let reconcile = projectRoot => { /* use readFileOpt to read previously computed directory path */ let operations = projectRoot |> getManifestFile |> Lib.gen(projectRoot); switch (operations) { | [] => () | _ as operations => Lib.log(operations) }; print_endline( Pastel.( "Ready for " "esy" ), ); }; let main = () => { Findlib.init(); ignore( switch (Sys.getenv_opt("cur__root")) { | Some(curRoot) => /** * This means the user ran pesy in an esy environment. * as esy pesy * TODO: when run as esy b pesy, it must exit early with an error */ reconcile(curRoot) | None => /** * This mean pesy is being run naked on the shell. * TODO: use readFileOpt to read previously computed directory path */ print_endline("Prebuilt Pesy must not be run globally.") }, ); }; let main = () => try(main()) { | BootstrappingError () => let message = Pastel.( "You have " "not installed" " esy\n" "pesy works together with esy to simplify your workflow. Please install esy.\n" "You could try\n\n" " npm install -g esy\n" ); fprintf(stderr, "%s\n", message); exit(-1); | InvalidBinProperty(pkgName) => let mStr = sprintf("Invalid value in subpackage %s's bin property\n", pkgName); let message = Pastel.( mStr "'bin' property is usually of the form { \"target.exe\": \"sourceFilename.re\" } " ); fprintf(stderr, "%s\n", message); exit(-1); | ShouldNotBeNull(e) => let message = Pastel.( "Found null value for " e "\nExpected a non null value." ); fprintf(stderr, "%s\n", message); exit(-1); | FatalError(e) => let message = Pastel.( "Fatal Error " e ); fprintf(stderr, "%s\n", message); exit(-1); | InvalidRootName(e) => let message = Pastel.( "Invalid root name!\n" "Expected package name of the form " "@myscope/foo-bar" " or " "foo-bar\n" "Instead found " e ); fprintf(stderr, "%s\n", message); exit(-1); | GenericException(e) => let message = Pastel.( "Error: " e ); fprintf(stderr, "%s\n", message); exit(-1); | ImportsParserFailure(_e) => /* TODO: Be more specific about which imports */ let message = Pastel.( "Could not understand the imports\n" "There seems to be a syntax error in one of the imports" ); fprintf(stderr, "%s\n", message); exit(-1); | ResolveRelativePathFailure(e) => let message = Pastel.( "Could not find the library\n" e ); fprintf(stderr, "%s\n", message); exit(-1); | LocalLibraryPathNotFound(e) => let message = "Error: " "Could not find the library " e "\ncheck the require() in import of your package.json" ; fprintf(stderr, "%s\n", message); exit(-1); | x => /* let message = Pastel.( "Failed" ); */ /* fprintf(stderr, "%s", message); */ /* exit(-1); */ raise(x) }; let pesy_dune_file = dir => { switch (Sys.getenv_opt("cur__root")) { | None => let message = Pastel.( "'pesy dune-file' must be run the build environment only\n" ); fprintf(stderr, "%s\n", message); exit(-1); | Some(curRoot) => try(duneFile(curRoot, getManifestFile(curRoot), dir)) { | LocalLibraryPathNotFound(e) => let message = "Error: " "Could not find the library " e "\ncheck the require() in import of your package.json" ; fprintf(stderr, "%s\n", message); exit(-1); } }; }; let pesy_build = () => ignore( switch (Sys.getenv_opt("cur__root")) { | Some(curRoot) => let manifestFile = curRoot |> getManifestFile; try(validateManifestFile(curRoot, manifestFile)) { | LocalLibraryPathNotFound(e) => let message = "Error: " "Could not find the library " e "\ncheck the require() in import of your package.json" ; fprintf(stderr, "%s\n", message); exit(-1); | ForeignStubsIncorrectlyUsed => let message = Pastel.( "Error: " "foreignStubs " "is introduced since dune version" " 2.0\n" "Use " "cNames" " to specify stubs" ); fprintf(stderr, "%s\n", message); exit(-1); | CNamesIncorrectlyUsed => let message = Pastel.( "Error: " "cNames " "is deprecated in dune version 2.x\n" "Use " "foreignStubs" " to specify stubs" ); fprintf(stderr, "%s\n", message); exit(-1); | InvalidDuneVersion(version) => let message = Pastel.( "Error: " "Invalid Dune version" {version} ); fprintf(stderr, "%s\n", message); exit(-1); }; let buildTarget = build(manifestFile); Unix.( switch ( create_process( "dune", [|"dune", "build", "-p", buildTarget|], Unix.stdin, Unix.stdout, Unix.stderr, ) |> waitpid([]) ) { | (_, WEXITED(c)) => c | (_, WSIGNALED(c)) => c | (_, WSTOPPED(c)) => c } ); | None => let message = Pastel.( "'pesy build' must be run the build environment only\n" "Try esy b pesy build" ); fprintf(stderr, "%s\n", message); exit(-1); }, ); let pesyLsLibs = () => { let scopedIfDoubleKebabified = str => switch (Str.split(Str.regexp("\\-\\-"), str)) { | [pkgName] => pkgName | [scope, pkgName] => "@" ++ scope ++ "/" ++ pkgName | _ => raise( LsLibsError("findlib name of the library was had more than one --"), ) }; Findlib.init(); let pkgs = Findlib.list_packages'(); List.iteri( (i, x) => { x |> Str.global_replace(Str.regexp("\\."), "/") |> scopedIfDoubleKebabified |> sprintf( "\x1b[2m%s──\x1b[0m require('\x1b[1m%s\x1b[0m')", i < List.length(pkgs) - 1 ? "├" : "└", ) |> print_endline }, pkgs, ); }; let version = "0.1.0-alpha.14"; let build = () => { let cmd = "build"; let envs: list(Cmd.Env.info) = []; let exits: list(Cmd.Exit.info) = []; let doc = "build - builds your pesy managed project"; let build_t = Term.(const(pesy_build) $ const()); let info = Cmd.info(cmd, ~envs, ~exits, ~doc, ~version); Cmd.v(info, build_t); }; let subpkgTerm = Cmdliner.Arg.( required & pos(0, some(string), None) & info( [], ~doc="Subpackage which needs the Dune file generated", ~docv="SUBPACKAGE", ) ); let pesy_dune_file = () => { let cmd = "dune-file"; let envs: list(Cmd.Env.info) = []; let exits: list(Cmd.Exit.info) = []; let doc = "dune-file - prints dune file for a given dir/subpackage"; let build_t = Term.(const(pesy_dune_file) $ subpkgTerm); let info = Cmd.info(cmd, ~envs, ~exits, ~doc, ~version); Cmd.v(info, build_t); }; let pesy_eject = dir => { switch (Sys.getenv_opt("cur__root")) { | None => let message = Pastel.( "'pesy eject' must be run the build environment only\n" ); fprintf(stderr, "%s\n", message); exit(-1); | Some(curRoot) => duneEject(curRoot, getManifestFile(curRoot), dir) }; }; let eject = () => { let subpkgTerm = Arg.( required & pos(0, some(string), None) & info( [], ~doc="Subpackage which needs to get ejected", ~docv="SUBPACKAGE", ) ); let cmd = "eject"; let envs: list(Cmd.Env.info) = []; let exits: list(Cmd.Exit.info) = []; let doc = "eject - eject dune file for a given dir/subpackage"; let build_t = Term.(const(pesy_eject) $ subpkgTerm); let info = Cmd.info(cmd, ~envs, ~exits, ~doc, ~version); Cmd.v(info, build_t); }; let lsLibs = () => { let cmd = "ls-libs"; let envs: list(Cmd.Env.info) = []; let exits: list(Cmd.Exit.info) = []; let doc = "ls-libs - lists installed packages"; let build_t = Term.(const(pesyLsLibs) $ const()); let info = Cmd.info(cmd, ~envs, ~exits, ~doc, ~version); Cmd.v(info, build_t); }; let cmd = "esy-pesy"; let envs: list(Cmd.Env.info) = []; let exits: list(Cmd.Exit.info) = []; let doc = "Esy Pesy - Your Esy Assistant."; let cmd_t = Term.(const(main) $ const()); let cmd_info = Cmd.info(cmd, ~envs, ~exits, ~doc, ~version); exit @@ Cmd.eval @@ Cmd.group(~default=cmd_t, cmd_info, [build(), pesy_dune_file(), lsLibs(), eject()]); ================================================ FILE: bin/dune ================================================ (executable (package pesy--esy-pesy) (name Pesy) (modules (:standard)) (public_name pesy) (libraries pesy--esy-pesy.errors pesy--esy-pesy.lib pesy--esy-pesy.utils cmdliner str findlib)) ================================================ FILE: dune ================================================ (dirs :standard \ node_modules tmp npm-cli) (vendored_dirs vendor) ================================================ FILE: dune-project ================================================ (lang dune 1.11) (name pesy) ================================================ FILE: e2e-tests/.gitignore ================================================ esy.lock node_modules _esy library/dune executable/dune test/dune ================================================ FILE: e2e-tests/Rimraf.re ================================================ type result = | Ok | Failure; let is_directory = p => { let stats = Unix.lstat(p); switch (stats.st_kind) { | S_DIR => true | S_LNK | S_SOCK | S_REG | S_CHR | S_BLK | S_FIFO => false }; }; let rec del_file = p => try( { Unix.unlink(p); Ok; } ) { | Unix.Unix_error(Unix.ENOENT, _, _) => Ok | Unix.Unix_error(Unix.EISDIR | Unix.EPERM, _, _) => Ok | Unix.Unix_error(Unix.EACCES, _, _) when Sys.win32 => Ok | Unix.Unix_error(Unix.EINTR, _, _) => del_file(p) | Unix.Unix_error(_e, _, _) => Failure }; let rec del_dir = p => { let rec del_members = (dHandle, p) => { switch ( try(Some(Unix.readdir(dHandle))) { | End_of_file => None } ) { | None => Ok | Some(".." | ".") => del_members(dHandle, p) | Some(f) => switch (run(Filename.concat(p, f))) { | _ => del_members(dHandle, p) } }; }; let dh = Unix.opendir(p); switch (del_members(dh, p)) { | Ok => Unix.closedir(dh); if (is_directory(p)) { Unix.rmdir(p); } else { Unix.unlink(p); }; Ok; | Failure => Failure }; } and run: string => result = p => try(is_directory(p) ? del_dir(p) : del_file(p)) { | Unix.Unix_error(e, _, _) => switch (e) { | Unix.ENOENT => Ok | _ => Failure } | _ => Failure }; ================================================ FILE: e2e-tests/Runner.re ================================================ open Yojson.Basic; open Unix; open Utils; open Bos; open Printf; /** TODO: Cleanup **/ let () = { let run = (~env=?, c, args) => { let env_vars = switch (env) { | Some(v) => v | None => Unix.environment() }; let pid = create_process_env( c, Array.append([|c|], args), env_vars, stdin, stdout, stderr, ); switch (Unix.waitpid([], pid)) { | (_, WEXITED(c)) => c | (_, WSIGNALED(c)) => c | (_, WSTOPPED(c)) => c }; }; let run = (cmd, args) => { let exitCode = run(cmd, args); if (exitCode != 0) { printf( "%s failed. Exit code relayed to the shell\n Exiting with (%d)...\n", cmd, exitCode, ); exit(exitCode); }; }; let cwd = Sys.getcwd(); printf("Running bootstrapper test"); print_newline(); chdir(Path.(cwd / "npm-cli")); printf("Installing pesy globally..."); print_newline(); run(makeCommand("yarn"), [||]); run(makeCommand("yarn"), [|"run", "package"|]); run(makeCommand("npm"), [|"pack"|]); run( makeCommand("npm"), [|"i", "-g", Path.(cwd / "npm-cli" / "pesy-0.5.0-dev.23.tgz")|], ); chdir(cwd); }; open Rresult.R.Infix; module Log = { open Printf; let log = OS.File.(writef(dash)); let warn = printf; let error = printf; let withLog = (name, f) => { log("Running '%s'", name) >>= ( () => { print_newline(); f(); } ) >>= (() => log("Finished '%s'", name)) >>= ( () => { print_newline(); Ok(); } ); }; }; module L = Log; let withCurrentWorkingDirectory = (path, f: string => result(unit, [> Rresult.R.msg] as 'a)) => { let fpath = Fpath.v(path); OS.Dir.current() >>= ( cwd => { L.log("Entering %s\n", path) >>= ( () => L.withLog( Printf.sprintf("rimraf(%s)", path), () => { rimraf(path); Ok(); }, ) ) >>= (() => OS.Dir.create(~path=true, fpath)) >>= (_ => OS.Dir.set_current(fpath)) >>= (() => f(path)) >>= (() => L.log("Leaving %s\n", path)) >>= (_ => OS.Dir.set_current(cwd)); } ); }; module Path = { let (/) = Filename.concat; }; let createTestWorkspace = workspaceFolderName => { let tmpDir = Filename.get_temp_dir_name(); Path.(tmpDir / workspaceFolderName); }; let pesyBinPath = makeCommand("pesy"); let esyBinPath = makeCommand("esy"); let failIfNotZeroExit = taskName => fun | `Exited(code) => if (code == 0) { Ok(); } else { Error(`Msg(sprintf("'%s' failed: non exit (%d)", taskName, code))); } | `Signaled(code) => Error(`Msg(sprintf("'%s' failed: signaled (%d)", taskName, code))); module Config: { type a; let ofString: string => result(a, [ | `Msg(string)]); let ofFile: Fpath.t => result(a, [ | `Msg(string)]); /** Basically a toString but results a string in a result **/ let serialize: result(a, [ | `Msg(string)]) => result(string, [ | `Msg(string)]); let createError: string => result('a, [ | `Msg(string)]); } = { type a = | FilePath(Fpath.t) | Contents(string); let ofString = x => Ok(Contents(x)); let ofFile = x => Ok(FilePath(x)); let createError = msg => Error(`Msg(msg)); let serialize: result(a, [ | `Msg(string)]) => result(string, [ | `Msg(string)]) = fun | Ok(t) => switch (t) { | FilePath(p) => OS.File.read(p) | Contents(s) => Ok(s) } | Error(`Msg(msg)) => createError(msg); }; let mergeJsons = (j1, j2) => { switch (j1, j2) { | (`Assoc(kvs1), `Assoc(kvs2)) => Ok(`Assoc(kvs1 @ kvs2)) | _ => Error( `Msg( sprintf("Merging %s and %s failed", to_string(j1), to_string(j2)), ), ) }; }; let addToManifest = (jsonString, manifest) => { OS.File.read(Fpath.v(manifest)) >>= ( manifestJsonString => { let manifestJson = try(Ok(from_string(manifestJsonString))) { | _ => Error( `Msg( sprintf("Input manifest was not a valid json: %s", jsonString), ), ) }; let editJson = try(Ok(from_string(jsonString))) { | _ => Error( `Msg( sprintf( "Input pesy config was not a valid json: %s", jsonString, ), ), ) }; editJson >>= (edit => manifestJson >>= (manifest => mergeJsons(manifest, edit))) >>= ( mergedJson => mergedJson |> to_string |> OS.File.write(Fpath.v(manifest)) ); } ); }; module PesyConfig = { let edit = (config, manifest) => { Config.serialize(config) >>= ( jsonString => { OS.File.read(Fpath.v(manifest)) >>= ( manifestJsonString => try( switch (from_string(manifestJsonString)) { | `Assoc(jsonKVPairs) => let pesyConfigJson = try(Ok(from_string(jsonString))) { | _ => Error( `Msg( sprintf( "Input pesy config was not a valid json: %s", jsonString, ), ), ) }; List.map( ((k, v)) => if (k == "buildDirs") { pesyConfigJson >>= (json => Ok((k, json))); } else { Ok((k, v)); }, jsonKVPairs, ) |> List.fold_left( (acc, v) => switch (acc, v) { | (Ok(l), Ok(e)) => Ok([e, ...l]) | (_, Error(_) as e) => e | (Error(_) as e, _) => e }, Ok([]), ) >>= ( kvs => `Assoc(kvs) |> to_string |> OS.File.write(Fpath.v(manifest)) ); | _ => Error(`Msg("Manifest file was invalid json")) } ) { | _ => Error(`Msg("Manifest file could not be parsed")) } ); } ); }; let add = (jsonString, manifest) => { OS.File.read(Fpath.v(manifest)) >>= ( manifestJsonString => try( switch (from_string(manifestJsonString)) { | `Assoc(jsonKVPairs) => let pesyConfigJson = try(Ok(from_string(jsonString))) { | _ => Error( `Msg( sprintf( "Input pesy config was not a valid json: %s", jsonString, ), ), ) }; List.map( ((k, v)) => if (k == "buildDirs") { pesyConfigJson >>= (json => mergeJsons(v, json)) >>= (mergedConfig => Ok((k, mergedConfig))); } else { Ok((k, v)); }, jsonKVPairs, ) |> List.fold_left( (acc, v) => switch (acc, v) { | (Ok(l), Ok(e)) => Ok([e, ...l]) | (_, Error(_) as e) => e | (Error(_) as e, _) => e }, Ok([]), ) >>= ( kvs => `Assoc(kvs) |> to_string |> OS.File.write(Fpath.v(manifest)) ); | _ => Error(`Msg("Manifest file was invalid json")) } ) { | _ => Error(`Msg("Manifest file could not be parsed")) } ); }; }; let checkProject = (msg, ()) => L.withLog(Printf.sprintf("esy start (%s)", msg), () => OS.Cmd.run_status(Cmd.(v(esyBinPath) % "start")) >>= failIfNotZeroExit("esy start: " ++ msg) ); let checkPesyConfig = (msg, editPesyConfig, ()) => L.withLog("Editing pesy config: " ++ msg, () => editPesyConfig()) >>= ( () => L.withLog("esy pesy: " ++ msg, () => OS.Cmd.run_status(Cmd.(v(esyBinPath) % "pesy")) >>= failIfNotZeroExit("esy pesy") ) ) >>= ( () => L.withLog(Printf.sprintf("esy build"), () => OS.Cmd.run_status(Cmd.(v(esyBinPath) % "build")) >>= failIfNotZeroExit("esy build") ) ) >>= checkProject(msg); let checkBootstrapper = cwd => { OS.Cmd.(run_status(Cmd.(v(pesyBinPath) % "--fetch-cache=false"))) >>= failIfNotZeroExit("pesy --force-cache-fetch") >>= checkProject("checking if bootstrapper works") >>= ( () => addToManifest( Str.global_replace( Str.regexp(""), "link:" ++ ( ( switch (Sys.getenv_opt("PESY_CLONE_PATH")) { | Some(path) => path | None => Sys.getcwd() } ) |> Str.(global_replace(regexp("\\"), "/")) ), {| { "resolutions": { "@pesy/esy-pesy": "" } } |}, ), Path.(cwd / "package.json"), ) >>= ( () => L.withLog(Printf.sprintf("esy"), () => OS.Cmd.run_status( Cmd.(v(esyBinPath) % "--skip-repository-update"), ) >>= failIfNotZeroExit("esy") ) ) ) >>= checkPesyConfig("try old (4.x) pesy syntax", () => PesyConfig.edit( Config.ofString( {| { "library": { "require": [ "console.lib", "pastel.lib" ] }, "bin": { "imports": [ "Library = require('test-project/library')" ], "bin": { "TestProjectApp": "TestProjectApp.re" } } } |}, ), Path.(cwd / "package.json"), ) ) >>= ( () => L.withLog("Editing source: Add file stubs.c", () => OS.File.write( Fpath.(v(cwd) / "library" / "stubs.c"), {| #include #include CAMLprim value caml_foo(value a) { int c_a = Int_val(a); printf("foo received: %d", c_a); return Val_unit; } |}, ) ) >>= (() => OS.File.read(Fpath.(v(cwd) / "library" / "Util.re"))) >>= ( utilRe => OS.File.write( Fpath.(v(cwd) / "library" / "Util.re"), utilRe ++ "\n" ++ "external foo: int => unit = \"caml_foo\";", ) ) ) >>= checkPesyConfig("add foreignStubs for stubs", () => PesyConfig.edit( Config.ofString( {| { "library": { "require": [ "console.lib", "pastel.lib" ], "foreignStubs": [{ "language": "c", "names": ["stubs"] }] }, "bin": { "imports": [ "Library = require('test-project/library')" ], "bin": { "TestProjectApp": "TestProjectApp.re" } } } |}, ), Path.(cwd / "package.json"), ) ) >>= checkPesyConfig("add byte mode compilation", () => PesyConfig.edit( Config.ofString( {| { "library": { "public": true, "require": [ "console.lib", "pastel.lib" ], "modes": [ "byte", "native" ], "foreignStubs": [{ "language": "c", "names": ["stubs"] }] }, "bin": { "modes": [ "byte", "exe" ], "imports": [ "Library = require('test-project/library')" ], "bin": { "TestProjectApp": "TestProjectApp.re" } } } |}, ), Path.(cwd / "package.json"), ) ) >>= ( _ => L.withLog( "Editing source: Add file library-with-relative-imports/Index.re", () => OS.Dir.create( ~path=true, Fpath.(v(cwd) / "library-with-relative-imports"), ) >>= ( _ => OS.File.write( Fpath.(v(cwd) / "library-with-relative-imports" / "Index.re"), {| open Foo let foo = () => { print_endline("relatively imported" ++ Foo.Util.hello()); }; |}, ) ) ) >>= ( _ => L.withLog( "Editing source: Add file executable-with-relative-imports/Main.re", () => OS.Dir.create( ~path=true, Fpath.(v(cwd) / "executable-with-relative-imports"), ) >>= ( _ => OS.File.write( Fpath.( v(cwd) / "executable-with-relative-imports" / "Main.re" ), {| open Foo Foo.foo(); |}, ) ) ) ) ) >>= checkPesyConfig("add relatively imported modules", () => PesyConfig.add( {| { "library-with-relative-imports": { "imports": [ "Foo = require('../library')" ] }, "executable-with-relative-imports": { "imports": [ "Foo = require('../library-with-relative-imports')" ], "bin": { "TestRelativelyImportedLib": "Main.re" } } } |}, Path.(cwd / "package.json"), ) ) >>= ( () => L.withLog(Printf.sprintf("esy add @opam/lwt @opam/lwt_ppx"), () => OS.Cmd.run_status( Cmd.(v(esyBinPath) % "add" % "@opam/lwt" % "@opam/lwt_ppx"), ) >>= failIfNotZeroExit("esy add @opam/lwt @opam/lwt_ppx") ) ) >>= ( () => L.withLog(Printf.sprintf("esy build"), () => OS.Cmd.run_status(Cmd.(v(esyBinPath) % "build")) >>= failIfNotZeroExit("esy build") ) ) >>= ( _ => L.withLog( "Editing source: Add file executable-with-lwt-preprocess/Main.re", () => OS.Dir.create( ~path=true, Fpath.(v(cwd) / "executable-with-lwt-preprocess"), ) >>= ( _ => OS.File.write( Fpath.(v(cwd) / "executable-with-lwt-preprocess" / "Main.re"), {| open Lwt; Console.log("Testing.."); let foo = { let%lwt foo = Lwt.return("hello world from lwt"); Lwt.return(foo ++ " blah"); }; print_endline(Lwt_main.run(foo)); |}, ) ) ) ) >>= checkPesyConfig("add preprocessor", () => PesyConfig.add( {| { "executable-with-lwt-preprocess": { "imports": [ "Console = require('@reason-native/console/lib')", "Lwt = require('lwt')", "LwtUnix = require('lwt/unix')" ], "preprocess": [ "pps", "lwt_ppx" ], "bin": { "TestLwtPreprocessor": "Main.re" } } } |}, Path.(cwd / "package.json"), ) ) >>= ( _ => L.withLog( "Editing source: Add file executable-with-raw-config/Main.re", () => OS.Dir.create( ~path=true, Fpath.(v(cwd) / "executable-with-raw-config"), ) >>= ( _ => OS.File.write( Fpath.(v(cwd) / "executable-with-raw-config" / "Main.re"), {| print_endline(Unix.getenv("PATH")); |}, ) ) ) ) >>= checkPesyConfig("add raw build config", () => PesyConfig.add( {| { "executable-with-raw-config": { "rawBuildConfig": [ "(libraries unix)" ], "bin": { "TestRawBuildConfig": "Main.re" } } } |}, Path.(cwd / "package.json"), ) ) >>= ( _ => L.withLog( "Editing source: Add file raw-footer-config-assets/plaintext.txt", () => OS.Dir.create( ~path=true, Fpath.(v(cwd) / "raw-footer-config-assets"), ) >>= ( _ => OS.File.write( Fpath.(v(cwd) / "raw-footer-config-assets" / "plaintext.txt"), {| Some random text here. |}, ) ) ) ) >>= checkPesyConfig("add raw build config footer", () => PesyConfig.add( {| { "raw-footer-config-assets" : { "namespace": "RawAssets", "name": "test-project.assets", "rawBuildConfigFooter": [ "(install (section share_root) (files (plaintext.txt as asset.txt)))" ] } } |}, Path.(cwd / "package.json"), ) ); }; switch ( withCurrentWorkingDirectory( createTestWorkspace("test-project"), checkBootstrapper, ) ) { | Ok () => () | Error(`Msg(msg)) => print_endline("Runner failed with: " ++ msg); exit(-1); }; ================================================ FILE: e2e-tests/Utils.re ================================================ open Printf; module Path = { let (/) = Filename.concat; }; let makeCommand = cmd => Sys.unix ? cmd : { let pathVars = Array.to_list(Unix.environment()) |> List.map(e => switch (Str.split(Str.regexp("="), e)) { | [k, v, ..._rest] => Some((k, v)) | _ => None } ) |> List.filter( fun | None => false | _ => true, ) |> List.filter(e => switch (e) { | Some((k, _)) => String.lowercase_ascii(k) == "path" | _ => false } ) |> List.map( fun | Some(x) => x | None => ("", "") /* Why not filter_map? */ ); let v = List.fold_right( (e, acc) => { let (_, v) = e; acc ++ (Sys.unix ? ":" : ";") ++ v; }, pathVars, "", ); let paths = Str.split(Str.regexp(Sys.unix ? ":" : ";"), v); let npmPaths = List.filter( path => Sys.file_exists(Filename.concat(path, sprintf("%s.cmd", cmd))), paths, ); switch (npmPaths) { | [] => fprintf(stderr, "No %s bin path found", cmd); exit(-1); | [h, ..._] => Filename.concat(h, sprintf("%s.cmd", cmd)) }; }; let rimraf = p => ignore(Rimraf.run(p)); let esyCommand = makeCommand("esy"); let buffer_size = 8192; let buffer = Bytes.create(buffer_size); let runCommandWithEnv = (command, args) => { let attach = Unix.create_process_env( command, Array.append([|command|], args), Unix.environment(), ); let pid = attach(Unix.stdin, Unix.stdout, Unix.stderr); switch (Unix.waitpid([], pid)) { | (_, WEXITED(c)) => c | (_, WSIGNALED(c)) => c | (_, WSTOPPED(c)) => c }; }; let mkdir = (~perms=?, p) => switch (perms) { | Some(x) => Unix.mkdir(p, x) | None => Unix.mkdir(p, 0o755) }; let file_copy = (input_name, output_name) => { open Unix; let fd_in = openfile(input_name, [O_RDONLY], 0); let fd_out = openfile(output_name, [O_WRONLY, O_CREAT, O_TRUNC], 438); let rec copy_loop = () => switch (read(fd_in, buffer, 0, buffer_size)) { | 0 => () | r => ignore(write(fd_out, buffer, 0, r)); copy_loop(); }; copy_loop(); close(fd_in); close(fd_out); }; module IO = { let write = (file, str) => { let oc = open_out(file); fprintf(oc, "%s", str); close_out(oc); }; let read = file => { let buf = ref(""); let breakOut = ref(false); let ic = open_in(file); while (! breakOut^) { let line = try(input_line(ic)) { | End_of_file => breakOut := true; ""; }; buf := buf^ ++ "\n" ++ line; }; buf^; }; }; let contains = (s1, s2) => { let re = Str.regexp_string(s2); try(Str.search_forward(re, s1, 0)) { | Not_found => (-1) }; }; let rec fetch_files = (f, p) => { let rec walk = (dh, acc) => { let read_dir = dh => try(Some(Unix.readdir(dh))) { | End_of_file => None }; switch (read_dir(dh)) { | Some("..") | Some(".") => walk(dh, acc) | Some(entry) => walk(dh, [Path.(p / entry), ...acc]) @ fetch_files(f, Path.(p / entry)) | None => Unix.closedir(dh); acc; }; }; if (try(Sys.is_directory(p)) { | _ => false }) { let dh = Unix.opendir(p); List.filter(f, walk(dh, [])); } else { []; }; }; ================================================ FILE: e2e-tests/dune ================================================ (executable (name Runner) (package PesyE2E) (public_name Runner.exe) (libraries unix bos yojson str)) ================================================ FILE: e2e-tests/pending-tests.re ================================================ /* OS.Dir.create(~path=true, Fpath.(v(cwd) / "virtual-foo")) */ /* >>= ( */ /* L.withLog("Editing source: Add file virtual-foo/VirtualFoo.rei", () => */ /* () => */ /* >>= ( */ /* _ => */ /* OS.File.write( */ /* Fpath.(v(cwd) / "virtual-foo" / "VirtualFoo.rei"), */ /* {| */ /* let thisWillBeImplementedLater: unit => unit; */ /* |}, */ /* ) */ /* ) */ /* ) */ /* >>= ( */ /* () => */ /* L.withLog( */ /* "Editing source: Add file implementation-bar/VirtualFoo.re", () => */ /* OS.Dir.create(~path=true, Fpath.(v(cwd) / "implementation-bar")) */ /* >>= ( */ /* _ => */ /* OS.File.write( */ /* Fpath.(v(cwd) / "implementation-bar" / "VirtualFoo.re"), */ /* {| */ /* let thisWillBeImplementedLater = () => { */ /* print_endline("From implementation bar..."); */ /* }; */ /* |}, */ /* ) */ /* ) */ /* ) */ /* >>= ( */ /* _ => */ /* L.withLog( */ /* "Editing source: Add file implementation-baz/VirtualFoo.re", () => */ /* OS.Dir.create( */ /* ~path=true, */ /* Fpath.(v(cwd) / "implementation-baz"), */ /* ) */ /* >>= ( */ /* _ => */ /* OS.File.write( */ /* Fpath.(v(cwd) / "implementation-baz" / "VirtualFoo.re"), */ /* {| */ /* let thisWillBeImplementedLater = () => { */ /* print_endline("From implementation baz..."); */ /* }; */ /* |}, */ /* ) */ /* ) */ /* ) */ /* >>= ( */ /* _ => */ /* L.withLog( */ /* "Editing source: Add file executable-virutal-bar/PesyVirtualApp.re", */ /* () => */ /* OS.Dir.create( */ /* ~path=true, */ /* Fpath.(v(cwd) / "executable-virtual-bar"), */ /* ) */ /* >>= ( */ /* _ => */ /* OS.File.write( */ /* Fpath.( */ /* v(cwd) */ /* / "executable-virtual-bar" */ /* / "PesyVirtualApp.re" */ /* ), */ /* {| */ /* Bar.thisWillBeImplementedLater(); */ /* |}, */ /* ) */ /* ) */ /* ) */ /* ) */ /* >>= ( */ /* _ => */ /* L.withLog( */ /* "Editing source: Add file executable-virtual-baz/PesyVirtualApp.re", */ /* () => */ /* OS.Dir.create( */ /* ~path=true, */ /* Fpath.(v(cwd) / "executable-virtual-baz"), */ /* ) */ /* >>= ( */ /* _ => */ /* OS.File.write( */ /* Fpath.( */ /* v(cwd) */ /* / "executable-virtual-baz" */ /* / "PesyVirtualApp.re" */ /* ), */ /* {| */ /* Baz.thisWillBeImplementedLater(); */ /* |}, */ /* ) */ /* ) */ /* ) */ /* ) */ /* >>= checkPesyConfig("add virtual modules", () => */ /* PesyConfig.add( */ /* {| */ /* { */ /* "virtual-foo": { */ /* "virtualModules": [ */ /* "VirtualFoo" */ /* ] */ /* }, */ /* "implementation-bar": { */ /* "implements": [ */ /* "test-project/virtual-foo" */ /* ] */ /* }, */ /* "implementation-baz": { */ /* "implements": [ */ /* "test-project/virtual-foo" */ /* ] */ /* }, */ /* "executable-virtual-bar": { */ /* "imports": [ */ /* "Bar = require('test-project/implementation-bar')" */ /* ], */ /* "bin": { */ /* "PesyVirtualAppBar.exe": "PesyVirtualApp.re" */ /* } */ /* }, */ /* "executable-virtual-baz": { */ /* "imports": [ */ /* "Baz = require('test-project/implementation-baz')" */ /* ], */ /* "bin": { */ /* "PesyVirtualAppBaz.exe": "PesyVirtualApp.re" */ /* } */ /* } */ /* } */ /* |}, */ /* Path.(cwd / "package.json"), */ /* ) */ /* ) */ /* ) */ /* ) */ /* ); */ ================================================ FILE: errors/Errors.re ================================================ type validationError = | StaleDuneFile(string) | StaleOpamFile((string, string)); exception ShouldNotBeNull(string); exception FatalError(string); exception ShouldNotBeHere(unit); exception InvalidRootName(string); exception GenericException(string); exception ResolveRelativePathFailure(string); exception InvalidBinProperty(string); exception BuildValidationFailures(list(validationError)); exception ImportsParserFailure(unit); exception LocalLibraryPathNotFound(string); exception ForeignStubsIncorrectlyUsed; exception CNamesIncorrectlyUsed; exception InvalidDuneVersion(string); ================================================ FILE: errors/dune ================================================ (library (name PesyEsyPesyErrors) (public_name pesy--esy-pesy.errors) (modules (:standard))) ================================================ FILE: lib/Common.re ================================================ exception InvalidSubDirs(string); type include_subdirs = | No | Unqualified; type t = { path: string, require: list(string), flags: option(list(string)), /* TODO: Use a variant instead since flags only accept a set of values and not any list of strings */ ocamlcFlags: option(list(string)), ocamloptFlags: option(list(string)), jsooFlags: option(list(string)), preprocess: option(list(string)), includeSubdirs: option(include_subdirs), rawBuildConfig: option(list(string)), rawBuildConfigFooter: option(list(string)), pesyModules: PesyModule.t, }; let create = ( path, require, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModules, ) => { let includeSubDirsSafe = switch (includeSubdirs) { | Some(x) => switch (x) { | "no" => Some(No) | "unqualified" => Some(Unqualified) | _ => raise(InvalidSubDirs(x)) } | None => None }; { path, require, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs: includeSubDirsSafe, rawBuildConfig, rawBuildConfigFooter, pesyModules, }; }; let toDuneStanzas = c => { let { require, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModules, _, } = c; ( /* libraries: */ switch (require) { | [] => switch (pesyModules) { | Some(x) => Some( Stanza.createExpression([ Stanza.createAtom("libraries"), Stanza.createAtom(PesyModule.getNamespace(x)), ]), ) | None => None } | libs => Some( Stanza.createExpression([ Stanza.createAtom("libraries"), ...List.map( r => Stanza.createAtom(r), libs @ ( switch (pesyModules) { | Some(x) => [PesyModule.getNamespace(x)] | None => [] } ), ), ]), ) }, /* flags: */ switch (flags) { | None => switch (pesyModules) { | Some(x) => Some( Stanza.createExpression([ Stanza.createAtom("flags"), Stanza.createAtom("-open"), Stanza.createAtom(PesyModule.getNamespace(x)), ]), ) | None => None } | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("flags"), ...List.map( f => Stanza.createAtom(f), l @ ( switch (pesyModules) { | Some(x) => ["-open", PesyModule.getNamespace(x)] | None => [] } ), ), ]), ) }, /* ocamlcFlags */ switch (ocamlcFlags) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("ocamlc_flags"), ...List.map(f => Stanza.createAtom(f), l), ]), ) }, /* ocamloptFlags */ switch (ocamloptFlags) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("ocamlopt_flags"), ...List.map(f => Stanza.createAtom(f), l), ]), ) }, /* jsooFlags */ switch (jsooFlags) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("js_of_ocaml"), ...List.map(f => Stanza.createAtom(f), l), ]), ) }, /* preprocess */ switch (preprocess) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("preprocess"), Stanza.createExpression(List.map(f => Stanza.createAtom(f), l)), ]), ) }, /* includeSubdirs */ switch (includeSubdirs) { | None => None | Some(v) => Some( Stanza.createExpression([ Stanza.createAtom("include_subdirs"), Stanza.createAtom( switch (v) { | No => "no" | Unqualified => "unqualified" }, ), ]), ) }, /* rawBuildConfig */ switch (rawBuildConfig) { | None => None | Some(l) => Some(l |> List.map(Stanza.ofString)) }, /* rawBuildConfig */ switch (rawBuildConfigFooter) { | None => None | Some(l) => Some(l |> List.map(Stanza.ofString)) }, /* pesy modules */ PesyModule.generateLibraryStanza(preprocess, pesyModules), PesyModule.generateAliasModuleStanza(pesyModules), ); }; let getPath = c => c.path; let getPesyModules = c => c.pesyModules; ================================================ FILE: lib/Common.rei ================================================ type include_subdirs; type t; let toDuneStanzas: t => ( option(Stanza.t), option(Stanza.t), option(Stanza.t), option(Stanza.t), option(Stanza.t), option(Stanza.t), option(Stanza.t), option(list(Stanza.t)), option(list(Stanza.t)), option(Stanza.t), option(Stanza.t), ); let getPath: t => string; let getPesyModules: t => PesyModule.t; let create: ( /* path */ string, /* require */ list(string), /* flags */ option(list(string)), /* Ocamlc flags */ option(list(string)), /* Ocamlopt flags */ option(list(string)), /* jsoo flags */ option(list(string)), /* preprocess */ option(list(string)), /* include subdirs */ option(string), /* raw config */ option(list(string)), /* raw config footer */ option(list(string)), /* pesy modules */ PesyModule.t ) => t; ================================================ FILE: lib/DuneFile.re ================================================ module Utils = PesyEsyPesyUtils.Utils; open Sexplib.Sexp; open Printf; exception InvalidDuneFile(unit); let toString = (stanzas: list(Stanza.t)) => List.fold_right( (s, acc) => Str.global_replace( Str.regexp("\"\\\\\\\\\""), "\\\\", to_string_hum(~indent=4, Stanza.toSexp(s)), ) ++ "\n" ++ acc, stanzas, "", ); let ofFile = n => { open Sexplib; let contentStr = try (Utils.readFile(n)) { | _ => "" }; Sexp.( switch (Sexp.of_string(sprintf("(%s)", contentStr))) { | List(l) => List.map(Stanza.ofSexp, l) | _ => raise(InvalidDuneFile()) } ); }; ================================================ FILE: lib/DuneFile.rei ================================================ let toString: list(Stanza.t) => string; let ofFile: string => list(Stanza.t); ================================================ FILE: lib/DuneProject.re ================================================ open Sexplib.Sexp; exception InvalidDuneProjectFile; let findLangVersion = fun | [x, ..._] => switch (Stanza.toSexp(x)) { | List([Atom("lang"), Atom("dune"), Atom(version)]) => version | _ => raise(InvalidDuneProjectFile) } | _ => raise(InvalidDuneProjectFile); ================================================ FILE: lib/DuneProject.rei ================================================ let findLangVersion: list(Stanza.t) => string; ================================================ FILE: lib/EsyCommand.re ================================================ open Printf; let esy_command = "esy"; /* @esy-ocaml/foo-package -> foo-package */ let resolveEsyCommand = () => Sys.unix ? try( Sys.command(sprintf("%s --version &>/dev/null", esy_command)) == 0 ? Some(esy_command) : None ) { | _ => None } : { let pathVars = Array.to_list(Unix.environment()) |> List.map(e => switch (Str.split(Str.regexp("="), e)) { | [k, v, ..._rest] => Some((k, v)) | _ => None } ) |> List.filter( fun | None => false | _ => true, ) |> List.filter(e => switch (e) { | Some((k, _)) => String.lowercase_ascii(k) == "path" | _ => false } ) |> List.map( fun | Some(x) => x | None => ("", "") /* Why not filter_map? */ ); let paths = Str.split( Str.regexp(Sys.unix ? ": " : ";"), String.concat( Sys.unix ? ": " : ";", List.map( e => { let (_, v) = e; v; }, pathVars, ), ), ); /* Unix.putenv("PATH", v); /\* This didn't work! *\/ */ let npmPaths = List.filter( path => Sys.file_exists(Filename.concat(path, "esy.cmd")), paths, ); switch (npmPaths) { | [] => None | [h, ..._] => Some(Filename.concat(h, "esy.cmd")) }; }; ================================================ FILE: lib/Executable.re ================================================ module Utils = PesyEsyPesyUtils.Utils; open Utils; module Mode = { exception InvalidCompilationMode(unit); exception InvalidBinaryKind(unit); module Compilation: { type t; let toString: t => string; let ofString: string => t; } = { type t = | Byte | Native | Best; let toString = fun | Byte => "byte" | Native => "native" | Best => "best"; let ofString = fun | "byte" => Byte | "native" => Native | "best" => Best | _ => raise(InvalidCompilationMode()); }; module BinaryKind: { type t = | C | Exe | Object | Shared_object | JS | Plugin; let toString: t => string; let ofString: string => t; } = { type t = | C | Exe | Object | Shared_object | JS | Plugin; let toString = fun | C => "c" | Exe => "exe" | Object => "object" | Shared_object => "shared_object" | JS => "js" | Plugin => "plugin"; let ofString = fun | "c" => C | "exe" => Exe | "object" => Object | "shared_object" => Shared_object | "js" => JS | "plugin" => Plugin | _ => raise(InvalidBinaryKind()); }; type t = | Atom(BinaryKind.t) | Tuple(Compilation.t, BinaryKind.t) | Array(list(t)); exception InvalidExecutableMode(string); let rec ofFieldTypes = parts => switch (parts) { | FieldTypes.String(bs) => { let parts = bs |> Str.split(Str.regexp("[ \n\r\x0c\t]+")) if (List.length(parts) > 1) { Array(parts |> List.map(b => Atom(BinaryKind.ofString(b)))) } else { Atom(BinaryKind.ofString(List.hd(parts))) } } | FieldTypes.List([FieldTypes.String(c), FieldTypes.String(b)]) => try(Tuple(Compilation.ofString(c), BinaryKind.ofString(b))) { | InvalidCompilationMode () => Array([ Atom(BinaryKind.ofString(c)), Atom(BinaryKind.ofString(b)), ]) | _ => raise( InvalidExecutableMode( "Invalid executable mode: expected of the form [(, )'s | 's] or 's", ), ) } | FieldTypes.List(xs) => Array(List.map(ofFieldTypes, xs)) | _ => raise( InvalidExecutableMode( "Invalid executable mode: expected of the form [(, )'s | 's] or 's", ), ) }; let rec toStanzas = m => switch (m) { | Array(x) => List.fold_left((acc, s) => acc @ toStanzas(s), [], x) | Tuple(c, b) => [ Stanza.createExpression([ Stanza.createAtom(Compilation.toString(c)), Stanza.createAtom(BinaryKind.toString(b)), ]), ] | Atom(b) => [Stanza.createAtom(BinaryKind.toString(b))] }; }; type t = { binKVs: list((string, string)), modes: option(Mode.t), }; let create = (binKVs, modes) => {binKVs, modes}; let toDuneStanza = (common: Common.t, e) => { /* let {name: pkgName, require, path} = common; */ let {binKVs, modes: modesP} = e; let ( libraries, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModulesLibrary, pesyModulesAliasModuleGen, ) = Common.toDuneStanzas(common); let path = Common.getPath(common); let (mains, publicNames) = List.fold_right((tuple, acc) => { let (main, publicName) = tuple; let (mains, publicNames) = acc; (mains @ [main], publicNames @ [publicName]); }, binKVs,([], [])); let name = Stanza.createExpression([Stanza.createAtom("names"), ...(mains |> List.map(x => x|> moduleNameOf |> Stanza.createAtom))]) let public_name = Stanza.createExpression([Stanza.createAtom("public_names"), ...(publicNames |> List.map(Stanza.createAtom))]); let modules = Stanza.createExpression([ Stanza.createAtom("modules"), Stanza.createExpression( [Stanza.createAtom(":standard")] @ ( switch (Common.getPesyModules(common)) { | Some(x) => [ Stanza.createAtom("\\"), Stanza.createAtom(PesyModule.getNamespace(x)), ] | None => [] } ), ), ]); /* let public_name = */ /* Stanza.create("public_name", Stanza.createAtom(pkgName)); */ /* let libraries = */ /* switch (require) { */ /* | [] => None */ /* | libs => */ /* Some( */ /* Stanza.createExpression([ */ /* Stanza.createAtom("libraries"), */ /* ...List.map(r => Stanza.createAtom(r), libs), */ /* ]), */ /* ) */ /* }; */ let modesD = switch (modesP) { | None => None | Some(m) => Some( Stanza.createExpression([ Stanza.createAtom("modes"), ...Mode.toStanzas(m), ]), ) }; let mandatoryExpressions = switch(modesP) { | Some(Mode.Atom(Mode.BinaryKind.JS)) => [name, modules] | _ => [name, modules, public_name] } let optionalExpressions = [ libraries, modesD, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, ]; let rawBuildConfig = switch (rawBuildConfig) { | Some(l) => l | None => [] }; let rawBuildConfigFooter = switch (rawBuildConfigFooter) { | Some(l) => l | None => [] }; let optionalRootStanzas = rawBuildConfigFooter @ ( switch (pesyModulesLibrary) { | Some(s) => [s] | None => [] } ) @ ( switch (pesyModulesAliasModuleGen) { | Some(s) => [s] | None => [] } ) @ ( switch (includeSubdirs) { | Some(s) => [s] | None => [] } ); let executable = Stanza.createExpression([ Stanza.createAtom("executables"), ...mandatoryExpressions @ filterNone(optionalExpressions) @ rawBuildConfig, ]); (path, [executable, ...optionalRootStanzas]); }; ================================================ FILE: lib/Executable.rei ================================================ module Utils = PesyEsyPesyUtils.Utils; open Utils; type t; module Mode: { type t; let ofFieldTypes: FieldTypes.t => t; let toStanzas: t => list(Stanza.t); }; let create: (list((string, string)), option(Mode.t)) => t; let toDuneStanza: (Common.t, t) => (string, list(Stanza.t)); ================================================ FILE: lib/ImportsParser.re ================================================ let parse = str => { let lexbuf = Lexing.from_string(str); Parser.main(Lexer.read, lexbuf); }; ================================================ FILE: lib/Lexer.mll ================================================ (* File lexer.mll *) { open Parser (* The type token is defined in parser.mli *) } rule read = parse [' ' '\t'] { read lexbuf } (* skip blanks *) | ['('] { LPAREN } | [')'] { RPAREN } | [';'] { SEMICOLON } | ['='] { ASSN } | "require" { REQUIRE } | ['\''] { SQUOTE } | ['A' - 'Z' ] [ 'A' - 'Z' 'a' - 'z' '_' '\'' '0'-'9'] * as lxm { MODULE_NAME(lxm) } | ['@'] ? ['A'-'Z' 'a'-'z' '.' '/' '-' '0'-'9' '_'] + as lxm { MODULE_PATH(lxm) } | ['\n'] {EOL} | eof {EOF} ================================================ FILE: lib/Lib.re ================================================ module Mode = Mode; module EsyCommand = EsyCommand; module Utils = PesyEsyPesyUtils.Utils; open Utils; open NoLwt; type fileOperation = | UPDATE(string) | CREATE(string); let gen = (projectPath, pkgPath) => { let conf = PesyConf.get(pkgPath); let pkgs = PesyConf.pkgs(conf); let rootName = PesyConf.rootName(conf); let rootNameOpamFile = rootName ++ ".opam"; let operations = ref([]); pkgs |> List.iter(((subpackage, _)) => { mkdirp(Path.(projectPath / subpackage)); let duneFilePath = Path.(projectPath / subpackage / "dune"); write( duneFilePath, {|(* -*- tuareg -*- *) open Jbuild_plugin.V1 let () = run_and_read_lines ("pesy dune-file " ^ Sys.getcwd ()) |> String.concat "\n" |> send |}, ); operations := [ CREATE( Str.global_replace( Str.regexp(Path.(projectPath / "")), "", duneFilePath, ), ), ...operations^, ]; }); let foundAnOpamFile = ref(false); let dirForEachEntry = (f, dirname) => { let d = Unix.opendir(dirname); try( while (true) { f(Unix.readdir(d)); } ) { | End_of_file => Unix.closedir(d) }; }; let contains = (n, s) => try(Str.search_forward(Str.regexp(s), n, 0) != (-1)) { | Not_found => false }; dirForEachEntry( n => if (contains(n, ".opam") && ! foundAnOpamFile^) { foundAnOpamFile := true; if (n != rootNameOpamFile) { copyFile( Path.(projectPath / n), Path.(projectPath / rootNameOpamFile), ); Unix.unlink(Path.(projectPath / n)); operations := [CREATE(rootNameOpamFile), ...operations^]; }; }, projectPath, ); operations^; }; let log = operations => { print_newline(); List.iter( o => { switch (o) { | CREATE(x) => print_endline( " Created " x , ) | UPDATE(x) => print_endline( " Updated " x , ) }; (); }, operations, ); print_newline(); }; let generateBuildFiles = projectRoot => { let packageJSONPath = Path.(projectRoot / "package.json"); gen(projectRoot, packageJSONPath); }; let build = manifestFile => PesyConf.get(manifestFile) |> PesyConf.rootName; let normalize = x => x |> Str.global_replace(Str.regexp("\\"), "/") |> Str.global_replace(Str.regexp("[/|\\]$"), "") |> (x => Sys.unix ? x : String.lowercase_ascii(x)); exception InvalidPackagePath(string); let duneFile = (projectPath, manifestFile, subpackagePath) => { let normalizedSubpackagePath = normalize(subpackagePath); let conf = PesyConf.get(manifestFile); let pkgs = PesyConf.pkgs(conf); let duneProjectPath = Path.(projectPath / "dune-project"); let duneVersion = DuneFile.ofFile(duneProjectPath) |> DuneProject.findLangVersion; let rootName = PesyConf.rootName(conf); let pesyPackages = try( pkgs |> List.map(PesyConf.toPesyConf(projectPath, rootName, ~duneVersion)) ) { | x => raise(x) }; /** TODO: Why compute for every subpackage? */ PesyConf.( switch ( pesyPackages |> List.find_opt(pesyPackage => normalize(pesyPackage.pkg_path) == normalizedSubpackagePath ) ) { | None => raise( InvalidPackagePath( "No package found with path: " ++ normalizedSubpackagePath, ), ) | Some(pesyPackage) => let (_, duneFile) = PesyConf.toDunePackages(projectPath, rootName, pesyPackage); DuneFile.toString(duneFile) |> print_endline; } ); }; let duneEject = (projectPath, manifestFile, subpackageNameOrPath) => { let normalizedSubpackageNameOrPath = normalize(subpackageNameOrPath); let conf = PesyConf.get(manifestFile); let pkgs = PesyConf.pkgs(conf); let duneProjectPath = Path.(projectPath / "dune-project"); let duneVersion = DuneFile.ofFile(duneProjectPath) |> DuneProject.findLangVersion; let rootName = PesyConf.rootName(conf); let pesyPackages = pkgs |> List.map(((pkgName, _) as pkg) => ( pkgName, PesyConf.toPesyConf(projectPath, rootName, pkg, ~duneVersion), ) ); switch ( pesyPackages |> List.find_opt(((pkgName, pesyPackage)) => { PesyConf.( normalize(pesyPackage.pkg_path) == normalizedSubpackageNameOrPath || pkgName == normalizedSubpackageNameOrPath ) }) ) { | None => raise( InvalidPackagePath( "No package found with path or name: " ++ normalizedSubpackageNameOrPath, ), ) | Some((pkgNameToEject, pesyPackage)) => let (_, duneFile) = PesyConf.toDunePackages(projectPath, rootName, pesyPackage); let newPkgs = pkgs |> List.filter(((pkgName, _)) => pkgName != pkgNameToEject); let newConf = switch (conf) { | `Assoc(newJson) => `Assoc( newJson |> List.map(((fieldName, _) as field) => fieldName != "buildDirs" ? field : (fieldName, `Assoc(newPkgs)) ), ) | _ => conf }; write( Path.(projectPath / "package.json"), JSON.pretty_to_string(newConf), ); write(Path.(pesyPackage.pkg_path / "dune"), DuneFile.toString(duneFile)); }; }; let validateManifestFile = (projectPath, manifestFile) => { let conf = PesyConf.get(manifestFile); let pkgs = PesyConf.pkgs(conf); let duneProjectPath = Path.(projectPath / "dune-project"); let duneVersion = DuneFile.ofFile(duneProjectPath) |> DuneProject.findLangVersion; let rootName = PesyConf.rootName(conf); ignore( pkgs |> List.map(PesyConf.toPesyConf(projectPath, rootName, ~duneVersion)), ); }; ================================================ FILE: lib/Library.re ================================================ module Utils = PesyEsyPesyUtils.Utils; open Utils; module Mode = { exception InvalidLibraryMode(string); type t = | Native | Byte | Best; let ofString = fun | "best" => Best | "native" => Native | "byte" => Byte | x => raise(InvalidLibraryMode(x)); let toString = fun | Best => "best" | Native => "native" | Byte => "byte"; }; type t = { name: string, public: bool, namespace: string, modes: option(list(Mode.t)), ffi: option(Stubs.t), virtualModules: option(list(string)), implements: option(list(string)), wrapped: option(bool), }; let create = (name, public, namespace, modes, ffi, virtualModules, implements, wrapped) => { name, public, namespace, modes, ffi, virtualModules, implements, wrapped, }; let toDuneStanza = (common, lib) => { /* let {name: pkgName, require, path} = common */ let { name, public, namespace, modes: modesP, ffi: stubsP, virtualModules: virtualModulesP, implements: implementsP, wrapped: wrappedP, } = lib; let ( libraries, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModulesLibrary, pesyModulesAliasModuleGen, ) = Common.toDuneStanzas(common); let path = Common.getPath(common); let public_name = if (public) { Stanza.createAtom(name) |> Stanza.create("public_name") |> Option.some } else { None }; // pesy's name is Dune's public_name let name = Stanza.create("name", Stanza.createAtom(namespace)); let modules = Stanza.createExpression([ Stanza.createAtom("modules"), Stanza.createExpression( [Stanza.createAtom(":standard")] @ ( switch (Common.getPesyModules(common)) { | Some(x) => [ Stanza.createAtom("\\"), Stanza.createAtom(PesyModule.getNamespace(x)), ] | None => [] } ), ), ]); let modesD = switch (modesP) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("modes"), ...List.map(m => m |> Mode.toString |> Stanza.createAtom, l), ]), ) }; let stubsD = Stubs.toDuneStanza(stubsP); let virtualModulesD = switch (virtualModulesP) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("virtual_modules"), ...List.map(Stanza.createAtom, l), ]), ) }; let implementsD = switch (implementsP) { | None => None | Some(l) => Some( Stanza.createExpression([ Stanza.createAtom("implements"), ...List.map(Stanza.createAtom, l), ]), ) }; let wrappedD = switch (wrappedP) { | None => None | Some(w) => Some( Stanza.createExpression([ Stanza.createAtom("wrapped"), Stanza.createAtom(string_of_bool(w)), ]), ) }; let mandatoryExpressions = [name, modules]; let optionalExpressions = [ public_name, libraries, modesD, virtualModulesD, implementsD, wrappedD, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, ...stubsD, ]; let rawBuildConfig = switch (rawBuildConfig) { | Some(l) => l | None => [] }; let rawBuildConfigFooter = switch (rawBuildConfigFooter) { | Some(l) => l | None => [] }; let optionalRootStanzas = rawBuildConfigFooter @ ( switch (pesyModulesLibrary) { | Some(s) => [s] | None => [] } ) @ ( switch (pesyModulesAliasModuleGen) { | Some(s) => [s] | None => [] } ) @ ( switch (includeSubdirs) { | Some(s) => [s] | None => [] } ); let library = Stanza.createExpression([ Stanza.createAtom("library"), ...mandatoryExpressions @ filterNone(optionalExpressions) @ rawBuildConfig, ]); (path, [library, ...optionalRootStanzas]); }; ================================================ FILE: lib/Library.rei ================================================ module Mode: { exception InvalidLibraryMode(string); type t; let ofString: string => t; let toString: t => string; }; type t; let create: ( string, bool, string, option(list(Mode.t)), option(Stubs.t), option(list(string)), option(list(string)), option(bool) ) => t; let toDuneStanza: (Common.t, t) => (string, list(Stanza.t)); ================================================ FILE: lib/Mode.re ================================================ module EsyEnv = { type t' = | UPDATE; /* | BUILD; */ }; ================================================ FILE: lib/Parser.mly ================================================ %token LPAREN RPAREN SEMICOLON %token EOL ASSN SQUOTE EOF REQUIRE %token MODULE_NAME %token MODULE_PATH %start main /* the entry point */ %type main %% main: MODULE_NAME ASSN REQUIRE LPAREN SQUOTE MODULE_PATH SQUOTE RPAREN EOF { ($1, $6) } | MODULE_NAME ASSN REQUIRE LPAREN SQUOTE MODULE_PATH SQUOTE RPAREN SEMICOLON EOF { ($1, $6) } ; ================================================ FILE: lib/PesyConf.re ================================================ open Printf; module Utils = PesyEsyPesyUtils.Utils; open Utils; open PesyEsyPesyErrors.Errors; /***** localName ~~> dunePublicName pesy_modules_namespace ~~> namespace modules ~~> aliases ***/ type pkgType = | ExecutablePackage(Executable.t) | LibraryPackage(Library.t) | TestPackage(Test.t); type package = { pkg_path: string, common: Common.t, pkgType, }; module Version = { type t = | V1(int) | V2(int) | V3(int); let ofString = version => { let vs = String.split_on_char('.', version) |> List.map(int_of_string); switch (vs) { | [1, minorVersion] => V1(minorVersion) | [2, minorVersion] => V2(minorVersion) | [3, minorVersion] => V3(minorVersion) | _ => raise(InvalidDuneVersion(version)) }; }; }; /* private */ exception ShouldHaveRaised(unit); let findIndex = (s1, s2) => { let re = Str.regexp_string(s2); try(Str.search_forward(re, s1, 0)) { | Not_found => (-1) }; }; let resolveRelativePath = path => { let separator = "/"; let revParts = List.rev(Str.split(Str.regexp(separator), path)); let rec resolve = (parts, skipCount, acc) => { switch (parts) { | ["..", ...r] => resolve(r, skipCount + 1, acc) | [".", ...r] => resolve(r, skipCount, acc) | [h, ...r] => resolve( r, skipCount > 0 ? skipCount - 1 : 0, skipCount == 0 ? [h, ...acc] : acc, ) | [] => if (skipCount == 0) { acc; } else { raise( ResolveRelativePathFailure( sprintf("Failed resolving: %s Too many `../`", path), ), ); } }; }; let dirSepChar = Filename.dir_sep.[0]; (path.[0] == dirSepChar ? Filename.dir_sep : "") ++ String.concat(separator, resolve(revParts, 0, [])); }; let specialCaseOpamRequires = package => Str.global_replace(Str.regexp("^@opam/"), "", package); module Result = { let bind = (o, f) => switch (o) { | Ok(x) => f(x) | Error(e) => Error(e) }; let ( let* ) = (x, f) => bind(x, f); }; let isValidScopeName = n => { n.[0] == '@'; }; let resolveDepNameToFindlib = depName => { let skipEnvVar = envVar => Array.fold_left( (acc, e) => if (Str.string_match( Str.regexp(Printf.sprintf("%s=.*", envVar)), e, 0, )) { acc; } else { [e, ...acc]; }, [], ); let list_diff = (l1, l2) => { l1 |> List.filter(e => !List.mem(e, l2)); }; /** The above parses {| foo (version: n/a) foo.lib (version: n/a) foo.bar.lib (version: n/a) |} to [["foo"], ["foo", "lib"], ["foo", "bar", "lib"]] */ let parseRelevantFindlibOutput = relevantFindlibOutputLines => relevantFindlibOutputLines |> List.map(x => Str.split(Str.regexp(" "), x) |> List.hd |> Str.split(Str.regexp("\\.")) ); let safeSeg = name => { /* Taken from esy's source */ let replaceAt = Str.regexp("@"); let replaceUnderscore = Str.regexp("_+"); let replaceSlash = Str.regexp("\\/"); let replaceDash = Str.regexp("\\-"); let replaceColon = Str.regexp(":"); name |> String.lowercase_ascii |> Str.global_replace(replaceAt, "") |> Str.global_replace(replaceUnderscore, "__") |> Str.global_replace(replaceSlash, "__s__") |> Str.global_replace(replaceColon, "__c__") |> Str.global_replace(replaceDash, "_"); }; let fullDepNameParts = Str.split(Str.regexp("/"), depName); let (depName, remainingParts) = switch (fullDepNameParts) { | [] => failwith("How can this be empty?") | [x] => (x, []) | [x, y, ...rest] => if (isValidScopeName(x)) { (x ++ "/" ++ y, rest); } else { (x, [y, ...rest]); } }; let process_env = Unix.environment() |> skipEnvVar("ESY__ROOT_PACKAGE_CONFIG_PATH"); let esyfiedDepName = safeSeg(depName); open Result; let* ocamlpath = switch (Sys.getenv_opt("OCAMLPATH")) { | Some(v) => Ok(v) | None => Error("OCAMLPATH not found in env") }; let candidates = Str.split(Str.regexp(Sys.unix ? ":" : ";"), ocamlpath) |> List.filter_map(v => if (Str.string_match( Str.regexp(".*" ++ esyfiedDepName ++ "-.*"), v, 0, )) { let (_exitCode, emptyOutput) = run( ~env= Array.of_list([ "OCAMLPATH=", ...process_env |> List.filter(x => x != "OCAMLPATH"), ]), "ocamlfind", [|"list"|], ); let (_exitCode, depOutput) = run( ~env= Array.of_list([ Printf.sprintf("OCAMLPATH=%s", v), ...process_env |> List.filter(x => x != "OCAMLPATH"), ]), "ocamlfind", [|"list"|], ); let relevantFindlibOutputLines = list_diff(depOutput, emptyOutput); let listOfLibraryNameAsList = parseRelevantFindlibOutput(relevantFindlibOutputLines); /** Since the library base name (say foo) need not match the npm package name, we are only going to compare the rest (["lib"], ["bar", "lib"] etc) */ let listOfCandidateLibraryNameAsList = listOfLibraryNameAsList |> List.filter_map( fun | [] => None | [_, ...rest] as libraryNameAsList => if (rest == remainingParts) { Some(libraryNameAsList); } else { None; }, ); switch (listOfCandidateLibraryNameAsList) { | [] => None | candidateLibraryNameAsList => switch (candidateLibraryNameAsList) { | [] => None | x => Some(x |> List.map(String.concat("/"))) } }; } else { None; } ) |> List.flatten; switch (candidates) { | [] => Error( Printf.sprintf( "Library %s not found", String.concat("/", [depName, ...remainingParts]), ), ) | [candidate] => Ok(candidate) | multipleCandidates => Error( Printf.sprintf( {|Multiple candidates found for %s %s|}, depName, multipleCandidates |> String.concat("\n"), ), ) }; }; let isValidBinaryFileName = fileName => Str.string_match(Str.regexp("^.+\\.exe$"), fileName, 0); let isValidSourceFile = fileName => Str.string_match(Str.regexp("^.+\\.\\(re\\|ml\\)$"), fileName, 0); /* Turns "Foo.re as Foo.exe" => ("Foo.re", "Foo.exe") */ /* Turns "foo/bar/baz" => "foo.bar.baz" */ let pathToOCamlLibName = p => Str.global_replace(Str.regexp("/"), ".", p); let stripAtTheRate = s => String.sub(s, 1, String.length(s) - 1); /* doubleKebabifyIfScoped turns @myscope/pkgName => myscope--pkgName */ let doubleKebabifyIfScoped = n => { switch (Str.split(Str.regexp("/"), n)) { | [pkgName] => pkgName | [scope, pkgName, ...rest] => isValidScopeName(scope) ? String.concat( "/", [stripAtTheRate(scope) ++ "--" ++ pkgName, ...rest], ) : String.concat("/", [scope, pkgName, ...rest]) | _ => raise(InvalidRootName(n)) }; }; type t = (string, list(package)); let toPesyConf = (projectPath, rootName, pkg, ~duneVersion) => { let (dir, conf) = pkg; let binJSON = JSON.member(conf, "bin"); let bin = try( Some( { JSON.toKeyValuePairs(binJSON) |> List.map(kv => { let (k, v) = kv; ( /* Value is the source .re file */ v |> JSON.toValue |> FieldTypes.toString, /* Key is the target executable name */ k, ); }); }, ) ) { | JSON.NullJSONValue(_) => None /* If its a string and not a JSON */ | JSON.InvalidJSONValue(_) => let binaryMainFile = try(binJSON |> JSON.toValue |> FieldTypes.toString) { | _ => raise(InvalidBinProperty(dir)) }; if (!isValidSourceFile(binaryMainFile)) { raise(InvalidBinProperty(dir)); }; Some([(binaryMainFile, moduleNameOf(binaryMainFile) ++ ".exe")]); | e => raise(e) }; /* Pesy'name is Dune's public_name */ /* If name is provided and binary's public_name is also provided in the bin property, name takes precedence */ let name = try(JSON.member(conf, "name") |> JSON.toValue |> FieldTypes.toString) { | JSON.NullJSONValue(_) => switch (bin) { | Some(names) => names |> List.map(((_mainFileName, installedBinaryName)) => installedBinaryName ) |> List.hd | None => rootName ++ "." ++ pathToOCamlLibName(dir) } | e => raise(e) }; let public = try(JSON.member(conf, "public") |> JSON.toValue |> FieldTypes.toBool) { | JSON.NullJSONValue(_) => false | e => raise(e) }; let (<|>) = (f, g, x) => g(f(x)); /* "my-package/lib/here" => "my-package.lib.here" */ let require = try( JSON.member(conf, "require") |> JSON.toValue |> FieldTypes.toList |> List.map( FieldTypes.toString <|> ( x => x.[0] == '.' ? sprintf("%s/%s/%s", rootName, dir, x) : x ) <|> resolveRelativePath <|> ( x => x.[0] == '@' ? if (findIndex(doubleKebabifyIfScoped(x), rootName) != 0) { switch (x |> resolveDepNameToFindlib) { | Ok(x) => x | Error(msg) => raise(Failure(msg)) }; } else { x |> doubleKebabifyIfScoped; } : x ) <|> pathToOCamlLibName, ) ) { | JSON.NullJSONValue(_) => [] | e => raise(e) }; let imports = try( JSON.member(conf, "imports") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString <|> ImportsParser.parse) ) { | JSON.NullJSONValue(_) => [] | _e => raise(ImportsParserFailure()) }; let modesAsFieldTypes = try(Some(JSON.member(conf, "modes") |> JSON.toValue)) { | JSON.NullJSONValue () => None | e => raise(e) }; let modes = switch (modesAsFieldTypes) { | Some(modesAsFieldTypes) => try(Some(Executable.Mode.ofFieldTypes(modesAsFieldTypes))) { | _ => None } | None => None }; let pesyModuleNamespace = [rootName] @ String.split_on_char('/', dir) @ ["PesyModules"] |> List.map(upperCamelCasify) |> List.fold_left((++), ""); let isLocalLibrary = path => findIndex(path, rootName) == 0; let aliases = imports |> List.map(import => { let (exportedNamespace, lib) = import; let libraryAsPath = lib |> ( x => { x.[0] == '.' ? sprintf("%s/%s/%s", rootName, dir, x) : x; } ) |> resolveRelativePath |> ( x => x.[0] == '@' ? if (findIndex(doubleKebabifyIfScoped(x), rootName) != 0) { switch (x |> resolveDepNameToFindlib) { | Ok(x) => x | Error(msg) => raise(Failure(msg)) }; } else { x |> doubleKebabifyIfScoped; } : x ); let stripRootName = Str.global_replace(Str.regexp(rootName ++ "/"), ""); let basePathToRequirePkg = libraryAsPath |> stripRootName |> (x => Path.(projectPath / x)) |> resolveRelativePath; if (isLocalLibrary(libraryAsPath)) { if (!Sys.file_exists(basePathToRequirePkg)) { raise(PesyEsyPesyErrors.Errors.LocalLibraryPathNotFound(lib)); }; }; let originalNamespace = if (isLocalLibrary(libraryAsPath)) { libraryAsPath |> String.split_on_char('/') |> List.map(upperCamelCasify) |> List.fold_left((++), ""); } else { /** ie. external library. We use findlib and figure out namespace **/ let findlibQueryModes = switch (modesAsFieldTypes) { | Some(modes) => modes |> FieldTypes.toList |> List.map(FieldTypes.toString) | None => ["native"] }; Str.global_replace( Str.regexp("\\.cm.*"), "", Findlib.package_property( findlibQueryModes, pathToOCamlLibName(libraryAsPath), "archive", ), ) |> String.mapi((i, c) => i == 0 ? Char.uppercase_ascii(c) : c); }; PesyModule.Alias.create( ~alias={ switch ( List.fold_left( (accExt, ext) => List.fold_left( (accEntry, entry) => { switch (accEntry) { | Some(x) => Some(x) | None => if (findIndex(libraryAsPath, rootName) != 0) { Some( sprintf( "module %s = %s;", exportedNamespace, originalNamespace, ), ); } else if (Sys.file_exists( Path.(basePathToRequirePkg / entry) ++ ext, ) || Sys.file_exists( Path.( basePathToRequirePkg / String.lowercase_ascii(entry) ) ++ ext, )) { Some( sprintf( "module %s = %s.%s;", exportedNamespace, originalNamespace, entry, ), ); } else { None; } } }, accExt, ["Index", exportedNamespace] /* If it finds, Index.re, it doesn't look for Bar.re */ ), None, [".re", ".ml"], ) ) { | Some(x) => x | None => sprintf( "module %s = %s;", exportedNamespace, originalNamespace, ) }; }, ~internal=isLocalLibrary(libraryAsPath), ~library=pathToOCamlLibName(libraryAsPath), ~originalNamespace, ~exportedNamespace, ); }); let aliasesWithDifferentNamespace = PesyModule.Alias.( aliases |> List.filter(alias => alias.originalNamespace != alias.exportedNamespace ) ); /* Ex: Pastel = require('pastel/lib'). In this case, we should skip aliasing. See: https://github.com/esy/pesy/issues/171 */ let aliasesWithSameNamespace = PesyModule.Alias.( aliases |> List.filter(alias => alias.originalNamespace == alias.exportedNamespace ) ); let pesyModules = PesyModule.create( ~namespace=pesyModuleNamespace, ~dunePublicName= sprintf( "%s.pesy-modules", pathToOCamlLibName(rootName ++ "/" ++ dir), ), ~aliases=aliasesWithDifferentNamespace, ); let fromListOrString = ls => try(FieldTypes.toList(ls)) { | FieldTypes.ConversionException("Expected list. Actual string") => FieldTypes.toString(ls) |> Str.split(Str.regexp("[ \n\r\x0c\t]+")) |> List.map(s => FieldTypes.String(s)) | e => raise(e) }; let flags = try( Some( JSON.member(conf, "flags") |> JSON.toValue |> fromListOrString |> List.map(FieldTypes.toString), ) ) { | _ => None }; let ocamlcFlags = try( Some( JSON.member(conf, "ocamlcFlags") |> JSON.toValue |> fromListOrString |> List.map(FieldTypes.toString), ) ) { | _ => None }; let ocamloptFlags = try( Some( JSON.member(conf, "ocamloptFlags") |> JSON.toValue |> fromListOrString |> List.map(FieldTypes.toString), ) ) { | _ => None }; let jsooFlags = try( Some( JSON.member(conf, "jsooFlags") |> JSON.toValue |> fromListOrString |> List.map(FieldTypes.toString), ) ) { | _ => None }; let preprocess = try( Some( JSON.member(conf, "preprocess") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString), ) ) { | _ => None }; let includeSubdirs = try( Some( JSON.member(conf, "includeSubdirs") |> JSON.toValue |> FieldTypes.toString, ) ) { | JSON.NullJSONValue(_) => None | e => raise(e) }; let rawBuildConfig = try( Some( JSON.member(conf, "rawBuildConfig") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString), ) ) { | _ => None }; let rawBuildConfigFooter = try( Some( JSON.member(conf, "rawBuildConfigFooter") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString), ) ) { | _ => None }; let pkg_path = Path.(projectPath / dir); let common = Common.create( Path.(projectPath / dir), List.append( require, PesyModule.Alias.( aliasesWithSameNamespace |> List.map(pesyModule => pesyModule.library) ), ), flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModules, ); /* Prioritising `bin` over `name` */ switch (bin) { | Some(binKVs) => //bins |> List.map(((mainFileName, _installedBinaryName)) => moduleNameOf(mainFileName)) { pkg_path, common, pkgType: ExecutablePackage(Executable.create(binKVs, modes)), } | None => let namespace = try( JSON.member(conf, "namespace") |> JSON.toValue |> FieldTypes.toString ) { | JSON.NullJSONValue () => sprintf("%s/%s", rootName, dir) |> String.split_on_char('/') |> List.map(upperCamelCasify) |> List.fold_left((++), "") | e => raise(e) }; let libraryModes = try( Some( JSON.member(conf, "modes") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString) |> List.map(Library.Mode.ofString), ) ) { | JSON.NullJSONValue () => None | e => raise(e) }; let cStubs = cns => try( JSON.toValue(cns) |> FieldTypes.toList |> List.map(FieldTypes.toString) ) { | e => raise(e) }; let foreignStubs = fss => try( JSON.toListKVPairs(fss) |> List.map(kvs => List.map( kv => { let (k, v) = kv; (k, v |> JSON.toValue); }, kvs, ) ) ) { | e => raise(e) }; let (cnJSON, fsJSON) = ( JSON.member(conf, "cNames"), JSON.member(conf, "foreignStubs"), ); let ffi = switch ( Version.ofString(duneVersion), JSON.toOption(cnJSON), JSON.toOption(fsJSON), ) { | (V1(_), None, None) => None | (V1(_), Some(cn), None) | (V1(_), Some(cn), Some(_)) => Some(Stubs.ofCNames(cStubs(cn))) | (V1(_), None, Some(_)) => raise(ForeignStubsIncorrectlyUsed) /* foreign stubs is supported in version > 1.0 */ | (_, None, None) => None | (_, Some(_), None) => raise(CNamesIncorrectlyUsed) | (_, None, Some(fs)) | (_, Some(_), Some(fs)) => Some(Stubs.ofForeignStubs(foreignStubs(fs))) }; let virtualModules = try( Some( JSON.member(conf, "virtualModules") |> JSON.toValue |> FieldTypes.toList |> List.map(FieldTypes.toString), ) ) { | JSON.NullJSONValue () => None | e => raise(e) }; let implements = try( Some( JSON.member(conf, "implements") |> JSON.toValue |> FieldTypes.toList |> List.map( FieldTypes.toString <|> ( x => x.[0] == '.' ? sprintf("%s/%s/%s", rootName, dir, x) : x ) <|> ( x => x.[0] == '@' ? if (findIndex(doubleKebabifyIfScoped(x), rootName) != 0) { switch (x |> resolveDepNameToFindlib) { | Ok(x) => x | Error(msg) => raise(Failure(msg)) }; } else { x |> doubleKebabifyIfScoped; } : x ) <|> resolveRelativePath <|> pathToOCamlLibName, ), ) ) { | JSON.NullJSONValue () => None | e => raise(e) }; let wrapped = try( Some( JSON.member(conf, "wrapped") |> JSON.toValue |> FieldTypes.toBool, ) ) { | JSON.NullJSONValue () => None | e => raise(e) }; { pkg_path, common, pkgType: LibraryPackage( Library.create( name, public, namespace, libraryModes, ffi, virtualModules, implements, wrapped, ), ), }; }; }; let toDunePackages = (_prjPath, _rootName, pkg) => { switch (pkg.pkgType) { | LibraryPackage(l) => Library.toDuneStanza(pkg.common, l) | ExecutablePackage(e) => Executable.toDuneStanza(pkg.common, e) | TestPackage(e) => Test.toDuneStanza(pkg.common, e) }; }; /* TODO: Figure better test setup */ /** DEPRECATED: Pesy is not supposed to be run in build env https://github.com/jchavarri/rebez/issues/4 **/; /* let validateDuneFiles = (projectPath, pkgPath) => { */ /* let json = JSON.fromFile(pkgPath); */ /* let (rootName, pesyPackages) = toPesyConf(projectPath, json); */ /* let rootNameOpamFile = rootName ++ ".opam"; */ /* let dunePackages = toDunePackages(projectPath, rootName, pesyPackages); */ /* let staleDuneFiles = */ /* dunePackages */ /* |> List.map(dpkg => { */ /* let (path, updatedDuneFile) = dpkg; */ /* let currentDuneFilePath = Path.(path / "dune"); */ /* (updatedDuneFile, currentDuneFilePath); */ /* }) */ /* |> List.filter(dpkg => { */ /* let (updatedDuneFile, currentDuneFilePath) = dpkg; */ /* updatedDuneFile != DuneFile.ofFile(currentDuneFilePath); */ /* }) */ /* |> List.map(t => { */ /* let (_updatedDuneFile, currentDuneFilePath) = t; */ /* currentDuneFilePath; */ /* }); */ /* let foundAnOpamFile = ref(false); */ /* let dirForEachEntry = (f, dirname) => { */ /* let d = Unix.opendir(dirname); */ /* try( */ /* while (true) { */ /* f(Unix.readdir(d)); */ /* } */ /* ) { */ /* | End_of_file => Unix.closedir(d) */ /* }; */ /* }; */ /* let contains = (n, s) => */ /* try(Str.search_forward(Str.regexp(s), n, 0) != (-1)) { */ /* | Not_found => false */ /* }; */ /* let staleOpamFile = ref(None); */ /* dirForEachEntry( */ /* n => */ /* if (contains(n, ".opam") && ! foundAnOpamFile^) { */ /* foundAnOpamFile := true; */ /* if (n != rootNameOpamFile) { */ /* staleOpamFile := Some((n, rootNameOpamFile)); */ /* }; */ /* }, */ /* projectPath, */ /* ); */ /* let errors = */ /* List.map(x => StaleDuneFile(x), staleDuneFiles) */ /* @ ( */ /* switch (staleOpamFile^) { */ /* | Some(x) => [StaleOpamFile(x)] */ /* | None => [] */ /* } */ /* ); */ /* if (List.length(errors) != 0) { */ /* raise(BuildValidationFailures(errors)); */ /* }; */ /* Str.global_replace(Str.regexp(".opam"), "", rootNameOpamFile); */ /* }; */ /* "name" in root package.json */ let rootName = json => try( doubleKebabifyIfScoped( JSON.member(json, "name") |> JSON.toValue |> FieldTypes.toString, ) ) { | JSON.NullJSONValue () => raise(ShouldNotBeNull("name")) | x => raise(x) }; let get = manifestFile => { JSON.fromFile(manifestFile); }; let pkgs = json => JSON.toKeyValuePairs(JSON.member(json, "buildDirs")); ================================================ FILE: lib/PesyModule.re ================================================ module Alias = { type t = { alias: string, library: string, internal: bool, // if an alias is for a local sub-library originalNamespace: string, exportedNamespace: string, }; let create = (~alias, ~internal, ~library, ~originalNamespace, ~exportedNamespace) => { {alias, library, internal, originalNamespace, exportedNamespace}; }; let isInternal = x => x.internal; let getOriginalNamespace = x => x.originalNamespace; let getLibrary = x => x.library; let transform = (~f, x) => f(x); let toReStatement = a => a.alias; }; type t' = { namespace: string, dunePublicName: string, aliases: list(Alias.t), }; type t = option(t'); let getNamespace = pm => pm.namespace; let getDunePublicName = pm => pm.dunePublicName; let create: (~namespace: string, ~dunePublicName: string, ~aliases: list(Alias.t)) => t = (~namespace, ~dunePublicName, ~aliases) => { List.length(aliases) == 0 ? None : Some({namespace, dunePublicName, aliases}); }; let generateAliasModuleStanza = pesyModules => switch (pesyModules) { | Some(x) => let pesyModulesReFile = x.aliases |> List.map(Alias.toReStatement) |> String.concat("\n"); Some( Stanza.createExpression([ Stanza.createAtom("rule"), Stanza.createExpression([ Stanza.createAtom("with-stdout-to"), Stanza.createAtom(Printf.sprintf("%s.re", x.namespace)), Stanza.createExpression([ Stanza.createAtom("run"), Stanza.createAtom("echo"), Stanza.createAtom(Printf.sprintf("%s", pesyModulesReFile)), ]), ]), ]), ); | None => None }; let generateLibraryStanza = (preprocess, pesyModules) => { let preprocessStanza = switch (preprocess) { | None => [] | Some(l) => [ Stanza.createExpression([ Stanza.createAtom("preprocess"), Stanza.createExpression(List.map(f => Stanza.createAtom(f), l)), ]), ] }; switch (pesyModules) { | Some(x) => Some( Stanza.createExpression([ Stanza.createAtom("library"), Stanza.createExpression([ Stanza.createAtom("name"), Stanza.createAtom(x.namespace), ]), Stanza.createExpression([ Stanza.createAtom("modules"), Stanza.createAtom(x.namespace), ]), Stanza.createExpression([ Stanza.createAtom("libraries"), ...{ module SS = Set.Make(String); x.aliases |> List.map(alias => Alias.isInternal(alias) ? Alias.getOriginalNamespace(alias): Alias.getLibrary(alias)) |> SS.of_list |> SS.elements |> List.map(Alias.transform(~f=Stanza.createAtom)); }, ]), ...preprocessStanza, ]), ) | None => None }; }; ================================================ FILE: lib/Stanza.re ================================================ open Sexplib.Sexp; type t = Sexplib.Sexp.t; let createAtom = a => Atom(a); let create = (stanza: string, expression) => List([Atom(stanza), expression]); let createExpression = atoms => List(atoms); let ofString = s => Sexplib.Parser.sexp(Sexplib.Lexer.main, Lexing.from_string(s)); let toSexp = x => x; let ofSexp = x => x; ================================================ FILE: lib/Stanza.rei ================================================ type t; let create: (string, t) => t; let createAtom: string => t; let createExpression: list(t) => t; let toSexp: t => Sexplib.Sexp.t; let ofSexp: Sexplib.Sexp.t => t; let ofString: string => t; ================================================ FILE: lib/Stubs.re ================================================ module Utils = PesyEsyPesyUtils.Utils; open Utils; type t = | CNames(list(string)) | ForeignStubs(list(list((string, FieldTypes.t)))); let ofCNames = cns => CNames(cns); let ofForeignStubs = fss => ForeignStubs(fss); module ForeignStub = { exception LanguageNotSupported(string); module Language = { type t = | C | CXX; let ofString = fun | "c" => C | "cxx" => CXX | x => raise(LanguageNotSupported(x)); let toString = fun | C => "c" | CXX => "cxx"; }; type t = { language: Language.t, names: option(list(string)), flags: option(list(string)), }; let ofFieldTypes = tfts => { /* Note: here language is set C as default value it will be replaced by the correct value in the below pattern match */ let fs = ref({language: Language.C, names: None, flags: None}); List.iter( tft => { switch (tft) { | ("names", ft) => fs := { ...fs^, names: switch (FieldTypes.toList(ft)) { | [] => None | l => Some(List.map(FieldTypes.toString, l)) }, } | ("flags", ft) => fs := { ...fs^, flags: switch (FieldTypes.toList(ft)) { | [] => None | l => Some(List.map(FieldTypes.toString, l)) }, } | ("language", ft) => fs := {...fs^, language: Language.ofString(FieldTypes.toString(ft))} | _ => () } }, tfts, ); fs^; }; let toDuneStanza = fs => { let stanzas = []; stanzas @ [ Stanza.createExpression([ Stanza.createAtom("language"), Stanza.createAtom(Language.toString(fs.language)), ]), ] @ ( switch (fs.names) { | None | Some([]) => [ Stanza.createExpression([ Stanza.createAtom("names"), Stanza.createAtom(":standard"), ]), ] | Some(xs) => [ Stanza.createExpression([ Stanza.createAtom("names"), ...List.map(Stanza.createAtom, xs), ]), ] } ) @ ( switch (fs.flags) { | None | Some([]) => [ Stanza.createExpression([ Stanza.createAtom("flags"), Stanza.createAtom(":standard"), ]), ] | Some(xs) => [ Stanza.createExpression([ Stanza.createAtom("flags"), ...List.map(Stanza.createAtom, xs), ]), ] } ); }; }; let cNamesD = cNamesP => [ Some( Stanza.createExpression([ Stanza.createAtom("c_names"), ...List.map(Stanza.createAtom, cNamesP), ]), ), ]; let foreignStubsD = foreignStubsP => List.map(ForeignStub.ofFieldTypes, foreignStubsP) |> List.map(fs => Some( Stanza.createExpression([ Stanza.createAtom("foreign_stubs"), ...ForeignStub.toDuneStanza(fs), ]), ) ); let toDuneStanza = stubsP => switch (stubsP) { | Some(s) => switch (s) { | CNames(cNamesP) => cNamesD(cNamesP) | ForeignStubs(foreignStubsP) => foreignStubsD(foreignStubsP) } | None => [None] }; ================================================ FILE: lib/Stubs.rei ================================================ module Utils = PesyEsyPesyUtils.Utils; open Utils; type t; let ofCNames: list(string) => t; let ofForeignStubs: list(list((string, FieldTypes.t))) => t; let toDuneStanza: option(t) => list(option(Stanza.t)); ================================================ FILE: lib/Test.re ================================================ open Printf; module Utils = PesyEsyPesyUtils.Utils; open Utils; module Mode = { exception InvalidCompilationMode(unit); exception InvalidBinaryKind(unit); module Compilation: { type t; let toString: t => string; let ofString: string => t; } = { type t = | Byte | Native | Best; let toString = fun | Byte => "byte" | Native => "native" | Best => "best"; let ofString = fun | "byte" => Byte | "native" => Native | "best" => Best | _ => raise(InvalidCompilationMode()); }; module BinaryKind: { type t; let toString: t => string; let ofString: string => t; } = { type t = | C | Exe | Object | Shared_object; let toString = fun | C => "c" | Exe => "exe" | Object => "object" | Shared_object => "shared_object"; let ofString = fun | "c" => C | "exe" => Exe | "object" => Object | "shared_object" => Shared_object | _ => raise(InvalidBinaryKind()); }; type t = (Compilation.t, BinaryKind.t); exception InvalidExecutableMode(string); let ofList = parts => switch (parts) { | [c, b] => (Compilation.ofString(c), BinaryKind.ofString(b)) | _ => raise( InvalidExecutableMode( sprintf( "Invalid executable mode: expected of the form (, ). Got %s", List.fold_left((a, e) => sprintf("%s %s", a, e), "", parts), ), ), ) }; let toList = m => { let (c, b) = m; [Compilation.toString(c), BinaryKind.toString(b)]; }; }; type t = { main: string, modes: option(Mode.t), }; let create = (main, modes) => {main, modes}; let toDuneStanza = (common: Common.t, e) => { /* let {name: pkgName, require, path} = common; */ let {main, modes: modesP} = e; let ( libraries, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, includeSubdirs, rawBuildConfig, rawBuildConfigFooter, pesyModulesLibrary, pesyModulesAliasModuleGen, ) = Common.toDuneStanzas(common); let path = Common.getPath(common); /* Pesy's main is Dune's name */ let name = Stanza.create("name", Stanza.createAtom(main)); let modules = Stanza.createExpression([ Stanza.createAtom("modules"), Stanza.createExpression( [Stanza.createAtom(":standard")] @ ( switch (Common.getPesyModules(common)) { | Some(x) => [ Stanza.createAtom("\\"), Stanza.createAtom(PesyModule.getNamespace(x)), ] | None => [] } ), ), ]); /* let public_name = */ /* Stanza.create("public_name", Stanza.createAtom(pkgName)); */ /* let libraries = */ /* switch (require) { */ /* | [] => None */ /* | libs => */ /* Some( */ /* Stanza.createExpression([ */ /* Stanza.createAtom("libraries"), */ /* ...List.map(r => Stanza.createAtom(r), libs), */ /* ]), */ /* ) */ /* }; */ let modesD = switch (modesP) { | None => None | Some(m) => Some( Stanza.createExpression([ Stanza.createAtom("modes"), Stanza.createExpression( m |> Mode.toList |> List.map(Stanza.createAtom), ), ]), ) }; let mandatoryExpressions = [name, modules]; let optionalExpressions = [ libraries, modesD, flags, ocamlcFlags, ocamloptFlags, jsooFlags, preprocess, pesyModulesLibrary, ]; let rawBuildConfig = switch (rawBuildConfig) { | Some(l) => l | None => [] }; let rawBuildConfigFooter = switch (rawBuildConfigFooter) { | Some(l) => l | None => [] }; let optionalRootStanzas = rawBuildConfigFooter @ ( switch (pesyModulesLibrary) { | Some(s) => [s] | None => [] } ) @ ( switch (pesyModulesAliasModuleGen) { | Some(s) => [s] | None => [] } ) @ ( switch (includeSubdirs) { | Some(s) => [s] | None => [] } ); let executable = Stanza.createExpression([ Stanza.createAtom("test"), ...mandatoryExpressions @ filterNone(optionalExpressions) @ rawBuildConfig, ]); (path, [executable, ...optionalRootStanzas]); }; ================================================ FILE: lib/Test.rei ================================================ type t; module Mode: { type t; let ofList: list(string) => t; let toList: t => list(string); }; let create: (string, option(Mode.t)) => t; let toDuneStanza: (Common.t, t) => (string, list(Stanza.t)); ================================================ FILE: lib/dune ================================================ (library (name PesyEsyPesyLib) (public_name pesy--esy-pesy.lib) (modules (:standard)) (libraries str sexplib findlib pesy--esy-pesy.utils pesy--esy-pesy.errors)) (rule (targets Lexer.ml) (deps Lexer.mll) (action (run %{bin:ocamllex} -q -o %{targets} %{deps}))) (rule (targets Parser.ml Parser.mli) (deps Parser.mly) (action (run %{bin:ocamlyacc} %{deps}))) ================================================ FILE: notes/benchmarking.md ================================================ The results of benchmarking a sample "generateEverything.sh" script: DELTAms 5 DELTAms 11 - detect shell DELTAms 6 - setup variables DELTAms 10 - define functions DELTAms 11 - define build variables DELTAms 8 - print directories DELTAms 9 - check lib dir DELTAms 30 - create lib build file DELTAms 12 - verify lib build existing contents DELTAms 12 - setup bin vars DELTAms 8 - check bin main mod name DELTAms 10 - check bin main module exists DELTAms 28 - read existing dune bin contents DELTAms 23 - create bin dune contents DELTAms 5 - check bin against required bin DELTAms 8 - check root dune exists DELTAms 4 - check opam file exists DELTAms -989 - check root dune-project file exists DELTAms 82 - perform actual build Build Succeeded! To test a binary: esy x ChalkConsole.exe DELTAms 5 - check build failure DELTAms 8 - end DELTAms 5 - end For the following manually instrumented profiling of that script file (requires gdate be installed). I've since improved the detect shell step (avoided using grep subprocess). All that really matters is the time it takes to run the genEverything script. It doesn't matter how long it takes to generate the genEverything script. The biggest impacts for optimization of running genEverything would be: 1. Omitting fields in the generated dune files that aren't present in the package.json config. Note that each measurement has an additional 5ms overhead apparently (so subtract about 5ms for each measurement to get the real time). Some smaller improvements: - md5 takes about 7ms to execute which blocks running of genEverything.sh, but just checking for if md5 program exists is time consuming. If we have a previous build hash, we don't need to check Run it in a project by doing `esy b ./_build/genEverything.sh` ```sh #!/bin/bash set -e set -u BOLD=`tput bold` || BOLD='' # Select bold mode BLACK=`tput setaf 0` || BLACK='' RED=`tput setaf 1` || RED='' GREEN=`tput setaf 2` || GREEN='' YELLOW=`tput setaf 3` || YELLOW='' RESET=`tput sgr0` || RESET='' PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # Some operation: NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS}" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" MODE="update" [[ $SHELL =~ "noprofile" ]] && MODE="build" # Some operation: NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - detect shell" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" LAST_EXE_NAME="" NOTIFIED_USER="false" BUILD_STALE_PROBLEM="false" DEFAULT_MAIN_MODULE_NAME="Index" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - setup variables" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" function notifyUser() { if [ "${NOTIFIED_USER}" == "false" ]; then echo "" if [ "${MODE}" == "build" ]; then printf " %sAlmost there!%s %sWe just need to prepare a couple of files:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" "${BOLD}" "${RESET}" else printf " %sPreparing for build:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" fi NOTIFIED_USER="true" else # do nothing true fi } function printDirectory() { if [ "${MODE}" != "build" ]; then DIR=$1 NAME=$2 NAMESPACE=$3 REQUIRE=$4 IS_LAST=$5 printf "│\\n" PREFIX="" if [[ "$IS_LAST" == "last" ]]; then printf "└─%s/\\n" "$DIR" PREFIX=" " else printf "├─%s/\\n" "$DIR" PREFIX="│ " fi printf "%s%s\\n" "$PREFIX" "$NAME" printf "%s%s\\n" "$PREFIX" "$NAMESPACE" if [ -z "$REQUIRE" ]; then true else if [ "$REQUIRE" != " " ]; then printf "%s%s\\n" "$PREFIX" "$REQUIRE" fi fi fi } NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - define functions" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" PACKAGE_NAME="chalk-console" PACKAGE_NAME_UPPER_CAMEL="ChalkConsole" NAMESPACE="ChalkConsole" PUBLIC_LIB_NAME="chalk-console.lib" #Default Namespace lib_NAMESPACE="ChalkConsole" #Default Requires lib_REQUIRE="" #Default Flags lib_FLAGS="" lib_OCAMLC_FLAGS="" lib_OCAMLOPT_FLAGS="" lib_PREPROCESS="" lib_C_NAMES="" #Default Requires bin_REQUIRE="" #Default Flags bin_FLAGS="" bin_OCAMLC_FLAGS="" bin_OCAMLOPT_FLAGS="" bin_PREPROCESS="" bin_C_NAMES="" lib_NAMESPACE=""ChalkConsole"" bin_MAIN_MODULE=""TestChalkConsole"" lib_REQUIRE=" console.lib chalk.lib " bin_REQUIRE=" console.lib chalk.lib chalk-console.lib " NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - define build variables" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" printDirectory "lib" "library name: chalk-console.lib" "namespace: $lib_NAMESPACE" "require: $lib_REQUIRE" not-last printDirectory "bin" "name: ChalkConsole.exe" "main: ${bin_MAIN_MODULE:-$DEFAULT_MAIN_MODULE_NAME}" "require:$bin_REQUIRE" last NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - print directories" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # Perform validation: LIB_DIR="${cur__root}/lib" LIB_DUNE_FILE="${LIB_DIR}/dune" # TODO: Error if there are multiple libraries all using the default namespace. if [ -d "${LIB_DIR}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Your project is missing the lib directory described in package.json buildDirs\\n" else printf " %s☒%s Your project is missing the lib directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${LIB_DIR}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check lib dir" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" LIB_DUNE_CONTENTS="" LIB_DUNE_EXISTING_CONTENTS="" if [ -f "${LIB_DUNE_FILE}" ]; then LIB_DUNE_EXISTING_CONTENTS=$(<"${LIB_DUNE_FILE}") fi LIB_DUNE_CONTENTS="(library" LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; !!!! This dune file is generated from the package.json file. Do NOT modify by hand.") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; !!!! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; The namespace other code see this as") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (name ${lib_NAMESPACE})") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (public_name chalk-console.lib)") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (libraries ${lib_REQUIRE})") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (c_names ${lib_C_NAMES}) ; From package.json cNames field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (flags (:standard ${lib_FLAGS})) ; From package.json flags field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlc_flags (:standard ${lib_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlopt_flags (:standard ${lib_OCAMLOPT_FLAGS}))) ; From package.json ocamloptFlags") NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - create lib build file" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${LIB_DUNE_EXISTING_CONTENTS}" == "${LIB_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update lib/dune build config\\n" else printf " %s☒%s Update lib/dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "$LIB_DUNE_CONTENTS" > "${LIB_DUNE_FILE}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - verify lib build existing contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" BIN_DIR="${cur__root}/bin" BIN_DUNE_FILE="${BIN_DIR}/dune" # FOR BINARY IN DIRECTORY bin bin_MAIN_MODULE="${bin_MAIN_MODULE:-$DEFAULT_MAIN_MODULE_NAME}" bin_MAIN_MODULE_NAME="${bin_MAIN_MODULE%%.*}" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - setup bin vars" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # https://stackoverflow.com/a/965072 if [ "$bin_MAIN_MODULE_NAME"=="$bin_MAIN_MODULE" ]; then # If they did not specify an extension, we'll assume it is .re bin_MAIN_MODULE_FILENAME="${bin_MAIN_MODULE}.re" else bin_MAIN_MODULE_FILENAME="${bin_MAIN_MODULE}" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin main mod name" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${BIN_DIR}/${bin_MAIN_MODULE_FILENAME}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser echo "" if [ "${MODE}" == "build" ]; then printf " □ Generate %s main module\\n" "${bin_MAIN_MODULE_FILENAME}" else printf " %s☒%s Generate %s main module\\n" "${BOLD}${GREEN}" "${RESET}" "${bin_MAIN_MODULE_FILENAME}" mkdir -p "${BIN_DIR}" printf "print_endline(\"Hello!\");" > "${BIN_DIR}/${bin_MAIN_MODULE_FILENAME}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin main module exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -d "${BIN_DIR}" ]; then LAST_EXE_NAME="ChalkConsole.exe" BIN_DUNE_EXISTING_CONTENTS="" if [ -f "${BIN_DUNE_FILE}" ]; then BIN_DUNE_EXISTING_CONTENTS=$(<"${BIN_DUNE_FILE}") else BIN_DUNE_EXISTING_CONTENTS="" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - read existing dune bin contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" BIN_DUNE_CONTENTS="(executable" BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; !!!! This dune file is generated from the package.json file. Do NOT modify by hand.") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; !!!! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; The entrypoint module") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (name ${bin_MAIN_MODULE_NAME}) ; From package.json main field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (public_name ChalkConsole.exe) ; From package.json name field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (libraries ${bin_REQUIRE}) ; From package.json require field (array of strings)") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (flags (:standard ${bin_FLAGS})) ; From package.json flags field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlc_flags (:standard ${bin_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlopt_flags (:standard ${bin_OCAMLOPT_FLAGS}))) ; From package.json ocamloptFlags field") NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - create bin dune contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${BIN_DUNE_EXISTING_CONTENTS}" == "${BIN_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update bin/dune build config\\n" else printf " %s☒%s Update bin/dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "${BIN_DUNE_CONTENTS}" > "${BIN_DUNE_FILE}" mkdir -p "${BIN_DIR}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin against required bin" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Generate missing the bin directory described in package.json buildDirs\\n" else printf " %s☒%s Generate missing the bin directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${BIN_DIR}" fi fi if [ -f "${cur__root}/dune" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Update ./dune to ignore node_modules\\n" else printf " %s☒%s Update ./dune to ignore node_modules\\n" "${BOLD}${GREEN}" "${RESET}" printf "(ignored_subdirs (node_modules))" > "${cur__root}/dune" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check root dune exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${cur__root}/${PACKAGE_NAME}.opam" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add %s\\n" "${PACKAGE_NAME}.opam" else printf " %s☒%s Add %s\\n" "${BOLD}${GREEN}" "${RESET}" "${PACKAGE_NAME}.opam" touch "${cur__root}/${PACKAGE_NAME}.opam" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check opam file exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${cur__root}/dune-project" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add a ./dune-project\\n" else printf " %s☒%s Add a ./dune-project\\n" "${BOLD}${GREEN}" "${RESET}" printf "(lang dune 1.0)\\n (name %s)" "${PACKAGE_NAME}" > "${cur__root}/dune-project" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check root dune-project file exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${MODE}" == "build" ]; then if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sTo perform those updates and build run:%s\n\n" "${BOLD}${YELLOW}" "${RESET}" printf " esy pesy\\n\\n\\n\\n" exit 1 else # If you list a refmterr as a dev dependency, we'll use it! BUILD_FAILED="" if hash refmterr 2>/dev/null; then refmterr dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" else dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - perform actual build" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -z "$BUILD_FAILED" ]; then printf "\\n%s Build Succeeded!%s " "${BOLD}${GREEN}" "${RESET}" if [ -z "$LAST_EXE_NAME" ]; then printf "\\n\\n" true else # If we built an EXE printf "%sTo test a binary:%s\\n\\n" "${BOLD}" "${RESET}" printf " esy x %s\\n\\n\\n" "${LAST_EXE_NAME}" fi true NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check build failure" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" else exit 1 fi fi else # In update mode. if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sUpdated!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy build\\n\\n\\n" else printf "\\n %sAlready up to date!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy build\\n\\n\\n" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - end" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - end" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" ``` Although we quickly call into genEverything if the package.json hasn't changed, there appears to be an 80ms overhead in pesy until we get to that point. DELTAms 4 - baseline margin of error amount DELTAms 5 - check help DELTAms 12 - check env DELTAms 13 - check create DELTAms 7 - record pesy dir super-project-now@0.0.0 DELTAms 6 - output title DELTAms 7 - mkdir cur__target_dir DELTAms 7 - check if md5 exists DELTAms 12 - compute md5 DELTAms 14 - get previous md5 ================================================ FILE: notes/checksum-verification.md ================================================ # Checksum verification As we create the build artifacts to publish to NPM, we also generate the SHA1 hash of the `.tgz` file created by `npm pack`, in a manner similar to how npm does. This way, you can verify that the package published to NPM is infact the same set of binaries that were built on CI. You can verify this by following this simple steps. 1. Head over to CI logs as per the release version a. [Pre-beta](https://dev.azure.com/pesy/pesy/_build/results?buildId=103) 2) Navigate to the `Release Job` section ![release-job](./images/release-job.png "Release job section") 3. Look for 'Calculating sha1' ![calculating-sha1](./images/calculating-sha1.png "Calculating sha1 option in the logs") 4. Verify its the same as the one in `npm info pesy`. Of course, ensure that the version you see in `npm info pesy` is the same the one in the logs. ![sha1-logs](./images/sha1-logs.png "SHA1 hash in the logs") You can also download the package straight from the CI and check if it is the same as the one on NPM. 1. In the same logs, on the top right you would see a blue button labeled `Artifacts` ![top-right-corner](./images/top-right-corner.png "Artifacts button on the top right corner") 2. In the sub menu drawn up by `Artifacts`, click on `Release`. This is the job where we collect are platform binaries and package them for NPM. You'll only find platform-specfic binaries in the other jobs. ![release-option](./images/release-option.png "Release option") 3. A file explorer like interface opens on clicking `Release` as explained in the previous step. Click on the `Release` folder - the only option. We run `npm pack` in this directory structure. ![artifacts-explorer](./images/artifacts-explorer.png "Artifacts explorer") 4. `pesy-.tgz` is the tar file that published to npm. You can uncompress and inspect its contents, or check its SHA1 integrity and ensure it's the same as the one on NPM ![download](./images/download.png "Download option for pesy-.tgz") 5. You might have to tap on the file once to show the kebab menu. ![tap-for-kebab](./images/tap-for-kebab.png "Tap for Kebab menu") ================================================ FILE: notes/compiler-support.org ================================================ * Compiler support This is an attempt to document compiler support pesy provides. ** Terminologies As defined in [[https://esy.sh/docs/en/environment.html][Esy's documentation]] - Regular dependencies #+begin_quote Regular dependencies are dependencies which are needed at runtime. They are listed in "dependencies" key of the package.json. #+end_quote - Development dependencies #+begin_quote are dependencies which are needed only during development. They are listed in "devDependencies" key of the package.json. Examples: @opam/merlin, @opam/ocamlformat and so on. #+end_quote ** Regular dependencies must be atleast 4.4.2004 because of ocamlbuild and base Base becase (and @pesy/esy-pesy -> @opam/sexplib -> @opam/parsexp -> @opam/base -> ocaml@>=4.4.2) ** 4.4 cannot be supported - possibly because of a solver bug in esy #+begin_example [ERROR] It appears that the num library was previously installed to your system compiler's lib directory, probably by a faulty opam package. You will need to remove arith_flags.*, arith_status.*, big_int.*, int_misc.*, nat.*, num.*, ratio.*, nums.*, libnums.* and stublibs/dllnums.* from /Users/manas/.esy/3___________________________________________________________________/i/ocaml-4.4.2004-52c21c80/lib/ocaml. make: *** [findlib-install] Error 1 error: command failed: 'make' 'LIBDIR=/Users/manas/.esy/3___________________________________________________________________/s/opam__s__num-opam__c__1.3-c60c3f0c/lib' 'findlib-install' (exited with 2) esy-build-package: exiting with errors above... #+end_example esy seeems to fetch num1.3 for compiler 4.4 when it's supposed to fetch num.0. Reported [[https://github.com/esy/esy/issues/1013][here]] ** Development dependencies must be altleast is 4.6 because of refmterr It uses string_of_bool_opt available post 4.05 only ** When dependencies: "ocaml": "4.4.2004 - 4.8" and devDependencies: "ocaml": "4.6.10 - 4.8" #+begin_example Conflicting constraints: @pesy/esy-pesy -> @reason-native/pastel -> @opam/re -> @opam/seq -> ocaml@<4.7.0 @pesy/esy-pesy -> ocaml@=4.8.1000 #+end_example ie if consuming packages want to use ocaml > 4.7, latest seq package (which is basically empty since the compiler supports natively) must be used. If consuming package is < 4.7, c-cube fallback package must be used. Esy's resolutions field cannot be used to vendor seq package - resolutions package can only be used to pin one package at a time. ** 4.9 support #+begin_example Conflicting constraints: @pesy/esy-pesy -> @opam/sexplib -> @opam/parsexp -> @opam/base -> ocaml@>=4.4.2 && ocaml@<4.9.0 @pesy/esy-pesy -> ocaml@=4.9.0 #+end_example Upgrading base requires latest dune. So 4.9 needs newer dune. TODO ================================================ FILE: notes/e2e.org ================================================ * Setup Recently [[https://github.com/esy/pesy/pull/105][Windows CI started failing]] due disk space issue. This could be due to the heavy e2e setup - multiple test projects were probably installing too many dependencies As a work around, we're writing an in place e2e setup that actually reflects developer workflow - it would bootstrap a new project and edit it in place. This time around, we aim to test error cases too * Issues with mdx attempt [[https://github.com/realworldocaml/mdx][MDX]] was the ideal tool for this. But unfortunately, we're testing a cli tool that call =esy=. Using =MDX= meant we had to use esy to run the tests and running a cli tool that spawns esy within esy can be challenging. For instance, we had tried setting up the following #+BEGIN_SRC lisp (alias (name runtest) (deps (:t test.t) (source_tree ./files)) (action (progn (run pwd) (run echo "%{project_root}/npm-cli/pesy") (setenv ESY__PROJECT "." (setenv OCAMLRUNPARAM b (setenv TEST_PROJECT_DIR "." (setenv PESY %{bin:pesy} (run %{bin:mdx} test --syntax=cram %{t}))))) (diff? %{t} %{t}.corrected)))) #+END_SRC and #+BEGIN_SRC sh The simplest case: running pesy in an empty directory $ mkdir -p $TEST_PROJECT_DIR $ cp -R $PWD/files/package.json $TEST_PROJECT_DIR $ cd $TEST_PROJECT_DIR; $PESY #+END_SRC It needs =MDX= which is available only in the sandbox and =esy-pesy= runs =esy status= which assumes the root package.json is the root not the test-project folder inside the =_build=. Writing to external $TMPDIR ================================================ FILE: notes/release.org ================================================ * Release process The release process is mostly manual right now and works like this. ** @pesy/esy-pesy 1. =git ls-files | xargs sed -i 's/dev./alpha." + "@pesy/esy-pesy": "" #+end_src ** pesy Same as =@pesy/esy-pesy= 1. =git ls-files | xargs sed -i 's/dev./alpha./dev./g'= 3. Commit and push ================================================ FILE: npm-cli/.gitignore ================================================ .DS_Store .merlin .bsb.lock npm-debug.log /lib/bs/ /node_modules/ pesy.bundle.js pesy-*.tgz *.map ================================================ FILE: npm-cli/.npmignore ================================================ src/* ================================================ FILE: npm-cli/.vscode/tasks.json ================================================ { "version": "0.1.0", "command": "npm", "options": { "cwd": "${workspaceRoot}", "env": { "BS_VSCODE" : "true" } }, "type": "shell", "args": ["run", "start"], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" }, "isBackground": true, "problemMatcher": { "fileLocation": "absolute", "owner": "ocaml", "background": { "activeOnStart": false, "beginsPattern": ">>>> Start compiling", "endsPattern": ">>>> Finish compiling" }, "pattern": [ { "regexp": "^File \"(.*)\", line (\\d+)(?:, characters (\\d+)-(\\d+))?:$", "file": 1, "line": 2, "column": 3, "endColumn": 4 }, { "regexp": "^(?:(?:Parse\\s+)?(Warning|[Ee]rror)(?:\\s+\\d+)?:)?\\s+(.*)$", "severity": 1, "message": 2, "loop": true } ] } } ================================================ FILE: npm-cli/README.md ================================================ # Basic Reason Template Hello! This project allows you to quickly get started with Reason and BuckleScript. If you wanted a more sophisticated version, try the `react` template (`bsb -theme react -init .`). # Build ``` npm run build ``` # Build + Watch ``` npm run start ``` # Editor If you use `vscode`, Press `Windows + Shift + B` it will build automatically ================================================ FILE: npm-cli/__tests__/utils_test.re ================================================ open Jest; open Expect; open! Expect.Operators; open Utils; describe("kebab function", () => { test("sample 1", () => "Esy Pesy" |> kebab |> expect |> toBe("esy-pesy") ); test("sample 2", () => "Hello-World-2020!" |> kebab |> expect |> toBe("hello-world-2020!") ); } ); describe("removeScope function", () => { test("no forward slash", () => "esy-pesy" |> removeScope |> expect |> toEqual("esy-pesy") ); test("forward slash at the beginning", () => "/esy-pesy" |> removeScope |> expect |> toEqual("esy-pesy") ); test("forward slash in between", () => "esy/pesy" |> removeScope |> expect |> toEqual("pesy") ); test("forward slash at the end", () => "esy-pesy/" |> removeScope |> expect |> toEqual("") ); test("multiple forward slashes", () => "/esy/pesy/lemon/squeezy" |> removeScope |> expect |> toEqual("squeezy") ); } ); describe("upperCamelCasify function", () => { test("should camelCasify", () => "esy-pesy" |> upperCamelCasify |> expect |> toEqual("EsyPesy") ); test("forward slash(/) at the beginning", () => "/esy-pesy" |> upperCamelCasify |> expect |> toEqual("/esyPesy") ); test("forward slash(/) in between", () => "esy/pesy" |> upperCamelCasify |> expect |> toEqual("Esy/pesy") ); test("forward slash(/) at the end", () => "esy-pesy/" |> upperCamelCasify |> expect |> toEqual("EsyPesy/") ); } ); ================================================ FILE: npm-cli/bsconfig.json ================================================ { "name": "pesy-bootstrapper", "version": "0.1.0", "sources": [ { "dir": "src", "subdirs": true }, { "dir": "__tests__", "type": "dev" } ], "package-specs": { "module": "commonjs" }, "suffix": ".bs.js", "bs-dependencies": [ "@glennsl/bs-json", "@glennsl/bs-jest", "tablecloth-bucklescript", "@prometheansacrifice/bs-cmdliner" ], "bsc-flags": ["-bs-g"], "warnings": { "number": "-44-102-20", "error": "+5" }, "refmt": 3 } ================================================ FILE: npm-cli/esy.json ================================================ { "dependencies": { "ocaml": "4.6.x", "@opam/dune": "2.7.1", "@esy-ocaml/reason": "3.6.x", "@opam/odoc": "*", "@opam/ocaml-lsp-server": "ocaml/ocaml-lsp:ocaml-lsp-server.opam", "@opam/merlin": "*" } } ================================================ FILE: npm-cli/package.json ================================================ { "name": "pesy", "version": "0.5.0-dev.23", "bin": { "pesy": "pesy" }, "esy": { "install": [ "mkdir #{self.install / 'bin' / 'azure-ci-template'}", "cp #{self.root / 'v0.4.4' / 'azure-ci-template' / 'azure-pipelines.yml'} #{self.install / 'bin' / 'azure-ci-template/' / 'azure-pipelines.yml'}", "cp #{self.root / 'v0.4.4' / 'azure-ci-template' / 'esy-build-steps.template.yml'} #{self.install / 'bin' / 'azure-ci-template/' / 'esy-build-steps.template.yml'}", "cp #{self.root / 'v0.4.4' / 'azure-ci-template' / 'publish-build-cache.yml'} #{self.install / 'bin' / 'azure-ci-template/' / 'publish-build-cache.yml'}", "cp #{self.root / 'v0.4.4' / 'azure-ci-template' / 'restore-build-cache.yml'} #{self.install / 'bin' / 'azure-ci-template/' / 'restore-build-cache.yml'}", "cp #{self.root / 'v0.4.4' / 'pesy'} #{self.install / 'bin' / 'pesy'}", "cp #{self.root / 'v0.4.4' / 'pesy-header.sh'} #{self.install / 'bin' / 'pesy-header.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-footer.template.sh'} #{self.install / 'bin' / 'pesy-footer.template.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-genBin.template.sh'} #{self.install / 'bin' / 'pesy-genBin.template.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-genLib.template.sh'} #{self.install / 'bin' / 'pesy-genLib.template.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-JSON.sh'} #{self.install / 'bin' / 'pesy-JSON.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-create.sh'} #{self.install / 'bin' / 'pesy-create.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-name-utils.sh'} #{self.install / 'bin' / 'pesy-name-utils.sh'}", "cp #{self.root / 'v0.4.4' / 'pesy-gitignore.template'} #{self.install / 'bin' / 'pesy-gitignore.template'}", "cp #{self.root / 'v0.4.4' / 'pesy-package.template.json'} #{self.install / 'bin' / 'pesy-package.template.json'}", "cp #{self.root / 'v0.4.4' / 'pesy-README.template.md'} #{self.install / 'bin' / 'pesy-README.template.md'}" ] }, "scripts": { "rollup": "rollup -c rollup.config.js", "rollup:watch": "rollup -c rollup.config.js -w", "docs": "bsdoc build pesy", "bsb": "bsb -make-world", "build": "yarn run bsb && yarn run rollup", "package": "node scripts/vendor-template.js && yarn run build", "prettier": "prettier --single-quote --trailing-comma es5 --write src/**.js", "test": "yarn run build && jest --coverage", "bsb:watch": "bsb -make-world -w", "bsb:clean": "bsb -clean-world" }, "keywords": [ "esy", "pesy", "reason", "ocaml" ], "files": [ "package.json", "pesy", "pesy.bundle.js", "templates/", "stubs/", "v0.4.4/" ], "license": "MIT", "devDependencies": { "@glennsl/bs-json": "^5.0.2", "@glennsl/bs-jest": "^0.5.0", "@prometheansacrifice/bs-cmdliner": "1.0.4000", "@rollup/plugin-commonjs": "^11.0.2", "@rollup/plugin-json": "^4.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "bs-platform": "7.0.1", "prettier": "^1.19.1", "rollup": "^1.16.2", "tablecloth-bucklescript": "0.0.6", "bsdoc": "*" }, "bugs": { "url": "https://github.com/esy/pesy/issues" }, "homepage": "https://github.com/esy/pesy#readme", "dependencies": { "chalk": "^3.0.0", "download-git-repo": "^2.0.0", "request": "^2.88.2", "request-progress": "^3.0.0", "rimraf": "^3.0.2", "source-map-support": "^0.5.16", "walk-sync": "^2.0.2" }, "resolutions": { "mkdirp": "1.0.3" } } ================================================ FILE: npm-cli/pesy ================================================ #! /usr/bin/env node require('./pesy.bundle.js'); ================================================ FILE: npm-cli/pesy.bundle.js.minisig ================================================ untrusted comment: signature from minisign secret key RWSTA7d4LKXMeRPeL7ceAi164fDdHZ1FIBWA8v6SdC+F496BaNW/H5mEFRhT+mr/6aSBqiIr0uNGXDLnspgUpafBuHL05S6JEw4= trusted comment: By prometheansacrifice L54khMsR3AfaT1VG0rhsZwQE7eK9lx1geX79qpMM1qRQAZd9Wv7qJYq4GH5J3lPMlJ4/YARjdz+bXJo3EkXBDA== ================================================ FILE: npm-cli/pesy.js ================================================ const Pesy = require("./lib/js/src/Pesy.bs.js"); try { Pesy.main(process.argv.slice(1)).catch((e) => console.error("Pesy.main rejected promise", e) ); } catch (e) { console.error("Pesy.main threw an exception", e); } ================================================ FILE: npm-cli/rollup.config.js ================================================ // rollup.config.js import commonjs from "@rollup/plugin-commonjs"; import nodeResolve from "@rollup/plugin-node-resolve"; import json from "@rollup/plugin-json"; export default { input: "./pesy.js", output: { file: "pesy.bundle.js", format: "cjs", sourcemap: true, }, plugins: [ nodeResolve({ preferBuiltins: true }), json(), commonjs({ ignore: ["child_process"], }), ], external: [ "child_process", "fs", "util", "chalk", "source-map-support", "request", "request-progress", "process", "https", "walk-sync", "download-git-repo", "path", "readline", "readable-stream", ], }; ================================================ FILE: npm-cli/scripts/vendor-template.js ================================================ const fs = require("fs"); const https = require("https"); const path = require("path"); const cp = require("child_process"); const util = require("util"); let tag = "0.1.0-alpha.20"; let url = `https://github.com/esy/pesy-reason-template/archive/${tag}.zip`; let downloadAs = "template.zip"; let extractedDirName = `pesy-reason-template-${tag}`; let get = (url) => new Promise((resolve, reject) => { let request = https.get(url, function (response) { resolve({ request, response }); }); }); let downloadFromHTTPStream = (response, p) => new Promise((resolve, reject) => { response.pipe(fs.createWriteStream(p)); response.on("end", resolve); }); let fetch = (url) => { return get(url).then(({ response }) => { if (response.statusCode === 302) { let redirectUri = response.headers["location"]; if (redirectUri) { return fetch(redirectUri); } else { return Promise.reject(new Error("Redirect location was not found")); } } else { return downloadFromHTTPStream( response, path.resolve(templateDir, zipFile) ); } }); }; let delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); let templateDir = "templates"; let zipTarget = path.resolve(__dirname, "..", templateDir, extractedDirName); let zipFile = "template.zip"; let main = () => { if (!fs.existsSync(path.resolve(".", templateDir))) { fs.mkdirSync(path.resolve(".", templateDir)); } let p; if (!fs.existsSync(path.resolve(".", templateDir, zipFile))) { p = fetch(url); } else { p = Promise.resolve(); } p.then(() => delay(100)) .then(() => { if (!fs.existsSync(zipTarget)) { console.log( `Extracting (entering: ${path.resolve( __dirname, "..", templateDir )})...` ); return Promise.resolve( cp .execSync("unzip -o template.zip", { cwd: path.resolve(__dirname, "..", templateDir), }) .toString() ); } }) .catch((e) => { console.error(e); process.exit(-1); }); }; main(); ================================================ FILE: npm-cli/src/AzurePipelines.re ================================================ open Bindings; module P = Js.Promise; module ProjectName: { type validated; type unvalidated; type t('a); let ofString: string => t(unvalidated); let validate: t(unvalidated) => t(validated); let toString: t(validated) => string; } = { type validated; type unvalidated; type t('a) = string; let ofString = x => x; let validate = x => { let start = x.[0] == '/' ? 1 : 0; let len = Js.String.length(x); let end_ = x.[len - 1] == '/' ? len - 1 : len; Js.String.substring(~from=start, ~to_=end_, x); }; let toString = x => x; }; module E = { type t = | InvalidJSONType(string) | MissingField(string) | InvalidFirstArrayElement; let toString = fun | InvalidJSONType(value) => {j|Field $value in Azure's response was undefined|j} | MissingField(k) => {j| Response from Azure did not contain build $k |j} | InvalidFirstArrayElement => "Unexpected array value in Azure response"; }; module RESTResponse = { type buildIdObject = {id: int}; let guard = (jsonParser, str) => try(jsonParser(str)) { | e => let msg = Printexc.to_string(e); Error({j|Failed to parse Azure response $msg $str |j}); }; let getBuildId' = json => { open Json.Decode; let buildIdObject = json => {id: field("id", int, json)}; let valueArray = field("value", array(buildIdObject), json); valueArray[0].id; }; let getBuildId = guard(responseText => switch (Json.parse(responseText)) { | Some(json) => Ok(getBuildId'(json)) | None => Error( {j|getBuildId(): responseText could not be parsed ------------ $responseText |j}, ) } ); type downloadUrlObject = {downloadUrl: string}; let getDownloadURL' = json => { open Json.Decode; let downloadUrlObject = json => { downloadUrl: field("downloadUrl", string, json), }; switch (json |> optional(field("resource", downloadUrlObject))) { | Some(resource) => Ok(resource.downloadUrl) | None => let responseText = Json.stringify(json); Error( {j|getDownloadURL(): responseObject.resource as not of the form { downloadURL: "..." }. Instead got $responseText |j}, ); }; }; let getDownloadURL = guard(responseText => switch (Json.parse(responseText)) { | Some(json) => getDownloadURL'(json) | None => Error("getDownloadURL(): could not parse responseText") } ); }; let os = switch (Process.platform) { | "darwin" => Some("Darwin") | "linux" => Some("Linux") | "win32" => Some("Windows_NT") | _ => None }; type artifact = { filename: string, checksumFilename: string, }; let artifact = switch (os) { | Some(os) => Some({ filename: {j|cache-$os-install-v1|j}, checksumFilename: {j|cache-$os-install-v1-checksum|j}, }) | None => None }; let master = "branchName=refs%2Fheads%2Fmaster"; let filter = "deletedFilter=excludeDeleted&statusFilter=completed&resultFilter=succeeded"; let latest = "queryOrder=finishTimeDescending&$top=1"; let restBase = "https://dev.azure.com"; let getDefinitionID = (projName, github) => { let proj = projName |> ProjectName.toString; let definition = Js.String.replace("/", ".", github); Https.getCompleteResponse( {j|$restBase/$proj/_apis/build/definitions?name=$definition&api-version=4.1|j}, ) |> P.then_(r => P.resolve( switch (r) { | Ok(response) => RESTResponse.getBuildId(response) | Error(e) => switch (e) { | Https.E.Failure(url) => Error({j| Could not download $url |j}) } }, ) ); }; let getBuildID = (projName, definitionID) => { let proj = projName |> ProjectName.toString; Https.getCompleteResponse( {j|$restBase/$proj/_apis/build/builds?$filter&$master&$latest&definitions=$definitionID&api-version=4.1|j}, ) |> P.then_(r => P.resolve( switch (r) { | Ok(response) => RESTResponse.getBuildId(response) | Error(e) => switch (e) { | Https.E.Failure(url) => Error({j| Could not download $url |j}) } }, ) ); }; let getDownloadURL = (projName, latestBuildID) => { let proj = projName |> ProjectName.toString; let latestBuildID = Js.Int.toString(latestBuildID); switch (artifact) { | Some({filename}) => Https.getCompleteResponse( {j|$restBase/$proj/_apis/build/builds/$latestBuildID/artifacts?artifactname=$filename&api-version=4.1|j}, ) |> P.then_( fun | Error(Https.E.Failure(url)) => Error({j| Failed to download $url |j}) |> P.resolve | Ok(responseText) => responseText |> RESTResponse.getDownloadURL |> P.resolve, ) | None => Error("We detected a platform for which we couldn't find cached builds") |> P.resolve }; }; let getChecksumDownloadURL = (projName, latestBuildID) => { let proj = projName |> ProjectName.toString; let latestBuildID = Js.Int.toString(latestBuildID); switch (artifact) { | Some({checksumFilename}) => Https.getCompleteResponse( {j|$restBase/$proj/_apis/build/builds/$latestBuildID/artifacts?artifactname=$checksumFilename&api-version=4.1|j}, ) |> P.then_( fun | Error(Https.E.Failure(url)) => Error({j| Failed to download $url |j}) |> P.resolve | Ok(responseText) => responseText |> RESTResponse.getDownloadURL |> P.resolve, ) | None => Error("We detected a platform for which we couldn't find cached builds") |> P.resolve }; }; ================================================ FILE: npm-cli/src/Bindings.re ================================================ open Js; module Process = { type t; [@bs.val] external v: t = "process"; [@bs.val] [@bs.scope "process"] external cwd: unit => string = "cwd"; [@bs.val] [@bs.scope "process"] external chdir: string => unit = "chdir"; [@bs.val] [@bs.scope "process"] external platform: string = "platform"; [@bs.val] [@bs.scope "process"] external arch: string = "arch"; [@bs.val] [@bs.scope "process"] external env: Js.Dict.t(string) = "env"; module Stdout = { type t; [@bs.val] external v: t = "process.stdout"; [@bs.send] external write: (t, string) => unit = "write"; }; }; module Error = { type t = {. "message": string}; [@bs.new] external make: string => t = "Error"; }; module JsError = Error; [@bs.val] [@bs.module "path"] external basename: string => string = "basename"; [@bs.val] [@bs.module "fs"] external makedirSync: string => unit = "mkdirSync"; [@bs.val] [@bs.module "fs"] external renameSync: (string, string) => unit = "renameSync"; type stats; [@bs.val] [@bs.module "fs"] external statSync: string => stats = "statSync"; [@bs.send] external isFile: stats => bool = "isFile"; [@bs.val] [@bs.module "process"] external cwd: unit => string = "cwd"; [@bs.val] [@bs.module "process"] external argv: array(string) = "argv"; let scriptPath: string = [%raw "process.argv[1]"]; [@bs.val] external dirname: string = "__dirname"; [@bs.module] external downloadGit: (string, string, Js.Nullable.t(Error.t) => unit) => unit = "download-git-repo"; let downloadGit = (repo, path) => Promise.make((~resolve, ~reject as _) => { downloadGit(repo, path, err => { switch (Nullable.toOption(err)) { | Some(e) => resolve(. Error(e##message)) | None => resolve(. Ok()) } }) }); module Buffer = { type t; [@bs.send] external toString: t => string = "toString"; [@bs.val] [@bs.scope "Buffer"] external from: string => t = "from"; let ofString = from; }; module type STREAM = { type t; let onData: (t, string, Buffer.t => unit) => unit; let onEnd: (t, string, unit => unit) => unit; let onClose: (t, string, unit => unit) => unit; }; module StreamFunctor = (S: {type t;}) => { type t = S.t; [@bs.send] external onData': (t, string, Buffer.t => unit) => unit = "on"; let onData = (t, cb) => onData'(t, "data", cb); [@bs.send] external onEnd': (t, string, unit => unit) => unit = "on"; let onEnd = (t, cb) => onEnd'(t, "end", cb); [@bs.send] external onError': (t, string, Error.t => unit) => unit = "on"; let onError = (t, cb) => onError'(t, "error", cb); let onClose = (t, cb) => onEnd'(t, "close", cb); }; module Stream = StreamFunctor({ type t; }); [@bs.module] external walk_sync: string => array(string) = "walk-sync"; module ChildProcess: { type t = {. "exitCode": int}; module Options: { type t; let make: (~cwd: string=?, ~env: Js.Dict.t(string)=?, ~stdio: string=?, unit) => t; }; exception ExecFailure((string, string, string)); let spawn: (string, array(string), Options.t) => t; let onClose: (t, int => unit) => unit; let exec: (string, Options.t) => Js.Promise.t(result((int, string, string), unit)); } = { type t = {. "exitCode": int}; // FIXME: async processes dont set exitCode exception ExecFailure((string, string, string)); module Options = { type t; [@bs.obj] external make: (~cwd: string=?, ~env: Js.Dict.t(string)=?, ~stdio: string=?, unit) => t = ""; }; [@bs.module "child_process"] external spawn: (string, array(string), Options.t) => t = "spawn"; /* [@bs.send] external on': (t, string, unit => unit) => unit = "on"; */ [@bs.send] external onClose': (t, string, int => unit) => unit = "on"; let onClose = (t, cb) => onClose'(t, "close", cb); [@bs.module "child_process"] external exec: (string, Options.t, (Js.Nullable.t(Error.t), string, string) => unit) => t /* This should have been `t` - ChildProcess object in Node.js TODO: figure a way to pass it to callback */ = "exec"; let exec = (cmd, options) => { Js.Promise.( make((~resolve, ~reject as _) => { let cp = ref({"exitCode": 0}); cp := exec(cmd, options, (err, stdout, stderr) => if (Js.Nullable.isNullable(err)) { resolve(. Ok(((cp^)##exitCode, stdout, stderr))); } else { resolve(. Error()); } ); (); }) ); }; let spawn = spawn; }; module Response = { type t = { . "statusCode": int, "headers": Js.Dict.t(string), }; [@bs.send] external setEncoding: (t, string) => unit = "setEncoding"; [@bs.send] external on: (t, string, Buffer.t => unit) => unit = "on"; }; module Request = { [@bs.module] external request: string => Stream.t = "request"; }; module RequestProgress = { type t; type state = { . "percent": float, "speed": int, "size": { . "total": int, "transferred": int, }, "time": { . "elapsed": float, "remaining": float, }, }; [@bs.module] external requestProgress: Stream.t => t = "request-progress"; [@bs.send] external onData': (t, string, Buffer.t => unit) => unit = "on"; let onData = (t, cb) => onData'(t, "data", cb); [@bs.send] external onProgress': (t, string, state => unit) => unit = "on"; let onProgress = (t, cb) => onProgress'(t, "progress", cb); [@bs.send] external onError': (t, string, JsError.t => unit) => unit = "on"; let onError = (t, cb) => onError'(t, "error", cb); [@bs.send] external onEnd': (t, string, unit => unit) => unit = "on"; let onEnd = (t, cb) => onEnd'(t, "end", cb); [@bs.send] external pipe: (t, Stream.t) => unit = "pipe"; }; module Https = { module E = { type t = | Failure(string); let toString = fun | Failure(url) => {j|Failed to place request to $url|j}; }; [@bs.module "https"] external get: (string, Response.t => unit) => Stream.t = "get"; let getCompleteResponse = url => Promise.make((~resolve, ~reject as _) => { let req = get( url, response => { let _statusCode = response##statusCode; let responseText = ref(""); Response.on(response, "data", c => responseText := responseText^ ++ Buffer.toString(c) ); Response.on(response, "end", _ => resolve(. Ok(responseText^))); Response.on(response, "error", _err => resolve(. Error( E.Failure({j|Error occurred while placing request to $url|j}), ), ) ); }, ); Stream.onError(req, error => resolve(. Error(E.Failure(error##message)))); }); }; module Crypto = { [@bs.module "../../../stubs/crypto.js"] external sha256: (. string, string) => string = "sha256"; [@bs.module "../../../stubs/crypto.js"] external sha1File: (string) => Js.Promise.t(string) = "sha1File"; [@bs.module "../../../stubs/crypto.js"] external sha256File: (string) => Js.Promise.t(string) = "sha256File"; }; module Resolve = { [@bs.module "../../../stubs/resolve.js"] external resolve': (string) => ((Js.Nullable.t(string), string) => unit) => unit = "run"; let resolve = (url) => Js.Promise.make((~resolve as r, ~reject as _) => { resolve'(url, (err, resolvedUrl) => { switch(Js.Nullable.toOption(err)) { | Some(msg) => r(. Error(msg)) | None => r(. Ok(resolvedUrl)) } }); }); }; module Fs = { [@bs.module "../../../stubs/fs.js"] external writeFile: (. string, Buffer.t) => Js.Promise.t(unit) = "writeFile"; [@bs.module "../../../stubs/fs.js"] external readFile: (. string) => Js.Promise.t(Buffer.t) = "readFile"; [@bs.module "fs"] external createWriteStream: string => Stream.t = "createWriteStream"; [@bs.module "fs"] external readStream: string => Stream.t = "ReadStream"; [@bs.module "../../../stubs/fs.js"] external unlink: string => Js.Promise.t(bool) = "unlink"; [@bs.module "../../../stubs/fs.js"] external rmdirRecursive: string => Js.Promise.t(unit) = "rmdirRecursive"; let copy = (~dryRun=?, ~src, ~dest, ()) => { Promise.( { let dryRun = switch (dryRun) { | Some(x) => x | None => false }; if (dryRun) { Js.log({j|Copying $src to $dest|j}) |> resolve; } else { readFile(. src) |> then_(b => writeFile(. dest, b)); }; } ); }; module DirEnt = { type t = {. "name": string}; [@bs.send] external isDirectory: t => bool = "isDirectory"; [@bs.send] external isFile: t => bool = "isFile"; }; module Dir = { type t = {. "path": string}; [@bs.send] external close: t => Promise.t(unit) = "close"; [@bs.send] external read: t => Promise.t(Js.Nullable.t(DirEnt.t)) = "read"; }; [@bs.module "../../../stubs/fs"] external opendir: string => Js.Promise.t(Dir.t) = "opendir"; [@bs.module "../../../stubs/fs"] external readdir: string => Js.Promise.t(Js.Array.t(string)) = "readdir"; module Stats = { type t; [@bs.send] external isDirectory: t => Js.Promise.t(bool) = "isDirectory"; }; [@bs.module "../../../stubs/fs"] external stat: string => Js.Promise.t(Stats.t) = "stat"; let isDirectory = p => Promise.(stat(p) |> then_(stats => Stats.isDirectory(stats))); [@bs.module "../../../stubs/fs.js"] external exists: string => Js.Promise.t(bool) = "exists"; [@bs.module "../../../stubs/fs.js"] external mkdir: string => Js.Promise.t(unit) = "mkdir"; }; [@bs.module "source-map-support"] external sourceMapSupportInstall: unit => unit = "install"; let throwJSError = [%raw "e => { throw e; }"]; module Chalk = { // https://github.com/ecliptic/bucklescript-tools/blob/develop/packages/bs-chalk/src/Chalk.re module Level = { type t = | None | Basic | Ansi256 | TrueColor; let fromInt = level => switch (level) { | 0 => None | 1 => Basic | 2 => Ansi256 | 3 => TrueColor | _ => None }; let toInt = level => switch (level) { | None => 0 | Basic => 1 | Ansi256 => 2 | TrueColor => 3 }; }; type colorSupport = { . "level": int, "hasBasic": bool, "has256": bool, "has16m": bool, }; [@bs.module "chalk"] external enabled: bool = "enabled"; [@bs.module "chalk"] external level_: int = "level"; [@bs.module "chalk"] external supportsColor: colorSupport = "supportsColor"; [@bs.module "chalk"] external stripColor: string => string = "stripColor"; [@bs.module "chalk"] external hasColor: string => bool = "hasColor"; [@bs.module "chalk"] external visible: string => bool = "visible"; /* Styles */ [@bs.module "chalk"] external reset: string => string = "chalk"; [@bs.module "chalk"] external bold: string => string = "bold"; [@bs.module "chalk"] external dim: string => string = "dim"; [@bs.module "chalk"] external italic: string => string = "italic"; [@bs.module "chalk"] external underline: string => string = "underline"; [@bs.module "chalk"] external inverse: string => string = "inverse"; [@bs.module "chalk"] external hidden: string => string = "hidden"; [@bs.module "chalk"] external strikethrough: string => string = "strikethrough"; /* Colors */ [@bs.module "chalk"] external black: string => string = "black"; [@bs.module "chalk"] external red: string => string = "red"; [@bs.module "chalk"] external green: string => string = "green"; [@bs.module "chalk"] external yellow: string => string = "yellow"; [@bs.module "chalk"] external blue: string => string = "blue"; [@bs.module "chalk"] external magenta: string => string = "magenta"; [@bs.module "chalk"] external cyan: string => string = "cyan"; [@bs.module "chalk"] external white: string => string = "white"; [@bs.module "chalk"] external gray: string => string = "gray"; [@bs.module "chalk"] external grey: string => string = "grey"; [@bs.module "chalk"] external blackBright: string => string = "blackBright"; [@bs.module "chalk"] external redBright: string => string = "redBright"; [@bs.module "chalk"] external greenBright: string => string = "greenBright"; [@bs.module "chalk"] external yellowBright: string => string = "yellowBright"; [@bs.module "chalk"] external blueBright: string => string = "blueBright"; [@bs.module "chalk"] external magentaBright: string => string = "magentaBright"; [@bs.module "chalk"] external cyanBright: string => string = "cyanBright"; [@bs.module "chalk"] external whiteBright: string => string = "whiteBright"; [@bs.module "chalk"] external bgBlack: string => string = "bgBlack"; [@bs.module "chalk"] external bgRed: string => string = "bgRed"; [@bs.module "chalk"] external bgGreen: string => string = "bgGreen"; [@bs.module "chalk"] external bgYellow: string => string = "bgYellow"; [@bs.module "chalk"] external bgBlue: string => string = "bgBlue"; [@bs.module "chalk"] external bgMagenta: string => string = "bgMagenta"; [@bs.module "chalk"] external bgCyan: string => string = "bgCyan"; [@bs.module "chalk"] external bgWhite: string => string = "bgWhite"; [@bs.module "chalk"] external bgBlackBright: string => string = "bgBlackBright"; [@bs.module "chalk"] external bgRedBright: string => string = "bgRedBright"; [@bs.module "chalk"] external bgGreenBright: string => string = "bgGreenBright"; [@bs.module "chalk"] external bgYellowBright: string => string = "bgYellowBright"; [@bs.module "chalk"] external bgBlueBright: string => string = "bgBlueBright"; [@bs.module "chalk"] external bgMagentaBright: string => string = "bgMagentaBright"; [@bs.module "chalk"] external bgCyanBright: string => string = "bgCyanBright"; [@bs.module "chalk"] external bgWhiteBright: string => string = "bgWhiteBright"; /* Exact colors */ [@bs.module "chalk"] external hex: string => string = "hex"; [@bs.module "chalk"] external rgb_: (. int, int, int) => string = "rgb"; [@bs.module "chalk"] external hsl_: (. int, int, int) => string = "hsl"; [@bs.module "chalk"] external hsv_: (. int, int, int) => string = "hsv"; [@bs.module "chalk"] external hwb_: (. int, int, int) => string = "hwb"; [@bs.module "chalk"] external bgHex: string => string = "bgHex"; [@bs.module "chalk"] external bgRgb_: (. int, int, int) => string = "bgRgb"; [@bs.module "chalk"] external bgHsl_: (. int, int, int) => string = "bgHsl"; [@bs.module "chalk"] external bgHsv_: (. int, int, int) => string = "bgHsv"; [@bs.module "chalk"] external bgHwb_: (. int, int, int) => string = "bgHwb"; [@bs.module "chalk"] external keyword: string => string = "keyword"; /* Convenience Methods */ let level: Level.t = level_ |> Level.fromInt; let rgb = (~r: int, ~g: int, ~b: int) => rgb_(. r, g, b); let hsl = (~h: int, ~s: int, ~l: int) => hsl_(. h, s, l); let hsv = (~h: int, ~s: int, ~v: int) => hsv_(. h, s, v); let hwb = (~h: int, ~w: int, ~b: int) => hwb_(. h, w, b); let bgRgb = (~r: int, ~g: int, ~b: int) => bgRgb_(. r, g, b); let bgHsl = (~h: int, ~s: int, ~l: int) => bgHsl_(. h, s, l); let bgHsv = (~h: int, ~s: int, ~v: int) => bgHsv_(. h, s, v); let bgHwb = (~h: int, ~w: int, ~b: int) => bgHwb_(. h, w, b); }; module Path = { [@bs.module "path"] [@bs.variadic] external join: array(string) => string = "join"; [@bs.module "path"] external basename: string => string = "basename"; [@bs.module "path"] external extname: string => string = "extname"; [@bs.module "path"] external dirname: string => string = "dirname"; [@bs.module "path"] [@bs.variadic] external resolve: array(string) => string = "resolve"; [@bs.module "path"] external isAbsolute: string => bool = "isAbsolute"; }; module Rimraf: { type t; /* Bindinds for https://www.npmjs.com/package/rimraf. rimraf is a cross-platform utility library to delete a directory and all its contens */ let run: string => Js.Promise.t(result(unit, string)); } = { type t; [@bs.module] external run': (string, Js.Nullable.t('a) => unit) => unit = "rimraf"; let run = p => Js.Promise.make((~resolve, ~reject as _) => run'(p, err => switch (Js.Nullable.toOption(err)) { | Some(err) => resolve(. Error(err##message)) | None => resolve(. Ok()) } ) ); }; module Os: { let tmpdir: unit => string; } = { [@bs.module "os"] external tmpdir: unit => string = "tmpdir"; } ================================================ FILE: npm-cli/src/Bootstrapper.re ================================================ open Bindings; open ResultPromise; let runCommand = (cmd, args, projectPath, message) => { Js.log(""); Js.log(message); Cmd.spawn(~args, ~cwd=projectPath, ~cmd); }; /** TODO: Bootstrapper should ideally work in a temporary workspace, make sure the project of generating files and substituting values in them works fine and only them present the project to the user for further esy command. Bonus: Caching templates fetched from remote urls. This way, we make them hash addressable and cache them. We'll need to however first issue a request to github and check if the last commit hash at the repo has changed. Bonus: We don't overwrite if files of the same name exist and only append pesy config to package.json/esy.json. Why? So that users can easily upgrade to a pesy config. (Opposite of pesy eject) */ let bootstrap = Template.Kind.gen; let warmup = (~projectPath, ~esyCmd as esy, ()) => { Js.log(("Running" |> Chalk.dim) ++ (" pesy warm" |> Chalk.whiteBright)); Project.ofPath(esy, projectPath) >>= ( project => try(Warmup.run(esy, project)) { | Js.Exn.Error(e) => switch (Js.Exn.message(e)) { | Some(message) => Js.Promise.resolve(Error({j|Error: $message|j})) | None => Js.Promise.resolve(Error("An unknown error occurred")) } | e => Js.log(e); Js.Promise.resolve(Error("A network error occurred")); } ) |> Js.Promise.then_(warmupResult => { switch (warmupResult) { | Ok () => () | Error(msg) => Js.log("Skipping warmup because: "); Js.log(msg); }; ResultPromise.ok(); }) |> catch |> Js.Promise.then_(() => ResultPromise.ok()); }; let warmupPrompt = () => Js.Promise.make((~resolve, ~reject as _) => { Utils.askYesNoQuestion( ~question="Warm up local cache from CI?", ~onYes=() => resolve(. true), ~onNo=() => resolve(. false), (), ) }); let runningEsy = (~esy, ~projectPath, ~forceCacheFetch, ()) => { runCommand( esy, [|"i"|], projectPath, ("Running" |> Chalk.dim) ++ (" esy install" |> Chalk.whiteBright), ) >>= ( () => { Process.Stdout.write( Process.Stdout.v, "\n" ++ ("Checking" |> Chalk.dim) ++ " if project has all dependencies installed already => ", ); Esy.status(projectPath, esy) >>= ( status => if (!EsyStatus.isProjectReadyForDev(status)) { Js.log("No" |> Chalk.red); let toRunWarmup = switch (forceCacheFetch) { | Some(toRunOrNot) => Js.Promise.resolve(toRunOrNot) | None => warmupPrompt() }; toRunWarmup |> Js.Promise.then_(toWarmup => if (toWarmup) { warmup(~esyCmd=esy, ~projectPath, ()); } else { ResultPromise.ok(); } ); } else { Js.log("Yes!" |> Chalk.green); ResultPromise.ok(); } ); } ) >>= ( () /* (_stdout, _stderr) */ => { runCommand( esy, [|"pesy"|], projectPath, ("Running" |> Chalk.dim) ++ (" esy pesy" |> Chalk.whiteBright) ++ (" and " |> Chalk.dim) ++ ("building project dependencies" |> Chalk.whiteBright), ); } ) >>= ( () /* (_stdout, _stderr) */ => { runCommand( esy, [|"b"|], projectPath, ("Running" |> Chalk.dim) ++ (" esy build" |> Chalk.whiteBright), ); } ) >>| ( () /* (_stdout, _stderr) */ => { Js.log(""); "Ready for development!" |> Chalk.green |> Js.log; } ); }; let run = ( esy, projectPath, template, bootstrapOnly, bootstrapCIOnly, forceCacheFetch, ) => { let bootstrapped = bootstrap(projectPath, bootstrapCIOnly, template) >>= ( () => { // TODO: Hacky! Streamline what stays and what doesn't. Maybe add a ignore field to pesy config so that we know what to copy and what shouldn't be? Rimraf.run( Path.join([|projectPath, ".ci-self"|]), ); } ); /* >>= ( */ /* _ => { */ /* Js.log(""); */ /* Js.log("Setting up"); */ /* Js.log(""); */ /* Template.substitute(projectPath); */ /* } */ /* ); */ bootstrapOnly ? bootstrapped >>| ( () => { Js.log(""); "You may have to run " ++ Chalk.green("esy") |> Js.log; } ) : bootstrapped >>= runningEsy(~esy, ~projectPath, ~forceCacheFetch); }; let run = ( esy, projectPath, template, bootstrapOnly, bootstrapCIOnly, forceCacheFetch, ) => { Fs.mkdir(projectPath) |> Js.Promise.then_(() => { Process.chdir(projectPath); run( esy, projectPath, template, bootstrapOnly, bootstrapCIOnly, forceCacheFetch, ); }); }; ================================================ FILE: npm-cli/src/Bootstrapper.rei ================================================ let run: ( Cmd.t, Path.t, Template.Kind.t, bool /* bootstrapOnly */, bool /* bootstrapCIOnly */, option(bool) ) => ResultPromise.t(unit, string); ================================================ FILE: npm-cli/src/Cmd.re ================================================ open Bindings; type t = { cmd: string, env: Js.Dict.t(string), }; type stdout = string; type stderr = string; let pathMissingFromEnv = "'PATH' variable not found in the environment"; let env_sep = Process.platform == "win32" ? ";" : ":"; let binPath = c => c.cmd; let make = (~env, ~cmd) => switch (Js.Dict.get(env, "PATH")) { | None => Error(pathMissingFromEnv) |> Js.Promise.resolve | Some(path) => let cmds = Process.platform == "win32" ? [|cmd ++ ".exe", cmd ++ ".cmd"|] : [|cmd|]; cmds |> Array.map(cmd => Js.String.split(env_sep, path) |> Js.Array.map(p => Path.join([|p, cmd|])) ) |> Js.Array.reduce(Js.Array.concat, [||]) |> Js.Array.map(p => Fs.exists(p) |> Js.Promise.then_(exists => Js.Promise.resolve((p, exists))) ) |> Js.Promise.all |> Js.Promise.then_(r => Js.Promise.resolve(Js.Array.filter(((_p, exists)) => exists, r)) ) |> Js.Promise.then_(r => { let r = Array.to_list(r); let r = switch (r) { | [] => Error({j| Command "$cmd" not found |j}) | [(cmd, _exists), ..._rest] => Ok({cmd, env}) }; Js.Promise.resolve(r); }); }; let ofPathStr = path => { Fs.exists(path) |> Js.Promise.then_(exists => if (exists) { Ok({cmd: path, env: Process.env}) |> Js.Promise.resolve; } else { Error({j| Command ($path) not found |j}) |> Js.Promise.resolve; } ); }; let output = (~args, ~cwd, ~cmd) => { let {cmd, env} = cmd; let shellString = Js.Array.concat(args, [|cmd|]) |> Js.Array.joinWith(" "); ChildProcess.exec(shellString, ChildProcess.Options.make(~cwd, ~env, ())) |> Js.Promise.then_(r => { let r = switch (r) { | Error () => Result.fail({j| Exec failed: $shellString |j}) | Ok((exitCode, stdout, stderr)) => if (exitCode == 0) { Ok((stdout, stderr)); } else { Error( {j| Command $cmd failed: exitCode: $exitCode stderr: $stderr |j}, ); } }; Js.Promise.resolve(r); }); }; let spawn = (~args, ~cwd, ~cmd) => { let {cmd, env: _} = cmd; Js.Promise.make((~resolve, ~reject as _) => { let process = ChildProcess.spawn( cmd, args, ChildProcess.Options.make(~cwd, ~stdio="inherit", ()), ); ChildProcess.onClose(process, exitCode => if (exitCode == 0) { resolve(. Ok()); } else { resolve(. Error(Js.Array.concat(args, [|cmd|]) |> Js.Array.joinWith(" ")), ); } ); }); }; ================================================ FILE: npm-cli/src/DefaultTemplate.re ================================================ open Bindings; let path = Path.resolve([| dirname, "templates", "pesy-reason-template-0.1.0-alpha.20", /* Must be the same as ./script/vendor-template.js */ |]); let ciPath = Path.resolve([|dirname, "templates", "ci"|]); let dockerPath = Path.resolve([|dirname, "templates", "docker"|]); ================================================ FILE: npm-cli/src/Dir.re ================================================ open Bindings; let isEmpty = path => !Node.Fs.existsSync(path) || Belt.Array.length(Node.Fs.readdirSync(path)) == 0; let forEachEnt = (f, dir) => { Js.Promise.( Fs.readdir(dir) |> then_(files => files |> Array.map(f) |> all) |> then_(_ => ResultPromise.ok()) ); }; let rec scan = (ignoreDirsTbl, f, dir) => { Js.Promise.( forEachEnt( entry => if (!Hashtbl.mem(ignoreDirsTbl, entry)) { let entryPath = Path.join([|dir, entry|]); f(entryPath) |> then_(_ => Fs.isDirectory(entryPath) |> then_(isDir => if (isDir) { scan(ignoreDirsTbl, f, entryPath); } else { ResultPromise.ok(); } ) ); } else { ResultPromise.ok(); }, dir, ) ); }; ================================================ FILE: npm-cli/src/Dir.rei ================================================ let isEmpty: Path.t => bool; let forEachEnt: (string => ResultPromise.t(unit, string), Path.t) => ResultPromise.t(unit, string); let scan: ( Hashtbl.t(string, bool), Path.t => ResultPromise.t(unit, string), Path.t ) => ResultPromise.t(unit, string); ================================================ FILE: npm-cli/src/Esy.re ================================================ open Bindings; open ResultPromise; type t = Cmd.t; let make = () => Cmd.make(~cmd="esy", ~env=Process.env); let status = (projectPath, cmd) => Cmd.output(~cmd, ~cwd=projectPath, ~args=[|"status"|]) >>= (((output, _stderr)) => EsyStatus.make(output) |> Js.Promise.resolve); let manifestPath = (path, cmd) => status(path, cmd) >>| (esyStatus => EsyStatus.getRootPackageConfigPath(esyStatus)); let importDependencies = (~projectPath, ~exportsPath, cmd) => Cmd.output( ~cmd, ~cwd=projectPath, ~args=[|"import-dependencies " ++ exportsPath|], ); ================================================ FILE: npm-cli/src/Esy.rei ================================================ type t = Cmd.t; let make: unit => Js.Promise.t(result(t, string)); let manifestPath: (string, t) => Js.Promise.t(result(string, string)); let status: (string, t) => Js.Promise.t(result(EsyStatus.t, string)); let importDependencies: (~projectPath: Path.t, ~exportsPath: Path.t, t) => Js.Promise.t(result((string, string), string)); ================================================ FILE: npm-cli/src/EsyLock.re ================================================ type t = {checksum: string}; let ofPath = path => { Bindings.( Fs.readFile(. path) |> Js.Promise.then_(lockfileBytes => { let lockFileContents = lockfileBytes |> Buffer.toString; ( switch (Json.parse(lockFileContents)) { | Some(json) => Json.Decode.( try( {checksum: field("checksum", string, json)} |> Result.return ) { | DecodeError(msg) => Error(msg) } ) | None => Error( {j| Json parser failed on the lockfile: $lockFileContents |j}, ) } ) |> Js.Promise.resolve; }) ); }; let checksum = v => v.checksum; ================================================ FILE: npm-cli/src/EsyLock.rei ================================================ type t; let ofPath: Path.t => ResultPromise.t(t, string); let checksum: t => string; ================================================ FILE: npm-cli/src/EsyStatus.re ================================================ type t = { isProjectReadyForDev: bool, rootPackageConfigPath: string, }; let make = statusOutput => switch (Json.parse(statusOutput)) { | Some(json) => Json.Decode.( try( { rootPackageConfigPath: field("rootPackageConfigPath", string, json), isProjectReadyForDev: field("isProjectReadyForDev", bool, json), } |> Result.return ) { | DecodeError(msg) => Error(msg) } ) | None => Error({j| Json parser failed $statusOutput |j}) }; let getRootPackageConfigPath = config => config.rootPackageConfigPath; let isProjectReadyForDev = config => config.isProjectReadyForDev; ================================================ FILE: npm-cli/src/EsyStatus.rei ================================================ type t; let make: string => result(t, string); let getRootPackageConfigPath: t => string; let isProjectReadyForDev: t => bool; ================================================ FILE: npm-cli/src/Path.re ================================================ type t = string; ================================================ FILE: npm-cli/src/Path.rei ================================================ type t = string; ================================================ FILE: npm-cli/src/Pesy.re ================================================ Bindings.sourceMapSupportInstall(); open Cmdliner; open Utils; open Bindings; open ResultPromise; let promptEmptyDirectory = () => Js.Promise.make((~resolve, ~reject as _) => { askYesNoQuestion( ~question="Current directory is not empty. Are you sure to continue?", ~onYes=() => resolve(. Result.return()), ~onNo=() => resolve(. Result.fail("Aborting setup")), (), ) }); let handleEmptyDirectory = (. path, force) => if (Dir.isEmpty(path) || force) { ResultPromise.ok(); } else { promptEmptyDirectory(); }; let main = ( projectPath, template, forceInit, forceCacheFetch, bootstrapOnly, bootstrapCIOnly, ) => { let projectPath = Path.isAbsolute(projectPath) ? projectPath : Path.join([|Process.cwd(), projectPath|]); handleEmptyDirectory(. projectPath, forceInit) >>= (() => Cmd.make(~cmd="esy", ~env=Process.env)) >>= ( esy => Bootstrapper.run( esy, projectPath, template, bootstrapOnly, bootstrapCIOnly, forceCacheFetch, ) ) |> catch; }; let warmup = () => { let projectPath = Process.cwd(); Esy.make() >>= ( esy => Project.ofPath(esy, projectPath) >>= (project => Warmup.run(esy, project)) ) |> ResultPromise.catch; }; let testTemplate = () => { let templatePath = Process.cwd(); let tmpdir = Os.tmpdir(); let testProjectPath = Path.join([|tmpdir, "test-project"|]); Rimraf.run(testProjectPath) >>= ( () => Fs.mkdir(testProjectPath) |> Js.Promise.then_(() => Cmd.make(~cmd="esy", ~env=Process.env)) ) >>= ( esy => { Js.log(""); Js.log( Chalk.dim("Creating ") ++ Chalk.whiteBright("test-project") ++ Chalk.dim(" at ") ++ Chalk.whiteBright(testProjectPath), ); Bootstrapper.run( esy, testProjectPath, Template.Kind.path(templatePath), false, false, None, ); } ) |> ResultPromise.catch; }; type componentConv = | CI | Docker; let upgradeTemplate = (dest, cs1, cs2) => { let components = cs1 @ cs2; let allIfNone = fun | [] => [CI, Docker] | x => x; let rec uniq = acc => fun | [] => acc | [h, ...rest] => List.mem(h, acc) ? uniq(acc, rest) : uniq([h, ...acc], rest); let setupTemplate = path => Template.copyAndSubstitute(path, dest, []) |> Js.Promise.then_( fun | Ok () => Js.Promise.resolve() | Error(msg) => Js.log("Error while upgrading: " ++ msg) |> Js.Promise.resolve, ); components |> uniq([]) |> allIfNone |> List.map( fun | CI => setupTemplate(DefaultTemplate.ciPath) | Docker => setupTemplate(DefaultTemplate.dockerPath), ) |> Array.of_list |> Js.Promise.all |> Js.Promise.then_(_ => Js.log("") |> Js.Promise.resolve); }; let version = "0.5.0-dev.23"; let template = { let doc = "Specify URL of the remote template. This can be of the form https://repo-url.git#. Eg: https://github.com/reason-native-web/morph-hello-world-pesy-template#6e5cbbb9f28"; Arg.( value & opt( Template.Kind.cmdlinerConv, Template.Kind.path(DefaultTemplate.path), ) & info(["t", "template"], ~docv="TEMPLATE_URL", ~doc) ); }; let directory = { let doc = "Initialises a new project at given directory"; Arg.(value & opt(string, Process.cwd()) & info(["directory", "d"], ~doc)); }; let forceInit = { let doc = "Force generation of project files"; Arg.(value & flag & info(["finit", "force-init"], ~doc)); }; let forceCacheFetch = { let doc = "Whether to fetch relocatable assets from CI. When absent, a prompt will be presented."; Arg.(value & opt(some(bool), None) & info(["fetch-cache"], ~doc)); }; let bootstrapOnly = { let doc = "Only create initial set of files. Dont run esy commands on them."; Arg.(value & flag & info(["b", "bootstrap-only"], ~doc)); }; let bootstrapCIOnly = { let doc = "Only create ci files."; Arg.(value & flag & info(["c", "bootstrap-ci-only"], ~doc)); }; open Cmdliner.Term; let cmd = { let cmd = "pesy"; let envs: list(env_info) = []; let exits: list(exit_info) = []; let doc = "Your Esy Assistant."; let cmdT = Term.( const(main) $ directory $ template $ forceInit $ forceCacheFetch $ bootstrapOnly $ bootstrapCIOnly ); (cmdT, Term.info(cmd, ~envs, ~exits, ~doc, ~version)); }; let warmupCmd = { let cmd = "warmup"; let envs: list(env_info) = []; let exits: list(exit_info) = []; let doc = "warmup - warms esy cache with prebuilts from CI"; let cmdT = Term.(const(warmup) $ const()); (cmdT, Term.info(cmd, ~envs, ~exits, ~doc, ~version)); }; let testTemplateCmd = { let cmd = "test-template"; let envs: list(env_info) = []; let exits: list(exit_info) = []; let doc = "test-template - convenient subcommand to test your pesy template"; let cmdT = Term.(const(testTemplate) $ const()); (cmdT, Term.info(cmd, ~envs, ~exits, ~doc, ~version)); }; let upgradeTemplateCmd = { let componentConv: Cmdliner.Arg.conv(componentConv) = { let ofString = fun | "ci" => Ok(CI) | "docker" => Ok(Docker) | _ => Error("Unrecognised component to be upgraded"); let parser = (str: string): Pervasives.result(componentConv, [ | `Msg(string)]) => switch (ofString(str)) { | Ok(kind) => Ok(kind) | Error(msg) => Error(`Msg(msg)) }; let printer: Cmdliner.Arg.printer(componentConv) = (ppf: Format.formatter, v: componentConv) => ( switch (v) { | CI => Format.fprintf(ppf, "CI") | Docker => Format.fprintf(ppf, "Docker") }: unit ); (parser, printer) |> Arg.conv(~docv="ci | docker"); }; let components = { let doc = "Specifies which components of the template to upgrade"; Arg.( value & opt(list(componentConv), []) & info(["components", "l"], ~doc) ); }; let component = { let doc = "Specifies which component of the template to upgrade"; Arg.( value & opt_all(componentConv, []) & info(["component", "c"], ~doc) ); }; let cmd = "upgrade-template"; let envs: list(env_info) = []; let exits: list(exit_info) = []; let doc = "upgrade-template - convenient subcommand to upgrade your template"; let cmdT = Term.(const(upgradeTemplate) $ directory $ component $ components); (cmdT, Term.info(cmd, ~envs, ~exits, ~doc, ~version)); }; let main = (. argv) => switch ( Term.eval_choice( ~argv, cmd, [warmupCmd, testTemplateCmd, upgradeTemplateCmd], ) ) { | exception (Invalid_argument(msg)) => Js.log(msg); Js.Promise.resolve(1); | `Ok(p) => p |> Js.Promise.then_(() => Js.Promise.resolve(0)) | _ => Js.Promise.resolve(1) }; ================================================ FILE: npm-cli/src/Pesy.rei ================================================ let main: (. array(string)) => Js.Promise.t(int); ================================================ FILE: npm-cli/src/PesyConfig.re ================================================ module Tag = { open Json.Decode; type t = string; let decoder = json => json |> string; }; type t = { azureProject: option(string), github: string, template: option(Tag.t), ignoreDirs: option(list(string)), }; let decoder = json => { open Json.Decode; let azureProject = json |> (field("azure-project", string) |> optional); let template = json |> (field("template", Tag.decoder) |> optional); let github = json |> field("github", string); let ignoreDirs = json |> (field("ignore-dirs", list(string)) |> optional); {ignoreDirs, github, template, azureProject}; }; let ofJson = json => try(json |> Json.Decode.field("pesy", decoder) |> Result.return) { | Json.Decode.DecodeError(msg) => Error(msg) }; /* Makes a config. Must fail if mandatory fields are not present */ let make = manifest => switch (manifest |> Json.parse) { | None => Error("Json parser failed: " ++ manifest) | Some(json) => ofJson(json) }; let getAzureProject = config => config.azureProject; let getGithub = config => config.github; let getIgnoreDirs = config => config.ignoreDirs; let getTemplateTag = config => config.template; module Build: { type t; let ofString: string => result(t, string); let ofJson: Js.Json.t => result(t, string); } = { type t = bool; // We only track if 'buildDirs' property exists in the package.json open Json.Decode; let ofJson = json => switch (json |> (field("buildDirs", dict(id)) |> optional)) { | Some(_) => Result.return(true) | None => let str = Json.stringify(json); Result.fail( {j|buildDirs was not found in the provided string: $str |j}, ); }; let ofString = str => { switch (Json.parse(str)) { | Some(json) => ofJson(json) | None => {j| Could not parse the provided string as json: $str |j} |> Result.fail }; }; }; ================================================ FILE: npm-cli/src/PesyConfig.rei ================================================ type t; /* Json decoder */ let decoder: Json.Decode.decoder(t); /* Extracts the Azure Project name from the config */ let getAzureProject: t => option(string); /* Extracts the github slug (username/reponame) from the config */ let getGithub: t => string; /* Extracts ignoreDirs from the config */ let getIgnoreDirs: t => option(list(string)); /* Extracts template version/tag from the config */ let getTemplateTag: t => option(string); /* Creates pesy config from a give manifest file */ let make: string => result(t, string); /* Same as make, but accepts a json instead of string */ let ofJson: Js.Json.t => result(t, string); /** Build Config */ module Build: { /** Abstract type */ type t; /** Parses the build config from a strig */ let ofString: string => result(t, string); /** Same as ofString - parses build config, but from a Json.t */ let ofJson: Js.Json.t => result(t, string); }; ================================================ FILE: npm-cli/src/Project.re ================================================ open ResultPromise; type t = { path: Path.t, manifest: string, hash: string, }; let ofPath = (esy, projectPath) => Esy.manifestPath(projectPath, esy) >>= ( rootPackageConfigPath => Bindings.Fs.readFile(. rootPackageConfigPath) |> Js.Promise.then_(bytes => bytes |> Result.return |> Js.Promise.resolve ) >>= ( manifestBytes => { [| rootPackageConfigPath |> Js.String.replace("package.json", "esy.json") |> Js.String.replace(".json", ".lock"), "index.json", |] |> Bindings.Path.join |> EsyLock.ofPath >>| (lock => EsyLock.checksum(lock)) >>= ( checksum => { let manifest = manifestBytes |> Bindings.Buffer.toString; ResultPromise.ok({hash: checksum, path: projectPath, manifest}); } ); } ) ); let lockFileHash = v => v.hash; let pesyConfig = v => PesyConfig.make(v.manifest); let path = v => v.path; let hasBuildDirsConfig = v => switch (PesyConfig.Build.ofString(v.manifest)) { | Error(_) => false | Ok(_) => true }; ================================================ FILE: npm-cli/src/Project.rei ================================================ type t; /** Given a path, it tries to returns a [project] if it is a valid one */ let ofPath: (Esy.t, Path.t) => ResultPromise.t(t, string); /** Given [project], it returns it's pesy config */ let pesyConfig: t => result(PesyConfig.t, string); /** Given a [project], it returns it's esy lock file checksum */ let lockFileHash: t => string; /** Given a [project], it returns the path it is setup */ let path: t => Path.t; let hasBuildDirsConfig: t => bool; ================================================ FILE: npm-cli/src/Readline.re ================================================ type io = { . "input": in_channel, "output": out_channel, }; type rlType = { . [@bs.meth] "close": unit => unit, [@bs.meth] "write": string => unit, [@bs.meth] "on": (string, string => unit) => unit, [@bs.meth] "question": (string, string => unit) => unit, }; [@bs.module "readline"] external createInterface: io => rlType = "createInterface"; ================================================ FILE: npm-cli/src/Result.re ================================================ open Belt.Result; let (>>=) = flatMap; let (>>|) = map; let return = x => Ok(x); let fail = x => Error(x); let all = (~f, rps) => List.fold_left( (acc, r) => switch (r, acc) { | (Ok(v), Ok(acc)) => Ok([v, ...acc]) | (Error(msg), Ok(_)) => Error(msg) | (Ok(_), Error(msg)) => Error(msg) | (Error(msg1), Error(msg2)) => Error(f(msg1, msg2)) }, Ok([]), rps, ); let all2 = (~f: ('a, 'a) => 'a, rps) => switch (rps) { | (Ok(v1), Ok(v2)) => Ok((v1, v2)) | (Error(msg), Ok(_)) => Error(msg) | (Ok(_), Error(msg)) => Error(msg) | (Error(msg1), Error(msg2)) => Error(f(msg1, msg2)) }; ================================================ FILE: npm-cli/src/ResultPromise.re ================================================ type t('a, 'b) = Js.Promise.t(result('a, 'b)); let (>>=) = (rp, f) => { rp |> Js.Promise.then_( fun | Ok(x) => f(x) | Error(msg) => Js.Promise.resolve(Error(msg)), ); }; let (>>|) = (rp, f) => { rp |> Js.Promise.then_( fun | Error(msg) => Js.Promise.resolve(Error(msg)) | Ok(x) => f(x) |> Result.return |> Js.Promise.resolve, ); }; let ok = x => x |> Result.return |> Js.Promise.resolve; // Js.Promise.resolve << Result.return; let fail = x => x |> Result.fail |> Js.Promise.resolve; /** Js.Promise.resolve << Result.fail; let fail: '_weak1 => Js.Promise.t(Belt.Result.t('a, '_weak1)) is not included in let fail: 'b => t('a, 'b) */; let catch = rp => rp |> Js.Promise.then_( fun | Ok () => Js.Promise.resolve() | Error(msg) => Js.log(msg) |> Js.Promise.resolve, ); let all = (~f, rps) => Js.Promise.all(rps) |> Js.Promise.then_(rs => rs |> Array.to_list |> Result.all(~f) |> ( fun | Ok(l) => Ok(Array.of_list(l)) | Error(msg) => Error(msg) ) |> Js.Promise.resolve ); let all2 = (~f, rps) => Js.Promise.all2(rps) |> Js.Promise.then_(rs => rs |> Result.all2(~f) |> Js.Promise.resolve); ================================================ FILE: npm-cli/src/ResultPromise.rei ================================================ type t('a, 'b) = Js.Promise.t(result('a, 'b)); let (>>=): (t('a, 'b), 'a => t('c, 'b)) => t('c, 'b); let (>>|): (t('a, 'b), 'a => 'c) => t('c, 'b); let ok: 'a => t('a, 'b); let fail: 'b => t('a, 'b); let catch: t(unit, string) => Js.Promise.t(unit); let all: (~f: ('b, 'b) => 'b, array(t('a, 'b))) => t(array('a), 'b); let all2: (~f: ('b, 'b) => 'b, (t('a, 'b), t('c, 'b))) => t(('a, 'c), 'b); ================================================ FILE: npm-cli/src/Spinner.re ================================================ let interval = 120; let frames = [|"-", "\\", "|", "/"|]; /* let frames = [|". ", ".. ", "..."|]; */ type t = Js.Nullable.t(Js.Global.intervalId); let n_frames = Array.length(frames); let start = msg => { let i = ref(0); Js.Nullable.return( Js.Global.setInterval( () => { Printf.printf( "%s %s \r\r", msg, frames[i^ mod n_frames], ); i := i^ + 1; }, interval, ), ); }; let cancel = intervalID => Js.Nullable.iter(intervalID, (. intervalId) => Js.Global.clearInterval(intervalId) ); let stop = spinnerIntervalID => { Printf.printf( " \r\r", ); cancel(spinnerIntervalID); }; let clearLine = () => { Js.log("\n"); }; ================================================ FILE: npm-cli/src/Spinner.rei ================================================ type t; let start: string => t; let stop: t => unit; let clearLine: unit => unit; ================================================ FILE: npm-cli/src/Template.re ================================================ open Utils; module Helpers: { /** Contains functions that compute package name kebabs, upper camel cased and other forms that aid in generating Dune config for the subpackages */ /** Substitute variable in a file name. Different from [substituteTemplateValues] since placeholders in file name contains underscore */ let substituteFileNames: (Path.t, string) => string; /** strips -template suffix */ let stripTemplateExtension: string => string; /** Substitiute variables in the provided string (file contents) */ let substituteTemplateValues: (Path.t, string) => string; } = { open Bindings; /** If the package name were [fooBar], it would be turned to [foo-bar] */ /* let packageNameKebab: Path.t => string; */ let packageNameKebab = projectPath => kebab(basename(projectPath)); /** If the package name were [@opam/foo], it turns [foo] */ /* let packageNameKebabSansScope: Path.t => string; */ let packageNameKebabSansScope = projectPath => projectPath |> packageNameKebab |> removeScope; /** foo-bar turns FooBar */ /* let packageNameUpperCamelCase: Path.t => string; */ let packageNameUpperCamelCase = projectPath => projectPath |> packageNameKebabSansScope |> upperCamelCasify; /** Set to a 0.0.0 */ /* let templateVersion: string; */ let templateVersion = "0.0.0"; /** Produces value for (library name ...) */ /* let packageLibName: Path.t => string; */ let packageLibName = projectPath => packageNameKebabSansScope(projectPath) ++ "/library"; /** Produces value for (library name ...) */ /* let packageTestName: Path.t => string; */ let packageTestName = projectPath => packageNameKebabSansScope(projectPath) ++ "/test"; let substituteTemplateValues = (projectPath, s) => s |> Js.String.replaceByRe( [%bs.re "//g"], packageNameKebab(projectPath), ) |> Js.String.replaceByRe([%bs.re "//g"], templateVersion) |> Js.String.replaceByRe( [%bs.re "//g"], packageLibName(projectPath), ) |> Js.String.replaceByRe( [%bs.re "//g"], packageTestName(projectPath), ) |> Js.String.replaceByRe( [%bs.re "//g"], packageNameKebab(projectPath), ) |> Js.String.replaceByRe( [%bs.re "//g"], packageNameUpperCamelCase(projectPath), ); let stripTemplateExtension = s => { s |> Js.String.replace("-template", ""); }; let substituteFileNames = (projectPath, s) => { s |> Js.String.replaceByRe( [%bs.re "/__PACKAGE_NAME_FULL__/g"], packageNameKebab(projectPath), ) |> Js.String.replaceByRe( [%bs.re "/__PACKAGE_NAME__/g"], packageNameKebab(projectPath), ) |> Js.String.replaceByRe( [%bs.re "/__PACKAGE_NAME_UPPER_CAMEL__/g"], packageNameUpperCamelCase(projectPath), ); }; }; open Bindings; open Helpers; let copyAndSubstitute = (templatePath, projectPath, ignoreDirs) => { let ignoreDirs = ignoreDirs @ [".ci-self"]; /* Hacky! Figure a cleaner way to ignore template ci files */ let ignoreDirsTbl = Hashtbl.create(ignoreDirs |> List.length); List.iter( ignoreDir => Hashtbl.add(ignoreDirsTbl, ignoreDir, true), ignoreDirs, ); Js.log(""); Dir.scan( ignoreDirsTbl, src => { let dest = Js.String.replace(templatePath, projectPath, src) |> substituteFileNames(projectPath) |> stripTemplateExtension; if (Js.String.search([%re "/azure\\-pipelines\\.ya?ml/"], src) != (-1) || Js.String.search([%re "/README.md/i"], src) != (-1)) { ResultPromise.ok(); } else { Fs.isDirectory(src) |> Js.Promise.then_(isDir => if (isDir) { Fs.mkdir(dest); } else { Js.Promise.( Fs.( readFile(. src) |> then_(b => Buffer.toString(b) |> substituteTemplateValues(projectPath) |> Buffer.from |> resolve ) |> then_(s => writeFile(. dest, s)) |> then_(_ => if (Js.String.search([%re "/\\.lock/"], dest) == (-1)) { (" created " |> Chalk.green) ++ ( dest |> Js.String.replace( projectPath ++ (Process.platform == "win32" ? "\\" : "/"), "", ) |> Chalk.whiteBright ) |> Js.log; resolve(); } else { resolve(); } ) ) ); } ) |> Js.Promise.then_(_ => ResultPromise.ok()); }; }, templatePath, ); }; let substitute = projectPath => { walk_sync(projectPath) |> Array.map(file_or_dir => Path.join([|projectPath, file_or_dir|])) |> Js.Array.filter(file_or_dir => {statSync(file_or_dir)->isFile}) |> Array.map(file => { let substitutedName = file |> substituteFileNames(projectPath) |> stripTemplateExtension; Js.Promise.( Fs.( readFile(. file) |> then_(b => Buffer.toString(b) |> substituteTemplateValues(projectPath) |> Buffer.from |> resolve ) |> then_(s => writeFile(. substitutedName, s)) |> then_(_ => { if (file != substitutedName) { Node.Fs.unlinkSync(file); }; substitutedName |> Js.String.replace( projectPath ++ (Process.platform == "win32" ? "\\" : "/"), "", ) |> resolve; }) ) ); }) |> Js.Promise.all |> Js.Promise.then_(files => { let shown = ref([]); files |> Array.to_list |> List.iter(fileName => if (Js.String.search([%re "/\\.lock/"], fileName) == (-1) && !List.exists(x => x == fileName, shown^)) { (" created " |> Chalk.green) ++ (fileName |> Chalk.whiteBright) |> Js.log; shown := [fileName, ...shown^]; } else { (); } ); ResultPromise.ok(); }); }; module Kind = { open ResultPromise; type t = | Path(string) | GitRemote(string); let path = x => Path(x); let gitRemote = x => GitRemote(x); let validate = source => { /* Sanitisation. Checking if the source is a valid pesy project*/ /* We may not reliably be able to run 'esy status' in a template project. Otherwise, we could have have simply obtained rootPackageConfigPath from it */ /* Checking if root as a json file. Pesy supports multiple esy sandboxes Therefore, any one of them may contain a pesy config, for the whole template to be considered a valid pesy template */ Fs.readdir(source) |> Js.Promise.then_(directoryEntries => Js.Array.reduce( (acc, directoryEntry) => if (Js.Re.test_([%re "/\\.json$/"], directoryEntry)) { Js.Array.concat( acc, [|Path.join([|source, directoryEntry|])|], ); } else { acc; }, [||], directoryEntries, ) |> Js.Promise.resolve ) |> Js.Promise.then_(jsonFiles => if (Array.length(jsonFiles) == 0) { ResultPromise.fail( {j|No esy manifest found in the template ($source) |j}, ); } else { Js.Array.map( jsonFile => { Fs.readFile(. jsonFile) |> Js.Promise.then_(jsonBytes => { switch ( jsonBytes |> Bindings.Buffer.toString |> Json.parse ) { | None => ResultPromise.fail( {j| JSON file $jsonFile failed to parse |j}, ) | Some(json) => let buildDirsExists = switch (PesyConfig.Build.ofJson(json)) { | Ok(_) => true | Error(_) => false }; let (pesyConfigExists, explicitIgnoreDirs) = switch (PesyConfig.ofJson(json)) { | Ok(pesyConfig) => switch (PesyConfig.getIgnoreDirs(pesyConfig)) { | Some(explicitIgnoreDirs) => ( true, explicitIgnoreDirs, ) | None => (true, []) } | Error(_msg) => (false, []) }; if (buildDirsExists || pesyConfigExists) { ResultPromise.ok((jsonFile, explicitIgnoreDirs)); } else { ResultPromise.fail( {j|Neither 'pesy' nor 'buildDirs' was found in $jsonFile. 'pesy' must contain 'github' and 'azure-project'. 'buildDirs' must be key-value object of build directories and their config |j}, ); }; } }) }, jsonFiles, ) |> Js.Promise.all |> Js.Promise.then_(esyManifestFiles => { let (pesyManifests, errors, explicitIgnoreDirs) = Js.Array.reduce( ((pesyManifests, errors, accExplicitIgnoreDirs)) => fun | Ok((jsonFile, explicitIgnoreDirs)) => ( [jsonFile, ...pesyManifests], errors, explicitIgnoreDirs @ accExplicitIgnoreDirs, ) | Error(msg) => ( pesyManifests, [msg, ...errors], accExplicitIgnoreDirs, ), ([], [], []), esyManifestFiles, ); if (List.length(pesyManifests) == 0) { let errors = Js.Array.joinWith("\n", Array.of_list(errors)); ResultPromise.fail( {j|No esy manifest files found with pesy config (buildDirs or pesy). Errors: $errors |j}, ); } else { ResultPromise.ok(explicitIgnoreDirs); }; }); } ); }; let gen = (dest, bootstrapCIOnly) => fun | GitRemote(remote) => { let tmpdir = Os.tmpdir(); let hash = Crypto.sha256(. remote, "pesy-sha256-secret"); let remoteTemplateStageArea = Path.join([|tmpdir, "remote-stage-area-" ++ hash|]); /* TODO: sanitise remote templates */ downloadGit( remote, remoteTemplateStageArea, ) >>= (() => validate(remoteTemplateStageArea)) >>= ( explicitIgnoreDirs => { copyAndSubstitute( remoteTemplateStageArea, dest, explicitIgnoreDirs @ ["node_modules", ".git", "_esy"], ); } ); } | Path(source) => if (bootstrapCIOnly) { copyAndSubstitute(DefaultTemplate.ciPath, dest, []); } else { validate(source) >>= ( explicitIgnoreDirs => copyAndSubstitute( source, dest, explicitIgnoreDirs @ ["node_modules", ".git", "_esy"], ) ); }; let ofString = str => /* TODO: sanitisation. For instance, if git remotes with three components (foo/bar/baz) are meaningless */ if (Path.isAbsolute(str)) { Path(str) |> Result.return; } else { GitRemote(str) |> Result.return; }; let cmdlinerConv = { let parser: Cmdliner.Arg.parser(t) = (str: string) => switch (ofString(str)) { | Ok(kind) => `Ok(kind) | Error(msg) => `Error(msg) }; let printer: Cmdliner.Arg.printer(t) = (ppf: Format.formatter, v: t) => ( switch (v) { | GitRemote(remote) => Format.fprintf(ppf, "GitRemote(%s)", remote) | Path(path) => Format.fprintf(ppf, "Path(%s)", path) }: unit ); (parser, printer); }; }; ================================================ FILE: npm-cli/src/Template.rei ================================================ module Kind: { type t; let path: string => t; let gitRemote: string => t; let gen: (Path.t, bool, t) => ResultPromise.t(unit, string); /** Parses a string into either Path or GitRemote. Otherwise fails */ let ofString: string => result(t, string); let cmdlinerConv: Cmdliner.Arg.conv(t); // = (Cmdliner.Arg.parser(t), Cmdliner.Arg.printer(t)); }; /** Copies a template */ let copyAndSubstitute: (Path.t, Path.t, list(string)) => ResultPromise.t(unit, string); /** Substitutes values in the template */ let substitute: Path.t => ResultPromise.t(unit, string); ================================================ FILE: npm-cli/src/Utils.re ================================================ let (<<) = (f, g, x) => f(g(x)); module Caml = { module List = List; module String = String; }; let spf = Printf.sprintf; let parent = Filename.dirname; /* let copyTemplate = (a, b) => { */ /* write(b, readFile(Path.(scriptPath / "share" / "template-repo" / a))); */ /* }; */ let kebab = str => { let charStrings = Js.String.split("", str); let k = Js.Array.joinWith( "", Array.map( c => { let c = Caml.String.get(c, 0); if (c == ' ' || c == '_') { String.make(1, '-'); } else if (Char.uppercase_ascii(c) != Char.lowercase_ascii(c) && Char.uppercase_ascii(c) == c) { "-" ++ String.make(1, Char.lowercase_ascii(c)); } else { String.make(1, c); }; }, charStrings, ), ) |> Js.String.replaceByRe([%bs.re "/\\-\\-+/g"], "-"); if (Js.String.split("", k)->Array.unsafe_get(0) == "-") { Caml.String.sub(k, 1, String.length(k) - 1); } else { k; }; }; let removeScope = kebab => Js.String.replaceByRe([%bs.re "/[^\\/]*\\//g"], "", kebab); let upperCamelCasify = kebab => { let parts = Js.String.split("-", kebab); let k = Js.Array.joinWith("", Array.map(String.capitalize_ascii, parts)); if (Caml.String.get(k, 0) == '-') { Caml.String.sub(k, 1, String.length(k) - 1); } else { k; }; }; /* let loadTemplate = name => */ /* readFile(Path.(scriptPath / "share" / "template-repo" / name)); */ /* let rec mkdirp = p => { */ /* let directory_created = exists(p); */ /* if (!directory_created) { */ /* mkdirp(Filename.dirname(p)); */ /* makedirSync(p); */ /* }; */ /* }; */ let renderAsciiTree = (dir, name, namespace, require, isLast) => if (isLast) { spf({js|│ └─ %s %s %s |js}, dir, name, namespace); } else { Printf.sprintf( {js|│ ├─ %s │ %s │ %s |js}, dir, name, namespace, ) ++ (require == "" ? "" : (isLast ? " " : "│ ") ++ require); }; /* Capable of rendering a tree of depth 1 */ /* exception RenderAsciiTreeChildrenError(string); */ /* let renderAscTreeChildren = */ /* fun */ /* | [] => */ /* raise(RenderAsciiTreeChildrenError("Tree cannot have zero children")) */ /* | [firstChild, ...restChildren] => { */ /* let firstChildLog = spf("├─ %s", firstChild); */ /* let restChildrenLog = */ /* Caml.List.map(c => spf("│ %s", c), restChildren); */ /* String.joinWith("\n", ["│", firstChildLog, ...restChildrenLog]); */ /* }; */ /* let renderAscLastTree = */ /* fun */ /* | [] => */ /* raise(RenderAsciiTreeChildrenError("Tree cannot have zero children")) */ /* | [firstChild, ...restChildren] => { */ /* let firstChildLog = spf("└─ %s", firstChild); */ /* let restChildrenLog = */ /* Caml.List.map(c => spf(" %s", c), restChildren); */ /* String.join(~sep="\n", ["│", firstChildLog, ...restChildrenLog]); */ /* }; */ /* let rec renderAscTree = */ /* fun */ /* | [] => () */ /* | [t] => print_endline(renderAscLastTree(t)) */ /* | [t, ...rest] => { */ /* Js.log(renderAscTreeChildren(t)); */ /* renderAscTree(rest); */ /* }; */ module Option: { type t('a) = option('a); let (>>=): (t('a), 'a => t('b)) => t('b); let (>>|): (t('a), 'a => 'b) => t('b); let return: 'a => t('a); } = { open Belt.Option; type t('a) = option('a); let (>>=) = flatMap; let (>>|) = map; let return = x => Some(x); }; let rec askYesNoQuestion = (~question, ~onYes, ~onNo, ()) => { let rl = Readline.createInterface({ "input": [%raw "process.stdin"], "output": [%raw "process.stdout"], }); rl##question( question ++ " [y/n] ", input => { let response = input->Js.String.trim->Js.String.toLowerCase; switch (response) { | "y" | "yes" => onYes(); rl##close(); | "n" | "no" => onNo(); rl##close(); | _ => rl##close(); askYesNoQuestion(~question, ~onYes, ~onNo, ()); }; }, ); }; let jsExnGuard = f => try(f()) { | Js.Exn.Error(e) => let message = switch (Js.Exn.message(e)) { | Some(message) => message | None => "" }; let stack = switch (Js.Exn.stack(e)) { | Some(stack) => stack | None => "" }; Js.log(message); Js.log(stack); Js.Promise.resolve(); }; ================================================ FILE: npm-cli/src/Warmup.re ================================================ open Bindings; open ResultPromise; let os = switch (Process.platform) { | "darwin" => let os = "Darwin"; let os = switch (Process.arch) { | "arm64" => os ++ "-arm64" | _ => os }; os; | "linux" => "Linux" | "win32" => "Windows_NT" | _ => failwith("No $os") }; let prepareAzureCacheURL = (projStr, github) => { let proj = projStr |> AzurePipelines.ProjectName.ofString |> AzurePipelines.ProjectName.validate; AzurePipelines.getDefinitionID(proj, github) >>= (definitionID => AzurePipelines.getBuildID(proj, definitionID)) >>= (id => AzurePipelines.getDownloadURL(proj, id)); }; let getLatestAzureBuildId = (proj, github) => { AzurePipelines.getDefinitionID(proj, github) >>= (definitionID => AzurePipelines.getBuildID(proj, definitionID)); }; let download = (url, file, ~progress, ~end_, ~error) => { open Bindings; let stream = RequestProgress.requestProgress(Request.request(url)); RequestProgress.onProgress(stream, state => progress(state##size##transferred) ); /* RequestProgress.onData(stream, data); */ RequestProgress.onEnd(stream, end_); RequestProgress.onError(stream, error); RequestProgress.pipe(stream, Fs.createWriteStream(file)); }; let getUnzipCmd = () => { Process.platform == "win32" ? Cmd.ofPathStr( Path.resolve([| dirname, "..", "esy", "node_modules", "esy-bash", ".cygwin", "bin", "unzip.exe", |]), ) |> Js.Promise.then_(cmd => { switch (cmd) { | Ok(cmd) => Ok(cmd) |> Js.Promise.resolve | Error(_) => Cmd.ofPathStr( Path.resolve([| dirname, "..", "@esy-nightly", "esy", "node_modules", "esy-bash", ".cygwin", "bin", "unzip.exe", |]), ) } }) : Cmd.make(~cmd="unzip", ~env=Process.env); }; let giga = 1024 * 1024 * 1024; let mega = 1024 * 1024; let kilo = 1024; let divideBy = (n, x) => float_of_int(x) /. float_of_int(n); let toHumanReadableBytes = fun | x when x > giga => x |> divideBy(giga) |> Printf.sprintf("%.2f GB ") | x when x > mega => x |> divideBy(mega) |> Printf.sprintf("%.2f MB ") | x when x > kilo => x |> divideBy(kilo) |> Printf.sprintf("%.2f KB ") | x => (x |> string_of_int) ++ " bytes"; let readFileContentAsString = filePath => Fs.readFile(. filePath) |> Js.Promise.then_(bytes => Bindings.Buffer.toString(bytes) |> Js.String.trim |> Js.Promise.resolve ); type checksumMatch = | ChecksumMatch | ChecksumNotMatch; type cacheState = | CacheFound(checksumMatch) | CacheNotFound; let verifyChecksum = (~checksumFilePath, ~cacheZipPath) => Js.Promise.all2(( readFileContentAsString(checksumFilePath), Crypto.sha256File(cacheZipPath), )) |> Js.Promise.then_(((checksumToMatch, calculatedChecksum)) => { Js.Promise.resolve( if (checksumToMatch == calculatedChecksum) { ChecksumMatch; } else { ChecksumNotMatch; }, ) }); let checkCacheState = (~checksumFilePath, ~cacheZipPath) => Js.Promise.all2((Fs.exists(cacheZipPath), Fs.exists(checksumFilePath))) |> Js.Promise.then_(((cacheZipFound, checksumFileFound)) => if (cacheZipFound && checksumFileFound) { verifyChecksum(~checksumFilePath, ~cacheZipPath) |> Js.Promise.then_(checksumMatch => Js.Promise.resolve(CacheFound(checksumMatch)) ); } else { Js.Promise.resolve(CacheNotFound); } ); let rec downloadCacheFromGithub = (~github, ~templateTag, ~cacheDir, ~cacheZipPath, ~checksumFilePath) => { Js.log2( "Fetching prebuilts from Github" |> Chalk.dim, github |> Chalk.whiteBright, ); Rimraf.run(cacheDir) |> Js.Promise.then_(_ => Fs.mkdir(cacheDir)) |> ( _ => Resolve.resolve( {j|https://github.com/$github/releases/download/$templateTag/cache-$os-install-v1-checksum|j}, ) ) >>= ( downloadUrl => Js.Promise.make((~resolve, ~reject as _) => { let progress = bytes => { bytes |> toHumanReadableBytes |> ( x => Process.Stdout.( write( v, "Downloading checksum file " ++ (x |> Chalk.green) ++ "\r", ) ) ); }; let error = error => { Js.log(error); resolve(. Error("Checksum file download failed")); }; let end_ = () => { Js.log("Checksum file downloaded. " |> Chalk.green); resolve(. Ok()); }; download(downloadUrl, checksumFilePath, ~progress, ~error, ~end_); }) ) >>= ( _ => Resolve.resolve( {j|https://github.com/$github/releases/download/$templateTag/cache-$os-install-v1|j}, ) ) >>= ( downloadUrl => Js.Promise.make((~resolve, ~reject as _) => { let progress = bytes => { bytes |> toHumanReadableBytes |> ( x => Process.Stdout.( write( v, "Downloading cache (" ++ {j|cache-$os-install-v1|j} ++ ") " ++ (x |> Chalk.green) ++ "\r", ) ) ); }; let error = error => { Js.log(error); resolve(. Error("Cache files download failed")); }; let end_ = () => { Js.log("\nCache files downloaded" |> Chalk.green); resolve(. Ok()); }; download(downloadUrl, cacheZipPath, ~progress, ~error, ~end_); }) ) >>= (_ => getUnzipCmd()) >>= (cmd => Cmd.output(~cwd=cacheDir, ~cmd, ~args=[|"-o", cacheZipPath|])) >>= ( _ => { Process.Stdout.(write(v, "Verifying checksum... ")); verifyChecksum(~checksumFilePath, ~cacheZipPath) |> Js.Promise.then_(cacheState => switch (cacheState) { | ChecksumMatch => Process.Stdout.( write(v, Chalk.green("checksum match") ++ "\n") ); ResultPromise.ok(); | ChecksumNotMatch => Process.Stdout.( write(v, Chalk.red("checksum does not match") ++ "\n") ); Js.Promise.make((~resolve, ~reject as _) => { Utils.askYesNoQuestion( ~question= "Looks like there is an issue with the downloaded files. Do you want to re-download these files ?", ~onYes= () => downloadCacheFromGithub( ~github, ~cacheDir, ~cacheZipPath, ~checksumFilePath, ), ~onNo= () => resolve(. Result.fail( "Issue with the downloaded files (checksum does not match)", ), ), (), ) }); } ); } ); }; let rec downloadCacheFromAzure = ( ~azureProject, ~github, ~cacheDir, ~checksumZipPath, ~cacheZipPath, ~checksumFilePath, ~exportPath, ) => { Js.log2( "Fetching prebuilts for azure project" |> Chalk.dim, azureProject |> AzurePipelines.ProjectName.toString |> Chalk.whiteBright, ); Rimraf.run(cacheDir) |> Js.Promise.then_(_ => Fs.mkdir(cacheDir)) |> Js.Promise.then_(() => getLatestAzureBuildId(azureProject, github)) >>= ( buildId => { AzurePipelines.getChecksumDownloadURL(azureProject, buildId) >>= ( downloadUrl => Js.Promise.make((~resolve, ~reject as _) => { let progress = bytes => { bytes |> toHumanReadableBytes |> ( x => Process.Stdout.( write( v, "Downloading checksum file" ++ (x |> Chalk.green) ++ "\r", ) ) ); }; let error = error => { Js.log(error); resolve(. Error("Checksum file download failed")); }; let end_ = () => { Js.log("Checksum file downloaded. " |> Chalk.green); resolve(. Ok()); }; download(downloadUrl, checksumZipPath, ~progress, ~error, ~end_); }) ) >>= (_ => AzurePipelines.getDownloadURL(azureProject, buildId)) >>= ( downloadUrl => Js.Promise.make((~resolve, ~reject as _) => { let progress = bytes => { bytes |> toHumanReadableBytes |> ( x => Process.Stdout.( write( v, "Downloading cache files " ++ (x |> Chalk.green) ++ "\r", ) ) ); }; let error = error => { Js.log(error); resolve(. Error("Cache files download failed")); }; let end_ = () => { Js.log("\nCache files Downloaded. " |> Chalk.green); resolve(. Ok()); }; download(downloadUrl, cacheZipPath, ~progress, ~error, ~end_); }) ) >>= (_ => getUnzipCmd()) >>= ( cmd => { Cmd.output(~cwd=cacheDir, ~cmd, ~args=[|"-o", checksumZipPath|]) >>= ( _ => { Js.log("Extracting files..."); Cmd.output(~cwd=cacheDir, ~cmd, ~args=[|"-o", cacheZipPath|]); } ) >>= ( _ => Cmd.output( ~cwd=cacheDir, ~cmd, ~args=[|"-d", "_export", "-o", exportPath|], ) ); } ) >>= ( _ => { Process.Stdout.(write(v, "Verifying checksum... ")); verifyChecksum(~checksumFilePath, ~cacheZipPath=exportPath) |> Js.Promise.then_(cacheState => switch (cacheState) { | ChecksumMatch => Process.Stdout.( write(v, Chalk.green("checksum match") ++ "\n") ); ResultPromise.ok(); | ChecksumNotMatch => Process.Stdout.( write(v, Chalk.red("checksum does not match") ++ "\n") ); Js.Promise.make((~resolve, ~reject as _) => { Utils.askYesNoQuestion( ~question= "Looks like there is an issue with the downloaded files. Do you want to re-download these files ?", ~onYes= () => downloadCacheFromAzure( ~azureProject, ~github, ~cacheDir, ~checksumZipPath, ~cacheZipPath, ~checksumFilePath, ~exportPath, ), ~onNo= () => resolve(. Result.fail( "Issue with the downloaded files (checksum does not match)", ), ), (), ) }); } ); } ); } ); }; let run = (esy, project) => { let projectHash = Project.lockFileHash(project); let projectPath = Project.path(project); let cacheDir = Path.join([|Os.tmpdir(), "pesy-" ++ projectHash|]); let checksumZipPath = Path.join([|cacheDir, "checksum.zip"|]); let cacheZipPath = Path.join([|cacheDir, "cache.zip"|]); let exportPath = Path.join([|cacheDir, {j|cache-$os-install-v1|j}, "_export.zip"|]); Js.Promise.resolve(Project.pesyConfig(project)) >>= ( pesyConfig => { let p = { let github = PesyConfig.getGithub(pesyConfig); let templateVersion = PesyConfig.getTemplateTag(pesyConfig); let azureProject = PesyConfig.getAzureProject(pesyConfig); switch (templateVersion, azureProject) { | (None, None) => let checksumFilePath = Path.join([|cacheDir, "checksum.txt"|]); checkCacheState(~checksumFilePath, ~cacheZipPath) |> Js.Promise.then_(cacheState => switch (cacheState) { | CacheFound(ChecksumMatch) => ResultPromise.ok() | CacheNotFound | CacheFound(ChecksumNotMatch) => downloadCacheFromGithub( ~github, ~templateTag="latest", ~cacheDir, ~cacheZipPath, ~checksumFilePath, ) } ); | (Some(templateTag), _) => let checksumFilePath = Path.join([|cacheDir, "checksum.txt"|]); checkCacheState(~checksumFilePath, ~cacheZipPath) |> Js.Promise.then_(cacheState => switch (cacheState) { | CacheFound(ChecksumMatch) => ResultPromise.ok() | CacheNotFound | CacheFound(ChecksumNotMatch) => downloadCacheFromGithub( ~github, ~templateTag, ~cacheDir, ~cacheZipPath, ~checksumFilePath, ) } ); | (None, Some(azureProject)) => let checksumFilePath = Path.join([| cacheDir, {j|cache-$os-install-v1-checksum|j}, "checksum.txt", |]); checkCacheState(~checksumFilePath, ~cacheZipPath) |> Js.Promise.then_(cacheState => { switch (cacheState) { | CacheFound(ChecksumMatch) => ResultPromise.ok() | CacheNotFound | CacheFound(ChecksumNotMatch) => let azureProject = azureProject |> AzurePipelines.ProjectName.ofString |> AzurePipelines.ProjectName.validate; downloadCacheFromAzure( ~azureProject, ~github, ~cacheDir, ~checksumZipPath, ~cacheZipPath, ~checksumFilePath, ~exportPath, ); } }); }; }; p >>= ( _stdout => Esy.importDependencies( ~projectPath, ~exportsPath=Path.join([|cacheDir, "_export"|]), esy, ) |> Js.Promise.then_( fun | Ok(r) => ResultPromise.ok(r) | Error(_) => /* import-dependencies can sometimes fail on individual cache entries which is fail. We can simply retry */ Esy.importDependencies( ~projectPath, ~exportsPath=Path.join([|cacheDir, "_export"|]), esy, ), ) >>| ( ((stdout, stderr)) => { Js.log( ("Running " |> Chalk.dim) ++ ( "esy import-dependencies " ++ Path.join([|cacheDir, "_export"|]) |> Chalk.bold ), ); Process.Stdout.(write(v, stdout |> Chalk.dim)); Process.Stdout.(write(v, stderr |> Chalk.dim)); } ) ); } ); }; ================================================ FILE: npm-cli/stubs/crypto.js ================================================ const crypto = require("crypto"); const fs = require("fs"); function sha256(data, secret) { crypto.createHmac("sha256", secret).update(data).digest(secret); } function shaFile(path, algo) { return new Promise((resolve, reject) => { const shasum = crypto.createHash(algo); let s = fs.ReadStream(path); s.on("data", function (data) { shasum.update(data); }); s.on("end", function () { var hash = shasum.digest("hex"); resolve(hash); }); s.on("error", function (error) { reject(error); }); }); } function sha1File(path) { return shaFile(path, "sha1"); } function sha256File(path) { return shaFile(path, "sha256"); } module.exports = { sha256, sha1File, sha256File }; ================================================ FILE: npm-cli/stubs/fs.js ================================================ let { promisify } = require("util"); let fs = require("fs"); let readFile = promisify(fs.readFile); let writeFile = promisify(fs.writeFile); let mkdirP = promisify(fs.mkdir); let exists = promisify(fs.exists); let stat = promisify(fs.stat); let readdir = promisify(fs.readdir); let unlink = promisify(fs.unlink); let mkdir = (path) => mkdirP(path, { recursive: true }); module.exports = { readFile, writeFile, mkdir, exists, readdir, stat, unlink, }; ================================================ FILE: npm-cli/stubs/resolve.js ================================================ const url = require("url"); function run(urlStr, callback) { let httpm; let urlObj = url.parse(urlStr); switch (urlObj.protocol) { case "http:": httpm = require("http"); break; case "https:": httpm = require("https"); break; default: throw `Unrecognised protocol in provided url: ${urlStr}`; } httpm.get(urlObj, function (response) { if (response.statusCode >= 300 && response.statusCode < 400) { let urlStr = response.headers.location; run(urlStr, (err, resolvedUrl) => { if (err) { callback(err); } else { callback(null, resolvedUrl); } }); } else if (response.statusCode >= 200 && response.statusCode < 300) { return callback(null, urlStr); } else callback("Server returned 4xx/5xx for " + urlStr); }); } module.exports.run = run; ================================================ FILE: npm-cli/templates/.gitignore ================================================ pesy-reason-template-* template.zip ================================================ FILE: npm-cli/templates/.npmignore ================================================ ================================================ FILE: npm-cli/templates/ci/.ci/build-docker.yml ================================================ jobs: - job: Docker_Alpine_Build displayName: Docker Alpine Build pool: vmImage: ubuntu-latest steps: - checkout: self submodules: true - script: sudo apt install jq gzip displayName: Install deps - bash: | ESY__PROJECT_NAME=$(jq -r .name package.json) ESY__PROJECT_VERSION=$(jq -r .version package.json) echo "##vso[task.setvariable variable=esy__project_name]$ESY__PROJECT_NAME" echo "##vso[task.setvariable variable=esy__project_version]$ESY__PROJECT_VERSION" - script: docker build . -f docker/DevImage.Dockerfile --network=host -t $(esy__project_name)-dev displayName: "Build Docker (dev) image" - script: docker container run -itd --network=host --name $(esy__project_name)-container $(esy__project_name)-dev displayName: "Run Docker container" - script: docker cp $(esy__project_name)-container:/app/_release $PWD/_container_release displayName: "Copy _release from container" - script: npm pack workingDirectory: _container_release displayName: "Npm pack'ing" - task: PublishBuildArtifacts@1 displayName: "Publish Docker built artifact" inputs: PathtoPublish: "_container_release" ArtifactName: DockerBuiltNPM - script: docker build . -f docker/ProdImage.Dockerfile --network=host -t $(esy__project_name) displayName: "Build production Docker image" - script: docker save $(esy__project_name) | gzip > $(esy__project_name)-docker-image.tar.gz displayName: "Save Docker image as tarball" - task: PublishBuildArtifacts@1 displayName: "Publish Docker production image" inputs: PathtoPublish: "$(esy__project_name)-docker-image.tar.gz" ArtifactName: AlpineDockerImage ================================================ FILE: npm-cli/templates/ci/.ci/build-platform.yml ================================================ parameters: platform: "macOS" vmImage: "macOS-10.13" jobs: - job: ${{ parameters.platform }} pool: vmImage: ${{ parameters.vmImage }} demands: node.js timeoutInMinutes: 120 # This is mostly for Windows steps: - powershell: $Env:Path continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print env in powershell" # Needed so that the mingw tar doesn't shadow the system tar. See # pipelines.yaml. We need windows bsdtar from system32, not the mingw # one. Note powershell doesn't need escaping of backslashes. - powershell: Write-Host "##vso[task.setvariable variable=PATH;]C:\Program Files\Git\bin;C:\Windows\system32;${env:PATH}" continueOnError: true condition: eq(variables['AGENT.OS'], 'Windows_NT') displayName: "Make sure C:/Program Files/Git/bin and windows/system32 is at front of path if windows" - powershell: $Env:Path continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print env in powershell" - powershell: get-command tar continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print where tar is located" - powershell: tar --help continueOnError: true condition: and(eq(variables['AGENT.OS'], 'Windows_NT'), and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])))) displayName: "Print tar help" - powershell: Write-Host "##vso[task.setvariable variable=HOME;]D:\" continueOnError: true condition: eq(variables['AGENT.OS'], 'Windows_NT') displayName: "Make sure $HOME is same is Agent.BuildDirectory" - bash: | # COMPUTE THE ESY INSTALL CACHE LOCATION AHEAD OF TIME DESIRED_LEN="85" # Not sure why, windows is has one extra underscore. Observed at https://github.com/ManasJayanth/reason-ocaml-tls-tutorial-meet/commit/3b4a6113cc413cc5cdf0fd8a2521c4c44dd1c0e5 if [ "$AGENT_OS" == "Windows_NT" ]; then DESIRED_LEN="86" fi HOME_ESY3="$HOME/.esy/3" HOME_ESY3_LEN=${#HOME_ESY3} NUM_UNDERS=$(echo "$(($DESIRED_LEN-$HOME_ESY3_LEN))") UNDERS=$(printf "%-${NUM_UNDERS}s" "_") UNDERS="${UNDERS// /_}" THE_ESY__CACHE_INSTALL_PATH=${HOME_ESY3}${UNDERS}/i if [ "$AGENT_OS" == "Windows_NT" ]; then THE_ESY__CACHE_INSTALL_PATH=$( cygpath --mixed --absolute "$THE_ESY__CACHE_INSTALL_PATH") fi echo "THE_ESY__CACHE_INSTALL_PATH: $THE_ESY__CACHE_INSTALL_PATH" # This will be exposed as an env var ESY__CACHE_INSTALL_PATH, or an # Azure var esy__cache_install_path echo "##vso[task.setvariable variable=esy__cache_install_path]$THE_ESY__CACHE_INSTALL_PATH" # - bash: | # which esy # echo "$( which esy )" # echo "##vso[task.setvariable variable=esy_bin_location]$(which esy)" # displayName: "Find esy binary" # - bash: echo ${ESY_BIN_LOCATION} # displayName: "Print esy bin location" - bash: env displayName: "Print environment" - template: esy-build-steps.yml - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: ${{ parameters.platform }}" inputs: PathtoPublish: "_release" ArtifactName: ${{ parameters.platform }} ================================================ FILE: npm-cli/templates/ci/.ci/cross-release.yml ================================================ steps: - template: utils/use-node.yml - script: "mkdir _release" displayName: "Create _release dir" - template: release-platform-setup.yml parameters: artifactName: "DockerBuiltNPM" # If static linking isn't necessary, use 'Linux' folder: "platform-linux" - template: release-platform-setup.yml parameters: artifactName: "macOS" folder: "platform-darwin" - template: release-platform-setup.yml parameters: artifactName: "Windows" folder: "platform-windows-x64" - script: "node .ci/pipelines-release.js" displayName: "node .ci/pipelines-release.js" continueOnError: true - script: "npm pack ." displayName: "npm pack" workingDirectory: "_release" - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: Release" inputs: PathtoPublish: "_release" ArtifactName: Release ================================================ FILE: npm-cli/templates/ci/.ci/esy-build-steps.yml ================================================ # Cross-platform set of build steps for building esy projects steps: - template: utils/use-node.yml - template: utils/use-cache-yarn.yml - template: utils/use-esy.yml - script: "esy install" displayName: "esy install" condition: ne(variables['AGENT.OS'], 'Linux') - template: utils/use-cache-esy.yml - script: "esy install --cache-tarballs-path=$(Agent.HomeDirectory)/esy-sources" displayName: "esy install" condition: eq(variables['AGENT.OS'], 'Linux') - template: utils/publish-sources.yml - template: utils/restore-build-cache.yml - script: "esy build --release" displayName: "esy build --release" - script: "esy release" displayName: "esy release" - template: utils/publish-build-cache.yml ================================================ FILE: npm-cli/templates/ci/.ci/opam-build-steps.yml ================================================ # Shared steps for building OPAM projects steps: - task: NodeTool@0 inputs: versionSpec: '8.9' - script: brew install gpatch displayName: 'brew install gpatch' - script: brew install opam displayName: 'brew install opam' - script: opam --version displayName: 'Check opam version' - script: opam init --auto-setup --dot-profile=~/.bash_profile displayName: 'opam init' - script: opam remote add ocamlorg https://opam.ocaml.org || true displayName: 'opam remote add ocamlorg' - script: opam remove default || true displayName: 'opam remove default' - script: opam update displayName: 'opam update' - script: opam switch create $(OCAML_VERSION) displayName: 'Use OCaml version: $(OCAML_VERSION)' - script: opam install -y dune displayName: 'opam install -y dune' - script: opam install -y menhir displayName: 'opam install -y menhir' - script: opam install -y utop displayName: 'opam install -y utop' - script: make clean-for-ci displayName: 'make clean-for-ci' - script: opam pin add -y reason . displayName: "opam pin add -y reason ." - script: opam pin add -y rtop . displayName: "opam pin add -y rtop ." - script: eval $(opam env); make test-ci displayName: "make test-ci" - script: git diff --exit-code displayName: "Check git is clean" ================================================ FILE: npm-cli/templates/ci/.ci/pipelines-release.js ================================================ const fs = require("fs"); const path = require("path"); console.log("Creating package.json"); // From the project root pwd const mainPackageJsonPath = fs.existsSync("esy.json") ? "esy.json" : "package.json"; const exists = fs.existsSync(mainPackageJsonPath); if (!exists) { console.error("No package.json or esy.json at " + mainPackageJsonPath); process.exit(1); } // Now require from this script's location. const mainPackageJson = require(path.join("..", mainPackageJsonPath)); const bins = Array.isArray(mainPackageJson.esy.release.bin) ? mainPackageJson.esy.release.bin.reduce( (acc, curr) => Object.assign({ [curr]: "bin/" + curr }, acc), {} ) : Object.keys(mainPackageJson.esy.release.bin).reduce( (acc, currKey) => Object.assign( { [currKey]: "bin/" + mainPackageJson.esy.release.bin[currKey] }, acc ), {} ); const rewritePrefix = mainPackageJson.esy && mainPackageJson.esy.release && mainPackageJson.esy.release.rewritePrefix; const packageJson = JSON.stringify( { name: mainPackageJson.name, version: mainPackageJson.version, license: mainPackageJson.license, description: mainPackageJson.description, repository: mainPackageJson.repository, scripts: { postinstall: "node -e \"process.env['OCAML_VERSION'] = process.platform == 'linux' ? '4.10.2000-musl.static.flambda': '4.10.2000'; process.env['OCAML_PKG_NAME'] = 'ocaml'; process.env['ESY_RELEASE_REWRITE_PREFIX']=true; require('./postinstall.js')\"": "node -e \"process.env['OCAML_VERSION'] = process.platform == 'linux' ? '4.10.2000-musl.static.flambda': '4.10.2000'; process.env['OCAML_PKG_NAME'] = 'ocaml'; require('./postinstall.js')\"" }, bin: bins, files: [ "_export/", "bin/", "postinstall.js", "esyInstallRelease.js", "platform-linux/", "platform-darwin/", "platform-darwin-arm64/", "platform-windows-x64/", ], }, null, 2 ); fs.writeFileSync( path.join(__dirname, "..", "_release", "package.json"), packageJson, { encoding: "utf8", } ); try { console.log("Copying LICENSE"); fs.copyFileSync( path.join(__dirname, "..", "LICENSE"), path.join(__dirname, "..", "_release", "LICENSE") ); } catch (e) { console.warn("No LICENSE found"); } console.log("Copying README.md"); try { fs.copyFileSync( path.join(__dirname, "..", "README.md"), path.join(__dirname, "..", "_release", "README.md") ); } catch (e) { console.warn("No README.md found"); } console.log("Copying postinstall.js"); fs.copyFileSync( path.join(__dirname, "release-postinstall.js"), path.join(__dirname, "..", "_release", "postinstall.js") ); console.log("Creating placeholder files"); const placeholderFile = `:; echo "You need to have postinstall enabled"; exit $? @ECHO OFF ECHO You need to have postinstall enabled`; fs.mkdirSync(path.join(__dirname, "..", "_release", "bin")); Object.keys(bins).forEach((name) => { if (bins[name]) { const binPath = path.join(__dirname, "..", "_release", bins[name]); fs.writeFileSync(binPath, placeholderFile); fs.chmodSync(binPath, 0777); } else { console.log("bins[name] name=" + name + " was empty. Weird."); console.log(bins); } }); ================================================ FILE: npm-cli/templates/ci/.ci/release-platform-setup.yml ================================================ parameters: platform: "macOS" folder: "platform-darwin" steps: - task: DownloadBuildArtifacts@0 displayName: "Download ${{ parameters.artifactName }} Artifacts" inputs: artifactName: ${{ parameters.artifactName }} downloadPath: $(Build.StagingDirectory) - script: "mkdir _release/${{ parameters.folder }}" displayName: "Create _release/${{ parameters.folder }}" - script: "cp -r $(Build.StagingDirectory)/${{ parameters.artifactName }}/ _release/${{ parameters.folder }}" displayName: "cp ${{ parameters.artifactName }}" ================================================ FILE: npm-cli/templates/ci/.ci/release-postinstall.js ================================================ /** * release-postinstall.js * * XXX: We want to keep this script installable at least with node 4.x. * * This script is bundled with the `npm` package and executed on release. * Since we have a 'fat' NPM package (with all platform binaries bundled), * this postinstall script extracts them and puts the current platform's * bits in the right place. */ var path = require("path"); var cp = require("child_process"); var fs = require("fs"); var os = require("os"); var platform = process.platform; var packageJson = require("./package.json"); var binariesToCopy = Object.keys(packageJson.bin) .map(function(name) { return packageJson.bin[name]; }) .concat(["esyInstallRelease.js"]); var foldersToCopy = ["bin", "_export"]; function copyRecursive(srcDir, dstDir) { var results = []; var list = fs.readdirSync(srcDir); var src, dst; list.forEach(function(file) { src = path.join(srcDir, file); dst = path.join(dstDir, file); var stat = fs.statSync(src); if (stat && stat.isDirectory()) { try { fs.mkdirSync(dst); } catch (e) { console.log("directory already exists: " + dst); console.error(e); } results = results.concat(copyRecursive(src, dst)); } else { try { fs.writeFileSync(dst, fs.readFileSync(src)); } catch (e) { console.log("could't copy file: " + dst); console.error(e); } results.push(src); } }); return results; } /** * Since os.arch returns node binary's target arch, not * the system arch. * Credits: https://github.com/feross/arch/blob/af080ff61346315559451715c5393d8e86a6d33c/index.js#L10-L58 */ function arch() { /** * The running binary is 64-bit, so the OS is clearly 64-bit. */ if (process.arch === "x64") { return "x64"; } /** * All recent versions of Mac OS are 64-bit. */ if (process.platform === "darwin") { return "x64"; } /** * On Windows, the most reliable way to detect a 64-bit OS from within a 32-bit * app is based on the presence of a WOW64 file: %SystemRoot%\SysNative. * See: https://twitter.com/feross/status/776949077208510464 */ if (process.platform === "win32") { var useEnv = false; try { useEnv = !!( process.env.SYSTEMROOT && fs.statSync(process.env.SYSTEMROOT) ); } catch (err) {} var sysRoot = useEnv ? process.env.SYSTEMROOT : "C:\\Windows"; // If %SystemRoot%\SysNative exists, we are in a WOW64 FS Redirected application. var isWOW64 = false; try { isWOW64 = !!fs.statSync(path.join(sysRoot, "sysnative")); } catch (err) {} return isWOW64 ? "x64" : "x86"; } /** * On Linux, use the `getconf` command to get the architecture. */ if (process.platform === "linux") { var output = cp.execSync("getconf LONG_BIT", { encoding: "utf8" }); return output === "64\n" ? "x64" : "x86"; } /** * If none of the above, assume the architecture is 32-bit. */ return "x86"; } // implementing it b/c we don't want to depend on fs.copyFileSync which appears // only in node@8.x function copyFileSync(sourcePath, destPath) { var data; try { data = fs.readFileSync(sourcePath); } catch (e) { data = fs.readFileSync(sourcePath + ".exe"); sourcePath = sourcePath + ".exe"; destPath = destPath + ".exe"; } var stat = fs.statSync(sourcePath); fs.writeFileSync(destPath, data); fs.chmodSync(destPath, 0755); } var copyPlatformBinaries = platformPath => { var platformBuildPath = path.join(__dirname, "platform-" + platformPath); foldersToCopy.forEach(folderPath => { var sourcePath = path.join(platformBuildPath, folderPath); var destPath = path.join(__dirname, folderPath); copyRecursive(sourcePath, destPath); }); binariesToCopy.forEach(binaryPath => { var sourcePath = path.join(platformBuildPath, binaryPath); var destPath = path.join(__dirname, binaryPath); if (fs.existsSync(destPath)) { fs.unlinkSync(destPath); } copyFileSync(sourcePath, destPath); }); }; try { fs.mkdirSync("_export"); } catch (e) { console.log("Could not create _export folder"); } switch (platform) { case "win32": if (arch() !== "x64") { console.warn("error: x86 is currently not supported on Windows"); process.exit(1); } copyPlatformBinaries("windows-x64"); break; case "linux": case "darwin": copyPlatformBinaries(platform); break; default: console.warn("error: no release built for the " + platform + " platform"); process.exit(1); } require("./esyInstallRelease"); ================================================ FILE: npm-cli/templates/ci/.ci/utils/create-docs.yml ================================================ # These steps are only run on Linux steps: - script: "esy doc" displayName: "Build docs" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) - script: echo '##vso[task.setvariable variable=docsPath]'$(esy echo '#{self.target_dir}/default/_doc/_html') displayName: "Save docsPath in variable" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: Docs" condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) inputs: PathtoPublish: $(docsPath) ArtifactName: Docs ================================================ FILE: npm-cli/templates/ci/.ci/utils/publish-build-cache.yml ================================================ # Steps for publishing project cache steps: - bash: 'mkdir -p $(Build.StagingDirectory)' displayName: '[Cache][Publish] Create cache directory' # continueOnError because on windows it has a permission denied error but the # export succeeds. - script: "esy export-dependencies" displayName: "esy export-dependencies" - bash: "zip -r cache.zip _export && shasum -a 256 cache.zip | awk '{ print $1 }' > checksum.txt && mv checksum.txt cache.zip $(Build.StagingDirectory)" displayName: "Computing sha256 of the zip" condition: ne(variables['AGENT.OS'], 'Windows_NT') - script: powershell.exe -nologo -noprofile -command "Compress-Archive -Path _export -DestinationPath cache.zip" displayName: "[Windows] Zipping _export" condition: eq(variables['AGENT.OS'], 'Windows_NT') - script: "shasum -a 256 cache.zip | awk '{ print $1 }' > checksum.txt && mv checksum.txt cache.zip $(Build.StagingDirectory)" displayName: "[Windows] Computing sha256" condition: eq(variables['AGENT.OS'], 'Windows_NT') - bash: pwd && ls _export/* && mv _export '$(Build.StagingDirectory)' && ls '$(Build.StagingDirectory)/_export/' displayName: '[Cache][Publish] move export to staging dir' # - bash: cd $ESY__CACHE_INSTALL_PATH && tar -czf $(Build.StagingDirectory)/esy-cache.tar . # workingDirectory: '' # condition: and(succeeded(), eq(variables['Build.Reason'], 'IndividualCI')) # displayName: '[Cache][Publish] Tar esy cache directory' # - bash: 'cd $(ESY__NPM_ROOT) && tar -czf $(Build.StagingDirectory)/npm-cache.tar .' # condition: and(succeeded(), eq(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch'])) # displayName: '[Cache][Publish] Tar npm cache directory' - task: PublishBuildArtifacts@1 displayName: '[Cache][Publish] Upload tarball' # TODO: The CI Build caches are pulled down by the last successful buildID # for the target branch. inputs: pathToPublish: '$(Build.StagingDirectory)/cache.zip' artifactName: 'cache-$(Agent.OS)-install-$(esy__ci_cache_version)' parallel: true parallelCount: 8 - task: PublishBuildArtifacts@1 displayName: '[Cache][Publish] Upload checksum' inputs: pathToPublish: '$(Build.StagingDirectory)/checksum.txt' artifactName: 'cache-$(Agent.OS)-install-$(esy__ci_cache_version)-checksum' parallel: true parallelCount: 8 ================================================ FILE: npm-cli/templates/ci/.ci/utils/publish-sources.yml ================================================ steps: - task: PublishBuildArtifacts@1 displayName: '[Cache][Publish] Sources' condition: eq(variables['AGENT.OS'], 'Linux') inputs: pathToPublish: "$(Agent.HomeDirectory)/esy-sources" artifactName: 'esy-sources' parallel: true parallelCount: 8 ================================================ FILE: npm-cli/templates/ci/.ci/utils/restore-build-cache.yml ================================================ # Steps for restoring project cache steps: - bash: 'mkdir -p $(Build.StagingDirectory)' condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Publish] Create cache directory' # TODO: This can be done in parallel with installing node, and esy # (which would save a bunch of time on windows) - task: Bash@3 condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Restore] Restoring build cache using REST API' continueOnError: true inputs: targetType: 'inline' # Optional. Options: filePath, inline script: | # If org name is reasonml then REST_BASE will be: https://dev.azure.com/reasonml/ REST_BASE="${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}" PROJ="$SYSTEM_TEAMPROJECT" ART_NAME="cache-${AGENT_OS}-install-${ESY__CI_CACHE_VERSION}" fetchLatestBuild() { PREFIX="branchName=refs%2Fheads%2F" BRANCH=${PREFIX}${SYSTEM_PULLREQUEST_TARGETBRANCH} FILTER='deletedFilter=excludeDeleted&statusFilter=completed&resultFilter=succeeded' LATEST='queryOrder=finishTimeDescending&$top=1' REST_BUILDS="$REST_BASE/$PROJ/_apis/build/builds?${FILTER}&${BRANCH}&${LATEST}&api-version=4.1" echo "Rest call for builds: $REST_BUILDS" REST_BUILDS_RESP=$(curl "$REST_BUILDS") if [[ $REST_BUILDS_RESP =~ (\"web\":\{\"href\":\")([^\"]*) ]]; then LATEST_BUILD_PAGE="${BASH_REMATCH[2]}"; else LATEST_BUILD_PAGE=""; fi if [[ $REST_BUILDS_RESP =~ (\"badge\":\{\"href\":\")([^\"]*) ]]; then LATEST_BUILD_BADGE="${BASH_REMATCH[2]}"; else LATEST_BUILD_BADGE=""; fi if [[ $REST_BUILDS_RESP =~ (\"id\":)([^,]*) ]]; then LATEST_BUILD_ID="${BASH_REMATCH[2]}"; else LATEST_BUILD_ID=""; fi } fetchLatestBuild fetchArtifactURL() { REST_ART="$REST_BASE/$PROJ/_apis/build/builds/$LATEST_BUILD_ID/artifacts?artifactName=$ART_NAME&api-version=4.1" echo "Rest call for artifacts: $REST_ART" if [[ $(curl $REST_ART) =~ (downloadUrl\":\")([^\"]*) ]]; then LATEST_ART_URL="${BASH_REMATCH[2]}"; else LATEST_ART_URL=""; fi } downloadArtifactAndContinue() { if [ -z "$LATEST_ART_URL" ] then echo "No latest artifact for merge-target branch found at URL $REST_ART" else curl "$LATEST_ART_URL" > "${BUILD_STAGINGDIRECTORY}/$ART_NAME.zip" PROJECT_DIR=$PWD cd $BUILD_STAGINGDIRECTORY unzip "$ART_NAME.zip" echo "Using Dependency cache for buildID: $LATEST_BUILD_ID" echo "Build log for build that produced the cache: $LATEST_BUILD_PAGE" echo "Build badge for build that produced the cache: $LATEST_BUILD_BADGE" echo "Build artifact from build that produced the cache: $LATEST_ART_URL" echo "Restoring build cache into:" mkdir -p $ESY__CACHE_INSTALL_PATH echo $ESY__CACHE_INSTALL_PATH echo "##vso[task.setvariable variable=esy_export_dir_to_import]${BUILD_STAGINGDIRECTORY}/${ART_NAME}/_export" if [[ -d ${ART_NAME}/_export ]]; then mv ${ART_NAME}/_export ${PROJECT_DIR}/_import cd $PROJECT_DIR echo "Cached builds to import" ls ./_import # import-build allows importing before esy install runs. # unlike import-dependencies echo "Going to import builds from ${PROJECT_DIR}/_import in the next build step" if [ "$AGENT_OS" == "Windows_NT" ]; then echo "Trying the cmd" # Have to import the builds one by one in windows because # there is some file locking issue in esy on windows only when # importing many in parallel. cd ./_import FILES=* for f in $FILES do echo "Trying to import $f" esy.cmd import-build "$f" done cd $PROJECT_DIR else esy import-dependencies "_import" fi else echo "No _export directory to import from build cache" echo "Here's the contents of build cache:" find ${BUILD_STAGINGDIRECTORY} fi fi } fetchArtifactURL downloadArtifactAndContinue - bash: 'rm -rf _import' continueOnError: true condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: 'Remove import directory' - bash: 'rm -rf *' continueOnError: true workingDirectory: '$(Build.StagingDirectory)' condition: and(eq(variables['Build.Reason'], 'PullRequest'), and(succeeded(), ne(variables['Build.SourceBranch'], variables['System.PullRequest.TargetBranch']))) displayName: '[Cache][Restore] Clean up staging dir' ================================================ FILE: npm-cli/templates/ci/.ci/utils/use-cache-esy.yml ================================================ steps: - task: Cache@2 inputs: key: 'v1 | esy-install-cache | "$(Agent.OS)" | "$(Build.SourcesDirectory)/esy.lock/index.json"' # vPrimary, here, is just a way to bust cache during debugging. Inspired from https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#can-i-clear-a-cache" path: $(ESY__CACHE_INSTALL_PATH) cacheHitVar: ESY_INSTALL_CACHE_RESTORED displayName: "Caching $(ESY__CACHE_INSTALL_PATH)" - task: Cache@2 inputs: key: 'v1 | esy-sources | "$(Agent.OS)" | "$(Build.SourcesDirectory)/esy.lock/index.json"' # vPrimary, here, is just a way to bust cache during debugging. Inspired from https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#can-i-clear-a-cache" path: "$(Agent.HomeDirectory)/esy-sources" cacheHitVar: ESY_SOURCE_CACHE_RESTORED displayName: "Caching esy sources" condition: eq(variables['AGENT.OS'], 'Linux') - task: Cache@2 inputs: key: 'v1 | esy-sources | "$(Agent.OS)" | "$(Build.SourcesDirectory)/esy.lock/index.json"' # vPrimary, here, is just a way to bust cache during debugging. Inspired from https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#can-i-clear-a-cache" path: "$(ESY__CACHE_INSTALL_PATH)/../../source" cacheHitVar: ESY_SOURCE_CACHE_RESTORED displayName: "Caching esy sources" condition: ne(variables['AGENT.OS'], 'Linux') ================================================ FILE: npm-cli/templates/ci/.ci/utils/use-cache-yarn.yml ================================================ steps: - bash: | YARN_CACHE_DIR=$(yarn cache dir) echo "##vso[task.setvariable variable=YARN_CACHE_DIR]$YARN_CACHE_DIR" - task: Cache@2 inputs: key: 'yarn | "$(Agent.OS)" | "$(Build.SourcesDirectory)/npm-cli/yarn.lock"' restoreKeys: | yarn | "$(Agent.OS)" yarn path: $(YARN_CACHE_DIR) displayName: Cache yarn ================================================ FILE: npm-cli/templates/ci/.ci/utils/use-esy.yml ================================================ # steps to install esy globally steps: - script: "yarn global add @esy-nightly/esy" displayName: "Install esy-nightly (via yarn)" - bash: | YARN_BIN_DIR=$(yarn global bin) echo $YARN_BIN_DIR echo "##vso[task.setvariable variable=YARN_BIN_DIR]$YARN_BIN_DIR" displayName: "Setting $YARN_BIN_DIR" - bash: | echo "##vso[task.setvariable variable=PATH]$PATH:$YARN_BIN_DIR" displayName: "Ensure yarn install global tools are available on $PATH" condition: ne(variables['AGENT.OS'], 'Windows_NT') - powershell: Write-Host "##vso[task.setvariable variable=PATH;]${env:PATH};${env:YARN_BIN_DIR}" displayName: "Ensure yarn install global tools are available on $PATH" condition: eq(variables['AGENT.OS'], 'Windows_NT') ================================================ FILE: npm-cli/templates/ci/.ci/utils/use-node.yml ================================================ # steps to use node on agent steps: - task: NodeTool@0 displayName: "Use Node 12.x" inputs: versionSpec: 12.x ================================================ FILE: npm-cli/templates/ci/azure-pipelines-template.yml ================================================ name: Build npm release variables: esy__ci_cache_version: v1 # this is available to all jobs in env as $ESY__CI_CACHE_VERSION or in azure config as $(esy__ci_cache_version) trigger: branches: include: - master - releases/* paths: exclude: - README.html - notes/* - "*.md" - LICENSE jobs: - template: .ci/build-platform.yml parameters: platform: Linux vmImage: ubuntu-latest - template: .ci/build-platform.yml parameters: platform: macOS vmImage: macOS-latest # Need windows-2019 to do esy import/export-dependencies # which assumes you have bsdtar (tar.exe) in your system # otherwise it will end up using the esy-bash tar which doesn't # understand drives like D:/ (thinks it's an scp path). - template: .ci/build-platform.yml parameters: platform: Windows vmImage: windows-2019 - template: .ci/build-docker.yml # This job is kept here as we want to have the platform names in the same file - job: Release displayName: Release dependsOn: - Docker_Alpine_Build - macOS - Windows pool: vmImage: macOS-latest demands: node.js steps: - template: .ci/cross-release.yml ================================================ FILE: npm-cli/templates/docker/docker/DevImage.Dockerfile ================================================ FROM esydev/esy:nightly-alpine-latest RUN apk add nodejs npm linux-headers emacs curl git perl-utils bash gcc g++ musl-dev make m4 patch COPY . /app WORKDIR /app RUN esy --cache-tarballs-path=esy-sources RUN esy release WORKDIR /app/_release RUN npm pack ================================================ FILE: npm-cli/templates/docker/docker/ProdImage.Dockerfile ================================================ FROM node:current-alpine COPY _container_release /app/_container_release WORKDIR /app/_container_release RUN yarn global --prefix /usr/local add $PWD ENTRYPOINT FooApp # To use: docker run --rm -it --name foo-c foo ================================================ FILE: npm-cli/v0.4.4/LICENSE ================================================ MIT License Copyright (c) 2017 Jordan W Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: npm-cli/v0.4.4/ORIGIN.md ================================================ - Includes vendored copy of [JSON.sh](https://github.com/dominictarr/JSON.sh) (under MIT LICENSE) which has been renamed to `pesy-JSON.sh` to avoid name collisions. ================================================ FILE: npm-cli/v0.4.4/README.md ================================================ # pesy: Native Reason Project from Json. > Use `package.json` to automatically configure libraries and executables built with Dune. ![screenshot](./images/screenshot.png "Demo") ## Commands: - `pesy` : Creates a new project in the current directory. - `esy` : Builds the current project (just like every other `esy` project). - `esy pesy` : Updates your build config from `package.json` (run this any time you change `package.json`).
### `pesy` (Create New Project) `pesy` global command creates `esy` projects instantly inside of any directory. ```sh npm install -g pesy cd my-project pesy # Hit enter to accept default name ``` This creates: - `package.json` with useful dependencies/compilers. - `.gitignore` and `README.md` with instructions for new contributors. - `.circleci` continuous integration with cache configured for ultra-fast pull requests. - `library/`, `executable/` and `test/` directory with starter modules.
### `esy` (Build The Project) Just like with any `esy` project, running `esy` from the project directory will build it and fetch/install any dependencies you might need. ```sh esy ``` > Your project's `esy.build` field is set to `pesy`, which will run `pesy` to > verify that all your build config is up to date before invoking the Dune > build. It will let you know if you need to run `esy pesy` to update your > build config from new changes to `package.json`.
### `esy pesy`: (Update Build Config Based On `package.json`) ```sh esy pesy ``` If you change your `buildDirs` config in `package.json`, run this command to update build configuration based on your latest `package.json`. If you forget to run this command and try to build (by running `esy`) without first running `esy pesy`, the build will remind you.
## Configuring: Configure your `package.json`'s `buildDirs` field for multiple libraries and executables. `buildDirs.DirectoryName` means that a library or executable will be located at `./DirectoryName`. The `buildDirs.DirectoryName.name` field determines the public name of the library or executable. a `name` ending in `.exe` is automatically configured as an executable, and a name of the form `packageName.anything` is automatically configured to be a library with the public name of `packageName.anything`. ```json "buildDirs": { "MyLibrary": { "name": "packageNameMyLibrary", "namespace": "MyLibrary", "require": ["console.lib"] }, "Tests": { "name": "Tests.exe", "description": "Runs all the tests natively", "flags": ["-linkall"], "require": ["console.lib", "packageNameMyLibrary""] } } ``` ### Supported Config Not all config is supported. This is just a proof of concept. If you'd like to add support for more config fields, PRs are welcomed. **Binaries** | Field | Type | Description | |--------|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |`name` | `string` | The name of the binary **that must end with `.exe`**. | |`main` | `string` | The name of the module that serves as the main entrypoint of the binary. | |`modes` | `list(string)` | [Advanced linking modes](https://jbuilder.readthedocs.io/en/latest/dune-files.html?highlight=modules_without_implementation#linking-modes). Each string should be of the form `"( )"` where `` is one `byte`, `native` or `best` and `` is one of `c`, `exe`, `object`, `shared_object`. | **Libraries** | Field | Type | Description | |-----------------|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |`name` | `string` | The name of the library | |`modes` | `list("byte"\|"native"\|"best")` | Mode which should be built by default. Useful for disabling native compilation for some libraries. | |`cNames` | `list(string)` | List of strings to use as C stubs (filenames without the `.c` extension). | |`virtualModules` | `list(string)` | List of modules within the library that will have interfaces but no implementation, causing this library to be considered "virtual". Another library can then claim to "implement" this library by including `"implements": "yourLibName"`. See [Virtual Libraries](https://jbuilder.readthedocs.io/en/latest/variants.html) | |`implements` | `list(string)` | List of virtual library names that this library implements. | |`wrapped` | `true|false` | Default `true`, and it's a good idea to keep it that way. Setting to `false` will put all your library modules in the global namespace. **Both Libraries And Binaries** | Field | Type | Description | |-----------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |`require` | `list(string)` | Public library names you want to be able to use. | |`flags` | `list(string)` | List of strings to pass to both native and bytecode compilers. | |`ocamlcFlags` | `list(string)` | List of flags to pass to `ocamlc` | |`ocamloptFlags` | `list(string)` | List of flags to pass to `ocamlopt` | |`jsooFlags` | `list(string)` | List of flags passed to `jsoo` | |`preprocess` | `list(string)` | List of preprocess options to enable. Primarily used to enable PPX | |`ignoredSubdirs` | `list(string)` | Subdirectory names to ignore (This feature is soon to be deprecated). | |`includeSubdirs` | `"no"\|"unqualified"` | Default is `"no"`, and changing to `"unqualified"` will compile modules at deeper directories than the place where the `dune` file is generated. See [Dune docs](https://jbuilder.readthedocs.io/en/latest/dune-files.html?highlight=include_subdirs#include-subdirs) | |`rawBuildConfig` | `list(string)` | Raw build config to be injected into the build config for _this_ target. | |`rawBuildConfigFooter` | `list(string)` | Raw build config to be injected into the footer of the build config. | ## Consuming New Package And Library Dependencies: - Add dependencies to `dependencies` in `package.json`. - Add the name of that new dependencies *library* to `package.json`'s `buildDirs` section that you want to use the library within. For example, if your project builds a library in the `exampleLib/` directory, and you want it to depend on a library named `bos.top` from an opam package named `bos`, change the `package.json` to look like this: ```json { "name": "my-package", "dependencies": { "@opam/bos": "*" }, "buildDirs": { "exampleLib": { "namespace": "Examples", "name": "my-package.example-lib", "require": [ "bos.top" ] } } } ``` - Then run: ```sh esy install # Fetch dependency sources esy pesy # Configure the build based on package.json esy build # Do the build ``` > Note: After adding/building a new dependency you can use `esy ls-libs` to see > which named libraries become available to you by adding the package > dependency. ## Tradeoffs: `esy-pesy` is good for rapidly making new small executables/libraries. Once they grow, you'll want to "eject out" of `esy-pesy` and begin customizing using a more advanced build system. ## Adding `pesy` to an existing project. You probably don't need `pesy` if you have an existing project that is working well, but to add `pesy` to an existing project, follow these steps: **1. Add a dependency on `pesy`, and configure `buildDirs`:** ```json { "name": "my-package", "dependencies": { "pesy": "*" }, "buildDirs": { "exampleLib": { "namespace": "Examples", "name": "my-package.example-lib", "require": [ "bos.top" ] }, "bin": { "name": "my-package.exe", "require": [ "my-package.lib" ] } } } ``` **2.Install and Build:** ```sh esy install esy pesy # Generate the project build config from json esy build ``` # Future Development: The next major version of `pesy` is getting even simpler and better, and has undergone a full native rewrite. Follow the work in its new repo: [https://github.com/esy/pesy](https://github.com/esy/pesy). # Changes: **version 0.4.3 (6/20/2019)** Moved `pesy` to a `devDependency` of all newly created projects. Also did the same for `refmterr`. This causes fewer package conflicts. **version 0.4.2 (6/16/2019)** Make new projects pin to ocaml `4.7.1004` so that it compiles with Reason, since we're still waiting on Reason to work with `4.8`. **version 0.4.0 (12/21/2018)** - Allow `buildDirs` to contain deeper directories such as `"path/to/my-lib": {...}"`. - Added support for `wrapped` property on libraries. - Added support for `virtualModules` and `implements` - properties for Dune virtual libraries. (This will only be supported if you mark your project as Dune 1.7 - not yet released). - Stopped using `ignore_subdirs` in new projects, instead using `(dirs (:standard \ _esy))` which only works in Dune `1.6.0+`, so made new projects have a lower bound of Dune `1.6.0`. - Support new properties `rawBuildConfig` which will be inserted at the bottom of the _target_ being configured (library/executable). - It expects an array of strings, each string being a separate line in the generated config. - Support new properties `rawBuildConfigFooter` which will be inserted at the bottom of the entire Dune file for the _target_ being configured. - It expects an array of strings, each string being a separate line in the generated config. - Support new properties `modes` for binaries and libraries `list(string)`. ================================================ FILE: npm-cli/v0.4.4/azure-ci-template/azure-pipelines.yml ================================================ # Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml name: $(Build.SourceVersion) jobs: - job: Linux timeoutInMinutes: 0 pool: vmImage: 'Ubuntu 16.04' variables: ESY__CACHE_INSTALL_PATH: /home/vsts/.esy/3_____________________________________________________________________/i/ ESY__CACHE_SOURCE_TARBALL_PATH: /home/vsts/.esy/source/i steps: # TODO: Uncomment both this and 'publish-build-cache' below to enable build caching for Linux. # - template: .ci/restore-build-cache.yml - template: .ci/esy-build-steps.yml # - template: .ci/publish-build-cache.yml - job: MacOS timeoutInMinutes: 0 pool: vmImage: 'macOS-latest' variables: ESY__CACHE_INSTALL_PATH: /Users/vsts/.esy/3____________________________________________________________________/i/ ESY__CACHE_SOURCE_TARBALL_PATH: /Users/vsts/.esy/source/i steps: # TODO: Uncomment both this and 'publish-build-cache' below to enable build caching for Mac. # - template: .ci/restore-build-cache.yml - template: .ci/esy-build-steps.yml # - template: .ci/publish-build-cache.yml - job: Windows timeoutInMinutes: 0 pool: vmImage: 'vs2017-win2016' variables: ESY__CACHE_INSTALL_PATH: C:\Users\VssAdministrator\.esy\3_\i ESY__CACHE_SOURCE_TARBALL_PATH: C:\Users\VssAdministrator\.esy\source\i steps: - template: .ci/restore-build-cache.yml - template: .ci/esy-build-steps.yml - template: .ci/publish-build-cache.yml - job: Release timeoutInMinutes: 0 displayName: Release dependsOn: - Linux - MacOS - Windows condition: succeeded() pool: vmImage: ubuntu-16.04 steps: - task: PublishBuildArtifacts@1 displayName: 'Release Package' inputs: PathtoPublish: '.' ArtifactName: npm-package ================================================ FILE: npm-cli/v0.4.4/azure-ci-template/esy-build-steps.template.yml ================================================ # Cross-platform set of build steps for building esy projects steps: - task: NodeTool@0 inputs: versionSpec: '8.9' - script: npm install -g esy@0.4.3 displayName: 'npm install -g esy@0.4.3' - script: esy install displayName: 'esy install' - script: esy pesy displayName: 'esy pesy' - script: esy build displayName: 'esy build' - script: esy test displayName: 'esy test' - script: esy x App.exe displayName: 'Run the main binary' - script: esy ls-libs continueOnError: true displayName: 'Show all libraries including this package lib' - script: esy release displayName: 'Test Creation of Prebuilt Binary Releases' continueOnError: true ================================================ FILE: npm-cli/v0.4.4/azure-ci-template/publish-build-cache.yml ================================================ # Steps for publishing project cache steps: - task: PublishBuildArtifacts@1 displayName: 'Cache: Upload install folder' condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) inputs: pathToPublish: '$(ESY__CACHE_INSTALL_PATH)' artifactName: 'cache-$(Agent.OS)-install' parallel: true parallelCount: 8 ================================================ FILE: npm-cli/v0.4.4/azure-ci-template/restore-build-cache.yml ================================================ # Steps for restoring project cache steps: - task: DownloadBuildArtifacts@0 condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master')) displayName: 'Cache: Restore install' inputs: buildType: 'specific' project: '$(System.TeamProject)' pipeline: '$(Build.DefinitionName)' branchName: 'refs/heads/master' buildVersionToDownload: 'latestFromBranch' downloadType: 'single' artifactName: 'cache-$(Agent.OS)-install' downloadPath: '$(System.ArtifactsDirectory)' continueOnError: true - task: CopyFiles@2 condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master')) inputs: sourceFolder: '$(System.ArtifactsDirectory)\cache-$(Agent.OS)-install' targetFolder: '$(ESY__CACHE_INSTALL_PATH)' continueOnError: true ================================================ FILE: npm-cli/v0.4.4/esy-peasy ================================================ #!/bin/bash set -e set -u echo "" echo "esy-peasy low-config build" echo "--------------------------" echo "Building at: $cur__root" # Need to avoid spinning up node every build command. # MD5_OF_PACKAGE # We can build out of source, then simply copy over the .merlin files because # those are whitelisted! We can also prepare them. PACKAGE_NAME="${cur__name}" PACKAGE_NAME_CAMEL=$(echo "${PACKAGE_NAME}" | perl -pe 's/([a-z0-9])-([a-zA-Z0-9])/$1\U$2/g') PACKAGE_NAME_CAMEL_UC=$(tr '[:lower:]' '[:upper:]' <<< "${PACKAGE_NAME_CAMEL:0:1}")${PACKAGE_NAME_CAMEL:1} LIB_DIR="${cur__root}/lib" BIN_DIR="${cur__root}/bin" LIB_JBUILD_FILE="${LIB_DIR}/jbuild" BIN_JBUILD_FILE="${BIN_DIR}/jbuild" # Hacky, but fast and v8-less parsing of the important field in json file. # Some of these command might fail if there's no field in the package.json so # we fall back to empty string on failure. DEPENDENCY_LIBRARIES_WITH=$(tr -d '[:",\n' < package.json | grep -E -o 'peasyLibs .*?\]') || DEPENDENCY_LIBRARIES_WITH="" DEPENDENCY_LIBRARIES="${DEPENDENCY_LIBRARIES_WITH:9}" || DEPENDENCY_LIBRARIES="" # Trim off the final dangling ] DEPENDENCY_LIBRARIES=${DEPENDENCY_LIBRARIES::${#DEPENDENCY_LIBRARIES}-1} || DEPENDENCY_LIBRARIES="" if [ -f "${cur__root}/bin/${PACKAGE_NAME_CAMEL_UC}.re" ]; then MAIN_MODULE="${PACKAGE_NAME_CAMEL_UC}" else if [ -f "${cur__root}/bin/Index.re" ]; then MAIN_MODULE="Index" else echo "" echo "ERROR: You must include either bin/Index.re or bin/${PACKAGE_NAME_CAMEL_UC}.re" echo "" exit 1 fi fi echo "Building Executable Named $PACKAGE_NAME_CAMEL_UC" if [ -d "${LIB_DIR}" ]; then echo "Building Library Named $cur__name" echo "(jbuild_version 1)" > "${LIB_JBUILD_FILE}" echo "(library" >> "${LIB_JBUILD_FILE}" echo "((name ${PACKAGE_NAME_CAMEL_UC}Lib)" >> "${LIB_JBUILD_FILE}" echo " (flags (-w -40 -w +26))" >> "${LIB_JBUILD_FILE}" echo " (public_name ${cur__name})" >> "${LIB_JBUILD_FILE}" echo " (libraries (${DEPENDENCY_LIBRARIES}))))" >> "${LIB_JBUILD_FILE}" DEPENDENCY_LIBRARIES="${DEPENDENCY_LIBRARIES} ${PACKAGE_NAME_CAMEL_UC}Lib" fi if [ -d "${BIN_DIR}" ]; then echo "(jbuild_version 1)" > "${BIN_JBUILD_FILE}" echo "(executable" >> "${BIN_JBUILD_FILE}" echo " ((name ${MAIN_MODULE})" >> "${BIN_JBUILD_FILE}" echo " (public_name ${PACKAGE_NAME_CAMEL_UC})" >> "${BIN_JBUILD_FILE}" echo " (libraries (${DEPENDENCY_LIBRARIES}))))" >> "${BIN_JBUILD_FILE}" else echo "Your reason-script is missing a ./bin directory." echo " Your reason-script must include a bin directory with a file named Index.re or ${PACKAGE_NAME_CAMEL_UC}.re" fi if [ -f "${cur__root}/${cur__name}.opam" ]; then # They already have an opam so apparently they know what they're # doing. DID_CREATE_OPAM="false" else DID_CREATE_OPAM="true" echo "(*tmp*)" > "${cur__root}/${cur__name}.opam" fi if [ -f "${cur__root}/jbuild-ignore" ]; then # They already have a jbuild-ignore so apparently they know what # they're doing. DID_CREATE_JBUILD_IGNORE="false" else DID_CREATE_JBUILD_IGNORE="true" echo "temporarily_generated_by_reason_script" > "${cur__root}/jbuild-ignore" echo "node_modules" >> "${cur__root}/jbuild-ignore" fi # If you list a refmterr as a dev dependency, we'll use it! BUILD_FAILED="" if hash refmterr 2>/dev/null; then refmterr jbuilder build || BUILD_FAILED="true" else jbuilder build || BUILD_FAILED="true" fi # Cleaning up automatically created opam/jbuild files is only something we'd # need to do if we weren't doing buildsInSource:true # if [ "${DID_CREATE_OPAM}" == "true" ]; then # rm "${cur__root}/${cur__name}.opam" # else # if [ -f "${cur__root}/${cur__name}.opam" ]; then # if [ "$(cat \"${cur__root}/${cur__name}.opam\")" == "(*tmp*)" ]; then # # Then this is left over from another failed run. Delete it. # rm "${cur__root}/${cur__name}.opam" # fi # fi # fi # if [ "${DID_CREATE_JBUILD_IGNORE}" == "true" ]; then # rm "${cur__root}/jbuild-ignore" # else # if [ -f "${cur__root}/jbuild-ignore" ]; then # if grep -q "temporarily_generated_by_reason_script" "${cur__root}/jbuild-ignore"; then # # Then this is left over from another failed run. Delete it. # rm "${cur__root}/jbuild-ignore" # fi # fi # fi # Copy over generated .merlin files - even if the build failed. if [ -d "${BIN_DIR}" ]; then if [ -f "${BIN_DIR}/.merlin" ]; then # Did you know sed allows you to use any separator such as ; and not just / # Really useful when the substitutions contain variables that have slashes # (paths) sed "s;\\.\\.\\/_build;${cur__target_dir}\\/_build;" > "${cur__original_root}/bin/.merlin" "${BIN_DIR}/.merlin" fi fi if [ -d "${LIB_DIR}" ]; then if [ -f "${LIB_DIR}/.merlin" ]; then sed "s;\\.\\.\\/_build;${cur__target_dir}\\/_build;" > "${cur__original_root}/lib/.merlin" "${LIB_DIR}/.merlin" fi fi if [ -f "${cur__root}/.merlin" ]; then cp "${cur__root}/.merlin" "${cur__original_root}/.merlin" fi if [ -z "$BUILD_FAILED" ]; then true else echo "esy-peasy BUILD FAILED!" echo "" exit 1 fi ================================================ FILE: npm-cli/v0.4.4/notes/benchmarking.md ================================================ The results of benchmarking a sample "generateEverything.sh" script: DELTAms 5 DELTAms 11 - detect shell DELTAms 6 - setup variables DELTAms 10 - define functions DELTAms 11 - define build variables DELTAms 8 - print directories DELTAms 9 - check lib dir DELTAms 30 - create lib build file DELTAms 12 - verify lib build existing contents DELTAms 12 - setup bin vars DELTAms 8 - check bin main mod name DELTAms 10 - check bin main module exists DELTAms 28 - read existing dune bin contents DELTAms 23 - create bin dune contents DELTAms 5 - check bin against required bin DELTAms 8 - check root dune exists DELTAms 4 - check opam file exists DELTAms -989 - check root dune-project file exists DELTAms 82 - perform actual build Build Succeeded! To test a binary: esy x ChalkConsole.exe DELTAms 5 - check build failure DELTAms 8 - end DELTAms 5 - end For the following manually instrumented profiling of that script file (requires gdate be installed). I've since improved the detect shell step (avoided using grep subprocess). All that really matters is the time it takes to run the genEverything script. It doesn't matter how long it takes to generate the genEverything script. The biggest impacts for optimization of running genEverything would be: 1. Omitting fields in the generated dune files that aren't present in the package.json config. Note that each measurement has an additional 5ms overhead apparently (so subtract about 5ms for each measurement to get the real time). Some smaller improvements: - md5 takes about 7ms to execute which blocks running of genEverything.sh, but just checking for if md5 program exists is time consuming. If we have a previous build hash, we don't need to check Run it in a project by doing `esy b ./_build/genEverything.sh` ```sh #!/bin/bash set -e set -u BOLD=`tput bold` || BOLD='' # Select bold mode BLACK=`tput setaf 0` || BLACK='' RED=`tput setaf 1` || RED='' GREEN=`tput setaf 2` || GREEN='' YELLOW=`tput setaf 3` || YELLOW='' RESET=`tput sgr0` || RESET='' PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # Some operation: NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS}" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" MODE="update" [[ $SHELL =~ "noprofile" ]] && MODE="build" # Some operation: NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - detect shell" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" LAST_EXE_NAME="" NOTIFIED_USER="false" BUILD_STALE_PROBLEM="false" DEFAULT_MAIN_MODULE_NAME="Index" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - setup variables" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" function notifyUser() { if [ "${NOTIFIED_USER}" == "false" ]; then echo "" if [ "${MODE}" == "build" ]; then printf " %sAlmost there!%s %sWe just need to prepare a couple of files:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" "${BOLD}" "${RESET}" else printf " %sPreparing for build:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" fi NOTIFIED_USER="true" else # do nothing true fi } function printDirectory() { if [ "${MODE}" != "build" ]; then DIR=$1 NAME=$2 NAMESPACE=$3 REQUIRE=$4 IS_LAST=$5 printf "│\\n" PREFIX="" if [[ "$IS_LAST" == "last" ]]; then printf "└─%s/\\n" "$DIR" PREFIX=" " else printf "├─%s/\\n" "$DIR" PREFIX="│ " fi printf "%s%s\\n" "$PREFIX" "$NAME" printf "%s%s\\n" "$PREFIX" "$NAMESPACE" if [ -z "$REQUIRE" ]; then true else if [ "$REQUIRE" != " " ]; then printf "%s%s\\n" "$PREFIX" "$REQUIRE" fi fi fi } NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - define functions" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" PACKAGE_NAME="chalk-console" PACKAGE_NAME_UPPER_CAMEL="ChalkConsole" NAMESPACE="ChalkConsole" PUBLIC_LIB_NAME="chalk-console.lib" #Default Namespace lib_NAMESPACE="ChalkConsole" #Default Requires lib_REQUIRE="" #Default Flags lib_FLAGS="" lib_OCAMLC_FLAGS="" lib_OCAMLOPT_FLAGS="" lib_PREPROCESS="" lib_C_NAMES="" #Default Requires bin_REQUIRE="" #Default Flags bin_FLAGS="" bin_OCAMLC_FLAGS="" bin_OCAMLOPT_FLAGS="" bin_PREPROCESS="" bin_C_NAMES="" lib_NAMESPACE=""ChalkConsole"" bin_MAIN_MODULE=""TestChalkConsole"" lib_REQUIRE=" console.lib chalk.lib " bin_REQUIRE=" console.lib chalk.lib chalk-console.lib " NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - define build variables" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" printDirectory "lib" "library name: chalk-console.lib" "namespace: $lib_NAMESPACE" "require: $lib_REQUIRE" not-last printDirectory "bin" "name: ChalkConsole.exe" "main: ${bin_MAIN_MODULE:-$DEFAULT_MAIN_MODULE_NAME}" "require:$bin_REQUIRE" last NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - print directories" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # Perform validation: LIB_DIR="${cur__root}/lib" LIB_DUNE_FILE="${LIB_DIR}/dune" # TODO: Error if there are multiple libraries all using the default namespace. if [ -d "${LIB_DIR}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Your project is missing the lib directory described in package.json buildDirs\\n" else printf " %s☒%s Your project is missing the lib directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${LIB_DIR}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check lib dir" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" LIB_DUNE_CONTENTS="" LIB_DUNE_EXISTING_CONTENTS="" if [ -f "${LIB_DUNE_FILE}" ]; then LIB_DUNE_EXISTING_CONTENTS=$(<"${LIB_DUNE_FILE}") fi LIB_DUNE_CONTENTS="(library" LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; !!!! This dune file is generated from the package.json file. Do NOT modify by hand.") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; !!!! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; The namespace other code see this as") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (name ${lib_NAMESPACE})") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (public_name chalk-console.lib)") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (libraries ${lib_REQUIRE})") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (c_names ${lib_C_NAMES}) ; From package.json cNames field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (flags (:standard ${lib_FLAGS})) ; From package.json flags field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlc_flags (:standard ${lib_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlopt_flags (:standard ${lib_OCAMLOPT_FLAGS}))) ; From package.json ocamloptFlags") NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - create lib build file" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${LIB_DUNE_EXISTING_CONTENTS}" == "${LIB_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update lib/dune build config\\n" else printf " %s☒%s Update lib/dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "$LIB_DUNE_CONTENTS" > "${LIB_DUNE_FILE}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - verify lib build existing contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" BIN_DIR="${cur__root}/bin" BIN_DUNE_FILE="${BIN_DIR}/dune" # FOR BINARY IN DIRECTORY bin bin_MAIN_MODULE="${bin_MAIN_MODULE:-$DEFAULT_MAIN_MODULE_NAME}" bin_MAIN_MODULE_NAME="${bin_MAIN_MODULE%%.*}" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - setup bin vars" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" # https://stackoverflow.com/a/965072 if [ "$bin_MAIN_MODULE_NAME"=="$bin_MAIN_MODULE" ]; then # If they did not specify an extension, we'll assume it is .re bin_MAIN_MODULE_FILENAME="${bin_MAIN_MODULE}.re" else bin_MAIN_MODULE_FILENAME="${bin_MAIN_MODULE}" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin main mod name" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${BIN_DIR}/${bin_MAIN_MODULE_FILENAME}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser echo "" if [ "${MODE}" == "build" ]; then printf " □ Generate %s main module\\n" "${bin_MAIN_MODULE_FILENAME}" else printf " %s☒%s Generate %s main module\\n" "${BOLD}${GREEN}" "${RESET}" "${bin_MAIN_MODULE_FILENAME}" mkdir -p "${BIN_DIR}" printf "print_endline(\"Hello!\");" > "${BIN_DIR}/${bin_MAIN_MODULE_FILENAME}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin main module exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -d "${BIN_DIR}" ]; then LAST_EXE_NAME="ChalkConsole.exe" BIN_DUNE_EXISTING_CONTENTS="" if [ -f "${BIN_DUNE_FILE}" ]; then BIN_DUNE_EXISTING_CONTENTS=$(<"${BIN_DUNE_FILE}") else BIN_DUNE_EXISTING_CONTENTS="" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - read existing dune bin contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" BIN_DUNE_CONTENTS="(executable" BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; !!!! This dune file is generated from the package.json file. Do NOT modify by hand.") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; !!!! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; The entrypoint module") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (name ${bin_MAIN_MODULE_NAME}) ; From package.json main field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (public_name ChalkConsole.exe) ; From package.json name field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (libraries ${bin_REQUIRE}) ; From package.json require field (array of strings)") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (flags (:standard ${bin_FLAGS})) ; From package.json flags field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlc_flags (:standard ${bin_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlopt_flags (:standard ${bin_OCAMLOPT_FLAGS}))) ; From package.json ocamloptFlags field") NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - create bin dune contents" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${BIN_DUNE_EXISTING_CONTENTS}" == "${BIN_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update bin/dune build config\\n" else printf " %s☒%s Update bin/dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "${BIN_DUNE_CONTENTS}" > "${BIN_DUNE_FILE}" mkdir -p "${BIN_DIR}" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check bin against required bin" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Generate missing the bin directory described in package.json buildDirs\\n" else printf " %s☒%s Generate missing the bin directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${BIN_DIR}" fi fi if [ -f "${cur__root}/dune" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Update ./dune to ignore node_modules\\n" else printf " %s☒%s Update ./dune to ignore node_modules\\n" "${BOLD}${GREEN}" "${RESET}" printf "(ignored_subdirs (node_modules))" > "${cur__root}/dune" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check root dune exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${cur__root}/${PACKAGE_NAME}.opam" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add %s\\n" "${PACKAGE_NAME}.opam" else printf " %s☒%s Add %s\\n" "${BOLD}${GREEN}" "${RESET}" "${PACKAGE_NAME}.opam" touch "${cur__root}/${PACKAGE_NAME}.opam" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check opam file exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -f "${cur__root}/dune-project" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add a ./dune-project\\n" else printf " %s☒%s Add a ./dune-project\\n" "${BOLD}${GREEN}" "${RESET}" printf "(lang dune 1.0)\\n (name %s)" "${PACKAGE_NAME}" > "${cur__root}/dune-project" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check root dune-project file exists" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ "${MODE}" == "build" ]; then if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sTo perform those updates and build run:%s\n\n" "${BOLD}${YELLOW}" "${RESET}" printf " esy pesy\\n\\n\\n\\n" exit 1 else # If you list a refmterr as a dev dependency, we'll use it! BUILD_FAILED="" if hash refmterr 2>/dev/null; then refmterr dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" else dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - perform actual build" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" if [ -z "$BUILD_FAILED" ]; then printf "\\n%s Build Succeeded!%s " "${BOLD}${GREEN}" "${RESET}" if [ -z "$LAST_EXE_NAME" ]; then printf "\\n\\n" true else # If we built an EXE printf "%sTo test a binary:%s\\n\\n" "${BOLD}" "${RESET}" printf " esy x %s\\n\\n\\n" "${LAST_EXE_NAME}" fi true NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - check build failure" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" else exit 1 fi fi else # In update mode. if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sUpdated!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy build\\n\\n\\n" else printf "\\n %sAlready up to date!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy build\\n\\n\\n" fi fi NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - end" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" NOW="1$(/opt/homebrew/bin/gdate +%N)" DELTA_MS=$(( $(($NOW-$PREV_TIME)) / 1000000)) echo "DELTAms ${DELTA_MS} - end" PREV_TIME="1$(/opt/homebrew/bin/gdate +%N)" ``` Although we quickly call into genEverything if the package.json hasn't changed, there appears to be an 80ms overhead in pesy until we get to that point. DELTAms 4 - baseline margin of error amount DELTAms 5 - check help DELTAms 12 - check env DELTAms 13 - check create DELTAms 7 - record pesy dir super-project-now@0.0.0 DELTAms 6 - output title DELTAms 7 - mkdir cur__target_dir DELTAms 7 - check if md5 exists DELTAms 12 - compute md5 DELTAms 14 - get previous md5 ================================================ FILE: npm-cli/v0.4.4/pesy ================================================ #!/bin/bash set -e # pesy-JSON.sh prints out all the fields in the form of: # ["key"] value # where value may be an array. # pipe the output of that to # # cat package.json | ./pesy-JSON.sh | sed -n 's;\["peasyLibs"\][[:space:]]*\(.*\);\1;p' # # Where (in that case) you would be extracting the value for `peasyLibs` field. # use [[:space:]] character class to ensure mac/linux compat. # # You can extract deeper fields by searching for fields like ["esy","build"]. # Need to avoid spinning up node every build command. # MD5_OF_PACKAGE # $cur__target_dir has some problems right now. # $fixed_cur__target_dir="$cur__original_root" # We can build out of source, then simply copy over the .merlin files because # those are whitelisted! We can also prepare them. # The two modes: # update: Update the jbuild files based on package.json # build: Perform the build from files updated in update mode. # Only way to determine that we are part of actual build vs. command line # update mode is by looking for noprofile. UNDER_ON=`tput smul` || UNDER_ON='' UNDER_OFF=`tput rmul` || UNDER_OFF='' BOLD=`tput bold` || BOLD='' # Select bold mode REV=`tput rev` || REV='' # Select bold mode BLACK=`tput setaf 0` || BLACK='' RED=`tput setaf 1` || RED='' GREEN=`tput setaf 2` || GREEN='' YELLOW=`tput setaf 3` || YELLOW='' BLUE=`tput setaf 4` || BLUE='' MAGENTA=`tput setaf 5` || MAGENTA='' CYAN=`tput setaf 6` || CYAN='' WHITE=`tput setaf 7` || WHITE='' RESET=`tput sgr0` || RESET='' if [[ "$1" == "help" ]]; then SHOW_HELP="true" else if [[ "$1" == "--help" ]]; then SHOW_HELP="true" fi fi if [[ "$SHOW_HELP" == "true" ]]; then printf "\\n%spesy%s%s: Your simple esy assistant.%s" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf "\\n" printf "\\n %spesy --help%s " "$BOLD" "$RESET" printf "\\n Show this help screen." printf "\\n" printf "\\n %spesy%s " "$BOLD" "$RESET" printf "\\n Running pesy in a fresh directory will help you set up an esy project." printf "\\n" printf "\\n %sesy pesy%s (in a project that uses esy)" "$BOLD" "$RESET" printf "\\n Once you have an esy project, 'esy pesy' will keep your project up to date." printf "\\n (make sure pesy is listed as a devDependency)." printf "\\n\\n\\n" exit 0 fi printf "%s\\n Hey, you are on an older unmaintained version of pesy. Please use @pesy/esy-pesy, in the devDependencies. See https://github.com/esy/pesy\\n %s" "${YELLOW}${BOLD}" "$RESET" # It can be expensive to find the pesy implementation dir. # If -z then we aren't in any sort of esy build or esy cmd environment. We're # running naked on the command line. This implies pesy create or help. In that # case, we need to compute the pesy dir, but we have nowhere to record it yet. if [ -z "${cur__target_dir}" ]; then # Create mode RECOMPUTE_PESY_DIR="true" RECORD_PESY_DIR="false" else # Build/update mode (must have the cur__target_dir available). mkdir -p "${cur__target_dir}" PESY_DIR_CACHE="${cur__target_dir}/pesyDirCache.txt" if [ -f "${PESY_DIR_CACHE}" ]; then RECOMPUTE_PESY_DIR="false" RECORD_PESY_DIR="false" else # Else compute and record it. RECOMPUTE_PESY_DIR="true" RECORD_PESY_DIR="true" fi fi if [ "${RECOMPUTE_PESY_DIR}" == "true" ]; then SOURCE="${BASH_SOURCE[0]}" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink PESY_DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$PESY_DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located done PESY_DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null && pwd )" else PESY_DIR=$(cat "${PESY_DIR_CACHE}") fi if [ -z "${cur__name}" ]; then # Will set PACKAGE_NAME and VERSION source "${PESY_DIR}/pesy-create.sh" esy install # Dynamically access the *current* version of instead of the one installed # as a dependency. Not always a great idea. # Uncomment while debugging pesy itself. # esy sh "${PESY_DIR}/pesy" esy pesy exit 0 else PACKAGE_NAME_FULL="${cur__name}" VERSION="${cur__version}" # Strip off any scope like @esy-ocaml/foo-package. PACKAGE_NAME="${PACKAGE_NAME_FULL##*/}" fi if [ "${RECORD_PESY_DIR}" == "true" ]; then echo "${PESY_DIR}" > "${PESY_DIR_CACHE}" fi set -u echo "" echo "${BOLD}${PACKAGE_NAME_FULL}@${VERSION}${RESET}" # The genEverything script is the one that actually does all the # checking/updating of build config. We generate that from pesy, then run it. # But it's really expensive to generate, so we only regenerate it if # package.json has changed. GEN_EVERYTHING="${cur__target_dir}/genEverything.sh" PESY_DIR_CACHE="${cur__target_dir}/pesyDirCache.txt" GEN_MD5="${cur__target_dir}/packageJson.md5" if [ -x "$(command -v md5)" ]; then CUR_MD5=$(md5 "${cur__root}/package.json") else if [ -x "$(command -v md5sum)" ]; then CUR_MD5=$(md5sum "${cur__root}/package.json") else echo "Aborting build because no checksum utilities are found (md5/md5sum)" exit 1 fi fi if [ -f "${GEN_MD5}" ]; then PREV_MD5=$(cat "${GEN_MD5}") else PREV_MD5="" fi if [[ "$CUR_MD5" == "$PREV_MD5" ]]; then "${GEN_EVERYTHING}" exit 0 else printf "%s" "${CUR_MD5}" > "${GEN_MD5}" fi ####### OKAY NOW EVERYTHING GENERATES THE BUILD SCRIPT "genEverything" ######### echo "" > "${GEN_EVERYTHING}" chmod 777 "${GEN_EVERYTHING}" # Gnu uppercasing extensions to sed don't exist on mac. source "${PESY_DIR}/pesy-name-utils.sh" PACKAGE_NAME_UPPER_CAMEL=$(upperCamelCasify "${PACKAGE_NAME}") NAMESPACE="${PACKAGE_NAME_UPPER_CAMEL}" PUBLIC_LIB_NAME="${PACKAGE_NAME}.lib" cat "${PESY_DIR}/pesy-header.sh" >> "${GEN_EVERYTHING}" cat <> "${GEN_EVERYTHING}" PACKAGE_NAME="${PACKAGE_NAME}" PACKAGE_NAME_UPPER_CAMEL="${PACKAGE_NAME_UPPER_CAMEL}" NAMESPACE="${NAMESPACE}" PUBLIC_LIB_NAME="${PUBLIC_LIB_NAME}" EOT function genLib() { DIR="$1" LIB_NAME="$2" ORIG_DIR="$3" sed -e "s;;${ORIG_DIR};g; s;;${DIR};g; s;;${LIB_NAME};g" "${PESY_DIR}/pesy-genLib.template.sh" >> "${GEN_EVERYTHING}" } # Generate the config updater per bin directory. function genBin() { DIR="$1" EXE_NAME="$2" ORIG_DIR="$3" sed -e "s;;${ORIG_DIR};g; s;;${DIR};g; s;;${EXE_NAME};g" "${PESY_DIR}/pesy-genBin.template.sh" >> "${GEN_EVERYTHING}" } # Hacky, but fast and v8-less parsing of the important field in json file. # Spit out some variable names that are of the form _FEATURE. # Then that secondary script can access those variables in generated code. OIFS=$IFS; # Initial pass through all names to set some defaults. # NOTICE THE QUOTE AROUND THE (.*) - that's because this should be a string. PARSED=$("${PESY_DIR}/pesy-JSON.sh" < "${cur__root}/package.json") ALL_DIR_TO_NAME=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","name"\][[:space:]]*"\([^"]*\)";\1=\2;p') ALL_DIR_TO_NAME=$(printf "%s" "$ALL_DIR_TO_NAME" | tr -s '\n' '|') if [ -z "${ALL_DIR_TO_NAME}" ]; then # By default, bin and lib ALL_DIR_TO_NAME="executable=${PACKAGE_NAME_UPPER_CAMEL}.exe|library=${PACKAGE_NAME}.lib|" fi IFS="|"; ALL_DIR_TO_NAME_ARR=($ALL_DIR_TO_NAME); # Set deafults for each package before then overriding them. SEEN_A_LIB="false" for ((i=0; i<${#ALL_DIR_TO_NAME_ARR[@]}; ++i)); do IFS="="; DIR_AND_NAME="${ALL_DIR_TO_NAME_ARR[$i]}" DIR_AND_NAME_ARR=($DIR_AND_NAME); ORIG_DIR=${DIR_AND_NAME_ARR[0]} DIR=$(upperCamelCasify "${DIR_AND_NAME_ARR[0]}") NAME=${DIR_AND_NAME_ARR[1]} if [[ "${NAME}" == *.lib ]]; then # We will let a single library default to the namespace of the package. if [[ "${SEEN_A_LIB}" == "false" ]]; then echo "#Default Namespace" >> "${GEN_EVERYTHING}" echo "${DIR}_NAMESPACE=\"${PACKAGE_NAME_UPPER_CAMEL}\"" >> "${GEN_EVERYTHING}" else # Else if there's more than one lib each must set their namespace. echo "#Default Namespace, When More Than One Library Present" >> "${GEN_EVERYTHING}" echo "${DIR}_NAMESPACE=\"\"" >> "${GEN_EVERYTHING}" fi SEEN_A_LIB="true" else echo "${DIR}_NAMESPACE=\"HEY! You Need To Specify a nameSpace: field for ${ORIG_DIR}\"" >> "${GEN_EVERYTHING}" fi echo "${DIR}_INCLUDESUBDIRS=\"\"" >> "${GEN_EVERYTHING}" echo "#Default Requires" >> "${GEN_EVERYTHING}" echo "${DIR}_REQUIRE=\"\"" >> "${GEN_EVERYTHING}" echo "#Default Flags" >> "${GEN_EVERYTHING}" echo "${DIR}_FLAGS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_IGNOREDSUBDIRS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_OCAMLC_FLAGS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_OCAMLOPT_FLAGS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_PREPROCESS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_C_NAMES=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_JSOO_FLAGS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_JSOO_FILES=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_IMPLEMENTS=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_VIRTUALMODULES=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_RAWBUILDCONFIG=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_RAWBUILDCONFIGFOOTER=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_MODES=\"\"" >> "${GEN_EVERYTHING}" echo "${DIR}_WRAPPED=\"\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_INCLUDESUBDIRS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","includeSubdirs"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_INCLUDESUBDIRS=$(printf "%s" "$ALL_DIR_TO_INCLUDESUBDIRS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_INCLUDESUBDIRS_ARR=($ALL_DIR_TO_INCLUDESUBDIRS); for ((i=0; i<${#ALL_DIR_TO_INCLUDESUBDIRS_ARR[@]}; ++i)); do IFS="="; DIR_AND_INCLUDESUBDIRS="${ALL_DIR_TO_INCLUDESUBDIRS_ARR[$i]}" DIR_AND_INCLUDESUBDIRS_ARR=($DIR_AND_INCLUDESUBDIRS); ORIG_DIR=${DIR_AND_INCLUDESUBDIRS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") INCLUDESUBDIRS=${DIR_AND_INCLUDESUBDIRS_ARR[1]} echo "${DIR}_INCLUDESUBDIRS=\"${INCLUDESUBDIRS}\"" >> "${GEN_EVERYTHING}" done # NOTICE THE QUOTE AROUND THE (.*) - that's because this should be a string. ALL_DIR_TO_NAMESPACE=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","namespace"\][[:space:]]*"\(.*\)";\1=\2;p') ALL_DIR_TO_NAMESPACE=$(printf "%s" "$ALL_DIR_TO_NAMESPACE" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_NAMESPACE_ARR=($ALL_DIR_TO_NAMESPACE); for ((i=0; i<${#ALL_DIR_TO_NAMESPACE_ARR[@]}; ++i)); do IFS="="; DIR_AND_NAMESPACE="${ALL_DIR_TO_NAMESPACE_ARR[$i]}" DIR_AND_NAMESPACE_ARR=($DIR_AND_NAMESPACE); ORIG_DIR=${DIR_AND_NAMESPACE_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") NAMESPACE=${DIR_AND_NAMESPACE_ARR[1]} echo "${DIR}_NAMESPACE=\"${NAMESPACE}\"" >> "${GEN_EVERYTHING}" done # NOTICE THE LACK OF QUOTE AROUND THE (.*) - that's because this should be a boolean. ALL_DIR_TO_WRAPPED=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","wrapped"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_WRAPPED=$(printf "%s" "$ALL_DIR_TO_WRAPPED" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_WRAPPED_ARR=($ALL_DIR_TO_WRAPPED); for ((i=0; i<${#ALL_DIR_TO_WRAPPED_ARR[@]}; ++i)); do IFS="="; DIR_AND_WRAPPED="${ALL_DIR_TO_WRAPPED_ARR[$i]}" DIR_AND_WRAPPED_ARR=($DIR_AND_WRAPPED); ORIG_DIR=${DIR_AND_WRAPPED_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") WRAPPED=${DIR_AND_WRAPPED_ARR[1]} echo "${DIR}_WRAPPED=\"${WRAPPED}\"" >> "${GEN_EVERYTHING}" done # NOTICE THE QUOTE AROUND THE (.*) - that's because this should be a string. ALL_DIR_TO_MAIN=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","main"\][[:space:]]*"\(.*\)";\1=\2;p') ALL_DIR_TO_MAIN=$(printf "%s" "$ALL_DIR_TO_MAIN" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_MAIN_ARR=($ALL_DIR_TO_MAIN); for ((i=0; i<${#ALL_DIR_TO_MAIN_ARR[@]}; ++i)); do IFS="="; DIR_AND_MAIN="${ALL_DIR_TO_MAIN_ARR[$i]}" DIR_AND_MAIN_ARR=($DIR_AND_MAIN); ORIG_DIR=${DIR_AND_MAIN_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") MAIN=${DIR_AND_MAIN_ARR[1]} echo "${DIR}_MAIN_MODULE=\"${MAIN}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_REQUIRE=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","require"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_REQUIRE=$(printf "$ALL_DIR_TO_REQUIRE" | tr -s '["],' ' ') ALL_DIR_TO_REQUIRE=$(printf "%s" "$ALL_DIR_TO_REQUIRE" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_REQUIRE_ARR=($ALL_DIR_TO_REQUIRE); for ((i=0; i<${#ALL_DIR_TO_REQUIRE_ARR[@]}; ++i)); do IFS="="; DIR_AND_REQUIRE="${ALL_DIR_TO_REQUIRE_ARR[$i]}" DIR_AND_REQUIRE_ARR=($DIR_AND_REQUIRE); ORIG_DIR=${DIR_AND_REQUIRE_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") REQUIRE=${DIR_AND_REQUIRE_ARR[1]} # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_REQUIRE=\"${REQUIRE}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_FLAGS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","flags"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_FLAGS=$(printf "$ALL_DIR_TO_FLAGS" | tr -s '["],' ' ') ALL_DIR_TO_FLAGS=$(printf "%s" "$ALL_DIR_TO_FLAGS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_FLAGS_ARR=($ALL_DIR_TO_FLAGS); for ((i=0; i<${#ALL_DIR_TO_FLAGS_ARR[@]}; ++i)); do IFS="="; DIR_AND_FLAGS="${ALL_DIR_TO_FLAGS_ARR[$i]}" DIR_AND_FLAGS_ARR=($DIR_AND_FLAGS); ORIG_DIR=${DIR_AND_FLAGS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_FLAGS_ARR[1]} # Escape any dollar signs FLAGS="${FLAGS//\\[^n\"]/\\\\}" FLAGS="${FLAGS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_FLAGS=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_IGNOREDSUBDIRS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","ignoredSubdirs"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_IGNOREDSUBDIRS=$(printf "$ALL_DIR_TO_IGNOREDSUBDIRS" | tr -s '["],' ' ') ALL_DIR_TO_IGNOREDSUBDIRS=$(printf "%s" "$ALL_DIR_TO_IGNOREDSUBDIRS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_IGNOREDSUBDIRS_ARR=($ALL_DIR_TO_IGNOREDSUBDIRS); for ((i=0; i<${#ALL_DIR_TO_IGNOREDSUBDIRS_ARR[@]}; ++i)); do IFS="="; DIR_AND_IGNOREDSUBDIRS="${ALL_DIR_TO_IGNOREDSUBDIRS_ARR[$i]}" DIR_AND_IGNOREDSUBDIRS_ARR=($DIR_AND_IGNOREDSUBDIRS); ORIG_DIR=${DIR_AND_IGNOREDSUBDIRS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") IGNOREDSUBDIRS=${DIR_AND_IGNOREDSUBDIRS_ARR[1]} # This one is an array so we take an extra ignoreSubdirs to strip out [ ] and "" echo "${DIR}_IGNOREDSUBDIRS=\"${IGNOREDSUBDIRS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_IMPLEMENTS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","implements"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_IMPLEMENTS=$(printf "$ALL_DIR_TO_IMPLEMENTS" | tr -s '["],' ' ') ALL_DIR_TO_IMPLEMENTS=$(printf "%s" "$ALL_DIR_TO_IMPLEMENTS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_IMPLEMENTS_ARR=($ALL_DIR_TO_IMPLEMENTS); for ((i=0; i<${#ALL_DIR_TO_IMPLEMENTS_ARR[@]}; ++i)); do IFS="="; DIR_AND_IMPLEMENTS="${ALL_DIR_TO_IMPLEMENTS_ARR[$i]}" DIR_AND_IMPLEMENTS_ARR=($DIR_AND_IMPLEMENTS); ORIG_DIR=${DIR_AND_IMPLEMENTS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") IMPLEMENTS=${DIR_AND_IMPLEMENTS_ARR[1]} # Escape any dollar signs IMPLEMENTS="${IMPLEMENTS//\\[^n\"]/\\\\}" IMPLEMENTS="${IMPLEMENTS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_IMPLEMENTS=\"${IMPLEMENTS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_VIRTUALMODULES=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","virtualModules"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_VIRTUALMODULES=$(printf "$ALL_DIR_TO_VIRTUALMODULES" | tr -s '["],' ' ') ALL_DIR_TO_VIRTUALMODULES=$(printf "%s" "$ALL_DIR_TO_VIRTUALMODULES" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_VIRTUALMODULES_ARR=($ALL_DIR_TO_VIRTUALMODULES); for ((i=0; i<${#ALL_DIR_TO_VIRTUALMODULES_ARR[@]}; ++i)); do IFS="="; DIR_AND_VIRTUALMODULES="${ALL_DIR_TO_VIRTUALMODULES_ARR[$i]}" DIR_AND_VIRTUALMODULES_ARR=($DIR_AND_VIRTUALMODULES); ORIG_DIR=${DIR_AND_VIRTUALMODULES_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") VIRTUALMODULES=${DIR_AND_VIRTUALMODULES_ARR[1]} # Escape any dollar signs VIRTUALMODULES="${VIRTUALMODULES//\\[^n\"]/\\\\}" VIRTUALMODULES="${VIRTUALMODULES//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_VIRTUALMODULES=\"${VIRTUALMODULES}\"" >> "${GEN_EVERYTHING}" done # Raw build config for this target # NOTE: This is how you implement config that is an array of strings, that become one line per array entry! ALL_DIR_TO_RAWBUILDCONFIG=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","rawBuildConfig",.*\][[:space:]]"*\(.*\)";\1=\2;p') # Note we DON'T want to remove the quotes. They are inside the strings perhaps. # ALL_DIR_TO_RAWBUILDCONFIG=$(printf "$ALL_DIR_TO_RAWBUILDCONFIG" | tr -s '["],' ' ') ALL_DIR_TO_RAWBUILDCONFIG=$(printf "%s" "$ALL_DIR_TO_RAWBUILDCONFIG" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_RAWBUILDCONFIG_ARR=($ALL_DIR_TO_RAWBUILDCONFIG); for ((i=0; i<${#ALL_DIR_TO_RAWBUILDCONFIG_ARR[@]}; ++i)); do IFS="="; DIR_AND_RAWBUILDCONFIG="${ALL_DIR_TO_RAWBUILDCONFIG_ARR[$i]}" DIR_AND_RAWBUILDCONFIG_ARR=($DIR_AND_RAWBUILDCONFIG); ORIG_DIR=${DIR_AND_RAWBUILDCONFIG_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") RAWBUILDCONFIG=${DIR_AND_RAWBUILDCONFIG_ARR[1]} # Escape any dollar signs # Note we DON'T want to remove the quotes. They are inside the strings perhaps. # RAWBUILDCONFIG="${RAWBUILDCONFIG//\\[^n\"]/\\\\}" RAWBUILDCONFIG="${RAWBUILDCONFIG//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_RAWBUILDCONFIG=\$(printf \"%s\\\\n %s\" \"\$${DIR}_RAWBUILDCONFIG\" \"${RAWBUILDCONFIG}\")" >> "${GEN_EVERYTHING}" done # Raw build config for this dune file # NOTE: This is how you implement config that is an array of strings, that become one line per array entry! ALL_DIR_TO_RAWBUILDCONFIGFOOTER=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","rawBuildConfigFooter",.*\][[:space:]]"*\(.*\)";\1=\2;p') # Note we DON'T want to remove the quotes. They are inside the strings perhaps. # ALL_DIR_TO_RAWBUILDCONFIGFOOTER=$(printf "$ALL_DIR_TO_RAWBUILDCONFIGFOOTER" | tr -s '["],' ' ') ALL_DIR_TO_RAWBUILDCONFIGFOOTER=$(printf "%s" "$ALL_DIR_TO_RAWBUILDCONFIGFOOTER" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_RAWBUILDCONFIGFOOTER_ARR=($ALL_DIR_TO_RAWBUILDCONFIGFOOTER); for ((i=0; i<${#ALL_DIR_TO_RAWBUILDCONFIGFOOTER_ARR[@]}; ++i)); do IFS="="; DIR_AND_RAWBUILDCONFIGFOOTER="${ALL_DIR_TO_RAWBUILDCONFIGFOOTER_ARR[$i]}" DIR_AND_RAWBUILDCONFIGFOOTER_ARR=($DIR_AND_RAWBUILDCONFIGFOOTER); ORIG_DIR=${DIR_AND_RAWBUILDCONFIGFOOTER_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") RAWBUILDCONFIGFOOTER=${DIR_AND_RAWBUILDCONFIGFOOTER_ARR[1]} # Escape any dollar signs # Note we DON'T want to remove the quotes. They are inside the strings perhaps. # RAWBUILDCONFIGFOOTER="${RAWBUILDCONFIGFOOTER//\\[^n\"]/\\\\}" RAWBUILDCONFIGFOOTER="${RAWBUILDCONFIGFOOTER//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_RAWBUILDCONFIGFOOTER=\$(printf \"%s\\\\n %s\" \"\$${DIR}_RAWBUILDCONFIGFOOTER\" \"${RAWBUILDCONFIGFOOTER}\")" >> "${GEN_EVERYTHING}" done # Raw build config for the footer of this targets Dune file. ALL_DIR_TO_MODES=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","modes"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_MODES=$(printf "$ALL_DIR_TO_MODES" | tr -s '["],' ' ') ALL_DIR_TO_MODES=$(printf "%s" "$ALL_DIR_TO_MODES" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_MODES_ARR=($ALL_DIR_TO_MODES); for ((i=0; i<${#ALL_DIR_TO_MODES_ARR[@]}; ++i)); do IFS="="; DIR_AND_MODES="${ALL_DIR_TO_MODES_ARR[$i]}" DIR_AND_MODES_ARR=($DIR_AND_MODES); ORIG_DIR=${DIR_AND_MODES_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") MODES=${DIR_AND_MODES_ARR[1]} # Escape any dollar signs MODES="${MODES//\\[^n\"]/\\\\}" MODES="${MODES//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_MODES=\"${MODES}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_OCAMLC_FLAGS=$(printf "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","ocamlcFlags"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_OCAMLC_FLAGS=$(printf "$ALL_DIR_TO_OCAMLC_FLAGS" | tr -s '["],' ' ') ALL_DIR_TO_OCAMLC_FLAGS=$(printf "%s" "$ALL_DIR_TO_OCAMLC_FLAGS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_OCAMLC_FLAGS_ARR=($ALL_DIR_TO_OCAMLC_FLAGS); for ((i=0; i<${#ALL_DIR_TO_OCAMLC_FLAGS_ARR[@]}; ++i)); do IFS="="; DIR_AND_OCAMLC_FLAGS="${ALL_DIR_TO_OCAMLC_FLAGS_ARR[$i]}" DIR_AND_OCAMLC_FLAGS_ARR=($DIR_AND_OCAMLC_FLAGS); ORIG_DIR=${DIR_AND_OCAMLC_FLAGS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_OCAMLC_FLAGS_ARR[1]} # Escape any dollar signs FLAGS="${FLAGS//\\[^n\"]/\\\\}" FLAGS="${FLAGS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_OCAMLC_FLAGS=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_OCAMLOPT_FLAGS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","ocamloptFlags"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_OCAMLOPT_FLAGS=$(printf "$ALL_DIR_TO_OCAMLOPT_FLAGS" | tr -s '["],' ' ') ALL_DIR_TO_OCAMLOPT_FLAGS=$(printf "%s" "$ALL_DIR_TO_OCAMLOPT_FLAGS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_OCAMLOPT_FLAGS_ARR=($ALL_DIR_TO_OCAMLOPT_FLAGS); for ((i=0; i<${#ALL_DIR_TO_OCAMLOPT_FLAGS_ARR[@]}; ++i)); do IFS="="; DIR_AND_OCAMLOPT_FLAGS="${ALL_DIR_TO_OCAMLOPT_FLAGS_ARR[$i]}" DIR_AND_OCAMLOPT_FLAGS_ARR=($DIR_AND_OCAMLOPT_FLAGS); ORIG_DIR=${DIR_AND_OCAMLOPT_FLAGS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_OCAMLOPT_FLAGS_ARR[1]} # Escape any dollar signs FLAGS="${FLAGS//\\[^n\"]/\\\\}" FLAGS="${FLAGS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_OCAMLOPT_FLAGS=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_PREPROCESS=$(printf "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","preprocess"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_PREPROCESS=$(printf "$ALL_DIR_TO_PREPROCESS" | tr -s '["],' ' ') ALL_DIR_TO_PREPROCESS=$(printf "%s" "$ALL_DIR_TO_PREPROCESS" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_PREPROCESS_ARR=($ALL_DIR_TO_PREPROCESS); for ((i=0; i<${#ALL_DIR_TO_PREPROCESS_ARR[@]}; ++i)); do IFS="="; DIR_AND_PREPROCESS="${ALL_DIR_TO_PREPROCESS_ARR[$i]}" DIR_AND_PREPROCESS_ARR=($DIR_AND_PREPROCESS); ORIG_DIR=${DIR_AND_PREPROCESS_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_PREPROCESS_ARR[1]} # Escape any dollar signs FLAGS="${FLAGS//\\[^n\"]/\\\\}" FLAGS="${FLAGS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_PREPROCESS=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_C_NAMES=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","cNames"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_C_NAMES=$(printf "$ALL_DIR_TO_C_NAMES" | tr -s '["],' ' ') ALL_DIR_TO_C_NAMES=$(printf "%s" "$ALL_DIR_TO_C_NAMES" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_C_NAMES_ARR=($ALL_DIR_TO_C_NAMES); for ((i=0; i<${#ALL_DIR_TO_C_NAMES_ARR[@]}; ++i)); do IFS="="; DIR_AND_C_NAMES="${ALL_DIR_TO_C_NAMES_ARR[$i]}" DIR_AND_C_NAMES_ARR=($DIR_AND_C_NAMES); ORIG_DIR=${DIR_AND_C_NAMES_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_C_NAMES_ARR[1]} # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_C_NAMES=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done # TODO: If not moving to native, we should make all the other list parsers use # this approach instead. # Need to achieve the following: # ... # (public_name console.lib) # (js_of_ocaml (flags (:standard --pretty)) # (javascript_files nativeChannels.js)) # [" "] "," (not escpaed quote) Remaining quotes? # OSX doen't have extended or pattern regexes. Need multiple pipes. # Two parallel arrays with the same length ALL_DIRS_JSOO_FLAGS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","jsooFlags"\][[:space:]]*\(.*\);\2;p' | sed 's;\[";;g' | sed 's;\([^\\]\)"\];\1;g' | sed 's;\([^\\]\)",";\1 ;g') ALL_DIRS_WITH_JSOO_FLAGS=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","jsooFlags"\][[:space:]]*\(.*\);\1;p') IFS=$'\n' ALL_DIRS_JSOO_FLAGS_ARR=($ALL_DIRS_JSOO_FLAGS); ALL_DIRS_WITH_JSOO_FLAGS_ARR=($ALL_DIRS_WITH_JSOO_FLAGS); for ((i=0; i<${#ALL_DIRS_WITH_JSOO_FLAGS_ARR[@]}; ++i)); do ORIG_DIR="${ALL_DIRS_WITH_JSOO_FLAGS_ARR[$i]}" DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS="${ALL_DIRS_JSOO_FLAGS_ARR[$i]}" # Escape any dollar signs FLAGS="${FLAGS//\\[^n\"]/\\\\}" FLAGS="${FLAGS//\$/\\\$}" # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_JSOO_FLAGS=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done ALL_DIR_TO_JSOO_FILES=$(printf "%s" "${PARSED}" | sed -n 's;\["buildDirs","\([^"]*\)","jsooFiles"\][[:space:]]*\(.*\);\1=\2;p') ALL_DIR_TO_JSOO_FILES=$(printf "$ALL_DIR_TO_JSOO_FILES" | tr -s '["],' ' ') ALL_DIR_TO_JSOO_FILES=$(printf "%s" "$ALL_DIR_TO_JSOO_FILES" | tr -s '\n' '|') IFS="|"; ALL_DIR_TO_JSOO_FILES_ARR=($ALL_DIR_TO_JSOO_FILES); for ((i=0; i<${#ALL_DIR_TO_JSOO_FILES_ARR[@]}; ++i)); do IFS="="; DIR_AND_JSOO_FILES="${ALL_DIR_TO_JSOO_FILES_ARR[$i]}" DIR_AND_JSOO_FILES_ARR=($DIR_AND_JSOO_FILES); ORIG_DIR=${DIR_AND_JSOO_FILES_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") FLAGS=${DIR_AND_JSOO_FILES_ARR[1]} # This one is an array so we take an extra step to strip out [ ] and "" echo "${DIR}_JSOO_FILES=\"${FLAGS}\"" >> "${GEN_EVERYTHING}" done # Print a summary of each named target. for ((i=0; i<${#ALL_DIR_TO_NAME_ARR[@]}; ++i)); do IFS="="; DIR_AND_NAME="${ALL_DIR_TO_NAME_ARR[$i]}" DIR_AND_NAME_ARR=($DIR_AND_NAME); ORIG_DIR=${DIR_AND_NAME_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") NAME=${DIR_AND_NAME_ARR[1]} if [[ "$i" == $(expr "${#ALL_DIR_TO_NAME_ARR[@]}" - "1") ]]; then IS_LAST="last" else IS_LAST="not-last" fi # We won't print the directories if running in build mode, just to make the # output cleaner for the most common builds, and to save a few milliseconds. # Since MODE is set at actual runtime (not in this script) we have to defer # evaluation of MODE. if [[ "${NAME}" == *.exe ]]; then # Lazy evaluation of mode - it's not yet known. echo '[ "${MODE}" != "build" ] && ' >> "$GEN_EVERYTHING" echo "printDirectory \"$ORIG_DIR\" \"name: $NAME\" \"main: \${${DIR}_MAIN_MODULE:-\$DEFAULT_MAIN_MODULE_NAME}\" \"require:\$${DIR}_REQUIRE\"" "$IS_LAST" >> "$GEN_EVERYTHING" else if [[ "${NAME}" == "${PACKAGE_NAME}"\.* ]]; then echo '[ "${MODE}" != "build" ] && ' >> "$GEN_EVERYTHING" echo "printDirectory \"$ORIG_DIR\" \"library name: $NAME\" \"namespace: \$${DIR}_NAMESPACE\" \"require: \$${DIR}_REQUIRE\"" "$IS_LAST" >> "$GEN_EVERYTHING" else # Errors will be caught later true fi fi done # Perform the updates/refresh per target or build. for ((i=0; i<${#ALL_DIR_TO_NAME_ARR[@]}; ++i)); do IFS="="; DIR_AND_NAME="${ALL_DIR_TO_NAME_ARR[$i]}" DIR_AND_NAME_ARR=($DIR_AND_NAME); ORIG_DIR=${DIR_AND_NAME_ARR[0]} DIR=$(upperCamelCasify "${ORIG_DIR}") NAME=${DIR_AND_NAME_ARR[1]} if [[ "${NAME}" == "" ]]; then printf "\\n%sMisconfigured package.json:%s" "${RED}${BOLD}" "${RESET}" printf "\\n - Missing/empty name for buildDirs/%s\\n\\n" "${ORIG_DIR}" exit 1 fi if [[ "${NAME}" == *.exe ]]; then genBin "$DIR" "$NAME" "$ORIG_DIR" else if [[ "${NAME}" == "${PACKAGE_NAME}"\.* ]]; then genLib "$DIR" "$NAME" "$ORIG_DIR" else printf "\\n%sMisconfigured package.json:%s" "${RED}${BOLD}" "${RESET}" printf "\\n" printf "\\n buildDirs.%s.name (\"%s\")\\n" "${ORIG_DIR}" "${NAME}" printf "\\n %s- Name should be any-name.exe to build a binary or%s" "${YELLOW}${BOLD}" "$RESET" printf "\\n %s- Name should be %s.suffix to build a library, where 'suffix' is anything but 'exe'%s\\n\\n" "${YELLOW}${BOLD}" "${PACKAGE_NAME}" "$RESET" exit 1 fi fi done IFS=$OIFS; cat "${PESY_DIR}/pesy-footer.template.sh" >> "${GEN_EVERYTHING}" "${GEN_EVERYTHING}" ================================================ FILE: npm-cli/v0.4.4/pesy-JSON.sh ================================================ #!/bin/sh throw() { echo "$*" >&2 exit 1 } BRIEF=0 LEAFONLY=0 PRUNE=0 NO_HEAD=0 NORMALIZE_SOLIDUS=0 usage() { echo echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]" echo echo "-p - Prune empty. Exclude fields with empty values." echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options." echo "-n - No-head. Do not show nodes that have no path (lines that start with [])." echo "-s - Remove escaping of the solidus symbol (straight slash)." echo "-h - This help text." echo } parse_options() { set -- "$@" local ARGN=$# while [ "$ARGN" -ne 0 ] do case $1 in -h) usage exit 0 ;; -b) BRIEF=1 LEAFONLY=1 PRUNE=1 ;; -l) LEAFONLY=1 ;; -p) PRUNE=1 ;; -n) NO_HEAD=1 ;; -s) NORMALIZE_SOLIDUS=1 ;; ?*) echo "ERROR: Unknown option." usage exit 0 ;; esac shift 1 ARGN=$((ARGN-1)) done } awk_egrep () { local pattern_string=$1 gawk '{ while ($0) { start=match($0, pattern); token=substr($0, start, RLENGTH); print token; $0=substr($0, start+RLENGTH); } }' pattern="$pattern_string" } tokenize () { local GREP local ESCAPE local CHAR if echo "test string" | egrep -ao --color=never "test" >/dev/null 2>&1 then GREP='egrep -ao --color=never' else GREP='egrep -ao' fi if echo "test string" | egrep -o "test" >/dev/null 2>&1 then ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' CHAR='[^[:cntrl:]"\\]' else GREP=awk_egrep ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' CHAR='[^[:cntrl:]"\\\\]' fi local STRING="\"$CHAR*($ESCAPE$CHAR*)*\"" local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?' local KEYWORD='null|false|true' local SPACE='[[:space:]]+' # Force zsh to expand $A into multiple words local is_wordsplit_disabled=$(unsetopt 2>/dev/null | grep -c '^shwordsplit$') if [ $is_wordsplit_disabled != 0 ]; then setopt shwordsplit; fi $GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$" if [ $is_wordsplit_disabled != 0 ]; then unsetopt shwordsplit; fi } parse_array () { local index=0 local ary='' read -r token case "$token" in ']') ;; *) while : do parse_value "$1" "$index" index=$((index+1)) ary="$ary""$value" read -r token case "$token" in ']') break ;; ',') ary="$ary," ;; *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;; esac read -r token done ;; esac [ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value= : } parse_object () { local key local obj='' read -r token case "$token" in '}') ;; *) while : do case "$token" in '"'*'"') key=$token ;; *) throw "EXPECTED string GOT ${token:-EOF}" ;; esac read -r token case "$token" in ':') ;; *) throw "EXPECTED : GOT ${token:-EOF}" ;; esac read -r token parse_value "$1" "$key" obj="$obj$key:$value" read -r token case "$token" in '}') break ;; ',') obj="$obj," ;; *) throw "EXPECTED , or } GOT ${token:-EOF}" ;; esac read -r token done ;; esac [ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value= : } parse_value () { local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0 case "$token" in '{') parse_object "$jpath" ;; '[') parse_array "$jpath" ;; # At this point, the only valid single-character tokens are digits. ''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;; *) value=$token # if asked, replace solidus ("\/") in json strings with normalized value: "/" [ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=$(echo "$value" | sed 's#\\/#/#g') isleaf=1 [ "$value" = '""' ] && isempty=1 ;; esac [ "$value" = '' ] && return [ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1 [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \ [ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1 [ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value" : } parse () { read -r token parse_value read -r token case "$token" in '') ;; *) throw "EXPECTED EOF GOT $token" ;; esac } if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]); then parse_options "$@" tokenize | parse fi # vi: expandtab sw=2 ts=2 ================================================ FILE: npm-cli/v0.4.4/pesy-README.template.md ================================================ # [![CircleCI](https://circleci.com/gh/yourgithubhandle//tree/master.svg?style=svg)](https://circleci.com/gh/yourgithubhandle//tree/master) **Contains the following libraries and executables:** ``` @0.0.0 │ ├─test/ │ name: Test.exe │ main: Test │ require: │ ├─library/ │ library name: │ namespace: │ require: │ └─executable/ name: App.exe main: App require: ``` ## Developing: ``` npm install -g esy git clone esy install esy build ``` ## Running Binary: After building the project, you can run the main binary that is produced. ``` esy x App.exe ``` ## Running Tests: ``` # Runs the "test" command in `package.json`. esy test ``` ================================================ FILE: npm-cli/v0.4.4/pesy-create.sh ================================================ #!/bin/bash set -e set -u uppers="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowers="abcdefghijklmnopqrstuvwxyz" wordBoundaries="._-" #usage: camelcasify "some_stringHere" -> "some-string-here" #usage: camelcasify "domHTML" -> "dom-html" #usage: camelcasify "domHtML" -> "dom-ht-ml" #usage: camelcasify "dom-HTML" -> "dom-html" lowerHyphenate(){ OUTPUT="" i=0 prevWasUpper="true" # Causes leading uppercase while ([ $i -lt ${#1} ]) do CUR=${1:$i:1} case $uppers in *$CUR*) CUR=${uppers%$CUR*}; if [[ "${prevWasUpper}" == "false" ]]; then OUTPUT="${OUTPUT}-${lowers:${#CUR}:1}" else # No hyphen OUTPUT="${OUTPUT}${lowers:${#CUR}:1}" fi prevWasUpper="true" # Causes leading uppercase ;; *) OUTPUT="${OUTPUT}$CUR" prevWasUpper="false" # Causes leading uppercase ;; esac i=$((i+1)) done echo "${OUTPUT}" } function printDirectory() { PREFIX="" if [[ "$IS_LAST" == "last" ]]; then printf "└─%s/\\n" "$DIR" PREFIX=" " else printf "├─%s/\\n" "$DIR" PREFIX="│ " fi printf "%s%s\\n" "$PREFIX" "$NAME" printf "%s%s\\n" "$PREFIX" "$NAMESPACE" if [ -z "$REQUIRE" ]; then true else if [ "$REQUIRE" != " " ]; then printf "%s%s\\n" "$PREFIX" "$REQUIRE" fi fi } # https://stackoverflow.com/a/677212 # We want to check if esy has been installed globally, but only when running # naked on the command line (just `pesy`). if hash esy 2>/dev/null; then true else printf "\\n%sERROR: You haven't installed esy globally. First install esy then try again.%s" "${RED}${BOLD}" "${RESET}" printf "\\n" printf "\\n npm install -g esy" printf "\\n\\n" exit 1 fi HAS_JSON="false" if [ -f "${PWD}/package.json" ]; then HAS_JSON="true" else if [ -f "${PWD}/esy.json" ]; then HAS_JSON="true" fi fi if [[ "$HAS_JSON" == "true" ]]; then printf "\\n%sIncorrect Usage:%s" "${RED}${BOLD}" "${RESET}" printf "\\n" printf "\\npesy should only be run via 'esy pesy', unless you want to create a new project" printf "\\nin a fresh directory. This does not appear to be a fresh directory because" printf "\\nit contains a package.json or esy.json file.\n\n" printf "\\nType esy --help for more assistance.\n\n" exit 1 fi CUR_DIR_NAME=${PWD##*/} CUR_DIR_NAME_KEBAB=$(lowerHyphenate "${CUR_DIR_NAME}") printf "\\n%sCreate new package in the CURRENT DIRECTORY %s?%s\\n" "${BOLD}" "${PWD}" "${RESET}" printf "\\n" printf "Enter package name (lowercase/hyphens) [default %s]:" "${CUR_DIR_NAME_KEBAB}" read ANSWER if [[ "${ANSWER}" == "" ]]; then ANSWER_KEBAB="${CUR_DIR_NAME_KEBAB}" else ANSWER_KEBAB=$(lowerHyphenate "${ANSWER}") if [[ "$ANSWER" != "${ANSWER_KEBAB}" ]]; then printf "\\n%sPackage names should only consist of lower case and hyphens. Pesy is going to adjust the name to%s:%s" "${YELLOW}${BOLD}" "${RESET}" "${BOLD}${ANSWER_KEBAB}${RESET}" fi fi PACKAGE_NAME_FULL="${ANSWER_KEBAB}" # Strip off any scope like @esy-ocaml/foo-package. PACKAGE_NAME="${PACKAGE_NAME_FULL##*/}" # https://stackoverflow.com/a/8952274 source "${PESY_DIR}/pesy-name-utils.sh" # Gnu uppercasing extensions to sed don't exist on mac. PACKAGE_NAME_UPPER_CAMEL=$(upperCamelCasify "${PACKAGE_NAME}") PUBLIC_LIB_NAME="${PACKAGE_NAME}.lib" VERSION="0.0.0" sed -e "s;;${PACKAGE_NAME_FULL};g; s;;${VERSION};g; s;;${PUBLIC_LIB_NAME};g; s;;${PACKAGE_NAME_UPPER_CAMEL};g" "${PESY_DIR}/pesy-package.template.json" >> "${PWD}/package.json" mkdir -p "${PWD}/executable/" printf "%s;\\n" "${PACKAGE_NAME_UPPER_CAMEL}.Util.foo()" >> "${PWD}/executable/${PACKAGE_NAME_UPPER_CAMEL}App.re" mkdir -p "${PWD}/library/" printf "let foo = () => print_endline(\"Hello\");\\n" >> "${PWD}/library/Util.re" mkdir -p "${PWD}/test/" printf "%s;\\n" "${PACKAGE_NAME_UPPER_CAMEL}.Util.foo()" >> "${PWD}/test/Test${PACKAGE_NAME_UPPER_CAMEL}.re" printf "print_endline(\"Add Your Test Cases Here\");\\n" >> "${PWD}/test/Test${PACKAGE_NAME_UPPER_CAMEL}.re" if [ -f "${PWD}/azure-pipelines.yml" ]; then printf "%s-azure-pipelines.yml already exists. Skipping azure-pipelines.yml generation.%s\\n" "${YELLOW}" "${RESET}" else mkdir -p "${PWD}/.ci" cp "${PESY_DIR}/azure-ci-template/azure-pipelines.yml" "${PWD}/azure-pipelines.yml" sed -e "s;;${PACKAGE_NAME_FULL};g; s;;${PACKAGE_NAME};g; s;;${PUBLIC_LIB_NAME};g; s;;${PACKAGE_NAME_UPPER_CAMEL};g" "${PESY_DIR}/azure-ci-template/esy-build-steps.template.yml" >> "${PWD}/.ci/esy-build-steps.yml" cp "${PESY_DIR}/azure-ci-template/publish-build-cache.yml" "${PWD}/.ci/publish-build-cache.yml" cp "${PESY_DIR}/azure-ci-template/restore-build-cache.yml" "${PWD}/.ci/restore-build-cache.yml" fi if [ -f "${PWD}/README.md" ]; then printf "%s-README.md already exists. Skipping README generation.%s\\n" "${YELLOW}" "${RESET}" else sed -e "s;;${PACKAGE_NAME_FULL};g; s;;${PACKAGE_NAME};g; s;;${PUBLIC_LIB_NAME};g; s;;${PACKAGE_NAME_UPPER_CAMEL};g" "${PESY_DIR}/pesy-README.template.md" >> "${PWD}/README.md" fi if [ -f "${PWD}/.gitignore" ]; then printf "%s-.gitignore already exists. Skipping .gitignore generation.%s\\n" "${YELLOW}" "${RESET}" else sed -e "s;;${PACKAGE_NAME};g; s;;${PUBLIC_LIB_NAME};g; s;;${PACKAGE_NAME_UPPER_CAMEL};g" "${PESY_DIR}/pesy-gitignore.template" >> "${PWD}/.gitignore" fi printf "\\n%s%s package.json created. Running 'esy install' and 'esy pesy'\\n\\n%s" "${BOLD}" "${PACKAGE_NAME_FULL}@${VERSION}" "${RESET}" ================================================ FILE: npm-cli/v0.4.4/pesy-footer.template.sh ================================================ if [ -f "${cur__root}/dune" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Update ./dune to ignore node_modules\\n" else printf " %s☒%s Update ./dune to ignore node_modules\\n" "${BOLD}${GREEN}" "${RESET}" printf "(dirs (:standard \\ node_modules \\ _esy))" > "${cur__root}/dune" fi fi if [ -f "${cur__root}/${PACKAGE_NAME}.opam" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add %s\\n" "${PACKAGE_NAME}.opam" else printf " %s☒%s Add %s\\n" "${BOLD}${GREEN}" "${RESET}" "${PACKAGE_NAME}.opam" touch "${cur__root}/${PACKAGE_NAME}.opam" fi fi if [ -f "${cur__root}/dune-project" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Add a ./dune-project\\n" else printf " %s☒%s Add a ./dune-project\\n" "${BOLD}${GREEN}" "${RESET}" printf "(lang dune 1.6)\\n (name %s)" "${PACKAGE_NAME}" > "${cur__root}/dune-project" fi fi if [ "${MODE}" == "build" ]; then if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sTo perform those updates and build run:%s\n\n" "${BOLD}${YELLOW}" "${RESET}" printf " esy pesy\\n\\n\\n\\n" exit 1 else # If you list a refmterr as a dev dependency, we'll use it! BUILD_FAILED="" if hash refmterr 2>/dev/null; then refmterr dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" else dune build -p "${PACKAGE_NAME}" || BUILD_FAILED="true" fi if [ -z "$BUILD_FAILED" ]; then printf "\\n%s Build Succeeded!%s " "${BOLD}${GREEN}" "${RESET}" if [ -z "$LAST_EXE_NAME" ]; then printf "\\n\\n" true else # If we built an EXE printf "%sTo test a binary:%s\\n\\n" "${BOLD}" "${RESET}" printf " esy x %s\\n\\n\\n" "${LAST_EXE_NAME}" fi true else exit 1 fi fi else # In update mode. if [ "${BUILD_STALE_PROBLEM}" == "true" ]; then printf "\\n %sUpdated!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy\\n\\n\\n" else printf "\\n %sAlready up to date!%s %sNow run:%s\\n\\n" "${BOLD}${GREEN}" "${RESET}" "${BOLD}" "${RESET}" printf " esy\\n\\n\\n" fi fi ================================================ FILE: npm-cli/v0.4.4/pesy-genBin.template.sh ================================================ BIN_DIR="${cur__root}/" BIN_DUNE_FILE="${BIN_DIR}/dune" # FOR BINARY IN DIRECTORY _MAIN_MODULE="${_MAIN_MODULE:-$DEFAULT_MAIN_MODULE_NAME}" _MAIN_MODULE_NAME="${_MAIN_MODULE%%.*}" # https://stackoverflow.com/a/965072 if [ "$_MAIN_MODULE_NAME"=="$_MAIN_MODULE" ]; then # If they did not specify an extension, we'll assume it is .re _MAIN_MODULE_FILENAME="${_MAIN_MODULE}.re" else _MAIN_MODULE_FILENAME="${_MAIN_MODULE}" fi if [ -f "${BIN_DIR}/${_MAIN_MODULE_FILENAME}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser echo "" if [ "${MODE}" == "build" ]; then printf " □ Generate %s main module\\n" "${_MAIN_MODULE_FILENAME}" else printf " %s☒%s Generate %s main module\\n" "${BOLD}${GREEN}" "${RESET}" "${_MAIN_MODULE_FILENAME}" mkdir -p "${BIN_DIR}" printf "print_endline(\"Hello!\");" > "${BIN_DIR}/${_MAIN_MODULE_FILENAME}" fi fi if [ -d "${BIN_DIR}" ]; then LAST_EXE_NAME="" BIN_DUNE_EXISTING_CONTENTS="" if [ -f "${BIN_DUNE_FILE}" ]; then BIN_DUNE_EXISTING_CONTENTS=$(<"${BIN_DUNE_FILE}") else BIN_DUNE_EXISTING_CONTENTS="" fi BIN_DUNE_CONTENTS="" BIN_DUNE_CONTENTS=$(printf "%s\\n%s" "${BIN_DUNE_CONTENTS}" "; !!!! This dune file is generated from the package.json file by pesy. If you modify it by hand") BIN_DUNE_CONTENTS=$(printf "%s\\n%s" "${BIN_DUNE_CONTENTS}" "; !!!! your changes will be undone! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") BIN_DUNE_CONTENTS=$(printf "%s\\n%s %s" "${BIN_DUNE_CONTENTS}" "; !!!! If you want to stop using pesy and manage this file by hand, change package.json's 'esy.build' command to: refmterr dune build -p " "${cur__name}") BIN_DUNE_CONTENTS=$(printf "%s\\n%s" "${BIN_DUNE_CONTENTS}" "(executable") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; The entrypoint module") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (name ${_MAIN_MODULE_NAME}) ; From package.json main field") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " ; The name of the executable (runnable via esy x ) ") BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (public_name ) ; From package.json name field") if [ -z "${_JSOO_FLAGS}" ] && [ -z "${_JSOO_FILES}" ]; then # No jsoo flags whatsoever true else BIN_DUNE_CONTENTS=$(printf "%s\\n %s" "${BIN_DUNE_CONTENTS}" " (js_of_ocaml ") if [ ! -z "${_JSOO_FLAGS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (flags (${_JSOO_FLAGS})) ; From package.json jsooFlags field") fi if [ ! -z "${_JSOO_FILES}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (javascript_files ${_JSOO_FILES}) ; From package.json jsooFiles field") fi BIN_DUNE_CONTENTS=$(printf "%s\\n%s" "${BIN_DUNE_CONTENTS}" " )") fi if [ ! -z "${_REQUIRE}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (libraries ${_REQUIRE}) ; From package.json require field (array of strings)") fi if [ ! -z "${_FLAGS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (flags (${_FLAGS})) ; From package.json flags field") fi if [ ! -z "${_OCAMLC_FLAGS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlc_flags (${_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") fi if [ ! -z "${_OCAMLOPT_FLAGS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (ocamlopt_flags (${_OCAMLOPT_FLAGS})) ; From package.json ocamloptFlags field") fi if [ ! -z "${_MODES}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (modes (${_MODES})) ; From package.json modes field") fi if [ ! -z "${_RAWBUILDCONFIG}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " ${_RAWBUILDCONFIG} ") fi if [ ! -z "${_PREPROCESS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" " (preprocess (${_PREPROCESS})) ; From package.json preprocess field") fi BIN_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${BIN_DUNE_CONTENTS}" ")") if [ ! -z "${_IGNOREDSUBDIRS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${BIN_DUNE_CONTENTS}" "(ignored_subdirs (${_IGNOREDSUBDIRS})) ; From package.json ignoredSubdirs field") fi if [ ! -z "${_INCLUDESUBDIRS}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${BIN_DUNE_CONTENTS}" "(include_subdirs ${_INCLUDESUBDIRS}) ; From package.json includeSubdirs field") fi if [ ! -z "${_RAWBUILDCONFIGFOOTER}" ]; then BIN_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${BIN_DUNE_CONTENTS}" "${_RAWBUILDCONFIGFOOTER}") fi if [ "${BIN_DUNE_EXISTING_CONTENTS}" == "${BIN_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update /dune build config\\n" else printf " %s☒%s Update /dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "${BIN_DUNE_CONTENTS}" > "${BIN_DUNE_FILE}" mkdir -p "${BIN_DIR}" fi fi else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Generate missing the directory described in package.json buildDirs\\n" else printf " %s☒%s Generate missing the directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${BIN_DIR}" fi fi ================================================ FILE: npm-cli/v0.4.4/pesy-genLib.template.sh ================================================ # Perform validation: LIB_DIR="${cur__root}/" LIB_DUNE_FILE="${LIB_DIR}/dune" # TODO: Error if there are multiple libraries all using the default namespace. if [ -d "${LIB_DIR}" ]; then true else BUILD_STALE_PROBLEM="true" notifyUser if [ "${MODE}" == "build" ]; then printf " □ Your project is missing the directory described in package.json buildDirs\\n" else printf " %s☒%s Your project is missing the directory described in package.json buildDirs\\n" "${BOLD}${GREEN}" "${RESET}" mkdir -p "${LIB_DIR}" fi fi LIB_DUNE_CONTENTS="" LIB_DUNE_EXISTING_CONTENTS="" if [ -f "${LIB_DUNE_FILE}" ]; then LIB_DUNE_EXISTING_CONTENTS=$(<"${LIB_DUNE_FILE}") fi LIB_DUNE_CONTENTS=$(printf "%s\\n%s" "${LIB_DUNE_CONTENTS}" "; !!!! This dune file is generated from the package.json file by pesy. If you modify it by hand") LIB_DUNE_CONTENTS=$(printf "%s\\n%s" "${LIB_DUNE_CONTENTS}" "; !!!! your changes will be undone! Instead, edit the package.json and then rerun 'esy pesy' at the project root.") LIB_DUNE_CONTENTS=$(printf "%s\\n%s %s" "${LIB_DUNE_CONTENTS}" "; !!!! If you want to stop using pesy and manage this file by hand, change package.json's 'esy.build' command to: refmterr dune build -p " "${cur__name}") LIB_DUNE_CONTENTS=$(printf "%s\\n%s" "${LIB_DUNE_CONTENTS}" "(library") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; The namespace that other packages/libraries will access this library through") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (name ${_NAMESPACE})") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " ; Other libraries list this name in their package.json 'require' field to use this library.") LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (public_name )") if [ ! -z "${_REQUIRE}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (libraries ${_REQUIRE})") fi if [ ! -z "${_WRAPPED}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${LIB_DUNE_CONTENTS}" " (wrapped ${_WRAPPED}) ; From package.json wrapped field") fi if [ ! -z "${_C_NAMES}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (c_names ${_C_NAMES}) ; From package.json cNames field") fi if [ -z "${_JSOO_FLAGS}" ] && [ -z "${_JSOO_FILES}" ]; then # No jsoo flags whatsoever true else LIB_DUNE_CONTENTS=$(printf "%s\\n %s" "${LIB_DUNE_CONTENTS}" " (js_of_ocaml ") if [ ! -z "${_JSOO_FLAGS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (flags (${_JSOO_FLAGS})) ; From package.json jsooFlags field") fi if [ ! -z "${_JSOO_FILES}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (javascript_files ${_JSOO_FILES}) ; From package.json jsooFiles field") fi LIB_DUNE_CONTENTS=$(printf "%s\\n%s" "${LIB_DUNE_CONTENTS}" " )") fi if [ ! -z "${_FLAGS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (flags (${_FLAGS})) ; From package.json flags field") fi if [ ! -z "${_OCAMLC_FLAGS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlc_flags (${_OCAMLC_FLAGS})) ; From package.json ocamlcFlags field") fi if [ ! -z "${_OCAMLOPT_FLAGS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (ocamlopt_flags (${_OCAMLOPT_FLAGS})) ; From package.json ocamloptFlags") fi if [ ! -z "${_MODES}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (modes (${_MODES})) ; From package.json modes field") fi if [ ! -z "${_IMPLEMENTS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (implements ${_IMPLEMENTS}) ; From package.json implements") fi if [ ! -z "${_VIRTUALMODULES}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (virtual_modules ${_VIRTUALMODULES}) ; From package.json virtualModules") fi if [ ! -z "${_RAWBUILDCONFIG}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " ${_RAWBUILDCONFIG} ") fi if [ ! -z "${_PREPROCESS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" " (preprocess (${_PREPROCESS})) ; From package.json preprocess field") fi LIB_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${LIB_DUNE_CONTENTS}" ")") if [ ! -z "${_IGNOREDSUBDIRS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${LIB_DUNE_CONTENTS}" "(ignored_subdirs (${_IGNOREDSUBDIRS})) ; From package.json ignoreSubdirs field") fi if [ ! -z "${_INCLUDESUBDIRS}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n%s\\n" "${LIB_DUNE_CONTENTS}" "(include_subdirs ${_INCLUDESUBDIRS}) ; From package.json includeSubdirs field") fi if [ ! -z "${_RAWBUILDCONFIGFOOTER}" ]; then LIB_DUNE_CONTENTS=$(printf "%s\\n %s\\n" "${LIB_DUNE_CONTENTS}" "${_RAWBUILDCONFIGFOOTER}") fi if [ "${LIB_DUNE_EXISTING_CONTENTS}" == "${LIB_DUNE_CONTENTS}" ]; then true else notifyUser BUILD_STALE_PROBLEM="true" if [ "${MODE}" == "build" ]; then printf " □ Update /dune build config\\n" else printf " %s☒%s Update /dune build config\\n" "${BOLD}${GREEN}" "${RESET}" printf "%s" "$LIB_DUNE_CONTENTS" > "${LIB_DUNE_FILE}" fi fi ================================================ FILE: npm-cli/v0.4.4/pesy-gitignore.template ================================================ npm-debug.log .merlin yarn-error.log node_modules node_modules/ _build _release _esy/ .install .DS_Store *.install ================================================ FILE: npm-cli/v0.4.4/pesy-header.sh ================================================ #!/bin/bash set -e set -u BOLD=`tput bold` || BOLD='' # Select bold mode BLACK=`tput setaf 0` || BLACK='' RED=`tput setaf 1` || RED='' GREEN=`tput setaf 2` || GREEN='' YELLOW=`tput setaf 3` || YELLOW='' RESET=`tput sgr0` || RESET='' MODE="update" # On Windows, the 'esy pesy' syntax doesn't work as we want it to - # our bash environment there is always run with 'noprofile', # so 'pesy' always runs in build mode instead of update mode. # To make this command work cross-platform, we add a way to override # the mode via the 'PESY_MODE' environment variable. set +u if [ ! -z "${PESY_MODE}" ]; then printf "PESY MODE" MODE="$PESY_MODE" else if [[ $SHELL =~ "noprofile" ]]; then MODE="build" fi fi set -u LAST_EXE_NAME="" NOTIFIED_USER="false" BUILD_STALE_PROBLEM="false" DEFAULT_MAIN_MODULE_NAME="Index" function notifyUser() { if [ "${NOTIFIED_USER}" == "false" ]; then echo "" if [ "${MODE}" == "build" ]; then printf " %sAlmost there!%s %sWe just need to prepare a couple of files:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" "${BOLD}" "${RESET}" else printf " %sPreparing for build:%s\\n\\n" "${YELLOW}${BOLD}" "${RESET}" fi NOTIFIED_USER="true" else # do nothing true fi } function printDirectory() { DIR=$1 NAME=$2 NAMESPACE=$3 REQUIRE=$4 IS_LAST=$5 printf "│\\n" PREFIX="" if [[ "$IS_LAST" == "last" ]]; then printf "└─%s/\\n" "$DIR" PREFIX=" " else printf "├─%s/\\n" "$DIR" PREFIX="│ " fi printf "%s%s\\n" "$PREFIX" "$NAME" printf "%s%s\\n" "$PREFIX" "$NAMESPACE" if [ -z "$REQUIRE" ]; then true else if [ "$REQUIRE" != " " ]; then printf "%s%s\\n" "$PREFIX" "$REQUIRE" fi fi } ================================================ FILE: npm-cli/v0.4.4/pesy-name-utils.sh ================================================ #!/bin/bash set -e set -u # Also removes / # https://stackoverflow.com/a/8952274 uppers="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowers="abcdefghijklmnopqrstuvwxyz" wordBoundaries="._-/" upperCamelCasify(){ #usage: camelcasify "some_string-Here" -> "SomeStringHere" OUTPUT="" i=0 prevWasBoundary="true" # Causes leading uppercase while ([ $i -lt ${#1} ]) do CUR=${1:$i:1} if [[ "${prevWasBoundary}" == "true" ]]; then # Then upper case this one. case "$lowers" in *$CUR*) CUR=${lowers%$CUR*} OUTPUT="${OUTPUT}${uppers:${#CUR}:1}" ;; *) OUTPUT="${OUTPUT}$CUR" ;; esac prevWasBoundary="false" else case $wordBoundaries in *$CUR*) prevWasBoundary="true" ;; *) OUTPUT="${OUTPUT}$CUR" ;; esac fi i=$((i+1)) done echo "${OUTPUT}" } ================================================ FILE: npm-cli/v0.4.4/pesy-package.template.json ================================================ { "name": "", "version": "0.0.0", "description": "My Project", "esy": { "build": "dune build -p ", "buildDev": "pesy", "release": { "releasedBinaries": [ "App.exe" ] } }, "buildDirs": { "test": { "require": [""], "main": "Test", "name": "Test.exe" }, "library": { "name": "", "namespace": "" }, "executable": { "require": [""], "main": "App", "name": "App.exe" } }, "scripts": { "pesy": "bash -c 'env PESY_MODE=update pesy'", "test": "esy x Test.exe" }, "dependencies": { "@opam/dune": ">=1.6.0", "@esy-ocaml/reason": "*", "ocaml": "^4.4.0" }, "devDependencies": { "ocaml": "4.7.1004", "refmterr": "*", "pesy": "*", "@opam/merlin": "*" } } ================================================ FILE: package.json ================================================ { "name": "@pesy/esy-pesy", "version": "0.1.0-alpha.14", "description": "\"Esy Pesy\" - Your Esy Assistant.", "esy": { "buildsInSource": "_build", "build": [ "dune build -p pesy--esy-pesy" ], "install": [ "esy-installer pesy--esy-pesy.install" ], "buildDev": [ "dune build --root . --only-packages pesy--esy-pesy,PesyE2E" ], "buildEnv": { "ODOC_SYNTAX": "re" }, "release": { "bin": [ "pesy" ], "includePackages": [ "root" ] } }, "pesy": { "github": "esy/pesy", "azure-project": "pesy/pesy" }, "scripts": { "doc": "esy dune build @doc -p pesy--esy-pesy,PesyE2E", "test:unit": "esy b dune exec ./unit-tests/runner/RunUnitTests.exe", "test:e2e": "./_build/default/e2e-tests/Runner.exe", "test": "esy run-script test:unit" }, "dependencies": { "@opam/reason": "*", "@opam/dune": "*", "@opam/cmdliner": "*", "@opam/pastel": "*", "@opam/ocamlfind": "*", "@opam/sexplib": "*", "@opam/yojson": "*", "ocaml": "4.6.10 - 5.3.0" }, "devDependencies": { "@opam/dune": "*", "@opam/bos": "*", "@reason-native/rely": "*", "@opam/odoc": "*", "@opam/ocaml-lsp-server": "*" }, "resolutions": { "@opam/cli": "reasonml/reason-native:cli.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@reason-native/cli": "reasonml/reason-native:cli.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@reason-native/rely": "reasonml/reason-native:rely.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@opam/pastel": "reasonml/reason-native:pastel.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@opam/console": "reasonml/reason-native:console.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@opam/file-context-printer": "reasonml/reason-native:file-context-printer.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8", "@opam/pastel": "reasonml/reason-native:pastel.opam#20b1997b6451d9715dfdbeec86a9d274c7430ed8" } } ================================================ FILE: pesy--esy-pesy.opam ================================================ opam-version: "2.0" name: "pesy" description: "Esy Pesy - Your Esy Assistant" synopsis: "Esy Pesy - Your Esy Assistant" version: "0.1.0-dev" maintainer: "Jordan Walke" authors: [ "Jordan Walke" "Manas Jayanth " ] homepage: "https://github.com/esy/pesy" bug-reports: "https://github.com/esy/pesy/issues" license: "MIT" dev-repo: "git+https://github.com/esy/pesy.git" build: [] depends: [] ================================================ FILE: scripts/bootstrap.sh ================================================ #! /bin/bash mkdir -p vendor cd vendor # reason_tag="3.0.4" # curl -LO "https://github.com/facebook/reason/archive/${reason_tag}.tar.gz" # mv "${reason_tag}.tar.gz" reason.tar.gz # tar -xf "reason.tar.gz" # mv "reason-${reason_tag}" reason # dune_tag="1.11.3" # curl -LO "https://github.com/ocaml/dune/archive/${dune_tag}.tar.gz" # mv "${dune_tag}.tar.gz" dune.tar.gz # tar -xf "dune.tar.gz" # mv "dune-${dune_tag}" dune # cmdliner_tag="1.0.4" # curl -LO "https://github.com/dbuenzli/cmdliner/archive/v${cmdliner_tag}.tar.gz" # mv "v${cmdliner_tag}.tar.gz" cmdliner.tar.gz # tar -xf "cmdliner.tar.gz" # mv "cmdliner-${cmdliner_tag}" cmdliner # sexplib_tag="0.12.0" # curl -LO "https://github.com/janestreet/sexplib/archive/v${sexplib_tag}.tar.gz" # mv "v${sexplib_tag}.tar.gz" sexplib.tar.gz # tar -xf "sexplib.tar.gz" # mv "sexplib-${sexplib_tag}" sexplib # yojson_tag="1.7.0" # curl -LO "https://github.com/ocaml-community/yojson/archive/${yojson_tag}.tar.gz" # mv "${yojson_tag}.tar.gz" yojson.tar.gz # tar -xf "yojson.tar.gz" # mv "yojson-${yojson_tag}" yojson # reason_native_commit="fd4da6d2f0f50cf4a9b5323a8706ff21557db5bb" # curl -LO "https://github.com/facebookexperimental/reason-native/archive/${reason_native_commit}.tar.gz" # mv "${reason_native_commit}.tar.gz" reason_native.tar.gz # tar -xf "reason_native.tar.gz" # mv "reason-native-${reason_native_commit}" reason-native # tag="v0.5" # pkg="merlin-extend" # curl -LO "https://github.com/let-def/${pkg}/releases/download/${tag}/merlin-extend-${tag}.tbz" # tar -xf "${pkg}-${tag}.tbz" # mv "${pkg}-${tag}" "${pkg}" # rm "${pkg}-${tag}.tbz" # tag="v3.3.2" # pkg="merlin" # curl -LO "https://github.com/ocaml/${pkg}/releases/download/${tag}/${pkg}-${tag}.tbz" # tar -xf "${pkg}-${tag}.tbz" # mv "${pkg}-${tag}" "${pkg}" # rm "${pkg}-${tag}.tbz" # tag="20190626" # pkg="menhir" # curl -LO "https://gitlab.inria.fr/fpottier/${pkg}/repository/${tag}/archive.tar.gz" # tar -xf "archive.tar.gz" # mv "menhir-20190626-9158c209f7a86967c837831b6ba64f031e4f3d76" "${pkg}" # rm "archive.tar.gz" # tag="1.3.2" # pkg="easy-format" # curl -LO "https://github.com/ocaml-community/${pkg}/releases/download/${tag}/${pkg}-${tag}.tbz" # tar -xf "${pkg}-${tag}.tbz" # mv "${pkg}-${tag}" "${pkg}" # rm "${pkg}-${tag}.tbz" tag="v0.12.2" pkg="base" curl -LO "https://github.com/janestreet/${pkg}/archive/${tag}.tar.gz" tar -xf $tag.tar.gz mv $pkg-0.12.2 $pkg rm $tag.tar.gz # Clean up # rm vendor/*.tar.* ================================================ FILE: scripts/run.bat ================================================ call esy build call esy npm-release call cd _release call npm pack call npm install -g ./pesy-0.5.0-dev.23.tgz call cd .. call .\_build\install\default\bin\TestPesyConfigure.exe ================================================ FILE: scripts/run.sh ================================================ #! /bin/bash # TODO: Add npm install -g verdaccio root=$PWD custom_registry_url=http://localhost:4873 original_npm_registry_url=https://registry.npmjs.org # `npm get registry` original_yarn_registry_url=https://registry.yarnpkg.com # `yarn config get registry` version=0.5.0-dev.23 function cleanup { if [[ ! -z "$root" ]] then rm -rf $root/scripts/storage rm -rf $root/scripts/htpasswd fi # TODO: kill verdaccio. Makes it convenient for local dev # ps -aux | grep 'verdaccio' | grep -v grep | awk '{print $2}' | xargs kill -9 echo Resetting registries npm set registry "$original_npm_registry_url" # https://registry.npmjs.org yarn config set registry "$original_yarn_registry_url" # http://registry.yarnpkg.com/ export NPM_CONFIG_REGISTRY= echo Clean up _release rm -rf _release } function main { echo 'Cleaning up.' cleanup echo esy install esy i echo esy build esy b --install # echo esy npm-release # esy npm-release || exit -1 # echo Entering _release # cd _release || exit -1 # echo Simulate latest stable release # node $root/scripts/simulate-latest.js $root/_release/package.json $version # echo Npm packing... # npm pack cd npm-cli echo Globally instaling the packed pesy npm i -g . tmp_registry_log=`mktemp` echo "Booting up verdaccio (log: $tmp_registry_log) (config: $root/scripts/verdaccio.yaml) " (cd && nohup npx verdaccio@3.8.2 -c $root/scripts/verdaccio.yaml | tee $tmp_registry_log &) grep -q 'http address' <(tail -f $tmp_registry_log) echo Set registry to local registry npm set registry "$custom_registry_url" yarn config set registry "$custom_registry_url" (npx npm-auth-to-token@1.0.0 -u user -p password -e user@example.com -r "$custom_registry_url") echo Publishing to local npm npm publish . echo NPM info npm info pesy # echo Writing pesy meta data to pesy-meta.jso # curl -H "Accept: application/vnd.npm.install-v1+json" http://localhost:4873/pesy | python -m json.tool > $root/pesy-meta.json pwd echo Entering root again cd .. pwd export NPM_CONFIG_REGISTRY="$custom_registry_url" ./_build/install/default/bin/TestBootstrapper.exe PESY_CLONE_PATH=$PESY_CLONE_PATH ./_build/install/default/bin/TestPesyConfigure.exe echo 'Cleaning up again' cleanup } if [ ! -z "$1" ] && [ "$1" == "clean" ] then cleanup else if [ -z "${PESY_CLONE_PATH}" ] then echo PESY_CLONE_PATH not defined in env exit -1 fi main fi ================================================ FILE: scripts/simulate-latest.js ================================================ let path = require("path"); let fs = require("fs"); let packageJSONPath = path.join(process.argv[2]); let packageJSON = require(packageJSONPath); fs.writeFileSync( packageJSONPath, JSON.stringify(Object.assign({}, packageJSON, { version: process.argv[3] })) ); ================================================ FILE: scripts/verdaccio.yaml ================================================ # path to a directory with all packages storage: ./storage # path to a directory with plugins to include plugins: ./plugins web: title: Verdaccio # comment out to disable gravatar support # gravatar: false # by default packages are ordercer ascendant (asc|desc) # sort_packages: asc auth: htpasswd: file: ./htpasswd # Maximum amount of users allowed to register, defaults to "+inf". # You can set this to -1 to disable registration. # max_users: 1000 security: api: jwt: sign: expiresIn: 60d notBefore: 1 web: sign: expiresIn: 7d notBefore: 1 # a list of other known repositories we can talk to uplinks: npmjs: url: https://registry.npmjs.org/ packages: '@*/*': # scoped packages access: $anonymous publish: $anonymous unpublish: $anonymous proxy: npmjs '**': # allow all users (including non-authenticated users) to read and # publish all packages # # you can specify usernames/groupnames (depending on your auth plugin) # and three keywords: "$all", "$anonymous", "$authenticated" access: $anonymous # allow all known users to publish/publish packages # (anyone can register by default, remember?) publish: $anonymous unpublish: $anonymous # if package is not available locally, proxy requests to 'npmjs' registry proxy: npmjs # You can specify HTTP/1.1 server keep alive timeout in seconds for incomming connections. # A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout. # WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enought. server: keepAliveTimeout: 60 middlewares: audit: enabled: true # log settings logs: - { type: stdout, format: pretty, level: http } #- {type: file, path: verdaccio.log, level: info} ================================================ FILE: site/ORIGINS.md ================================================ Dox: Here's a list of all of the technologies that are used and included in Dox. Each of these projects should include a LICENSE file from their original project, but even if they do not, they still retain the license/copyright of their original project (even though they are copied/"vendored" in ## Flatdoc: This project is just a fork of flatdoc, so of course [https://github.com/rstacruz/flatdoc](flatdoc) should be mentioned. Flatdoc is excellent. # jquery: jquery is licensed under the MIT license, and is vendored in vendor/jquery.js See its license [here](https://jquery.org/license/) #medium-zoom [Medium-zoom](https://github.com/francoischalifour/medium-zoom) is vendored as well. #Fira Mono Font Is also vendored as the default source code font. See its LICENSE included in the vendor directory. #Roboto Font Is also vendored and is the default font for text. See its LICENSE included in the vendor directory. # Terminal Animation: The example terminal animation was gotten from [termtosvg](https://github.com/nbedos/termtosvg)'s repo, which is BSD 3-Clause License (see the license there). # Stylus The vendored stylus in `support/vendor/stylus.min.js` is gotten from https://github.com/stylus/stylus/tree/client and is under MIT license (see the repo). # hljs HLJS is vendored in support/vendor/ along with all of its out of the box css styles. hljs is licensed under BSD 3-Clause License and the license can be found in its repo [here](https://github.com/highlightjs/highlight.js). # marked Flatdoc vendors marked (markdown parsing library) inside of flatdoc.js https://github.com/markedjs/marked It is licensed under MIT (see the repo for license). # Beach Images: Credit Lance Aspser: https://unsplash.com/photos/W785zpEXZZo https://unsplash.com/photos/woDxDNvpmdk ================================================ FILE: site/Reload.js ================================================ /*! * Flatdoc - (c) 2013, 2014 Rico Sta. Cruz * http://ricostacruz.com/flatdoc * @license MIT */ /** * Reload is just a paired down version of Flatdoc with some additional * features, and many features removed. * * This version of flatdoc can run in three modes: * * Main entrypoint script include (when included from an index.html or * foo.html). * * * * Included in a name.md.html markdown document or name.styl.html Stylus * document at the start of file * * * # Rest of markdown here * - regular markdown * - regular markdown * * or: * * * Rest of .styl document here: * * As a node script which will bundle your page into a single file assuming you've run npm install. */ /** * Since we use one simple script for everything, we need to detect how it's * being used. If not a node script, it could be included form the main html * page, or from a docs/stylus page. The main script tag in the main page will * be run at a point where there's no body in the document. For doc pages * (markdown/stylus) it will have a script tag at the top which implicitly * defines a body. */ function detectDocOrStyleIfNotNodeScript() { let hasParentFrame = window.parent !== window; let hasBody = document.body !== null; return hasParentFrame || hasBody; }; /** * Here's the order of events that occur when using the local file system at least: * 1. body DOMContentLoaded * 2. body onload event * 3. settimeout 0 handler. */ if(typeof process !== 'undefined') { if(process.argv && process.argv.length > 2 && process.argv[2] === 'bundle') { var fs = require('fs'); var path = require('path'); var Inliner = require('inliner'); let siteDir = __dirname; var pathToChrome = process.platform === 'win32' ? path.join(require('process').env['LOCALAPPDATA'], 'Google', 'Chrome', 'Application', 'chrome.exe') : '/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome'; var cmd = pathToChrome + " " + path.join(siteDir, "index.dev.html") + ' --headless --dump-dom --virtual-time-budget=400'; var rendered = require('child_process').execSync(cmd).toString(); let renderedHtmlPath = path.join(siteDir, 'index.rendered.html'); let indexHtmlPath = path.join(siteDir, 'index.html'); fs.writeFileSync(renderedHtmlPath, rendered); console.log("INLINING PAGE: ", indexHtmlPath); var options = { /* Make sure you have this set to true to avoid flickering jumps */ images: true, compressCSS: true, compressJS: true, // If true, will mess with hljs. collapseWhitespace: false, nosvg: true, // by default, DO compress SVG with SVGO skipAbsoluteUrls: false, preserveComments: false, iesafe: false, }; new Inliner(renderedHtmlPath, options, function (error, html) { // compressed and inlined HTML page // console.log(html); if(error) { console.error(e); process.exit(1); } fs.writeFileSync(indexHtmlPath, html) process.exit(0); }); } } /** * How Github decides to render previews as markdown: * https://github.com/github/markup/issues/1069#issuecomment-306084234 * * This comment says you can force your file to be rendered as markdown in * github a couple of ways: A vim region, or a gitattributes but gitattributes * isn't working. * Abusing the Vim mode: * * Abusing the Emacs mode: * * (note that emacs mode is determined by the `-*- mode: markdown; -*-` It just fits nicely * with the html comment *) * https://github.com/github/markup/issues/1069#issuecomment-460056003 * * Supposedly, Chrome is supposed to detect html files on local disk by * sniffing some tags. but it doesn't appear to work. * Chromium mime type sniffing: * https://source.chromium.org/chromium/chromium/src/+/master:net/base/mime_sniffer.cc;drc=faa13f8c8516dd027f5fc5a6ba984099ff330d05;l=781?originalUrl=https:%2F%2Fcs.chromium.org%2Fchromium%2Fsrc%2Fnet%2Fbase%2Fmime_sniffer.cc * https://source.chromium.org/chromium/chromium/src/+/master:net/base/mime_sniffer.cc;l=795?originalUrl=https:%2F%2Fcs.chromium.org%2Fchromium%2Fsrc%2Fnet%2Fbase%2Fmime_sniffer.cc * SniffForHTML: * https://source.chromium.org/chromium/chromium/src/+/master:net/base/mime_sniffer.cc;drc=c12f7a008d7096c48d0c4db36c6d6edbc71700fb;l=381?originalUrl=https:%2F%2Fcs.chromium.org%2Fchromium%2Fsrc%2Fnet%2Fbase%2Fmime_sniffer.cc * * A trick to create markdown comments that don't render in Github: * http://alvinalexander.com/technology/markdown-comments-syntax-not-in-generated-output/ * (Suggestion, use the # form and make sure there's a line before it) * https://stackoverflow.com/questions/4823468/comments-in-markdown * * * This doesn't work because it needs spaces around the [] for ft detection to * kick in on Github: * [vim: syntax=Markdown]: # () * This works! * [ vim:syntax=Markdown ]: # () * But this does! * [-*-mode:markdown-*-]: # () * * Another supposed way to write comments in markdown is: * [this is a comment]:: * So this works for injecting the script tag and getting Github to render it * as a markdown file: * []:-*-mode:markdown-*-: * However with that last approach, there's much more to clean up in the output * on Flatdoc's side. * * This approach is the cleanest and only has us searching for / cleaning up a * single `)` closing paren before Flatdoc renders the markup. * * [ vim:syntax=Markdown ]: # () * */ else if( document.location.href.indexOf('.md') === document.location.href.length - 2 || document.location.href.indexOf('.md.html') === document.location.href.length - 8 || document.location.href.indexOf('.styl.html') === document.location.href.length - 10 || document.location.href.indexOf('.md.htm') === document.location.href.length - 7 || document.location.href.indexOf('.styl.htm') === document.location.href.length - 9 || detectDocOrStyleIfNotNodeScript() ) { document.write(''); document.addEventListener("DOMContentLoaded", function() { var plaintexts = document.querySelectorAll('plaintext'); if(plaintexts.length === 1) { window.parent.postMessage({ messageType: 'docPageContent' , iframeName: window.name, content: plaintexts[0].innerHTML }, "*"); } else { window.parent.postMessage({ messageType: "docPageError", iframeName: window.name, error: "There isn't exactly one plaintext tag inside of " + window.name + ". Something went wrong and we didn't inject the plaintext tag." }, "*"); } }); } else { (function($) { var exports = this; var marked; /** * Basic Flatdoc module. * * The main entry point is `Flatdoc.run()`, which invokes the [Runner]. * * Flatdoc.run({ * fetcher: Flatdoc.github('rstacruz/backbone-patterns'); * }); * * These fetcher functions are available: * * Flatdoc.github('owner/repo') * Flatdoc.github('owner/repo', 'API.md') * Flatdoc.github('owner/repo', 'API.md', 'branch') * Flatdoc.bitbucket('owner/repo') * Flatdoc.bitbucket('owner/repo', 'API.md') * Flatdoc.bitbucket('owner/repo', 'API.md', 'branch') * Flatdoc.file('http://path/to/url') * Flatdoc.file([ 'http://path/to/url', ... ]) */ var Flatdoc = exports.Flatdoc = {}; exports.Reload = exports.Flatdoc; /** * Creates a runner. * See [Flatdoc]. */ Flatdoc.run = function(options) { $(function() { (new Flatdoc.runner(options)).run(); }); }; /** * Simplified easy to use API that calls the underlying API. */ Flatdoc.reload = function(options) { var actualOptions = {}; if(options.stylus) { actualOptions.stylusFetcher = Flatdoc.docPage(options.stylus); } if(options.doc) { actualOptions.fetcher = Reload.docPage(options.doc); } if(options.highlight) { actualOptions.highlight = options.highlight; } Flatdoc.run(actualOptions); }; /** * File fetcher function. * * Fetches a given `url` via AJAX. * See [Runner#run()] for a description of fetcher functions. */ Flatdoc.file = function(url) { function loadData(locations, response, callback) { if (locations.length === 0) callback(null, response); else $.get(locations.shift()) .fail(function(e) { callback(e, null); }) .done(function (data) { if (response.length > 0) response += '\n\n'; response += data; loadData(locations, response, callback); }); } return function(callback) { loadData(url instanceof Array ? url : [url], '', callback); }; }; /** * Local docPage doc fetcher function. * * Fetches a given `url` via iframe inclusion, expecting the file to be of * the "docPage" form of markdown which can be loaded offline. * See [Runner#run()] for a description of fetcher functions. * * Tags the url argument on the fetcher itself so it can be used for other * debugging/relativization. */ Flatdoc.docPageErrorHandler = null; Flatdoc.docPage = function(url) { if (!Flatdoc.errorHandler) { var listenerID = window.addEventListener('message', function(e) { if (e.data.messageType === 'docPageError') { console.error(e.data.error); } }); Flatdoc.docPageErrorHandler = listenerID; } var fetchdocPage = function(url) { var onDone = null; var onFail = null; var returns = { fail: function(cb) { onFail = cb; return returns; }, done: function(cb) { onDone = cb; return returns; } }; var timeout = window.setTimeout(function() { onFail && onFail( "Timed out loading " + url + ". It might still load if the request comes back, " + "but this took super long. Maybe you are paused in the debugger?" ); }, 400); var listenerID = window.addEventListener('message', function(e) { if(e.data.messageType === 'docPageContent' && e.data.iframeName === url) { window.removeEventListener('message', listenerID); if(onDone) { window.clearTimeout(timeout); onDone(e.data.content); } } }); var iframe = document.createElement('iframe'); iframe.name = url; // Themes may opt to handle offline/pre rendering, and this is convenient // to mark these iframes as not-essential once rendered so they may be // removed from the DOM after rendering, and won't take up space in the // bundle. iframe.className = 'removeFromRenderedPage'; iframe.src=url; iframe.style="display:none !important"; iframe.type="text/plain"; iframe.onerror = function(e) { if(onFail) { onFail(e); } }; // iframe.onload = function(e) { // }; document.body.appendChild(iframe); // Even if using the local file system, this will immediately resume // after appending without waiting or blocking. There is no way to tell // that an iframe has loaded successfully without some kind of a timeout. // Even bad src locations will fire the onload event. An onerror event is // a solid signal that the page failed, but abscense of an onerror on the // iframe is not a confirmation of success or that it hasn't failed. return returns; }; function loadData(locations, response, callback) { if (locations.length === 0) callback(null, response); else fetchdocPage(locations.shift()) .fail(function(e) { callback(e, null); }) .done(function (data) { if (response.length > 0) response += '\n\n'; response += data; loadData(locations, response, callback); }); } var url = url instanceof Array ? url : [url]; var ret = function(callback) { loadData(url, '', callback); }; // Tag the fetcher with the url in case you want it. ret.url = url; return ret; }; /** * Github fetcher. * Fetches from repo `repo` (in format 'user/repo'). * * If the parameter `filepath` is supplied, it fetches the contents of that * given file in the repo's default branch. To fetch the contents of * `filepath` from a different branch, the parameter `ref` should be * supplied with the target branch name. * * See [Runner#run()] for a description of fetcher functions. * * See: http://developer.github.com/v3/repos/contents/ */ Flatdoc.github = function(opts) { if (typeof opts === 'string') { opts = { repo: arguments[0], filepath: arguments[1] }; } var url; if (opts.filepath) { url = 'https://api.github.com/repos/'+opts.repo+'/contents/'+opts.filepath; } else { url = 'https://api.github.com/repos/'+opts.repo+'/readme'; } var data = {}; if (opts.token) { data.access_token = opts.token; } if (opts.ref) { data.ref = opts.ref; } return function(callback) { $.get(url, data) .fail(function(e) { callback(e, null); }) .done(function(data) { var markdown = exports.Base64.decode(data.content); callback(null, markdown); }); }; }; /** * Bitbucket fetcher. * Fetches from repo `repo` (in format 'user/repo'). * * If the parameter `filepath` is supplied, it fetches the contents of that * given file in the repo. * * See [Runner#run()] for a description of fetcher functions. * * See: https://confluence.atlassian.com/display/BITBUCKET/src+Resources#srcResources-GETrawcontentofanindividualfile * See: http://ben.onfabrik.com/posts/embed-bitbucket-source-code-on-your-website * Bitbucket appears to have stricter restrictions on * Access-Control-Allow-Origin, and so the method here is a bit * more complicated than for Github * * If you don't pass a branch name, then 'default' for Hg repos is assumed * For git, you should pass 'master'. In both cases, you should also be able * to pass in a revision number here -- in Mercurial, this also includes * things like 'tip' or the repo-local integer revision number * Default to Mercurial because Git users historically tend to use GitHub */ Flatdoc.bitbucket = function(opts) { if (typeof opts === 'string') { opts = { repo: arguments[0], filepath: arguments[1], branch: arguments[2] }; } if (!opts.filepath) opts.filepath = 'readme.md'; if (!opts.branch) opts.branch = 'default'; var url = 'https://bitbucket.org/api/1.0/repositories/'+opts.repo+'/src/'+opts.branch+'/'+opts.filepath; return function(callback) { $.ajax({ url: url, dataType: 'jsonp', error: function(xhr, status, error) { alert(error); }, success: function(response) { var markdown = response.data; callback(null, markdown); } }); }; }; /** * Parser module. * Parses a given Markdown document and returns a JSON object with data * on the Markdown document. * * var data = Flatdoc.parser.parse('markdown source here'); * console.log(data); * * data == { * title: 'My Project', * content: '<p>This project is a...', * menu: {...} * } */ var Parser = Flatdoc.parser = {}; /** * Parses a given Markdown document. * See `Parser` for more info. */ Parser.parse = function(source, highlight) { marked = exports.marked; Parser.setMarkedOptions(highlight); var html = $("<div>" + marked(source)); var h1 = html.find('h1').eq(0); var title = h1.text(); // Mangle content Transformer.mangle(html); var menu = Transformer.getMenu(html); return { title: title, content: html, menu: menu }; }; Parser.setMarkedOptions = function(highlight) { marked.setOptions({ highlight: function(code, lang) { if (lang) { return highlight(code, lang); } return code; } }); }; /** * Transformer module. * This takes care of any HTML mangling needed. The main entry point is * `.mangle()` which applies all transformations needed. * * var $content = $("<p>Hello there, this is a docu..."); * Flatdoc.transformer.mangle($content); * * If you would like to change any of the transformations, decorate any of * the functions in `Flatdoc.transformer`. */ var Transformer = Flatdoc.transformer = {}; /** * Takes a given HTML `$content` and improves the markup of it by executing * the transformations. * * > See: [Transformer](#transformer) */ Transformer.mangle = function($content) { this.addIDs($content); this.buttonize($content); this.smartquotes($content); }; /** * Adds IDs to headings. */ Transformer.addIDs = function($content) { var slugs = ['', '', '']; $content.find('h1, h2, h3').each(function() { var $el = $(this); var num = parseInt(this.nodeName[1]); var text = $el.text(); var slug = Flatdoc.slugify(text); if (num > 1) slug = slugs[num - 2] + '-' + slug; slugs.length = num - 1; slugs = slugs.concat([slug, slug]); $el.attr('id', slug); }); }; /** * Returns menu data for a given HTML. * * menu = Flatdoc.transformer.getMenu($content); * menu == { * level: 0, * items: [{ * section: "Getting started", * level: 1, * items: [...]}, ...]} */ Transformer.getMenu = function($content) { var root = {items: [], id: '', level: 0}; var cache = [root]; function mkdir_p(level) { cache.length = level + 1; var obj = cache[level]; if (!obj) { var parent = (level > 1) ? mkdir_p(level-1) : root; obj = { items: [], level: level }; cache = cache.concat([obj, obj]); parent.items.push(obj); } return obj; } $content.find('h1, h2, h3').each(function() { var $el = $(this); var level = +(this.nodeName.substr(1)); var parent = mkdir_p(level-1); var obj = { section: $el.text(), items: [], level: level, id: $el.attr('id') }; parent.items.push(obj); cache[level] = obj; }); return root; }; /** * Changes "button >" text to buttons. */ Transformer.buttonize = function($content) { $content.find('a').each(function() { var $a = $(this); var m = $a.text().match(/^(.*) >$/); if (m) $a.text(m[1]).addClass('button'); }); }; /** * Applies smart quotes to a given element. * It leaves `code` and `pre` blocks alone. */ Transformer.smartquotes = function ($content) { var nodes = getTextNodesIn($content), len = nodes.length; for (var i=0; i<len; i++) { var node = nodes[i]; node.nodeValue = quotify(node.nodeValue); } }; /** * Syntax highlighters. * * You may add or change more highlighters via the `Flatdoc.highlighters` * object. * * Flatdoc.highlighters.js = function(code) { * }; * * Each of these functions */ var Highlighters = Flatdoc.highlighters = {}; /** * JavaScript syntax highlighter. * * Thanks @visionmedia! */ Highlighters.js = Highlighters.javascript = function(code) { return code .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/("[^\"]*?")/g, '<span class="string">$1</span>') .replace(/('[^\']*?')/g, '<span class="string">$1</span>') .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>') .replace(/\/\*(.*)\*\//gm, '<span class="comment">/*$1*/</span>') .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>') .replace(/(\d+)/gm, '<span class="number">$1</span>') .replace(/\bnew *(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>') .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>'); }; Highlighters.html = function(code) { return code .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/("[^\"]*?")/g, '<span class="string">$1</span>') .replace(/('[^\']*?')/g, '<span class="string">$1</span>') .replace(/&lt;!--(.*)--&gt;/g, '<span class="comment">&lt;!--$1--&gt;</span>') .replace(/&lt;([^!][^\s&]*)/g, '&lt;<span class="keyword">$1</span>'); }; Highlighters.generic = function(code) { return code .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/("[^\"]*?")/g, '<span class="string">$1</span>') .replace(/('[^\']*?')/g, '<span class="string">$1</span>') .replace(/(\/\/|#)(.*)/gm, '<span class="comment">$1$2</span>') .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>') .replace(/(\d+)/gm, '<span class="number">$1</span>'); }; /** * Menu view. Renders menus */ var MenuView = Flatdoc.menuView = function(menu) { var $el = $("<ul>"); function process(node, $parent) { var id = node.id || 'root'; var $li = $('<li>') .attr('id', id + '-item') .addClass('level-' + node.level) .appendTo($parent); if (node.section) { var $a = $('<a>') .html(node.section) .attr('id', id + '-link') .attr('href', '#' + node.id) .addClass('level-' + node.level) .appendTo($li); } if (node.items.length > 0) { var $ul = $('<ul>') .addClass('level-' + (node.level+1)) .attr('id', id + '-list') .appendTo($li); node.items.forEach(function(item) { process(item, $ul); }); } } process(menu, $el); return $el; }; /** * A runner module that fetches via a `fetcher` function. * * var runner = new Flatdoc.runner({ * fetcher: Flatdoc.url('readme.txt') * }); * runner.run(); * * The following options are available: * * - `fetcher` - a function that takes a callback as an argument and * executes that callback when data is returned. * * See: [Flatdoc.run()] */ var Runner = Flatdoc.runner = function(options) { this.initialize(options); }; Runner.prototype.root = '[role~="flatdoc"]'; Runner.prototype.menu = '[role~="flatdoc-menu"]'; Runner.prototype.title = '[role~="flatdoc-title"]'; Runner.prototype.content = '[role~="flatdoc-content"]'; Runner.prototype.initialize = function(options) { $.extend(this, options); }; /** * Syntax highlighting. * * You may define a custom highlight function such as `highlight` from * the highlight.js library. * * Flatdoc.run({ * highlight: function (code, value) { * return hljs.highlight(lang, code).value; * }, * ... * }); * */ Runner.prototype.highlight = function(code, lang) { var fn = Flatdoc.highlighters[lang] || Flatdoc.highlighters.generic; return fn(code); }; /** * Loads the Markdown document (via the fetcher), parses it, and applies it * to the elements. */ Runner.prototype.run = function() { var doc = this; $(doc.root).trigger('flatdoc:loading'); // If this *is* an already rendered snapshot, then no need to render // anything. Just fire off the ready events so that hacky jquery code can // perform resizing etc. if(window.location.pathname.indexOf('.dev.html') !== (window.location.pathname.length - '.dev.html'.length)) { $(doc.root).trigger('flatdoc:style-ready'); $(doc.root).trigger('flatdoc:ready'); return; } var fetchedStylus = false; var stylus = false; var fetchedMarkdown = false; var markdown = null; function checkDone() { if(fetchedStylus && fetchedMarkdown) { var styleCss = null; if(stylus) { window.stylus.render(stylus, function(err, result) { if(err) { console.error('Stylus error:' + err.message); throw err; } else { styleCss = result; } }); var style = document.createElement('style'); style.type = 'text/css'; style.name = 'style generated from .styl.html file'; style.innerHTML = styleCss; document.getElementsByTagName('head')[0].appendChild(style); } $(doc.root).trigger('flatdoc:style-ready'); /** * The user can put this in their html file to: * 1. Get vim syntax highlighting to work. * 2. Get github to treat their html/htm file as a markdown file for rendering. * 3. Load the script tag only when rendered with ReFresh. * * [ vim:syntax=Markdown ]: # (<script src="flatdoc.js"></script>) * * Only downside is that it leaves a dangling ) in the text returned to * us which we can easily normalize. */ if(markdown[0] === ')' && markdown[1] === '\n') { markdown = markdown.substring(2); } var data = Flatdoc.parser.parse(markdown, doc.highlight); doc.applyData(data, doc); var id = location.hash.substr(1); if (id) { var el = document.getElementById(id); if (el) el.scrollIntoView(true); } $(doc.root).trigger('flatdoc:ready'); } }; if(doc.stylusFetcher) { doc.stylusFetcher(function(err, st) { // Will run sync if (err) { console.error('[Flatdoc] fetching Stylus data failed.', err); return; } fetchedStylus = true; stylus = st; checkDone(); }); } else { fetchedStylus = true; } doc.fetcher(function(err, md) { if (err) { console.error('[Flatdoc] fetching Markdown data failed.', err); return; } fetchedMarkdown = true; markdown = md; checkDone(); }); }; /** * Applies given doc data `data` to elements in object `elements`. */ Runner.prototype.applyData = function(data) { var elements = this; elements.el('title').html(data.title); elements.el('content').html(data.content.find('>*')); elements.el('menu').html(MenuView(data.menu)); }; /** * Fetches a given element from the DOM. * * Returns a jQuery object. * @api private */ Runner.prototype.el = function(aspect) { return $(this[aspect], this.root); }; /* * Helpers */ // http://stackoverflow.com/questions/298750/how-do-i-select-text-nodes-with-jquery function getTextNodesIn(el) { var exclude = 'iframe,pre,code'; return $(el).find(':not('+exclude+')').andSelf().contents().filter(function() { return this.nodeType == 3 && $(this).closest(exclude).length === 0; }); } // http://www.leancrew.com/all-this/2010/11/smart-quotes-in-javascript/ function quotify(a) { a = a.replace(/(^|[\-\u2014\s(\["])'/g, "$1\u2018"); // opening singles a = a.replace(/'/g, "\u2019"); // closing singles & apostrophes a = a.replace(/(^|[\-\u2014\/\[(\u2018\s])"/g, "$1\u201c"); // opening doubles a = a.replace(/"/g, "\u201d"); // closing doubles a = a.replace(/\.\.\./g, "\u2026"); // ellipses a = a.replace(/--/g, "\u2014"); // em-dashes return a; } })(jQuery); /* jshint ignore:start */ /*! * marked - a markdown parser * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed) * https://github.com/chjj/marked */ (function(){var t={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:o,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:o,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};t.bullet=/(?:[*+-]|\d+\.)/;t.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;t.item=l(t.item,"gm")(/bull/g,t.bullet)();t.list=l(t.list)(/bull/g,t.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();t._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";t.html=l(t.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,t._tag)();t.paragraph=l(t.paragraph)("hr",t.hr)("heading",t.heading)("lheading",t.lheading)("blockquote",t.blockquote)("tag","<"+t._tag)("def",t.def)();t.normal=h({},t);t.gfm=h({},t.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});t.gfm.paragraph=l(t.paragraph)("(?!","(?!"+t.gfm.fences.source.replace("\\1","\\2")+"|")();t.tables=h({},t.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function e(e){this.tokens=[];this.tokens.links={};this.options=e||a.defaults;this.rules=t.normal;if(this.options.gfm){if(this.options.tables){this.rules=t.tables}else{this.rules=t.gfm}}}e.rules=t;e.lex=function(t,n){var s=new e(n);return s.lex(t)};e.prototype.lex=function(t){t=t.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(t,true)};e.prototype.token=function(e,n){var e=e.replace(/^ +$/gm,""),s,i,r,l,o,h,a,u,p;while(e){if(r=this.rules.newline.exec(e)){e=e.substring(r[0].length);if(r[0].length>1){this.tokens.push({type:"space"})}}if(r=this.rules.code.exec(e)){e=e.substring(r[0].length);r=r[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?r.replace(/\n+$/,""):r});continue}if(r=this.rules.fences.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"code",lang:r[2],text:r[3]});continue}if(r=this.rules.heading.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"heading",depth:r[1].length,text:r[2]});continue}if(n&&(r=this.rules.nptable.exec(e))){e=e.substring(r[0].length);h={type:"table",header:r[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:r[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:r[3].replace(/\n$/,"").split("\n")};for(u=0;u<h.align.length;u++){if(/^ *-+: *$/.test(h.align[u])){h.align[u]="right"}else if(/^ *:-+: *$/.test(h.align[u])){h.align[u]="center"}else if(/^ *:-+ *$/.test(h.align[u])){h.align[u]="left"}else{h.align[u]=null}}for(u=0;u<h.cells.length;u++){h.cells[u]=h.cells[u].split(/ *\| */)}this.tokens.push(h);continue}if(r=this.rules.lheading.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"heading",depth:r[2]==="="?1:2,text:r[1]});continue}if(r=this.rules.hr.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"hr"});continue}if(r=this.rules.blockquote.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"blockquote_start"});r=r[0].replace(/^ *> ?/gm,"");this.token(r,n);this.tokens.push({type:"blockquote_end"});continue}if(r=this.rules.list.exec(e)){e=e.substring(r[0].length);l=r[2];this.tokens.push({type:"list_start",ordered:l.length>1});r=r[0].match(this.rules.item);s=false;p=r.length;u=0;for(;u<p;u++){h=r[u];a=h.length;h=h.replace(/^ *([*+-]|\d+\.) +/,"");if(~h.indexOf("\n ")){a-=h.length;h=!this.options.pedantic?h.replace(new RegExp("^ {1,"+a+"}","gm"),""):h.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&u!==p-1){o=t.bullet.exec(r[u+1])[0];if(l!==o&&!(l.length>1&&o.length>1)){e=r.slice(u+1).join("\n")+e;u=p-1}}i=s||/\n\n(?!\s*$)/.test(h);if(u!==p-1){s=h[h.length-1]==="\n";if(!i)i=s}this.tokens.push({type:i?"loose_item_start":"list_item_start"});this.token(h,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(r=this.rules.html.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:r[1]==="pre"||r[1]==="script",text:r[0]});continue}if(n&&(r=this.rules.def.exec(e))){e=e.substring(r[0].length);this.tokens.links[r[1].toLowerCase()]={href:r[2],title:r[3]};continue}if(n&&(r=this.rules.table.exec(e))){e=e.substring(r[0].length);h={type:"table",header:r[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:r[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:r[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(u=0;u<h.align.length;u++){if(/^ *-+: *$/.test(h.align[u])){h.align[u]="right"}else if(/^ *:-+: *$/.test(h.align[u])){h.align[u]="center"}else if(/^ *:-+ *$/.test(h.align[u])){h.align[u]="left"}else{h.align[u]=null}}for(u=0;u<h.cells.length;u++){h.cells[u]=h.cells[u].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(h);continue}if(n&&(r=this.rules.paragraph.exec(e))){e=e.substring(r[0].length);this.tokens.push({type:"paragraph",text:r[1][r[1].length-1]==="\n"?r[1].slice(0,-1):r[1]});continue}if(r=this.rules.text.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:"text",text:r[0]});continue}if(e){throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}}return this.tokens};var n={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:o,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:o,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};n._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;n._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;n.link=l(n.link)("inside",n._inside)("href",n._href)();n.reflink=l(n.reflink)("inside",n._inside)();n.normal=h({},n);n.pedantic=h({},n.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});n.gfm=h({},n.normal,{escape:l(n.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(n.text)("]|","~]|")("|","|https?://|")()});n.breaks=h({},n.gfm,{br:l(n.br)("{2,}","*")(),text:l(n.gfm.text)("{2,}","*")()});function s(t,e){this.options=e||a.defaults;this.links=t;this.rules=n.normal;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=n.breaks}else{this.rules=n.gfm}}else if(this.options.pedantic){this.rules=n.pedantic}}s.rules=n;s.output=function(t,e,n){var i=new s(e,n);return i.output(t)};s.prototype.output=function(t){var e="",n,s,i,l;while(t){if(l=this.rules.escape.exec(t)){t=t.substring(l[0].length);e+=l[1];continue}if(l=this.rules.autolink.exec(t)){t=t.substring(l[0].length);if(l[2]==="@"){s=l[1][6]===":"?this.mangle(l[1].substring(7)):this.mangle(l[1]);i=this.mangle("mailto:")+s}else{s=r(l[1]);i=s}e+='<a href="'+i+'">'+s+"</a>";continue}if(l=this.rules.url.exec(t)){t=t.substring(l[0].length);s=r(l[1]);i=s;e+='<a href="'+i+'">'+s+"</a>";continue}if(l=this.rules.tag.exec(t)){t=t.substring(l[0].length);e+=this.options.sanitize?r(l[0]):l[0];continue}if(l=this.rules.link.exec(t)){t=t.substring(l[0].length);e+=this.outputLink(l,{href:l[2],title:l[3]});continue}if((l=this.rules.reflink.exec(t))||(l=this.rules.nolink.exec(t))){t=t.substring(l[0].length);n=(l[2]||l[1]).replace(/\s+/g," ");n=this.links[n.toLowerCase()];if(!n||!n.href){e+=l[0][0];t=l[0].substring(1)+t;continue}e+=this.outputLink(l,n);continue}if(l=this.rules.strong.exec(t)){t=t.substring(l[0].length);e+="<strong>"+this.output(l[2]||l[1])+"</strong>";continue}if(l=this.rules.em.exec(t)){t=t.substring(l[0].length);e+="<em>"+this.output(l[2]||l[1])+"</em>";continue}if(l=this.rules.code.exec(t)){t=t.substring(l[0].length);e+="<code>"+r(l[2],true)+"</code>";continue}if(l=this.rules.br.exec(t)){t=t.substring(l[0].length);e+="<br>";continue}if(l=this.rules.del.exec(t)){t=t.substring(l[0].length);e+="<del>"+this.output(l[1])+"</del>";continue}if(l=this.rules.text.exec(t)){t=t.substring(l[0].length);e+=r(l[0]);continue}if(t){throw new Error("Infinite loop on byte: "+t.charCodeAt(0))}}return e};s.prototype.outputLink=function(t,e){if(t[0][0]!=="!"){return'<a href="'+r(e.href)+'"'+(e.title?' title="'+r(e.title)+'"':"")+">"+this.output(t[1])+"</a>"}else{return'<img src="'+r(e.href)+'" alt="'+r(t[1])+'"'+(e.title?' title="'+r(e.title)+'"':"")+">"}};s.prototype.smartypants=function(t){if(!this.options.smartypants)return t;return t.replace(/--/g,"—").replace(/'([^']*)'/g,"‘$1’").replace(/"([^"]*)"/g,"“$1”").replace(/\.{3}/g,"…")};s.prototype.mangle=function(t){var e="",n=t.length,s=0,i;for(;s<n;s++){i=t.charCodeAt(s);if(Math.random()>.5){i="x"+i.toString(16)}e+="&#"+i+";"}return e};function i(t){this.tokens=[];this.token=null;this.options=t||a.defaults}i.parse=function(t,e){var n=new i(e);return n.parse(t)};i.prototype.parse=function(t){this.inline=new s(t.links,this.options);this.tokens=t.reverse();var e="";while(this.next()){e+=this.tok()}return e};i.prototype.next=function(){return this.token=this.tokens.pop()};i.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};i.prototype.parseText=function(){var t=this.token.text;while(this.peek().type==="text"){t+="\n"+this.next().text}return this.inline.output(t)};i.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return"<hr>\n"}case"heading":{return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n"}case"code":{if(this.options.highlight){var t=this.options.highlight(this.token.text,this.token.lang);if(t!=null&&t!==this.token.text){this.token.escaped=true;this.token.text=t}}if(!this.token.escaped){this.token.text=r(this.token.text,true)}return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n"}case"table":{var e="",n,s,i,l,o;e+="<thead>\n<tr>\n";for(s=0;s<this.token.header.length;s++){n=this.inline.output(this.token.header[s]);e+=this.token.align[s]?'<th align="'+this.token.align[s]+'">'+n+"</th>\n":"<th>"+n+"</th>\n"}e+="</tr>\n</thead>\n";e+="<tbody>\n";for(s=0;s<this.token.cells.length;s++){i=this.token.cells[s];e+="<tr>\n";for(o=0;o<i.length;o++){l=this.inline.output(i[o]);e+=this.token.align[o]?'<td align="'+this.token.align[o]+'">'+l+"</td>\n":"<td>"+l+"</td>\n"}e+="</tr>\n"}e+="</tbody>\n";return"<table>\n"+e+"</table>\n"}case"blockquote_start":{var e="";while(this.next().type!=="blockquote_end"){e+=this.tok()}return"<blockquote>\n"+e+"</blockquote>\n"}case"list_start":{var h=this.token.ordered?"ol":"ul",e="";while(this.next().type!=="list_end"){e+=this.tok()}return"<"+h+">\n"+e+"</"+h+">\n"}case"list_item_start":{var e="";while(this.next().type!=="list_item_end"){e+=this.token.type==="text"?this.parseText():this.tok()}return"<li>"+e+"</li>\n"}case"loose_item_start":{var e="";while(this.next().type!=="list_item_end"){e+=this.tok()}return"<li>"+e+"</li>\n"}case"html":{return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text}case"paragraph":{return"<p>"+this.inline.output(this.token.text)+"</p>\n"}case"text":{return"<p>"+this.parseText()+"</p>\n"}}};function r(t,e){return t.replace(!e?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function l(t,e){t=t.source;e=e||"";return function n(s,i){if(!s)return new RegExp(t,e);i=i.source||i;i=i.replace(/(^|[^\[])\^/g,"$1");t=t.replace(s,i);return n}}function o(){}o.exec=o;function h(t){var e=1,n,s;for(;e<arguments.length;e++){n=arguments[e];for(s in n){if(Object.prototype.hasOwnProperty.call(n,s)){t[s]=n[s]}}}return t}function a(t,n,s){if(s||typeof n==="function"){if(!s){s=n;n=null}if(n)n=h({},a.defaults,n);var l=e.lex(l,n),o=n.highlight,u=0,p=l.length,g=0;if(!o||o.length<3){return s(null,i.parse(l,n))}var c=function(){delete n.highlight;var t=i.parse(l,n);n.highlight=o;return s(null,t)};for(;g<p;g++){(function(t){if(t.type!=="code")return;u++;return o(t.text,t.lang,function(e,n){if(n==null||n===t.text){return--u||c()}t.text=n;t.escaped=true;--u||c()})})(l[g])}return}try{if(n)n=h({},a.defaults,n);return i.parse(e.lex(t,n),n)}catch(f){f.message+="\nPlease report this to https://github.com/chjj/marked.";if((n||a.defaults).silent){return"<p>An error occured:</p><pre>"+r(f.message+"",true)+"</pre>"}throw f}}a.options=a.setOptions=function(t){h(a.defaults,t);return a};a.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:"lang-"};a.Parser=i;a.parser=i.parse;a.Lexer=e;a.lexer=e.lex;a.InlineLexer=s;a.inlineLexer=s.output;a.parse=a;if(typeof exports==="object"){module.exports=a}else if(typeof define==="function"&&define.amd){define(function(){return a})}else{this.marked=a}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); /*! * base64.js * http://github.com/dankogai/js-base64 */ (function(r){"use strict";if(r.Base64)return;var e="2.1.2";var t;if(typeof module!=="undefined"&&module.exports){t=require("buffer").Buffer}var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var a=function(r){var e={};for(var t=0,n=r.length;t<n;t++)e[r.charAt(t)]=t;return e}(n);var o=String.fromCharCode;var u=function(r){if(r.length<2){var e=r.charCodeAt(0);return e<128?r:e<2048?o(192|e>>>6)+o(128|e&63):o(224|e>>>12&15)+o(128|e>>>6&63)+o(128|e&63)}else{var e=65536+(r.charCodeAt(0)-55296)*1024+(r.charCodeAt(1)-56320);return o(240|e>>>18&7)+o(128|e>>>12&63)+o(128|e>>>6&63)+o(128|e&63)}};var c=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var i=function(r){return r.replace(c,u)};var f=function(r){var e=[0,2,1][r.length%3],t=r.charCodeAt(0)<<16|(r.length>1?r.charCodeAt(1):0)<<8|(r.length>2?r.charCodeAt(2):0),a=[n.charAt(t>>>18),n.charAt(t>>>12&63),e>=2?"=":n.charAt(t>>>6&63),e>=1?"=":n.charAt(t&63)];return a.join("")};var h=r.btoa||function(r){return r.replace(/[\s\S]{1,3}/g,f)};var d=t?function(r){return new t(r).toString("base64")}:function(r){return h(i(r))};var v=function(r,e){return!e?d(r):d(r).replace(/[+\/]/g,function(r){return r=="+"?"-":"_"}).replace(/=/g,"")};var g=function(r){return v(r,true)};var l=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var A=function(r){switch(r.length){case 4:var e=(7&r.charCodeAt(0))<<18|(63&r.charCodeAt(1))<<12|(63&r.charCodeAt(2))<<6|63&r.charCodeAt(3),t=e-65536;return o((t>>>10)+55296)+o((t&1023)+56320);case 3:return o((15&r.charCodeAt(0))<<12|(63&r.charCodeAt(1))<<6|63&r.charCodeAt(2));default:return o((31&r.charCodeAt(0))<<6|63&r.charCodeAt(1))}};var s=function(r){return r.replace(l,A)};var p=function(r){var e=r.length,t=e%4,n=(e>0?a[r.charAt(0)]<<18:0)|(e>1?a[r.charAt(1)]<<12:0)|(e>2?a[r.charAt(2)]<<6:0)|(e>3?a[r.charAt(3)]:0),u=[o(n>>>16),o(n>>>8&255),o(n&255)];u.length-=[0,0,2,1][t];return u.join("")};var C=r.atob||function(r){return r.replace(/[\s\S]{1,4}/g,p)};var b=t?function(r){return new t(r,"base64").toString()}:function(r){return s(C(r))};var B=function(r){return b(r.replace(/[-_]/g,function(r){return r=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};r.Base64={VERSION:e,atob:C,btoa:h,fromBase64:B,toBase64:v,utob:i,encode:v,encodeURI:g,btou:s,decode:B};if(typeof Object.defineProperty==="function"){var S=function(r){return{value:r,enumerable:false,writable:true,configurable:true}};r.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",S(function(){return B(this)}));Object.defineProperty(String.prototype,"toBase64",S(function(r){return v(this,r)}));Object.defineProperty(String.prototype,"toBase64URI",S(function(){return v(this,true)}))}}})(this); /*! * node-parameterize 0.0.7 * https://github.com/fyalavuz/node-parameterize * Exported as `Flatdoc.slugify` */ (function(r){var LATIN_MAP={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ő":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ű":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ő":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ű":"u","ý":"y","þ":"th","ÿ":"y"};var LATIN_SYMBOLS_MAP={"©":"(c)"};var GREEK_MAP={"α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ά":"a","έ":"e","ί":"i","ό":"o","ύ":"y","ή":"h","ώ":"w","ς":"s","ϊ":"i","ΰ":"y","ϋ":"y","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ά":"A","Έ":"E","Ί":"I","Ό":"O","Ύ":"Y","Ή":"H","Ώ":"W","Ϊ":"I","Ϋ":"Y"};var TURKISH_MAP={"ş":"s","Ş":"S","ı":"i","İ":"I","ç":"c","Ç":"C","ü":"u","Ü":"U","ö":"o","Ö":"O","ğ":"g","Ğ":"G"};var RUSSIAN_MAP={"а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ё":"yo","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ё":"Yo","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya"};var UKRAINIAN_MAP={"Є":"Ye","І":"I","Ї":"Yi","Ґ":"G","є":"ye","і":"i","ї":"yi","ґ":"g"};var CZECH_MAP={"č":"c","ď":"d","ě":"e","ň":"n","ř":"r","š":"s","ť":"t","ů":"u","ž":"z","Č":"C","Ď":"D","Ě":"E","Ň":"N","Ř":"R","Š":"S","Ť":"T","Ů":"U","Ž":"Z"};var POLISH_MAP={"ą":"a","ć":"c","ę":"e","ł":"l","ń":"n","ó":"o","ś":"s","ź":"z","ż":"z","Ą":"A","Ć":"C","Ę":"e","Ł":"L","Ń":"N","Ó":"o","Ś":"S","Ź":"Z","Ż":"Z"};var LATVIAN_MAP={"ā":"a","č":"c","ē":"e","ģ":"g","ī":"i","ķ":"k","ļ":"l","ņ":"n","š":"s","ū":"u","ž":"z","Ā":"A","Č":"C","Ē":"E","Ģ":"G","Ī":"i","Ķ":"k","Ļ":"L","Ņ":"N","Š":"S","Ū":"u","Ž":"Z"};var ALL_DOWNCODE_MAPS=new Array;ALL_DOWNCODE_MAPS[0]=LATIN_MAP;ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP;ALL_DOWNCODE_MAPS[2]=GREEK_MAP;ALL_DOWNCODE_MAPS[3]=TURKISH_MAP;ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP;ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP;ALL_DOWNCODE_MAPS[6]=CZECH_MAP;ALL_DOWNCODE_MAPS[7]=POLISH_MAP;ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP;var Downcoder=new Object;Downcoder.Initialize=function(){if(Downcoder.map)return;Downcoder.map={};Downcoder.chars="";for(var i in ALL_DOWNCODE_MAPS){var lookup=ALL_DOWNCODE_MAPS[i];for(var c in lookup){Downcoder.map[c]=lookup[c];Downcoder.chars+=c}}Downcoder.regex=new RegExp("["+Downcoder.chars+"]|[^"+Downcoder.chars+"]+","g")};downcode=function(slug){Downcoder.Initialize();var downcoded="";var pieces=slug.match(Downcoder.regex);if(pieces){for(var i=0;i<pieces.length;i++){if(pieces[i].length==1){var mapped=Downcoder.map[pieces[i]];if(mapped!=null){downcoded+=mapped;continue}}downcoded+=pieces[i]}}else{downcoded=slug}return downcoded};Flatdoc.slugify=function(s,num_chars){s=downcode(s);s=s.replace(/[^-\w\s]/g,"");s=s.replace(/^\s+|\s+$/g,"");s=s.replace(/[-\s]+/g,"-");s=s.toLowerCase();return s.substring(0,num_chars)};})(); /* jshint ignore:end */ // This } is for the initial if() statement that bails out early. } ================================================ FILE: site/fonts/CodingFont.css ================================================ /* * This is actually Fira Mono */ @font-face { font-family: 'CodingFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: normal; font-style: normal; } @font-face { font-family: 'CodingFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 500; font-style: normal; } @font-face { font-family: 'CodingFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: bold; font-style: normal; } ================================================ FILE: site/fonts/LICENSE-Fira ================================================ Copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: site/fonts/LICENSE-Roboto ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: site/fonts/WordFont.css ================================================ /* * This is actually Roboto. */ @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 500; font-style: normal; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: normal; font-style: italic; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 300; font-style: italic; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: normal; font-style: normal; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 900; font-style: normal; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: bold; font-style: italic; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 900; font-style: italic; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: bold; font-style: normal; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 300; font-style: normal; } @font-face { font-family: 'WordFont'; src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: 500; font-style: italic; } ================================================ FILE: site/index.dev.html ================================================ <!doctype html> <html> <head> <meta charset='utf-8'> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width"> <title>pesy</title> <!-- Reload --> <script class="removeFromRenderedPage" src='vendor/highlight.pack.js'></script> <script src='vendor/jquery.js'></script> <script src='vendor/medium-zoom.js'></script> <script class="removeFromRenderedPage" src='vendor/stylus.min.js'></script> <!-- <script src='legacy.js'></script> --> <script src='Reload.js'></script> <!-- hljs theme --> <link href='vendor/highlight-styles/mono-blue.css' rel='stylesheet'> <!-- fonts --> <link href='./fonts/PrivateCodingFont.css' rel='stylesheet'> <link href='./fonts/PrivateWordFont.css' rel='stylesheet'> <!-- if including a private coding font/word font, remove the non-private one from document after rendering to avoid bundling it --> <link href='./fonts/CodingFont.css' rel='stylesheet'> <link href='./fonts/WordFont.css' rel='stylesheet'> <!-- Initializer --> <script> Reload.reload({ stylus: './theme-white/theme.styl.html', doc: '../README.html', highlight: function (code, value) { return hljs.highlight( value === 'reason' ? 'reasonml' : value === 'json' ? 'javascript' : value, code ).value; } }); </script> <!-- Flatdoc theme --> <script src='theme-white/theme.js'></script> <!-- Meta --> <meta content="Reload" property="og:site_name"> <meta content="Reload" property="og:title"> <meta content="website" property="og:type"> <meta content="A rapid project documentation tool" name="description"> <meta content="A rapid project documentation tool" property="og:description"> <meta content="http://ricostacruz.com/flatdoc/support/preview.jpg" property="og:image"> <!-- Analytics --> </head> <body role='flatdoc' class='big-h3 large-brief'> <script> document.body.style="visibility:hidden" </script> <!-- https://unsplash.com/photos/Z0uzZSM5i4M --> <div class='title-area title-card noselect'> <div class='in'> <div class='headline'> <h1>pesy</h1> <img src="./animation.svg" alt="Example" style="max-width:100%;"> </div> </div> </div> <div class='header'> <div class='left'> <h1><a href='./index.html'>pesy</a></h1> <ul> <li><a href="https://github.com/esy/pesy">GitHub</a></li> <li><a href="https://github.com/esy/pesy/issues">Issues</a></li> </ul> </div> <div class='right'> </div> </div> <div class='content-root'> <div class='menubar'> <div class='section'> <a class='big button' href='' target='_blank'>Install</a> </div> <div class='menu section' role='flatdoc-menu'></div> </div> <div role='flatdoc-content' class='content'></div> </div> </body> </html> ================================================ FILE: site/package.json ================================================ { "name": "Reload", "description": "Fork of the wonderful Flatdoc", "keywords": [ "documentation", "markdown" ], "author": "Rico Sta. Cruz <hi@ricostacruz.com>", "version": "0.9.0", "repository": { "type": "git", "url": "https://github.com/rstacruz/flatdoc.git" }, "scripts": { "test": "mocha", "bundle": "node ./Reload.js bundle" }, "main": "Reload.js", "devDependencies": { "mocha": "1.10.0", "chai": "1.6.0", "jsdom": "*", "uglify-js": "2.6.0", "stylus": "0.46.3", "nib": "0.9.1", "commander": "1.1.1", "dox": "0.4.3", "inliner": "*" } } ================================================ FILE: site/theme-white/theme.js ================================================ (function($) { var $window = $(window); var $document = $(document); /* * Scrollspy. */ $document.on('flatdoc:ready', function() { /** * Remove any nodes that are not needed once rendered. This way when generating * a pre-rendered `.rendered.html`, they won't become part of the bundle, when * that rendered page is turned into a `.html` bundle. They have served their * purpose. Add `class='removeFromRenderedPage'` to anything you want removed * once used to render the page. (Don't use for script tags that are needed for * interactivity). */ $('.removeFromRenderedPage').each(function(i, e) { e.parentNode.removeChild(e); }); /** * See documentation for `continueRight` css class in style.styl. */ document.querySelectorAll( '.content > img + pre,' + '.content > img + blockquote,' + '.content > p + pre,' + '.content > p + blockquote,' + '.content > ul + pre,' + '.content > ul + blockquote,' + '.content > ol + pre,' + '.content > ol + blockquote,' + '.content > h1 + pre,' + '.content > h1 + blockquote,' + '.content > h2 + pre,' + '.content > h2 + blockquote,' + '.content > h3 + pre,' + '.content > h3 + blockquote,' + '.content > h4 + pre,' + '.content > h4 + blockquote,' + '.content > h5 + pre,' + '.content > h5 + blockquote,' + '.content > h6 + pre,' + '.content > h6 + blockquote,' + '.content > table + pre,' + '.content > table + blockquote' ).forEach(function(e) { // Annotate classes for the left and right items that are "resynced". // This allows styling them differently. Maybe more top margins. e.className += 'flatdoc-synced-up-right'; if(e.previousSibling) { e.previousSibling.className += 'flatdoc-synced-up-left'; } }) var onAllImagesLoaded = function() { $("h2, h3").scrollagent( function(cid, pid, currentElement, previousElement) { if (pid) { $("[href='#"+pid+"']").removeClass('active'); } if (cid) { $("[href='#"+cid+"']").addClass('active'); } }); $('.menu a').anchorjump(); // Rejump after images have loaded $.anchorjump(window.location.hash, {speed: 0}); /** * If you add a style="visibility:hidden" to your document body, we will clear * the style after the styles have been injected. This avoids a flash of * unstyled content. * Only after scrolling and loading a stable page with all styles, do we * reenable visibility. */ document.body.style=""; }; var imageCount = $('img').length; var nImagesLoaded = 0; // Wait for all images to be loaded by cloning and checking: // https://cobwwweb.com/wait-until-all-images-loaded // Thankfully browsers cache images. function onOneImageLoaded(loadedEl) { nImagesLoaded++; if (nImagesLoaded == imageCount) { onAllImagesLoaded(); } } $('img').each(function(_i, imgEl) { $('<img>').on('load', onOneImageLoaded).attr('src', $(imgEl).attr('src')); }); }); /* * Anchor jump links. */ $document.on('flatdoc:ready', function() { // $('.menu a').anchorjump(); }); $document.on('flatdoc:ready', function() { if (typeof mediumZoom !== 'undefined') { mediumZoom(document.querySelectorAll('.content img'), { scrollOffset: 20, container: document.body, margin: 24, background: '#ffffff', }); document.querySelectorAll('.content img').forEach(function(img) { var parent = img.parentElement; if (parent && parent.tagName.toUpperCase() === 'P') { // Allows targeting css for containers of images // since has() selector is not yet supported in css parent.className += ' imageContainer'; } }); } }); /* * Title card. */ $document.on('flatdoc:style-ready', function() { var $card = $('.title-card'); if (!$card.length) return; var $header = $('.header'); var headerHeight = $header.length ? $header.outerHeight() : 0; $window .on('resize.title-card', function() { var windowWidth = $window.width(); if (windowWidth < 480) { $card.css('height', ''); } else { var height = $window.height(); $card.css('height', height - headerHeight); } }) .trigger('resize.title-card'); }); $(document).on('flatdoc:ready', function() { $("#misc, #basic").remove(); $("pre > code").each(function() { var $code = $(this); var m = $code.text().match(/<body class='([^']*)'/); if (m) { var $q = $("<blockquote><a href='#"+m[1]+"' class='button light'>Toggle</a></blockquote>"); $q.find('a').click(function() { var klass = $(this).attr('href').substr(1); $('body').toggleClass(klass); if (klass === 'big-h3') $.anchorjump('#theme-options'); if (klass === 'large-brief') $.anchorjump('#flatdoc'); }); $code.after($q); } }); }); /* * Sidebar stick. */ /* $(function() { var $sidebar = $('.menubar'); var elTop; $window .on('resize.sidestick', function() { $sidebar.removeClass('fixed'); elTop = $sidebar.offset().top; $window.trigger('scroll.sidestick'); }) .on('scroll.sidestick', function() { var scrollY = $window.scrollTop(); $sidebar.toggleClass('fixed', (scrollY >= elTop)); }) .trigger('resize.sidestick'); }); */ })(jQuery); /*! jQuery.scrollagent (c) 2012, Rico Sta. Cruz. MIT License. * https://github.com/rstacruz/jquery-stuff/tree/master/scrollagent */ // Call $(...).scrollagent() with a callback function. // // The callback will be called everytime the focus changes. // // Example: // // $("h2").scrollagent(function(cid, pid, currentElement, previousElement) { // if (pid) { // $("[href='#"+pid+"']").removeClass('active'); // } // if (cid) { // $("[href='#"+cid+"']").addClass('active'); // } // }); (function($) { $.fn.scrollagent = function(options, callback) { // Account for $.scrollspy(function) if (typeof callback === 'undefined') { callback = options; options = {}; } var $sections = $(this); var $parent = options.parent || $(window); // Find the top offsets of each section var offsets = []; $sections.each(function(i) { var offset = $(this).attr('data-anchor-offset') ? parseInt($(this).attr('data-anchor-offset'), 10) : (options.offset || 0); offsets.push({ id: $(this).attr('id'), index: i, el: this, offset: offset }); }); // State var current = null; var height = null; var range = null; // Save the height. Do this only whenever the window is resized so we don't // recalculate often. $(window).on('resize', function() { height = $parent.height(); range = $(document).height(); }); // Find the current active section every scroll tick. $parent.on('scroll', function() { var y = $parent.scrollTop(); // y += height * (0.3 + 0.7 * Math.pow(y/range, 2)); var latest = null; for (var i in offsets) { if (offsets.hasOwnProperty(i)) { var offset = offsets[i]; var el = offset.el; var relToViewport = offset.el.getBoundingClientRect().top; if(relToViewport > 0 && relToViewport < height / 2) { latest = offset; break; } } } if (latest && (!current || (latest.index !== current.index))) { callback.call($sections, latest ? latest.id : null, current ? current.id : null, latest ? latest.el : null, current ? current.el : null); current = latest; } }); $(window).trigger('resize'); $parent.trigger('scroll'); return this; }; })(jQuery); /*! Anchorjump (c) 2012, Rico Sta. Cruz. MIT License. * http://github.com/rstacruz/jquery-stuff/tree/master/anchorjump */ // Makes anchor jumps happen with smooth scrolling. // // $("#menu a").anchorjump(); // $("#menu a").anchorjump({ offset: -30 }); // // // Via delegate: // $("#menu").anchorjump({ for: 'a', offset: -30 }); // // You may specify a parent. This makes it scroll down to the parent. // Great for tabbed views. // // $('#menu a').anchorjump({ parent: '.anchor' }); // // You can jump to a given area. // // $.anchorjump('#bank-deposit', options); (function($) { var defaults = { 'speed': 500, 'offset': 0, 'for': null, 'parent': document.body }; $.fn.anchorjump = function(options) { options = $.extend({}, defaults, options); if (options['for']) { this.on('click', options['for'], onClick); } else { this.on('click', onClick); } function onClick(e) { var $a = $(e.target).closest('a'); if (e.ctrlKey || e.metaKey || e.altKey || $a.attr('target')) { return; } e.preventDefault(); var href = $a.attr('href'); $.anchorjump(href, options); } }; // Jump to a given area. $.anchorjump = function(href, options) { options = $.extend({}, defaults, options); var top = 0; if (href != '#') { var $area = $(href); // Find the parent if (options.parent) { var $parent = $area.closest(options.parent); if ($parent.length) { $area = $parent; } } if (!$area.length) { return; } // Determine the pixel offset; use the default if not available var offset = $area.attr('data-anchor-offset') ? parseInt($area.attr('data-anchor-offset'), 10) : options.offset; // offset().top might be negative because the document is the thing that // overflow-scrolls. top = $area.offset().top + offset; } $('html, body').animate({ scrollTop: document.body.scrollTop + top }, options.speed); $('body').trigger('anchor', href); // Add the location hash via pushState. if (window.history.pushState) { window.history.pushState({ href: href }, "", href); } }; })(jQuery); ================================================ FILE: site/theme-white/theme.styl.html ================================================ <script src="../Reload.js"> </script> support-for-ie = true // Fonts $body-font = PrivateWordFont, WordFont, Helvetica Neue, Open Sans, sans-serif $mono-font = PrivateCodingFont, CodingFont, Menlo, monospace // Margins $pad = 40px // Space between things $sidepad = 30px // Padding to the left of the sidebar $minipad = 20px // Space for mobile $vmargin = 16px // Margin between blocks // Colors $offwhite = #fafafa $codebg = #f7fafc $codeborder = #eceff3 $grey = #909090 $txt = #444444 $txtlight = #888888 $accent = #556cd6 * 0.85 $line = #e3e8ee $headerbg = #fafafa // Misc $shadow-str = 0.1 // Dimensions $sidebar-width = 230px $content-width = 550px $pre-width = 380px .medium-zoom-image z-index:100 .medium-zoom-overlay z-index:100 global-reset() h1, h2, h3, h4, h5, h6, p, blockquote, pre, html, body, div, span, applet, object, iframe, del, dfn, em, img, ins, kbd, q, s, samp, dl, dt, dd, ol, ul, li, a, small, abbr, acronym, address, big, cite, code, caption, tbody, table, tfoot, thead, tr, th, td, fieldset, form, label, legend, strike, strong, sub, sup, tt, var font-weight: inherit font-style: inherit font-family: inherit font-size: 100% vertical-align: baseline margin: 0 padding: 0 border: 0 outline: 0 body /** Needed for medium-zoom positioning */ position:relative; line-height: 1 color: black background: white ol, ul list-style: none table border-spacing: 0 border-collapse: separate vertical-align: middle caption, th, td text-align: left vertical-align: middle font-weight: normal a img border: none clearfix() &:before &:after content: "" display: table &:after clear: both zoom: 1 if support-for-ie // ---------------------------------------------------------------------------- // Mixins scrollbar($bg=white) & -webkit-overflow-scrolling: touch &::-webkit-scrollbar width: 15px height: 15px &::-webkit-scrollbar-thumb background: #ddd border-radius: 8px border: solid 4px $bg &:hover::-webkit-scrollbar-thumb background: #999 box-shadow: inset 2px 2px 3px rgba(0, 0, 0, 0.2) antialias() -webkit-font-smoothing: antialiased text-rendering: optimizeLegibility /* ---------------------------------------------------------------------------- * Base */ global-reset() html height: 100% /* Messes up medium-zoom */ /* overflow-y:scroll */ /* messes up medium-zoom body overflow-y:scroll overflow-x:hidden */ /* * jordwalke: Continues left parallel with a right docking, until the next * right docking. Requires a JS shim at document load time to * fix up the elements that occur before that next right docking, * because there is no CSS selector for "comes before". * What about using: * * The following selector matches <h1> elements only if they have a <p> element * directly following them: * * h1:has(+ p) * * document.querySelectorAll( * '.content > img + pre,' + * '.content > img + blockquote,' + * '.content > p + pre,' + * '.content > p + blockquote,' + * '.content > ul + pre,' + * '.content > ul + blockquote,' + * '.content > ol + pre,' + * '.content > ol + blockquote,' + * '.content > h1 + pre,' + * '.content > h1 + blockquote,' + * '.content > h2 + pre,' + * '.content > h2 + blockquote,' + * '.content > h3 + pre,' + * '.content > h3 + blockquote,' + * '.content > h4 + pre,' + * '.content > h4 + blockquote,' + * '.content > h5 + pre,' + * '.content > h5 + blockquote,' + * '.content > h6 + pre,' + * '.content > h6 + blockquote,' + * '.content > table + pre,' + * '.content > table + blockquote' * ).forEach(function(e) {e.previousSibling ? (e.previousSibling.style="clear:both") : null;}) */ continueRight clear:left float:left html overflow-x: hidden body, td, textarea, input font-family: $body-font line-height: 1.6 font-size: 16px color:$txt @media (max-width: 480px) /* Mobile */ font-size: 12px a color: $accent text-decoration: none &:hover color: $accent * 0.8 /* ---------------------------------------------------------------------------- * Content styling */ .content img margin: 0 box-sizing: border-box .imageContainer margin: $vmargin 0 p, ul, ol, h1, h2, h3, h4, h5, h6, pre, blockquote padding: $vmargin 0 box-sizing: border-box h1, h2, h3, h4, h5, h6 font-weight: bold antialias() pre font-family: $mono-font ul > li list-style-type: disc ol > li list-style-type: decimal ul, ol margin-left: 20px /* jordwalke: This margin-right is needed to allow lists to "dock" to the * left of a right block that spans multiple left blocks. The padding-right * is needed regardless to get the right boundary of text to be a perfect box. * TODO: This is the source of funny body size in mobile dimensions. */ margin-right: -20px ul > li list-style-type: none position: relative &:before content: '' display: block position: absolute left: -17px top: 7px width: 5px height: 5px border-radius: 4px box-sizing: border-box background: white border: solid 1px $grey li > :first-child padding-top: 0 strong, b font-weight: bold i, em font-style: italic /*color: $grey*/ p > code background: $codebg border-radius: 2px; border: 1px solid $codeborder table > code, li > code, tr > code, td > code, th > code background: $codebg border-radius: 2px; border: 1px solid $codeborder code font-family: $mono-font padding: 1px 3px font-size: 0.90em pre > code border: none; background: $codebg display: block background: transparent font-size: 0.90em letter-spacing: 0px blockquote :first-child padding-top: 0 :last-child padding-bottom: 0 table margin-top: $vmargin margin-bottom: $vmargin padding: 0 border-collapse: collapse /* Tables in non split mode should not have any clearing */ /* clear: both */ /* float: left */ tbody > :nth-child(2n) background-color: $offwhite tr border-top: 1px solid $line background-color: white margin: 0 padding: 0 th background-color: $offwhite text-align: auto; font-weight: bold border: 1px solid $line margin: 0 padding: 6px 13px td text-align: auto; border: 1px solid $line margin: 0 padding: 6px 13px th, td :first-child margin-top: 0; :last-child margin-bottom: 0; /* ---------------------------------------------------------------------------- * Content */ .content-root min-height: 90% position: relative /* Shadow around image in literate right bar */ /* Remove outline while animating open */ /* It's still not enough to hide outline while closing */ .medium-zoom--opened .content .imageContainer &:after box-shadow: none !important @media (min-width: 1180px) /* Big desktop */ body:not(.no-literate) .content blockquote .imageContainer /* So clicks pass through to image */ pointer-events: none overflow:hidden; display:inline-block; position:relative; border-radius:0px; &:after content: ""; position: absolute; width: 100%; height: 100%; left: 0; top: 0; box-shadow: inset 0px 0px 0px 0.5px #55555511 img vertical-align:middle; /* Reenable pointer events */ pointer-events: auto .content padding-top: $pad - $vmargin padding-bottom: $pad padding-left: $pad padding-right: $pad clearfix() img width: 100% max-width: 700px blockquote color: $grey h1, h2, h3 antialias() font-family: WordFont padding-bottom: 0 + p, ul, ol padding-top: 10px h1, h2 text-transform: uppercase letter-spacing: 1px font-size: 1.5em h3 font-size: 1.2em // Lines h1, h2, .big-heading padding-top: $pad * 1.5 &:before display: block content: '' background: linear-gradient(left, rgba($line, 1.0) 80%, rgba($line, 0.0)) box-shadow: 0 1px 0 rgba(white, 0.4) height: 1px position: relative top: $pad * -1 left: $pad * -1 /* width: 100% */ @media (max-width: 768px) /* Mobile and tablet */ padding-top: $minipad * 2 &:before background: $line left: $pad * -1 top: $minipad * -1 width: 120% // Small headings h4, h5, h6, .small-heading border-bottom: solid 1px rgba(black, 0.07) color: $grey padding-top: $vmargin * 2 padding-bottom: 10px body:not(.big-h3) & h3 @extends .content .small-heading font-size: 0.9em body.big-h3 & h3 @extends .content .big-heading h1:first-child padding-top: 0 &, a, a:visited color: $txt &:before display: none @media (max-width: 768px) /* Tablet */ .content h4, h5, h6, .small-heading, body:not(.big-h3) & h3 padding-top: $vmargin * 1.5 @media (max-width: 480px) /* Mobile */ .content padding: $minipad padding-top: $minipad * 2 h4, h5, h6, .small-heading, body:not(.big-h3) & h3 padding-top: $vmargin // ---------------------------------------------------------------------------- // Code blocks inset-box() background: $offwhite /* border: solid 1px $offwhite*0.95 */ /* border-top: solid 1px $offwhite*0.9 */ /* border-left: solid 1px $offwhite*0.93 */ display: block padding: 10px border-radius: 2px overflow: auto scrollbar($offwhite) body.no-literate .content pre > code inset-box() @media (max-width: 1180px) /* Small desktop */ .content pre > code inset-box() /* Hide scrollbar but keep functionality */ pre > code &::-webkit-scrollbar display: none /* Hide scrollbar for IE, Edge and Firefox */ pre > code overflow-x:scroll -ms-overflow-style: none /* IE and Edge */ scrollbar-width: none /* Firefox */ // ---------------------------------------------------------------------------- // Buttons .button antialias() font-family: WordFont, sans-serif letter-spacing: 0px font-weight: bold display: inline-block padding: 3px 25px border: solid 2px $accent border-radius: 20px margin-right: 15px &, &:visited background: $accent color: white text-shadow: none &:hover border-color: #111 background: #111 color: white &.light &, &:visited background: transparent color: $grey border-color: $grey text-shadow: none &:hover border-color: $grey background: $grey color: white .content .button + em color: $grey // ---------------------------------------------------------------------------- // Literate mode content @media (min-width: 1180px) /* Big desktop */ body:not(.no-literate) .content-root background-color: $offwhite $w = ($sidebar-width + $content-width) /* Fix major perf issue on firefox by commenting this out: https://github.com/zachlatta/reason/commit/787b8f783288d0337a3fab5b71c54d6d5630ef6e */ box-shadow: inset $w 0 white, inset ($w + 1) 0 $line, inset ($w + 10) 0 5px -10px rgba(black, $shadow-str) // Literate mode @media (min-width: 1180px) /* Big desktop */ small-heading() margin-left: $pad width: $content-width - $pad * 2 margin-bottom: 3px padding-left: 0 padding-right: 0 body:not(.no-literate) .content padding-left: 0 padding-right: 0 width: $content-width + $pre-width max-width: none > .flatdoc-synced-up-left clear: both /*.flatdoc-synced-up-right margin-top:$pad */ p, ul, ol, h1, h2, h3, h4, h5, h6, pre, blockquote width: $content-width box-sizing: border-box padding-right: $pad padding-left: $pad h1, h2, h3 clear: both /* width: 100% */ pre, blockquote width: $pre-width padding-left: ($pad/2) padding-right: ($pad/2) float: right clear: right + p, ul, ol, h4, h5, h6 clear: both p, ul, ol, h4, h5, h6 float: left clear: left h4, h5, h6, .small-heading, body:not(.big-h3) & h3 small-heading() table /* jordwalke: Moved the clearing only to here instead of the general table rule. * Otherwise, the following layout is messed up when resizing the window to be narrow: * * `type Unix.error` * : Error codes for specific `Unix` module errors. * * Value | Meaning * :------------------- |:------------------------------------------ * `EACCES` | Permission denied * `EAGAIN` | Resource temporarily unavailable; try again * `EBADF` | Bad file descriptor * `EBUSY` | Resource unavailable * `EEXISTS` | File already exists * `EISDIR` | Is a directory * `ENOENT` | No such file or directory * `ENOTDIR` | Not a directory * `ENOTEMPTY` | Directory not empty * [See all](https://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#TYPEerror) | * * * `fun Unix.dup` : `(~cloexec:bool=?, ` `file_descr` `) => ` `file_descr` * : Return a new file descriptor referencing the same file as the given * descriptor. See `Unix.set_close_on_exec` for documentation on the `cloexec` * optional argument. * (Copied from stdlib docs) */ clear: left float: left margin-left: $pad margin-right: $pad max-width: $content-width - $pad*2 body:not(.no-literate):not(.big-h3) .content > h3 small-heading() // ---------------------------------------------------------------------------- // Header .medium-zoom--opened > .header /* Needs to be less than medium-zoom overlays */ z-index:50 .header background: $headerbg z-index:101 /* text-shadow: 0 1px 0 rgba(white, 0.5) */ border-bottom: solid 1px $line padding: 15px 15px 15px $sidepad position: -webkit-sticky position: sticky top: 0px; clearfix() line-height: 20px .left float: left .right text-align: right position: absolute right: 15px top: 15px iframe display: inline-block vertical-align: middle h1 antialias() font-weight: bold font-family: WordFont, sans-serif font-size: 1em &, a, a:visited color: $grey a:hover color: $txt li a font-size: 1em color: $grey display: block &:hover color: $grey*0.4 @media (min-width: 480px) /* Tablet & Desktop */ h1 float: left ul, li display: block float: left ul margin-left: -15px h1 + ul border-left: solid 1px $line margin-left: 15px li border-left: solid 1px rgba(white, 0.5) border-right: solid 1px $line &:last-child border-right: 0 li a padding: 0 15px @media (max-width: 480px) /* Mobile */ // Hide extra stuff on mobile .right display: none // ---------------------------------------------------------------------------- // Sidebar .menubar antialias() .section padding: $sidepad $sidepad box-sizing: border-box .section + .section border-top: solid 1px $line .section.no-line border-top: 0 padding-top: 0 a.big.button display: block box-sizing: border-box width: 100% padding: 10px 20px text-align: center font-weight: bold font-size: 1.1em background: transparent border: solid 3px $accent border-radius: 30px font-family: WordFont, sans-serif &, &:visited color: $accent text-decoration: none &:hover background: $accent &, &:visited color: white @media (max-width: 480px) /* Mobile */ .menubar padding: $minipad border-bottom: solid 1px $line @media (max-width: 768px) /* Mobile and tablet */ .menubar display: none @media (min-width: 768px) /* Desktop */ .content-root padding-left: $sidebar-width .menubar position: absolute left: 0 top: 0 bottom: 0 width: $sidebar-width border-right: solid 1px $line .menubar.fixed position: fixed scrollbar() overflow-y: auto .menubar font-size: 0.9em // Sticky left menu: .menu.section position: -webkit-sticky position: sticky /* header height */ top: 35px .bottom.section position: -webkit-sticky position: sticky /* header height */ top: 35px .noselect -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Safari */ -khtml-user-select: none; /* Konqueror HTML */ -moz-user-select: none; /* Old versions of Firefox */ -ms-user-select: none; /* Internet Explorer/Edge */ user-select: none; /* Non-prefixed version, currently supported by Chrome, Edge, Opera and Firefox */ // Menu items .menu ul.level-1 > li + li margin-top: 20px a box-sizing: border-box position: relative display: block padding-top: 4px padding-bottom: 4px margin-right: ($sidepad * -1) color: $txtlight font-weight: 500!important &:hover color: $accent*0.8 a.level-1 font-family: WordFont, sans-serif text-transform: uppercase font-size: 1em font-weight: bold &, &:visited color: $grey &:hover color: $grey*0.6 a.level-2 font-size: 1em font-weight: normal a.level-3 font-weight: normal font-size: 1em padding-left: 8px a.active &, &:visited, &:hover color: $accent // Indicator &:after visibility: hidden content: '' display: block box-sizing: border-box position: absolute top: 10px right: $sidepad width: 9px height: 3px border-radius: 2px background: $accent // ---------------------------------------------------------------------------- // Syntax highlighting code .string, .number color: #3ac .init color: #383 .keyword font-weight: bold .comment color: $grey * 1.2 // ---------------------------------------------------------------------------- .content .large-brief & > h1:first-child + p, > p.brief font-size: 1.3em font-family: Open Sans, sans-serif font-weight: 300 // ---------------------------------------------------------------------------- .title-area min-height: 100px box-sizing: border-box antialias() text-align: center border-bottom: solid 1px $line overflow: hidden > img.bg z-index: 0 // Start it off screen position: absolute left: -9999px > div position: relative z-index: 1 // ----------------- Styles just for "this page" ----------------------------- .title-card text-rendering: optimizeLegibility !important -webkit-font-smoothing: antialiased !important -moz-osx-font-smoothing: grayscale .title-card /* background: #1d3b47; */ /* background-position: center center; */ /* background-size: cover; */ color: #ccc text-align: center position: relative z-index: 1 width: 100% display: table .title-card > .in display: table-cell vertical-align: middle .title-card .headline vertical-align: middle display: inline-block -webkit-box-sizing: border-box box-sizing: border-box /* text-shadow: 0 0 4px rgba(0, 0, 0, 0.5); */ padding-left: 40px padding-right: 40px max-width: 800px line-height: 1.7 .title-card h1 font-family: 'Open Sans', sans-serif font-size: 6em font-weight: 600 line-height: 1.1 margin-bottom: 0.5em color: #333 .title-card p font-family: WordFont, sans-serif color: #777 font-weight: bold font-size: 1.5em .title-card h5 margin-top: 50px margin-bottom: 50px font-family: WordFont, sans-serif color: #777 letter-spacing: 2px font-size: 1.8em .title-card h5 span display: inline-block padding: 5px 20px border: solid 3px #fff @media (max-width: 768px) /* Tablet */ .title-card h5 margin-top: 100px @media (max-width: 480px) /* Mobile */ .title-card padding: 50px 0 .title-card .headline padding-left: 10px padding-right: 10px min-height: none .title-card h1 font-size: 2.2em .title-card p font-size: 1.1em .title-card h5 margin-top: 40px font-size: 0.9em ================================================ FILE: unit-tests/runner/Lib.re ================================================ module TestFramework = { include Rely.Make({ let config = Rely.TestFrameworkConfig.initialize({ snapshotDir: "_build/default/unit-tests", projectDir: "", }); }); }; open TestFramework; open PesyEsyPesyLib; open PesyConf; open PesyEsyPesyErrors.Errors; open PesyEsyPesyUtils.Utils; describe("PesyConf.resolveRelativePath", ({test, _}) => { test("simple case", ({expect, _}) => expect.string(resolveRelativePath("foo/lib")).toEqual("foo/lib") ); test("with ../ in the path", ({expect, _}) => expect.string(resolveRelativePath("foo/bar/..")).toEqual("foo") ); test("with ../../ in the path", ({expect, _}) => expect.string(resolveRelativePath("foo/bar/../..")).toEqual("") ); test("with excessive ../", ({expect, _}) => expect.fn(() => resolveRelativePath("foo/bar/../../..")).toThrowException( ResolveRelativePathFailure( "Failed resolving: foo/bar/../../.. Too many `../`", ), ) ); test("foo/bar/../baz/", ({expect, _}) => expect.string(resolveRelativePath("foo/bar/../baz/")).toEqual("foo/baz") ); }); describe("PesyConf.moduleNameOf", ({test, _}) => { test("simple case .re file", ({expect, _}) => expect.string(moduleNameOf("Foo.re")).toEqual("Foo") ); test("simple case .ml file", ({expect, _}) => expect.string(moduleNameOf("Foo.ml")).toEqual("Foo") ); }); describe("PesyConf.isValidBinaryFileName", ({test, _}) => { test("For an invalid binary", ({expect, _}) => expect.bool(isValidBinaryFileName("Foo.re")).toBeFalse() ); test("For a valid binary", ({expect, _}) => expect.bool(isValidBinaryFileName("Foo.exe")).toBeTrue() ); }); describe("PesyConf.isValidSourceFile", ({test, _}) => { test("For an invalid source file", ({expect, _}) => expect.bool(isValidSourceFile("Foo.exe")).toBeFalse() ); test("For a valid source file", ({expect, _}) => expect.bool(isValidSourceFile("Foo.ml")).toBeTrue() ); test("For a valid source file", ({expect, _}) => expect.bool(isValidSourceFile("Foo.re")).toBeTrue() ); }); describe("PesyConf.isValidScopeName", ({test, _}) => { test("For an invalid case", ({expect, _}) => expect.bool(isValidScopeName("myscope")).toBeFalse() ); test("For a valid case", ({expect, _}) => expect.bool(isValidScopeName("@myscope")).toBeTrue() ); }); describe("PesyConf.doubleKebabifyIfScoped", ({test, _}) => { test("test foo-bar", ({expect, _}) => expect.string(doubleKebabifyIfScoped("foo-bar")).toEqual("foo-bar") ) }); let testToPackages = (~duneVersion="1.11", jsonStr) => { let json = JSON.ofString(jsonStr); let pkgs = PesyConf.pkgs(json); let pesyPackages = List.map(toPesyConf("", "", ~duneVersion), pkgs); let dunePackages = List.map(toDunePackages("", ""), pesyPackages); List.map( p => { let (_, d) = p; d; }, dunePackages, ); }; describe("PesyConf.testToPackages", ({test, _}) => { test("Sample config - 1", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "test": { "require": ["foo"], "bin": { "Bar.exe": "Bar.re" } } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Bar) (modules (:standard)) (public_names Bar.exe)\n (libraries foo))\n", ]) ); test("Sample config - 2", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "modes": ["best"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo) (modes best))\n", ]) ); test("Sample config - 3", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "cNames": ["stubs"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo) (c_names stubs))\n", ]) ); test("Sample config - 4", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "implements": ["foo"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (implements foo))\n", ]) ); test("Sample config - 5", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "wrapped": false } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (wrapped false))\n", ]) ); test("Sample config - 6", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": ["best", "c"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes (best c)))\n", ]) ); test("Sample config - 7", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "flags": ["-w", "-33+9"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo) (flags -w -33+9))\n", ]) ); test("Sample config - 8", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "ocamlcFlags": ["-annot", "-c"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (ocamlc_flags -annot -c))\n", ]) ); test("Sample config - 9", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "ocamloptFlags": ["-rectypes", "-nostdlib"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard))\n (ocamlopt_flags -rectypes -nostdlib))\n", ]) ); test("Sample config - 10", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "jsooFlags": ["-pretty", "-no-inline"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (js_of_ocaml -pretty -no-inline))\n", ]) ); test("Sample config - 11", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "preprocess": [ "pps", "lwt_ppx" ] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (preprocess (pps lwt_ppx)))\n", ]) ); test("Sample config - 12", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "includeSubdirs": "unqualified" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)))\n(include_subdirs unqualified)\n", ]) ); test("Sample config - 12", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "includeSubdirs": "unqualified" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)))\n(include_subdirs unqualified)\n", ]) ); test("Sample config - 14", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testexe": { "bin": { "Foo.exe": "Foo.re" }, "rawBuildConfigFooter": [ "(install (section share_root) (files (asset.txt as asset.txt)))" ] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names Foo.exe))\n(install (section share_root) (files (asset.txt as asset.txt)))\n", ]) ); test("Sample config - 14", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testexe": { "bin": { "Foo.exe": "Foo.re" } } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names Foo.exe))\n", ]) ); test("Sample config - 15", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "rawBuildConfigFooter": [ "(install (section share_root) (files (asset.txt as asset.txt)))" ] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)))\n(install (section share_root) (files (asset.txt as asset.txt)))\n", ]) ); test("Sample config - 16", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "rawBuildConfig": [ "(libraries lwt lwt.unix raw.lib)", "(preprocess (pps lwt_ppx))" ] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries lwt lwt.unix raw.lib)\n (preprocess (pps lwt_ppx)))\n", ]) ); test("Sample config - 17", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "flags": "-verbose" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo) (flags -verbose))\n", ]) ); test("Sample config - 18", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "ocamlcFlags": "-annot -c" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (ocamlc_flags -annot -c))\n", ]) ); test("Sample config - 19", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "ocamloptFlags": "-rectypes -nostdlib" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard))\n (ocamlopt_flags -rectypes -nostdlib))\n", ]) ); test("Sample config - 20", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "namespace": "Foo", "name": "bar.lib", "jsooFlags": "-pretty -no-inline" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (js_of_ocaml -pretty -no-inline))\n", ]) ); test("Sample config - 21", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.bc.js": "Foo.re" }, "modes": "js" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.bc.js)\n (modes js))\n", ]) ); test("Sample config - 22", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": "exe object shared_object" } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes exe object shared_object))\n", ]) ); test("Sample config - 23", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": ["js", "plugin"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes js plugin))\n", ]) ); test("Sample config - 24", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": [["byte", "exe"], ["byte", "js"]] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes (byte exe) (byte js)))\n", ]) ); test("Sample config - 25", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": ["byte", "exe"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes (byte exe)))\n", ]) ); test("Sample config - 26", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "bin": { "bar.exe": "Foo.re" }, "modes": ["exe"] } } } |}, ) |> List.map(DuneFile.toString), ). toEqual([ "(executables (names Foo) (modules (:standard)) (public_names bar.exe)\n (modes exe))\n", ]) ); test("Sample config - 27", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "foreignStubs": [ { "language": "c" } ] } } } |}, ~duneVersion="2.0", ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo)\n (foreign_stubs (language c) (names :standard) (flags :standard)))\n", ]) ); test("Sample config - 28", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "foreignStubs": [ { "language": "c", "names": ["src1", "src2"], "flags": [] } ] } } } |}, ~duneVersion="2.0", ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo)\n (foreign_stubs (language c) (names src1 src2) (flags :standard)))\n", ]) ); test("Sample config - 29", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "foreignStubs": [ { "language": "c", "names": ["src1", "src2"] }, { "language": "cxx", "names": ["src3"], "flags": ["-02"] } ] } } } |}, ~duneVersion="2.0", ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo)\n (foreign_stubs (language c) (names src1 src2) (flags :standard))\n (foreign_stubs (language cxx) (names src3) (flags -02)))\n", ]) ); test("Sample config - 30", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "cNames": ["stubs"], "foreignStubs": [ { "language": "c", "names": ["src1", "src2"] }, { "language": "cxx", "names": ["src3"], "flags": ["-02"] } ] } } } |}, ~duneVersion="2.0", ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo)\n (foreign_stubs (language c) (names src1 src2) (flags :standard))\n (foreign_stubs (language cxx) (names src3) (flags -02)))\n", ]) ); test("Sample config - 31", ({expect, _}) => expect.list( testToPackages( {| { "name": "foo", "buildDirs": { "testlib": { "require": ["foo"], "namespace": "Foo", "name": "bar.lib", "cNames": ["stub1", "stub2"], "foreignStubs": [ { "language": "c", "names": ["src1", "src2"] }, { "language": "cxx", "names": ["src3"], "flags": ["-02"] } ] } } } |}, ~duneVersion="1.11", ) |> List.map(DuneFile.toString), ). toEqual([ "(library (name Foo) (modules (:standard)) (libraries foo)\n (c_names stub1 stub2))\n", ]) ); }); ================================================ FILE: unit-tests/runner/RunUnitTests.re ================================================ module UtilsTests = Utils; module LibTests = Lib; LibTests.TestFramework.cli(); UtilsTests.TestFramework.cli(); ================================================ FILE: unit-tests/runner/Utils.re ================================================ module TestFramework = { include Rely.Make({ let config = Rely.TestFrameworkConfig.initialize({ snapshotDir: "_build/default/unit-tests", projectDir: "", }); }); }; open PesyEsyPesyUtils; open TestFramework; open Utils; describe("Utils.filterNone", ({test, _}) => { test("simple case", ({expect, _}) => expect.list(filterNone([Some(1), None, None, Some(2), None, Some(3)])). toEqual([ 1, 2, 3, ]) ) }); ================================================ FILE: unit-tests/runner/dune ================================================ (test (name RunUnitTests) (libraries pesy--esy-pesy.lib pesy--esy-pesy.utils rely.lib)) ================================================ FILE: utils/FieldTypes.re ================================================ open Printf; type t = | Bool(bool) | String(string) | List(list(t)); exception ConversionException(string); let toBool = fun | Bool(b) => b | String(s) => raise( ConversionException(sprintf("Expected string. Actual string (%s)", s)), ) | List(_l) => raise(ConversionException("Expected string. Actual list")); let toString = fun | String(s) => s | Bool(b) => raise( ConversionException( sprintf("Expected string. Actual bool (%s)", string_of_bool(b)), ), ) | List(_) => raise(ConversionException("Expected string. Actual list")); let toList = fun | List(l) => l | Bool(b) => raise( ConversionException( sprintf("Expected list. Actual bool (%s)", string_of_bool(b)), ), ) | String(_) => raise(ConversionException("Expected list. Actual string")); ================================================ FILE: utils/JSON.re ================================================ /* TODO: Making parsing more lenient? Eg. allow string where single element list is valid */ include Yojson.Basic; open Printf; open Yojson.Basic; type t = Yojson.Basic.t; /* private */ exception MissingJSONMember(string); /* public */ exception InvalidJSONValue(string); exception NullJSONValue(unit); let ofString = jstr => from_string(jstr); let fromFile = path => from_file(path); let member = (j, m) => try(Util.member(m, j)) { | _ => raise( MissingJSONMember(Printf.sprintf("%s was missing in the json", m)), ) }; let toOption = v => v === `Null ? None : Some(v); let toKeyValuePairs = (json: Yojson.Basic.t) => switch (json) { | `Assoc(jsonKeyValuePairs) => jsonKeyValuePairs | `Null => raise(NullJSONValue()) | _ => raise(InvalidJSONValue("Expected key value pairs")) }; let toListKVPairs = (json: Yojson.Basic.t) => switch (json) { | `List(kvs) => List.map(toKeyValuePairs, kvs) | `Null => raise(NullJSONValue()) | _ => raise(InvalidJSONValue("Expected list of key value pairs")) }; let rec toValue = (json: Yojson.Basic.t) => switch (json) { | `Bool(b) => FieldTypes.Bool(b) | `String(s) => FieldTypes.String(s) | `List(jl) => FieldTypes.List(List.map(j => toValue(j), jl)) | `Null => raise(NullJSONValue()) | _ => raise( InvalidJSONValue( sprintf( "Value must be either string, bool or list of string. Found %s", to_string(json), ), ), ) }; let debug = t => to_string(t); ================================================ FILE: utils/JSON.rei ================================================ include (module type of Yojson.Basic); type t = Yojson.Basic.t; exception NullJSONValue(unit); exception InvalidJSONValue(string); let ofString: string => t; let fromFile: string => t; let member: (t, string) => t; let toOption: t => option(t); let toKeyValuePairs: t => list((string, t)); let toListKVPairs: t => list(list((string, t))); let toValue: t => FieldTypes.t; let debug: t => string; ================================================ FILE: utils/Utils.re ================================================ open Printf; let prompt = q => { print_endline(q); read_line(); }; let kebab = str => { let charStrings = Str.split(Str.regexp_string(""), str); let k = String.concat( "", List.map( c => if (Char.code(c.[0]) >= 65 && Char.code(c.[0]) <= 90) { "-" ++ String.lowercase_ascii(c); } else { c; }, charStrings, ), ); if (k.[0] == '-') { String.sub(k, 1, String.length(k) - 1); } else { k; }; }; let getCurrentDirName = () => Filename.basename(Sys.getenv("PWD")); let upperCamelCasify = kebab => { let parts = Str.split(Str.regexp_string("-"), kebab); let k = String.concat("", List.map(String.capitalize_ascii, parts)); if (String.length(k) > 0 && k.[0] == '-') { String.sub(k, 1, String.length(k) - 1); } else { k; }; }; let removeScope = kebab => Str.global_replace(Str.regexp("[^\\/]*/"), "", kebab); module NoLwt = { open Printf; let write = (file, str) => { let oc = open_out(file); fprintf(oc, "%s", str); close_out(oc); }; }; let readFile = file => { let buf = ref(""); let breakOut = ref(false); let ic = open_in(file); while (! breakOut^) { let line = try(input_line(ic)) { | End_of_file => breakOut := true; ""; }; buf := buf^ ++ "\n" ++ line; }; buf^; }; module Path = { let (/) = Filename.concat; }; let parent = Filename.dirname; let loadTemplate = name => readFile( Path.( (Sys.executable_name |> parent |> parent) / "share" / "template-repo" / name ), ); let buffer_size = 8192; let buffer = Bytes.create(buffer_size); let copyFile = (input_name, output_name) => { open Unix; let fd_in = openfile(input_name, [O_RDONLY], 0); let fd_out = openfile(output_name, [O_WRONLY, O_CREAT, O_TRUNC], 438); let rec copy_loop = () => switch (read(fd_in, buffer, 0, buffer_size)) { | 0 => () | r => ignore(write(fd_out, buffer, 0, r)); copy_loop(); }; copy_loop(); close(fd_in); close(fd_out); }; let copyTemplate = (input_name, output_name) => { copyFile( Path.( (Sys.executable_name |> parent |> parent) / "share" / "template-repo" / input_name ), output_name, ); }; let r = Str.regexp; let exists = Sys.file_exists; let mkdir = (~perms=?, p) => switch (perms) { | Some(x) => Unix.mkdir(p, x) | None => Unix.mkdir(p, 0o755) }; let rec mkdirp = p => { let directory_created = try(Sys.is_directory(p)) { | Sys_error(_) => false }; if (!directory_created) { mkdirp(Filename.dirname(p)); mkdir(p); }; }; let spf = Printf.sprintf; let renderAsciiTree = (dir, name, namespace, require, isLast) => if (isLast) { spf({js|│ └─ %s %s %s |js}, dir, name, namespace); } else { Printf.sprintf( {js|│ ├─ %s │ %s │ %s |js}, dir, name, namespace, ) ++ (require == "" ? "" : (isLast ? " " : "│ ") ++ require); }; /* Capable of rendering a tree of depth 1 */ exception RenderAsciiTreeChildrenError(string); let renderAscTreeChildren = fun | [] => raise(RenderAsciiTreeChildrenError("Tree cannot have zero children")) | [firstChild, ...restChildren] => { let firstChildLog = sprintf("├─ %s", firstChild); let restChildrenLog = List.map(c => sprintf("│ %s", c), restChildren); String.concat("\n", ["│", firstChildLog, ...restChildrenLog]); }; let renderAscLastTree = fun | [] => raise(RenderAsciiTreeChildrenError("Tree cannot have zero children")) | [firstChild, ...restChildren] => { let firstChildLog = sprintf("└─ %s", firstChild); let restChildrenLog = List.map(c => sprintf(" %s", c), restChildren); String.concat("\n", ["│", firstChildLog, ...restChildrenLog]); }; let rec renderAscTree = fun | [] => () | [t] => print_endline(renderAscLastTree(t)) | [t, ...rest] => { print_endline(renderAscTreeChildren(t)); renderAscTree(rest); }; let readFileOpt = f => if (exists(f)) { Some(readFile(f)); } else { None; }; /* module Cache = { */ /* module CacheInternal = { */ /* type t = {path: string}; */ /* let init = path => {path: path}; */ /* }; */ /* let init = () => { */ /* /\* let cacheStoragePath = *\/ */ /* /\* Path.((Sys.executable_name |> parent |> parent) / "share" / "cache"); *\/ */ /* }; */ /* let get = (cache: CacheInternal.t, key: string) => {}; */ /* }; */ let commandOutput = (command, args) => { open Unix; let cmd = String.concat(" ", Array.to_list(Array.append([|command|], args))); let (cout, cin, cerr) = open_process_full(cmd, Unix.environment()); let repeat = ref(true); let stdout = ref(""); let stderr = ref(""); while (repeat^) { ignore( try(stdout := stdout^ ++ input_line(cout)) { | End_of_file => repeat := false }, ); }; while (repeat^) { ignore( try(stderr := stderr^ ++ input_line(cerr)) { | End_of_file => repeat := false }, ); }; switch (close_process_full((cout, cin, cerr))) { | WEXITED(_c) => (stdout^, stderr^) | WSIGNALED(_c) => (stdout^, stderr^) | WSTOPPED(_c) => (stdout^, stderr^) }; }; let runCommandWithEnv = (command, args) => { open Unix; /* let attach = */ /* Unix.create_process_env( */ /* command, */ /* Array.append([|command|], args), */ /* Unix.environment(), */ /* ); */ /* let pid = attach(Unix.stdin, Unix.stdout, Unix.stderr); */ /* switch (Unix.waitpid([], pid)) { */ /* | (_, WEXITED(c)) => c */ /* | (_, WSIGNALED(c)) => c */ /* | (_, WSTOPPED(c)) => c */ /* }; */ let cmd = String.concat(" ", Array.to_list(Array.append([|command|], args))); let (cout, cin, cerr) = open_process_full(cmd, Unix.environment()); let repeat = ref(true); while (repeat^) { ignore( try({ let line = input_line(cerr); print_endline(<Pastel dim=true> line </Pastel>); }) { | End_of_file => repeat := false }, ); }; while (repeat^) { ignore( try({ let line = input_line(cout); print_endline(<Pastel dim=true> line </Pastel>); }) { | End_of_file => repeat := false }, ); }; switch (close_process_full((cout, cin, cerr))) { | WEXITED(c) => c | WSIGNALED(c) => c | WSTOPPED(c) => c }; }; let filterNone = l => { let result = ref([]); let rec loop = fun | [] => () | [h, ...rest] => { switch (h) { | Some(a) => result := [a, ...result^] | None => () }; loop(rest); }; loop(l); List.rev(result^); }; let run = (~env, c, args) => { let env_vars = switch (env) { | Some(v) => v | None => Unix.environment() }; let (readme, writeme) = Unix.pipe(); let pid = Unix.create_process_env( c, Array.append([|c|], args), env_vars, Unix.stdin, writeme, Unix.stderr, ); Unix.close(writeme); let result = {contents: []}; let in_channel = Unix.in_channel_of_descr(readme); try( while (true) { result.contents = [input_line(in_channel), ...result.contents]; } ) { | End_of_file => () }; Unix.close(readme); result := List.rev(result^); switch (Unix.waitpid([], pid)) { | (_, WEXITED(c)) => (c, result^) | (_, WSIGNALED(c)) => (c, []) | (_, WSTOPPED(c)) => (c, []) }; }; let run = (~env=?, cmd, args) => { let (exitCode, lines) = run(~env, cmd, args); if (exitCode != 0) { Printf.printf( "%s failed. Exit code relayed to the shell\n Exiting with (%d)...\n", cmd, exitCode, ); exit(exitCode); } else { (exitCode, lines); }; }; let moduleNameOf = fileName => Str.global_replace(Str.regexp("\\.\\(re\\|ml\\)$"), "", fileName); module JSON = JSON; module FieldTypes = FieldTypes; ================================================ FILE: utils/dune ================================================ (library (name PesyEsyPesyUtils) (public_name pesy--esy-pesy.utils) (modules (:standard)) (libraries unix yojson str pastel.lib))