refactor for cross platform use
This commit is contained in:
parent
090932e783
commit
18daf2c63f
15 changed files with 5626 additions and 23 deletions
53
.github/workflows/main.yml
vendored
53
.github/workflows/main.yml
vendored
|
@ -1,9 +1,9 @@
|
|||
name: Main
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
on: [pull_request, push]
|
||||
# push:
|
||||
# branches:
|
||||
# - 'master'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -14,20 +14,33 @@ jobs:
|
|||
uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Install
|
||||
run: npm ci
|
||||
- name: Build
|
||||
run: npm run build
|
||||
- name: Test
|
||||
run: npm rust test
|
||||
- name: "check for uncommitted changes"
|
||||
# Ensure no changes, but ignore node_modules dir since dev/fresh ci deps installed.
|
||||
run: |
|
||||
git diff --exit-code --stat -- . ':!node_modules' \
|
||||
|| (echo "##[error] found changed files after build. please 'npm run build && npm run format'" \
|
||||
"and check in all changes" \
|
||||
&& exit 1)
|
||||
# https://github.com/actions/docker/tree/master/cli
|
||||
- name: Package
|
||||
uses: actions/docker/cli@master
|
||||
with:
|
||||
args: build -t ${{ github.repository }}:latest -t ${{ github.repository }}:${{ github.sha }} .
|
||||
# https://github.com/actions/docker/tree/master/login
|
||||
- name: Publish Auth
|
||||
uses: actions/docker/login@master
|
||||
env:
|
||||
# https://help.github.com/en/articles/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
# https://github.com/actions/docker/tree/master/cli
|
||||
- name: Publish
|
||||
uses: actions/docker/cli@master
|
||||
with:
|
||||
args: push ${{ github.repository }}:latest
|
||||
# - name: Package
|
||||
# uses: actions/docker/cli@master
|
||||
# with:
|
||||
# args: build -t ${{ github.repository }}:latest -t ${{ github.repository }}:${{ github.sha }} .
|
||||
# # https://github.com/actions/docker/tree/master/login
|
||||
# - name: Publish Auth
|
||||
# uses: actions/docker/login@master
|
||||
# env:
|
||||
# # https://help.github.com/en/articles/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables
|
||||
# DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
# DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||
# # https://github.com/actions/docker/tree/master/cli
|
||||
# - name: Publish
|
||||
# uses: actions/docker/cli@master
|
||||
# with:
|
||||
# args: push ${{ github.repository }}:latest
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
node_modules
|
||||
|
|
30
__tests__/github.test.ts
Normal file
30
__tests__/github.test.ts
Normal file
|
@ -0,0 +1,30 @@
|
|||
//import * as assert from "assert";
|
||||
//const assert = require('assert');
|
||||
import * as assert from 'assert';
|
||||
import { mimeOrDefault, asset } from '../src/github';
|
||||
|
||||
describe('github', () => {
|
||||
describe('mimeOrDefault', () => {
|
||||
it('returns a specific mime for common path', async () => {
|
||||
assert.equal(mimeOrDefault('foo.tar.gz'), 'application/gzip')
|
||||
});
|
||||
it('returns default mime for uncommon path', async () => {
|
||||
assert.equal(mimeOrDefault('foo.uncommon'), 'application/octet-stream')
|
||||
});
|
||||
});
|
||||
|
||||
describe('asset', () => {
|
||||
it('derives asset info from a path', async () => {
|
||||
const {
|
||||
name,
|
||||
mime,
|
||||
size,
|
||||
file
|
||||
} = asset('tests/data/foo/bar.txt');
|
||||
assert.equal(name, 'bar.txt');
|
||||
assert.equal(mime, 'text/plain');
|
||||
assert.equal(size, 10);
|
||||
assert.equal(file.toString(), 'release me')
|
||||
});
|
||||
})
|
||||
});
|
19
__tests__/util.test.ts
Normal file
19
__tests__/util.test.ts
Normal file
|
@ -0,0 +1,19 @@
|
|||
import { isTag, paths } from '../src/util';
|
||||
import * as assert from 'assert';
|
||||
|
||||
describe('util', () => {
|
||||
describe('isTag', () => {
|
||||
it('returns true for tags', async () => {
|
||||
assert.equal(isTag('refs/tags/foo'), true)
|
||||
});
|
||||
it ('returns false for other kinds of refs', async () => {
|
||||
assert.equal(isTag('refs/heads/master'), false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('paths', () => {
|
||||
it('resolves files given a set of paths', async () => {
|
||||
assert.deepStrictEqual(paths(["tests/data/**/*"]), ['tests/data/foo/bar.txt'])
|
||||
});
|
||||
})
|
||||
});
|
|
@ -24,8 +24,10 @@ inputs:
|
|||
required: false
|
||||
default: 'empty'
|
||||
runs:
|
||||
using: 'docker'
|
||||
image: 'docker://softprops:action-gh-action'
|
||||
#using: 'docker'
|
||||
#image: 'docker://softprops:action-gh-action'
|
||||
using: 'node12'
|
||||
main: 'lib/main.js'
|
||||
env:
|
||||
'GITHUB_TOKEN': 'As provided by Github Actions'
|
||||
branding:
|
||||
|
|
11
jest.config.js
Normal file
11
jest.config.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
module.exports = {
|
||||
clearMocks: true,
|
||||
moduleFileExtensions: ['js', 'ts'],
|
||||
testEnvironment: 'node',
|
||||
testMatch: ['**/*.test.ts'],
|
||||
testRunner: 'jest-circus/runner',
|
||||
transform: {
|
||||
'^.+\\.ts$': 'ts-jest'
|
||||
},
|
||||
verbose: true
|
||||
}
|
69
lib/github.js
Normal file
69
lib/github.js
Normal file
|
@ -0,0 +1,69 @@
|
|||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs_1 = require("fs");
|
||||
const mime_1 = require("mime");
|
||||
const path_1 = require("path");
|
||||
exports.asset = (path) => {
|
||||
return {
|
||||
name: path_1.basename(path),
|
||||
mime: exports.mimeOrDefault(path),
|
||||
size: fs_1.lstatSync(path).size,
|
||||
file: fs_1.readFileSync(path)
|
||||
};
|
||||
};
|
||||
exports.mimeOrDefault = (path) => {
|
||||
return mime_1.getType(path) || "application/octet-stream";
|
||||
};
|
||||
exports.upload = (gh, url, path) => __awaiter(void 0, void 0, void 0, function* () {
|
||||
let { name, size, mime, file } = exports.asset(path);
|
||||
console.log(`⬆️ Uploading ${name}...`);
|
||||
return yield gh.repos.uploadReleaseAsset({
|
||||
url,
|
||||
headers: {
|
||||
"content-length": size,
|
||||
"content-type": mime
|
||||
},
|
||||
name,
|
||||
file
|
||||
});
|
||||
});
|
||||
exports.release = (config, gh) => __awaiter(void 0, void 0, void 0, function* () {
|
||||
let [owner, repo] = config.github_repository.split("/");
|
||||
try {
|
||||
let release = yield gh.repos.getReleaseByTag({
|
||||
owner,
|
||||
repo,
|
||||
tag: config.github_ref
|
||||
});
|
||||
return release.data;
|
||||
}
|
||||
catch (error) {
|
||||
if (error.status === 404) {
|
||||
const tag_name = config.github_ref.replace("refs/tags/", "");
|
||||
const name = config.input_name || tag_name;
|
||||
const body = config.input_body;
|
||||
const draft = config.input_draft;
|
||||
let release = yield gh.repos.createRelease({
|
||||
owner,
|
||||
repo,
|
||||
tag_name,
|
||||
name,
|
||||
body,
|
||||
draft
|
||||
});
|
||||
return release.data;
|
||||
}
|
||||
else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
});
|
45
lib/main.js
Normal file
45
lib/main.js
Normal file
|
@ -0,0 +1,45 @@
|
|||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const core = __importStar(require("@actions/core"));
|
||||
const github_1 = require("@actions/github");
|
||||
const util_1 = require("./util");
|
||||
const github_2 = require("./github");
|
||||
function run() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
const config = util_1.parseConfig(process.env);
|
||||
if (!util_1.isTag(config.github_ref)) {
|
||||
throw new Error(`⚠️ GitHub Releases requires a tag`);
|
||||
}
|
||||
// todo: validate github_ref is a tag
|
||||
const gh = new github_1.GitHub(config.github_token);
|
||||
let rel = yield github_2.release(config, gh);
|
||||
if (config.input_files) {
|
||||
util_1.paths(config.input_files).forEach((path) => __awaiter(this, void 0, void 0, function* () {
|
||||
yield github_2.upload(gh, rel.upload_url, path);
|
||||
}));
|
||||
}
|
||||
console.log(`🎉 Release ready at ${rel.html_url}`);
|
||||
}
|
||||
catch (error) {
|
||||
core.setFailed(error.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
run();
|
31
lib/util.js
Normal file
31
lib/util.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
"use strict";
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const glob = __importStar(require("glob"));
|
||||
const fs_1 = require("fs");
|
||||
exports.parseConfig = (env) => {
|
||||
return {
|
||||
github_token: env.GITHUB_TOKEN || "",
|
||||
github_ref: (env.GITHUB_REF || ""),
|
||||
github_repository: env.GITHUB_REPOSITORY || "",
|
||||
input_name: env.INPUT_NAME,
|
||||
input_body: env.INPUT_BODY,
|
||||
input_body_path: env.INPUT_BODY_PATH,
|
||||
input_files: (env.INPUT_FILES || "").split(","),
|
||||
input_draft: env.INPUT_DRAFT === 'true'
|
||||
};
|
||||
};
|
||||
exports.paths = (patterns) => {
|
||||
return patterns.reduce((acc, pattern) => {
|
||||
return acc.concat(glob.sync(pattern).filter(path => fs_1.lstatSync(path).isFile()));
|
||||
}, []);
|
||||
};
|
||||
exports.isTag = (ref) => {
|
||||
return ref.startsWith("refs/tags/");
|
||||
};
|
5131
package-lock.json
generated
Normal file
5131
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
36
package.json
Normal file
36
package.json
Normal file
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"name": "action-gh-release",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"description": "GitHub Action for creating GitHub Releases",
|
||||
"main": "lib/main.js",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/softprops/action-gh-template.git"
|
||||
},
|
||||
"keywords": [
|
||||
"actions"
|
||||
],
|
||||
"author": "softprops",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.0.0",
|
||||
"@actions/github": "^1.0.0",
|
||||
"glob": "^7.1.4",
|
||||
"mime": "^2.4.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/glob": "^7.1.1",
|
||||
"@types/jest": "^24.0.13",
|
||||
"@types/mime": "^2.0.1",
|
||||
"@types/node": "^12.0.4",
|
||||
"jest": "^24.8.0",
|
||||
"jest-circus": "^24.7.1",
|
||||
"ts-jest": "^24.0.2",
|
||||
"typescript": "^3.5.1"
|
||||
}
|
||||
}
|
86
src/github.ts
Normal file
86
src/github.ts
Normal file
|
@ -0,0 +1,86 @@
|
|||
import { GitHub } from '@actions/github';
|
||||
import { Config } from './util';
|
||||
import { lstatSync, readFileSync } from 'fs';
|
||||
import { getType } from 'mime';
|
||||
import { basename } from 'path';
|
||||
|
||||
export interface ReleaseAsset {
|
||||
name: string,
|
||||
mime: string,
|
||||
size: number,
|
||||
file: Buffer
|
||||
}
|
||||
|
||||
export interface Release {
|
||||
upload_url: string,
|
||||
html_url: string
|
||||
}
|
||||
|
||||
export const asset = (path: string): ReleaseAsset => {
|
||||
return {
|
||||
name: basename(path),
|
||||
mime: mimeOrDefault(path),
|
||||
size: lstatSync(path).size,
|
||||
file: readFileSync(path)
|
||||
};
|
||||
}
|
||||
|
||||
export const mimeOrDefault = (path: string): string => {
|
||||
return getType(path) || "application/octet-stream";
|
||||
}
|
||||
|
||||
export const upload = async (
|
||||
gh: GitHub,
|
||||
url: string,
|
||||
path: string
|
||||
): Promise<any> => {
|
||||
let {
|
||||
name,
|
||||
size,
|
||||
mime,
|
||||
file
|
||||
} = asset(path);
|
||||
console.log(`⬆️ Uploading ${name}...`);
|
||||
return await gh.repos.uploadReleaseAsset({
|
||||
url,
|
||||
headers: {
|
||||
"content-length": size,
|
||||
"content-type": mime
|
||||
},
|
||||
name,
|
||||
file
|
||||
});
|
||||
}
|
||||
|
||||
export const release = async (
|
||||
config: Config,
|
||||
gh: GitHub
|
||||
): Promise<Release> => {
|
||||
let [owner, repo] = config.github_repository.split("/");
|
||||
try {
|
||||
let release = await gh.repos.getReleaseByTag({
|
||||
owner,
|
||||
repo,
|
||||
tag: config.github_ref
|
||||
});
|
||||
return release.data;
|
||||
} catch (error) {
|
||||
if (error.status === 404) {
|
||||
const tag_name = config.github_ref.replace("refs/tags/", "");
|
||||
const name = config.input_name || tag_name;
|
||||
const body = config.input_body;
|
||||
const draft = config.input_draft;
|
||||
let release = await gh.repos.createRelease({
|
||||
owner,
|
||||
repo,
|
||||
tag_name,
|
||||
name,
|
||||
body,
|
||||
draft
|
||||
});
|
||||
return release.data;
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
27
src/main.ts
Normal file
27
src/main.ts
Normal file
|
@ -0,0 +1,27 @@
|
|||
import * as fs from 'fs';
|
||||
import * as core from '@actions/core';
|
||||
import { GitHub } from '@actions/github';
|
||||
import { paths, parseConfig, isTag } from './util';
|
||||
import { release, upload } from './github';
|
||||
|
||||
async function run() {
|
||||
try {
|
||||
const config = parseConfig(process.env);
|
||||
if (!isTag(config.github_ref)) {
|
||||
throw new Error(`⚠️ GitHub Releases requires a tag`);
|
||||
}
|
||||
// todo: validate github_ref is a tag
|
||||
const gh = new GitHub(config.github_token);
|
||||
let rel = await release(config, gh);
|
||||
if (config.input_files) {
|
||||
paths(config.input_files).forEach(async (path) => {
|
||||
await upload(gh, rel.upload_url, path)
|
||||
});
|
||||
}
|
||||
console.log(`🎉 Release ready at ${rel.html_url}`)
|
||||
} catch (error) {
|
||||
core.setFailed(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
run();
|
39
src/util.ts
Normal file
39
src/util.ts
Normal file
|
@ -0,0 +1,39 @@
|
|||
import * as glob from 'glob';
|
||||
import { lstatSync } from 'fs';
|
||||
|
||||
export interface Config {
|
||||
github_token: string,
|
||||
github_ref: string,
|
||||
github_repository: string,
|
||||
// user provided
|
||||
input_name?: string,
|
||||
input_body?: string,
|
||||
input_body_path?: string,
|
||||
input_files?: string[],
|
||||
input_draft?: boolean,
|
||||
}
|
||||
|
||||
type Env = { [key: string]: string | undefined };
|
||||
|
||||
export const parseConfig = (env: Env): Config => {
|
||||
return {
|
||||
github_token: env.GITHUB_TOKEN || "",
|
||||
github_ref: (env.GITHUB_REF || ""),
|
||||
github_repository: env.GITHUB_REPOSITORY || "",
|
||||
input_name: env.INPUT_NAME,
|
||||
input_body: env.INPUT_BODY,
|
||||
input_body_path: env.INPUT_BODY_PATH,
|
||||
input_files: (env.INPUT_FILES || "").split(","),
|
||||
input_draft: env.INPUT_DRAFT === 'true'
|
||||
}
|
||||
}
|
||||
|
||||
export const paths = (patterns: string[]): string[] => {
|
||||
return patterns.reduce((acc: string[], pattern: string): string[] => {
|
||||
return acc.concat(glob.sync(pattern).filter(path => lstatSync(path).isFile()));
|
||||
}, [])
|
||||
}
|
||||
|
||||
export const isTag = (ref: string): boolean => {
|
||||
return ref.startsWith("refs/tags/")
|
||||
}
|
63
tsconfig.json
Normal file
63
tsconfig.json
Normal file
|
@ -0,0 +1,63 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
/* Basic Options */
|
||||
// "incremental": true, /* Enable incremental compilation */
|
||||
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||
// "checkJs": true, /* Report errors in .js files. */
|
||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||||
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||
"outDir": "./lib", /* Redirect output structure to the directory. */
|
||||
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||
// "composite": true, /* Enable project compilation */
|
||||
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||||
// "removeComments": true, /* Do not emit comments to output. */
|
||||
// "noEmit": true, /* Do not emit outputs. */
|
||||
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||
|
||||
/* Strict Type-Checking Options */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
"noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* Enable strict null checks. */
|
||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||
|
||||
/* Additional Checks */
|
||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||
|
||||
/* Module Resolution Options */
|
||||
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||
// "types": [], /* Type declaration files to be included in compilation. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
|
||||
/* Source Map Options */
|
||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||
|
||||
/* Experimental Options */
|
||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||
},
|
||||
"exclude": ["node_modules", "**/*.test.ts"]
|
||||
}
|
Loading…
Reference in a new issue