parent
170cd2186c
commit
3c2c952562
@ -0,0 +1,14 @@ |
|||||||
|
/// <reference types="svelte" />
|
||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
/** |
||||||
|
* Declares the Svelte component type for TypeScript. |
||||||
|
* This allows you to import .svelte files into your .ts files. |
||||||
|
*/ |
||||||
|
declare module "*.svelte" { |
||||||
|
import type { ComponentType, SvelteComponent } from "svelte"; |
||||||
|
// Define the SvelteComponent type more generically or specifically if needed.
|
||||||
|
// For general use, ComponentType<SvelteComponent> is a good start.
|
||||||
|
const component: ComponentType<SvelteComponent>; |
||||||
|
export default component; |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
|
||||||
|
<head> |
||||||
|
<meta charset="UTF-8" /> |
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||||
|
<title>@ldo/svelte Library Example</title> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<div id="app"></div> |
||||||
|
<script type="module" src="/src/main.ts"></script> |
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,29 @@ |
|||||||
|
<script lang="ts"> |
||||||
|
import { myExampleFunction, myReactiveStore } from "@ldo/svelte"; |
||||||
|
|
||||||
|
let message = "Testing @ldo/svelte library!"; |
||||||
|
|
||||||
|
myExampleFunction(); |
||||||
|
myReactiveStore(); |
||||||
|
|
||||||
|
// Example of using a function from your library |
||||||
|
// if (typeof myExampleFunction === 'function') { |
||||||
|
// message = myExampleFunction(); |
||||||
|
// } |
||||||
|
|
||||||
|
// Example of subscribing to a store from your library |
||||||
|
// let storeValue: any; |
||||||
|
// if (myReactiveStore && typeof myReactiveStore.subscribe === 'function') { |
||||||
|
// const unsubscribe = myReactiveStore.subscribe(value => { |
||||||
|
// storeValue = value; |
||||||
|
// }); |
||||||
|
// // Clean up subscription on component destroy |
||||||
|
// import { onDestroy } from 'svelte'; |
||||||
|
// onDestroy(unsubscribe); |
||||||
|
// } |
||||||
|
</script> |
||||||
|
|
||||||
|
<main> |
||||||
|
<h1>@ldo/svelte Example App</h1> |
||||||
|
<p>{message}</p> |
||||||
|
</main> |
@ -0,0 +1,9 @@ |
|||||||
|
import App from "./App.svelte"; |
||||||
|
// You might have some global CSS for the example app itself
|
||||||
|
// import './app.css';
|
||||||
|
|
||||||
|
const app = new App({ |
||||||
|
target: document.getElementById('app')!, |
||||||
|
}); |
||||||
|
|
||||||
|
export default app; |
@ -0,0 +1,86 @@ |
|||||||
|
// packages/svelte/jest.config.js
|
||||||
|
|
||||||
|
/** @type {import('jest').Config} */ |
||||||
|
const config = { |
||||||
|
// Indicates whether the coverage information should be collected while executing the test
|
||||||
|
collectCoverage: true, |
||||||
|
// An array of glob patterns indicating a set of files for which coverage information should be collected
|
||||||
|
collectCoverageFrom: ["src/**/*.{ts,svelte}"], // Focus coverage on your source files
|
||||||
|
// The directory where Jest should output its coverage files
|
||||||
|
coverageDirectory: "coverage", |
||||||
|
// A list of reporter names that Jest uses when writing coverage reports
|
||||||
|
coverageReporters: ["json", "text", "lcov", "html"], |
||||||
|
|
||||||
|
// The test environment that will be used for testing (jsdom for browser-like environment)
|
||||||
|
testEnvironment: "jest-environment-jsdom", |
||||||
|
|
||||||
|
// A list of paths to modules that run some code to configure or set up the testing framework
|
||||||
|
// before each test file in the suite.
|
||||||
|
setupFilesAfterEnv: ["<rootDir>/jest.setup.ts"], |
||||||
|
|
||||||
|
// The glob patterns Jest uses to detect test files
|
||||||
|
testMatch: [ |
||||||
|
"<rootDir>/src/**/*.test.ts", |
||||||
|
"<rootDir>/src/**/*.spec.ts", |
||||||
|
"<rootDir>/test/**/*.test.ts", // Or wherever your tests are located
|
||||||
|
"<rootDir>/test/**/*.spec.ts", |
||||||
|
], |
||||||
|
|
||||||
|
// An array of file extensions your modules use
|
||||||
|
moduleFileExtensions: ["ts", "js", "svelte", "json"], |
||||||
|
|
||||||
|
// A map from regular expressions to module names or to arrays of module names
|
||||||
|
// that allow to stub out resources with a single module
|
||||||
|
moduleNameMapper: { |
||||||
|
// Alias for SvelteKit-style $lib imports (if you use them)
|
||||||
|
"^\\$lib(.*)$": "<rootDir>/src$1", |
||||||
|
// Mock CSS imports to prevent errors
|
||||||
|
"\\.(css|less|scss|sass)$": "identity-obj-proxy", |
||||||
|
// You can add mocks for other static assets if needed
|
||||||
|
// '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/__mocks__/fileMock.js',
|
||||||
|
}, |
||||||
|
|
||||||
|
// A map from regular expressions to paths to transformers
|
||||||
|
transform: { |
||||||
|
"^.+\\.svelte$": [ |
||||||
|
"svelte-jester", // Uses your svelte-jester@^5.0.0
|
||||||
|
{ |
||||||
|
preprocess: true, // This will automatically use svelte.config.js
|
||||||
|
// Set to false if svelte.config.js is not found or not to be used.
|
||||||
|
// You could also pass preprocess options directly here:
|
||||||
|
// preprocess: require('svelte-preprocess')({ typescript: true })
|
||||||
|
}, |
||||||
|
], |
||||||
|
"^.+\\.ts$": [ |
||||||
|
// Changed from (ts|tsx) as tsx is less common in Svelte libs
|
||||||
|
"ts-jest", |
||||||
|
{ |
||||||
|
tsconfig: "<rootDir>/tsconfig.json", // Points to your package's tsconfig for type-safety
|
||||||
|
// Example: disabling some TS diagnostics if they are noisy in tests
|
||||||
|
// diagnostics: {
|
||||||
|
// ignoreCodes: ['TS151001']
|
||||||
|
// }
|
||||||
|
}, |
||||||
|
], |
||||||
|
// If you have .js files that need transpilation (e.g. using modern JS features not supported by Node version running Jest)
|
||||||
|
// you might add a babel-jest transformer here. For a library mostly in TS, this might not be needed.
|
||||||
|
// '^.+\\.js$': 'babel-jest',
|
||||||
|
}, |
||||||
|
|
||||||
|
// An array of regexp pattern strings that are matched against all source file paths before transformation.
|
||||||
|
// If the file path matches any of the patterns, it will not be transformed.
|
||||||
|
// This is important for node_modules that are published as ES modules but Jest runs in CJS by default.
|
||||||
|
transformIgnorePatterns: [ |
||||||
|
"/node_modules/(?!(svelte-routing|another-es-module-package)/)", // Adjust if you use ESM-only deps
|
||||||
|
], |
||||||
|
|
||||||
|
// Indicates whether each individual test should be reported during the run
|
||||||
|
verbose: true, |
||||||
|
|
||||||
|
// Optionally, if your project or tests are pure ESM, you might explore ESM support in Jest:
|
||||||
|
// preset: 'ts-jest/presets/default-esm', // or 'ts-jest/presets/default-esm-legacy'
|
||||||
|
// extensionsToTreatAsEsm: ['.ts', '.svelte'],
|
||||||
|
// moduleNameMapper for ESM often needs to handle .js extensions in imports.
|
||||||
|
}; |
||||||
|
|
||||||
|
export default config; |
@ -0,0 +1,5 @@ |
|||||||
|
// packages/svelte/jest.setup.js
|
||||||
|
|
||||||
|
// Extends Jest's expect method with matchers from @testing-library/jest-dom
|
||||||
|
// For example, to use `expect(element).toHaveTextContent(/react/i)`
|
||||||
|
import "@testing-library/jest-dom"; |
@ -0,0 +1,7 @@ |
|||||||
|
export function myExampleFunction() { |
||||||
|
console.log("Hello Example Function"); |
||||||
|
} |
||||||
|
|
||||||
|
export function myReactiveStore() { |
||||||
|
console.log("Hello Example Store"); |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
// packages/svelte/svelte.config.js
|
||||||
|
import sveltePreprocess from "svelte-preprocess"; |
||||||
|
|
||||||
|
/** @type {import('@sveltejs/kit').Config} */ // Or just an empty object if not using Kit features
|
||||||
|
const config = { |
||||||
|
preprocess: sveltePreprocess({ |
||||||
|
typescript: true, // Enable TypeScript preprocessing
|
||||||
|
// You can add other svelte-preprocess options here if needed,
|
||||||
|
// e.g., for SCSS, PostCSS, etc.
|
||||||
|
// scss: { includePaths: ['theme'] },
|
||||||
|
// postcss: true,
|
||||||
|
}), |
||||||
|
// compilerOptions for Svelte if needed, though usually not for Jest transforms directly
|
||||||
|
// compilerOptions: {
|
||||||
|
// customElement: false,
|
||||||
|
// }
|
||||||
|
}; |
||||||
|
|
||||||
|
export default config; |
@ -0,0 +1,5 @@ |
|||||||
|
describe("Trivial", () => { |
||||||
|
it("Is true", () => { |
||||||
|
expect(true).toBe(true); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,58 @@ |
|||||||
|
{ |
||||||
|
"extends": "../../tsconfig.base.json", |
||||||
|
"compilerOptions": { |
||||||
|
"target": "ESNext", |
||||||
|
"module": "ESNext", |
||||||
|
"moduleResolution": "bundler", |
||||||
|
"baseUrl": ".", |
||||||
|
"paths": { |
||||||
|
"$lib": [ |
||||||
|
"src" |
||||||
|
], |
||||||
|
"$lib/*": [ |
||||||
|
"src/*" |
||||||
|
], |
||||||
|
// Add this path alias for your library: |
||||||
|
"@ldo/svelte": [ |
||||||
|
"src/index.ts" |
||||||
|
], // Points to your library's main entry point for types |
||||||
|
"@ldo/svelte/*": [ |
||||||
|
"src/*" |
||||||
|
] // Allows importing submodules like '@ldo/svelte/store' if you structure that way |
||||||
|
}, |
||||||
|
"resolveJsonModule": true, |
||||||
|
"allowSyntheticDefaultImports": true, |
||||||
|
"esModuleInterop": true, |
||||||
|
"isolatedModules": true, |
||||||
|
"sourceMap": true, |
||||||
|
"strict": true, |
||||||
|
"noEmit": true, |
||||||
|
"lib": [ |
||||||
|
"DOM", |
||||||
|
"ESNext" |
||||||
|
], |
||||||
|
"types": [ |
||||||
|
"jest", |
||||||
|
"@testing-library/jest-dom", |
||||||
|
"@types/node", |
||||||
|
"svelte" // Added "svelte" to ensure Svelte's global types are picked up |
||||||
|
] |
||||||
|
}, |
||||||
|
"include": [ |
||||||
|
"src/**/*.ts", |
||||||
|
"src/**/*.d.ts", // Make sure to include your new env.d.ts |
||||||
|
"src/**/*.svelte", |
||||||
|
"tests/**/*.ts", |
||||||
|
"tests/**/*.svelte", |
||||||
|
"example/src/**/*.ts", // Include example app's TS files |
||||||
|
"example/src/**/*.svelte", // Include example app's Svelte files |
||||||
|
"vite.config.ts", |
||||||
|
"vite.config.example.ts", |
||||||
|
"jest.config.js" |
||||||
|
], |
||||||
|
"exclude": [ |
||||||
|
"node_modules", |
||||||
|
"dist", |
||||||
|
"dist-example" |
||||||
|
] |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
// packages/svelte/vite.config.example.ts
|
||||||
|
import { defineConfig } from "vite"; |
||||||
|
import { svelte } from "@sveltejs/vite-plugin-svelte"; |
||||||
|
import sveltePreprocess from "svelte-preprocess"; |
||||||
|
import path from "path"; |
||||||
|
|
||||||
|
// Assuming your library's package name is "@ldo/svelte"
|
||||||
|
// and its source entry is "src/index.ts"
|
||||||
|
const libraryPackageName = "@ldo/svelte"; // Or derive from your package.json if preferred
|
||||||
|
const librarySourceEntryPoint = path.resolve(__dirname, "src/index.ts"); |
||||||
|
|
||||||
|
export default defineConfig({ |
||||||
|
// This tells Vite that the root of your example app is the 'example' folder
|
||||||
|
root: path.resolve(__dirname, "example"), |
||||||
|
|
||||||
|
// Define a different public directory for the example app if needed, default is 'public' inside the root.
|
||||||
|
// publicDir: path.resolve(__dirname, 'example/public'),
|
||||||
|
|
||||||
|
plugins: [ |
||||||
|
svelte({ |
||||||
|
preprocess: sveltePreprocess({ |
||||||
|
typescript: true, // Enable TypeScript in <script lang="ts">
|
||||||
|
}), |
||||||
|
// Hot Module Replacement (HMR) options for Svelte
|
||||||
|
// These are generally good defaults for development.
|
||||||
|
hot: { |
||||||
|
preserveLocalState: true, // Try to preserve component state on HMR updates
|
||||||
|
}, |
||||||
|
}), |
||||||
|
], |
||||||
|
resolve: { |
||||||
|
alias: { |
||||||
|
// This is a crucial alias. It makes sure that when your example app
|
||||||
|
// imports your library (e.g., `import { ... } from '@ldo/svelte';`),
|
||||||
|
// it uses the actual source code from your `src` directory,
|
||||||
|
// allowing for live updates and easy testing during development.
|
||||||
|
[libraryPackageName]: librarySourceEntryPoint, |
||||||
|
}, |
||||||
|
// Important for Svelte projects to prevent issues with multiple Svelte instances.
|
||||||
|
dedupe: ["svelte"], |
||||||
|
}, |
||||||
|
server: { |
||||||
|
// Port for the example app's dev server
|
||||||
|
port: 5173, // Vite's default, or choose another like 3000 or 8080
|
||||||
|
open: true, // Automatically open the app in the browser on server start (optional)
|
||||||
|
}, |
||||||
|
build: { |
||||||
|
// Output directory for the built example app (e.g., when running `npm run build:example`)
|
||||||
|
// This should be different from your library's `dist` directory.
|
||||||
|
outDir: path.resolve(__dirname, "dist-example"), |
||||||
|
emptyOutDir: true, // Clean the output directory before building
|
||||||
|
}, |
||||||
|
// Ensure that dependencies from the main library are correctly resolved if linked
|
||||||
|
// optimizeDeps: {
|
||||||
|
// include: ['@ldo/svelte'], // May not be necessary with the alias
|
||||||
|
// },
|
||||||
|
}); |
Loading…
Reference in new issue