mirror of
https://github.com/pebble-dev/clay.git
synced 2026-08-28 04:46:57 -04:00
* feat: add ambient module stubs for declaration generation Provide TypeScript ambient declarations for 'message_keys' (Pebble SDK module) and './tmp/config-page.html' (build artefact) so tsc can resolve these imports when generating .d.ts files. * feat: add tsconfig for declaration generation Configures tsc --allowJs --emitDeclarationOnly to generate per-file .d.ts reference output in dist-types/ from the library source files. * feat: add curated TypeScript declarations for public API Hand-curated index.d.ts covering Clay, ClayConfig, ClayItem, ClayEvents, manipulators, and all supporting types. Necessary because tsc cannot infer the ClayEvents mixin or dynamically-bound manipulator methods. All types are exported via the Clay namespace. * test: add type-checking verification for index.d.ts Exercises the full public API surface — constructor, instance/static methods, ClayConfig/ClayItem event methods, manipulator methods, namespace-exported types, and customFn this-context. * build: add typescript devDependency, types field, and build scripts Adds typescript 6.0.2 as a devDependency. Sets "types": "index.d.ts" in package.json. Adds build:types and check:types scripts. * build: add gulp types task to validate declarations on build Validates index.d.ts against test/type-checks.ts as part of the default gulp build. Reference declaration generation via build:types remains available as a separate manual step. * chore: update ignore files for TypeScript declarations Add dist-types/ to .gitignore (build artefact). Whitelist index.d.ts in .npmignore so type declarations ship with the package. * ci: add typecheck workflow to validate TypeScript declarations Runs npm run check:types on push and PR to main, matching the existing lint/test/build workflow pattern.
156 lines
4.0 KiB
JavaScript
Executable File
156 lines
4.0 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
var gulp = require('gulp');
|
|
var browserify = require('browserify');
|
|
var source = require('vinyl-source-stream');
|
|
var buffer = require('vinyl-buffer');
|
|
var stringify = require('stringify');
|
|
var del = require('del');
|
|
var inline = require('gulp-inline');
|
|
var htmlmin = require('gulp-htmlmin');
|
|
var sass = require('gulp-sass')(require('sass'));
|
|
var sourceMaps = require('gulp-sourcemaps');
|
|
var autoprefixer = require('gulp-autoprefixer');
|
|
var uglify = require('gulp-uglify');
|
|
var autoprefixify = require('./src/scripts/vendor/autoprefixify');
|
|
var insert = require('gulp-insert');
|
|
var clayPackage = require('./package.json');
|
|
|
|
var sassIncludePaths = [].concat(
|
|
require('bourbon').includePaths,
|
|
'src/styles'
|
|
);
|
|
|
|
var autoprefixerOptions = {
|
|
browsers: ['Android 4', 'iOS 8'],
|
|
cascade: false
|
|
};
|
|
|
|
var stringifyOptions = ['.html', '.tpl', '.css'];
|
|
var versionMessage = '/* Clay - https://github.com/pebble-dev/clay - Version: ' +
|
|
clayPackage.version +
|
|
' - Build Date: ' + new Date().toISOString() + ' */\n';
|
|
|
|
gulp.task('clean-js', function() {
|
|
return del(['tmp/config-page.js']);
|
|
});
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskJs() {
|
|
return browserify('src/scripts/config-page.js', { debug: true })
|
|
.transform('deamdify')
|
|
.bundle()
|
|
.pipe(source('config-page.js'))
|
|
.pipe(gulp.dest('./tmp/'));
|
|
}
|
|
|
|
gulp.task('js', gulp.series('clean-js', taskJs));
|
|
|
|
gulp.task('clean-sass', function() {
|
|
return del(['tmp/config-page.scss']);
|
|
});
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskSass() {
|
|
return gulp.src(['./src/styles/config-page.scss',
|
|
'./src/styles/clay/components/*.scss'])
|
|
.pipe(sourceMaps.init())
|
|
.pipe(sass({
|
|
loadPaths: sassIncludePaths
|
|
}).on('error', sass.logError))
|
|
.pipe(autoprefixer(autoprefixerOptions))
|
|
.pipe(sourceMaps.write('./'))
|
|
.pipe(gulp.dest('tmp'));
|
|
}
|
|
|
|
gulp.task('sass', gulp.series('clean-sass', taskSass));
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskInlineHtml() {
|
|
return gulp.src('src/config-page.html')
|
|
.pipe(inline())
|
|
.pipe(htmlmin({
|
|
collapseWhitespace: true,
|
|
removeComments: true,
|
|
removeTagWhitespace: true,
|
|
removeRedundantAttributes: true,
|
|
caseSensitive: true,
|
|
minifyJS: true,
|
|
minifyCSS: true
|
|
}))
|
|
.pipe(gulp.dest('tmp/'));
|
|
}
|
|
|
|
gulp.task('inlineHtml', gulp.series('js', 'sass', taskInlineHtml));
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskClay() {
|
|
return browserify('index.js', {
|
|
debug: false,
|
|
standalone: clayPackage.name
|
|
})
|
|
.transform('deamdify')
|
|
.transform(stringify(stringifyOptions))
|
|
// .transform(autoprefixify, autoprefixerOptions)
|
|
.require(require.resolve('./index'), {expose: clayPackage.name})
|
|
.exclude('message_keys')
|
|
.bundle()
|
|
.pipe(source('index.js'))
|
|
.pipe(buffer())
|
|
.pipe(uglify({
|
|
preserveComments: 'license'
|
|
}))
|
|
.pipe(insert.prepend(versionMessage))
|
|
.pipe(gulp.dest('./src/js'));
|
|
}
|
|
|
|
gulp.task('clay', gulp.series('inlineHtml', taskClay));
|
|
|
|
// Validates the curated index.d.ts against test/type-checks.ts.
|
|
// For per-file reference declarations in dist-types/, run: npm run build:types
|
|
gulp.task('types', function(done) {
|
|
var exec = require('child_process').exec;
|
|
exec('npx tsc -p tsconfig.typecheck.json', function(err, stdout, stderr) {
|
|
if (stdout) { console.log(stdout); }
|
|
if (stderr) { console.error(stderr); }
|
|
done(err);
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskDevJs() {
|
|
return browserify('dev/dev.js', { debug: true })
|
|
.transform(stringify(stringifyOptions))
|
|
.transform('deamdify')
|
|
.transform(autoprefixify, autoprefixerOptions)
|
|
.ignore('message_keys')
|
|
.bundle()
|
|
.pipe(source('dev.js'))
|
|
.pipe(gulp.dest('./tmp/'));
|
|
}
|
|
|
|
gulp.task('dev-js', gulp.series('js', 'sass', taskDevJs));
|
|
|
|
gulp.task('default', gulp.series('clay', 'types'));
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
function taskDev() {
|
|
gulp.watch('src/styles/**/*.scss', ['sass']);
|
|
gulp.watch(['src/scripts/**/*.js', 'src/templates/**/*.tpl'], ['js']);
|
|
gulp.watch(['src/**', 'dev/**/*.js'], ['dev-js']);
|
|
}
|
|
|
|
gulp.task('dev', gulp.series('dev-js', taskDev));
|