diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 741ec15..5856b71 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -13,6 +13,7 @@ jobs: node-version: latest registry-url: 'https://registry.npmjs.org' - run: npm i + - run: npm run prepare:build - run: npm run build - name: Prepare Release run: npm run prepare:release ${{ github.ref_name }} diff --git a/.gitignore b/.gitignore index 70663cf..7cb6f1b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,10 @@ node_modules .idea coverage/ dist/ -.DS_Store \ No newline at end of file +.DS_Store + +# These files are created for builds and releases, we don't want to track them in GitHub +src/Components.ts +src/Parameters.ts +src/Properties.ts +src/ValueTypes.ts diff --git a/bin/prepare-build.js b/bin/prepare-build.js new file mode 100644 index 0000000..e2af953 --- /dev/null +++ b/bin/prepare-build.js @@ -0,0 +1,39 @@ +// This file compiles export files for all calendar components, properties, parameters and value types +import fs from 'fs/promises'; +import {dirname, basename, resolve, parse, format} from 'path'; +import {fileURLToPath} from 'url'; + +await exportBundle('Parser/Components', 'src/Components.ts'); +await exportBundle('Parser/Properties', 'src/Properties.ts'); +await exportBundle('Parser/Parameters', 'src/Parameters.ts'); +await exportBundle('Parser/ValueTypes', 'src/ValueTypes.ts'); + +console.log('All OK'); + +async function exportBundle (dirFromAppSrc) { + dirFromAppSrc = dirFromAppSrc.trimEnd('/'); + const files = (await fs.readdir(buildAppPath(`src/${dirFromAppSrc}`))) + .filter(file => !file.startsWith('.')) // no hidden files + .map(async file => { + let exports; + const path = parse(file); + + // Check if keyword `export default` exists in file to see whether we have to map the default + if ((await fs.readFile(buildAppPath(`src/${dirFromAppSrc}/${file}`), 'utf8')).includes('export default')) { + exports = `default as ${path.name}`; + } else { + exports = path.name; + } + + return `export { ${exports} } from '${format({...path, ext: undefined, base: undefined, dir: `./${dirFromAppSrc}`})}';`; + }); + + const target = buildAppPath(`src/${basename(dirFromAppSrc)}.ts`) + await fs.writeFile(target, (await Promise.all(files)).join("\n"), 'utf8'); + + console.log(`OK: ${target}`); +} + +function buildAppPath (path) { + return resolve(dirname(fileURLToPath(import.meta.url)), '../' + path); +} \ No newline at end of file diff --git a/package.json b/package.json index 1b7d7ac..1dbe3f7 100644 --- a/package.json +++ b/package.json @@ -8,18 +8,25 @@ "types": "./dist/index.d.ts", "exports": { ".": "./dist/index.js", - "./parser": "./dist/parser.js" + "./parser": "./dist/parser.js", + "./Components": "./dist/Components.js", + "./Parameters": "./dist/Parameters.js", + "./Properties": "./dist/Properties.js", + "./ValueTypes": "./dist/ValueTypes.js" }, "typesVersions": { "*": { - "parser": [ - "dist/parser.d.ts" - ] + "parser": ["dist/parser.d.ts"], + "Components": ["dist/Components.d.ts"], + "Parameters": ["dist/Parameters.d.ts"], + "Properties": ["dist/Properties.d.ts"], + "ValueTypes": ["dist/ValueTypes.d.ts"] } }, "scripts": { "build": "tsup", "lint": "eslint src/**", + "prepare:build": "node bin/prepare-build.js", "prepare:release": "node bin/prepare-release.js", "compile:parameters": "node --loader=./loader.js compiler/parameters.ts", "compile:properties": "node --loader=./loader.js compiler/properties.ts", diff --git a/tsup.config.ts b/tsup.config.ts index 52b5e88..f76ab11 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,14 @@ import { defineConfig } from 'tsup'; import { resolve, join } from 'path'; export default defineConfig({ - entry: ['src/index.ts', 'src/parser.ts'], + entry: [ + 'src/index.ts', + 'src/parser.ts', + 'src/Components.ts', + 'src/Parameters.ts', + 'src/Properties.ts', + 'src/ValueTypes.ts', + ], splitting: true, sourcemap: false, clean: true,